mirror of https://github.com/Hilbis/Hilbish
Compare commits
5 Commits
efc69ab769
...
f2ee600c28
Author | SHA1 | Date |
---|---|---|
sammyette | f2ee600c28 | |
sammyette | 61914f8dc7 | |
sammyette | 6dbb39d404 | |
sammyette | 890f10e176 | |
sammyette | 6b27d14f45 |
|
@ -126,12 +126,12 @@ func docPieceTag(tagName string, tags map[string][]tag) []docPiece {
|
||||||
|
|
||||||
func setupDocType(mod string, typ *doc.Type) *docPiece {
|
func setupDocType(mod string, typ *doc.Type) *docPiece {
|
||||||
docs := strings.TrimSpace(typ.Doc)
|
docs := strings.TrimSpace(typ.Doc)
|
||||||
inInterface := strings.HasPrefix(docs, "#interface")
|
tags, doc := getTagsAndDocs(docs)
|
||||||
if !inInterface {
|
|
||||||
|
if tags["type"] == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
inInterface := tags["interface"] != nil
|
||||||
tags, doc := getTagsAndDocs(docs)
|
|
||||||
|
|
||||||
var interfaces string
|
var interfaces string
|
||||||
typeName := strings.ToUpper(string(typ.Name[0])) + typ.Name[1:]
|
typeName := strings.ToUpper(string(typ.Name[0])) + typ.Name[1:]
|
||||||
|
@ -168,10 +168,7 @@ func setupDocType(mod string, typ *doc.Type) *docPiece {
|
||||||
if tags["member"] != nil {
|
if tags["member"] != nil {
|
||||||
isMember = true
|
isMember = true
|
||||||
}
|
}
|
||||||
var parentMod string
|
parentMod := mod
|
||||||
if inInterface {
|
|
||||||
parentMod = mod
|
|
||||||
}
|
|
||||||
dps := &docPiece{
|
dps := &docPiece{
|
||||||
Doc: typeDoc,
|
Doc: typeDoc,
|
||||||
FuncName: typeName,
|
FuncName: typeName,
|
||||||
|
@ -191,13 +188,19 @@ func setupDocType(mod string, typ *doc.Type) *docPiece {
|
||||||
|
|
||||||
func setupDoc(mod string, fun *doc.Func) *docPiece {
|
func setupDoc(mod string, fun *doc.Func) *docPiece {
|
||||||
docs := strings.TrimSpace(fun.Doc)
|
docs := strings.TrimSpace(fun.Doc)
|
||||||
inInterface := strings.HasPrefix(docs, "#interface")
|
tags, parts := getTagsAndDocs(docs)
|
||||||
if (!strings.HasPrefix(fun.Name, prefix[mod]) && !inInterface) || (strings.ToLower(fun.Name) == "loader" && !inInterface) {
|
|
||||||
|
// i couldnt fit this into the condition below for some reason so here's a goto!
|
||||||
|
if tags["member"] != nil {
|
||||||
|
goto start
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strings.HasPrefix(fun.Name, prefix[mod]) && tags["interface"] == nil) || (strings.ToLower(fun.Name) == "loader" && tags["interface"] == nil) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
tags, parts := getTagsAndDocs(docs)
|
start:
|
||||||
|
inInterface := tags["interface"] != nil
|
||||||
var interfaces string
|
var interfaces string
|
||||||
funcsig := parts[0]
|
funcsig := parts[0]
|
||||||
doc := parts[1:]
|
doc := parts[1:]
|
||||||
|
@ -418,7 +421,11 @@ func main() {
|
||||||
modDescription := typeTag.ReplaceAllStringFunc(strings.Replace(modu.Description, "<", `\<`, -1), func(typ string) string {
|
modDescription := typeTag.ReplaceAllStringFunc(strings.Replace(modu.Description, "<", `\<`, -1), func(typ string) string {
|
||||||
typName := typ[1:]
|
typName := typ[1:]
|
||||||
typLookup := typeTable[strings.ToLower(typName)]
|
typLookup := typeTable[strings.ToLower(typName)]
|
||||||
linkedTyp := fmt.Sprintf("/Hilbish/docs/api/%s/%s/#%s", typLookup[0], typLookup[0] + "." + typLookup[1], strings.ToLower(typName))
|
ifaces := typLookup[0] + "." + typLookup[1] + "/"
|
||||||
|
if typLookup[1] == "" {
|
||||||
|
ifaces = ""
|
||||||
|
}
|
||||||
|
linkedTyp := fmt.Sprintf("/Hilbish/docs/api/%s/%s#%s", typLookup[0], ifaces, strings.ToLower(typName))
|
||||||
return fmt.Sprintf(`<a href="%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
return fmt.Sprintf(`<a href="%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
||||||
})
|
})
|
||||||
f.WriteString(fmt.Sprintf("## Introduction\n%s\n\n", modDescription))
|
f.WriteString(fmt.Sprintf("## Introduction\n%s\n\n", modDescription))
|
||||||
|
@ -450,7 +457,11 @@ func main() {
|
||||||
htmlSig := typeTag.ReplaceAllStringFunc(strings.Replace(dps.FuncSig, "<", `\<`, -1), func(typ string) string {
|
htmlSig := typeTag.ReplaceAllStringFunc(strings.Replace(dps.FuncSig, "<", `\<`, -1), func(typ string) string {
|
||||||
typName := typ[1:]
|
typName := typ[1:]
|
||||||
typLookup := typeTable[strings.ToLower(typName)]
|
typLookup := typeTable[strings.ToLower(typName)]
|
||||||
linkedTyp := fmt.Sprintf("/Hilbish/docs/api/%s/%s/#%s", typLookup[0], typLookup[0] + "." + typLookup[1], strings.ToLower(typName))
|
ifaces := typLookup[0] + "." + typLookup[1] + "/"
|
||||||
|
if typLookup[1] == "" {
|
||||||
|
ifaces = ""
|
||||||
|
}
|
||||||
|
linkedTyp := fmt.Sprintf("/Hilbish/docs/api/%s/%s#%s", typLookup[0], ifaces, strings.ToLower(typName))
|
||||||
return fmt.Sprintf(`<a href="%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
return fmt.Sprintf(`<a href="%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
||||||
})
|
})
|
||||||
f.WriteString(fmt.Sprintf("### %s\n", htmlSig))
|
f.WriteString(fmt.Sprintf("### %s\n", htmlSig))
|
||||||
|
@ -487,10 +498,10 @@ func main() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
htmlSig := typeTag.ReplaceAllStringFunc(strings.Replace(dps.FuncSig, "<", `\<`, -1), func(typ string) string {
|
htmlSig := typeTag.ReplaceAllStringFunc(strings.Replace(dps.FuncSig, "<", `\<`, -1), func(typ string) string {
|
||||||
// todo: get type from global table to link to
|
typName := regexp.MustCompile(`\w+`).FindString(typ[1:])
|
||||||
// other pages (hilbish page can link to hilbish.jobs#Job)
|
typLookup := typeTable[strings.ToLower(typName)]
|
||||||
typName := typ[1:]
|
fmt.Printf("%+q, \n", typLookup)
|
||||||
linkedTyp := strings.ToLower(typName) // TODO: link
|
linkedTyp := fmt.Sprintf("/Hilbish/docs/api/%s/%s/#%s", typLookup[0], typLookup[0] + "." + typLookup[1], strings.ToLower(typName))
|
||||||
return fmt.Sprintf(`<a href="#%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
return fmt.Sprintf(`<a href="#%s" style="text-decoration: none;">%s</a>`, linkedTyp, typName)
|
||||||
})
|
})
|
||||||
f.WriteString(fmt.Sprintf("#### %s\n", htmlSig))
|
f.WriteString(fmt.Sprintf("#### %s\n", htmlSig))
|
||||||
|
|
22
complete.go
22
complete.go
|
@ -74,13 +74,20 @@ func splitForFile(str string) []string {
|
||||||
|
|
||||||
func fileComplete(query, ctx string, fields []string) ([]string, string) {
|
func fileComplete(query, ctx string, fields []string) ([]string, string) {
|
||||||
q := splitForFile(ctx)
|
q := splitForFile(ctx)
|
||||||
|
path := ""
|
||||||
|
if len(q) != 0 {
|
||||||
|
path = q[len(q) - 1]
|
||||||
|
}
|
||||||
|
|
||||||
return matchPath(q[len(q) - 1])
|
return matchPath(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
func binaryComplete(query, ctx string, fields []string) ([]string, string) {
|
func binaryComplete(query, ctx string, fields []string) ([]string, string) {
|
||||||
q := splitForFile(ctx)
|
q := splitForFile(ctx)
|
||||||
query = q[len(q) - 1]
|
query = ""
|
||||||
|
if len(q) != 0 {
|
||||||
|
query = q[len(q) - 1]
|
||||||
|
}
|
||||||
|
|
||||||
var completions []string
|
var completions []string
|
||||||
|
|
||||||
|
@ -151,11 +158,12 @@ func matchPath(query string) ([]string, string) {
|
||||||
files, _ := os.ReadDir(path)
|
files, _ := os.ReadDir(path)
|
||||||
for _, entry := range files {
|
for _, entry := range files {
|
||||||
// should we handle errors here?
|
// should we handle errors here?
|
||||||
file, _ := entry.Info()
|
file, err := entry.Info()
|
||||||
fileInfo, err := entry.Info()
|
if err == nil && file.Mode() & os.ModeSymlink != 0 {
|
||||||
if err == nil && fileInfo.Mode() & os.ModeSymlink != 0 {
|
path, err := filepath.EvalSymlinks(filepath.Join(path, file.Name()))
|
||||||
path, _ := filepath.EvalSymlinks(filepath.Join(path, file.Name()))
|
if err == nil {
|
||||||
file, _ = os.Lstat(path)
|
file, err = os.Lstat(path)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if strings.HasPrefix(file.Name(), baseName) {
|
if strings.HasPrefix(file.Name(), baseName) {
|
||||||
|
|
|
@ -27,12 +27,9 @@ In this example, a command with the name of `hello` is created
|
||||||
that will print `Hello world!` to output. One question you may
|
that will print `Hello world!` to output. One question you may
|
||||||
have is: What is the `sinks` parameter?
|
have is: What is the `sinks` parameter?
|
||||||
|
|
||||||
A sink is a writable/readable pipe, or you can imagine a Lua
|
The `sinks` parameter is a table with 3 keys: `in`, `out`,
|
||||||
file. It's used in this case to write to the proper output,
|
and `err`. The values of these is a <a href="/Hilbish/docs/api/hilbish/#sink" style="text-decoration: none;">Sink</a>.
|
||||||
incase a user either pipes to another command or redirects somewhere else.
|
|
||||||
|
|
||||||
So, the `sinks` parameter is a table containing 3 sinks:
|
|
||||||
`in`, `out`, and `err`.
|
|
||||||
- `in` is the standard input. You can read from this sink
|
- `in` is the standard input. You can read from this sink
|
||||||
to get user input. (**This is currently unimplemented.**)
|
to get user input. (**This is currently unimplemented.**)
|
||||||
- `out` is standard output. This is usually where text meant for
|
- `out` is standard output. This is usually where text meant for
|
||||||
|
@ -40,10 +37,6 @@ output should go.
|
||||||
- `err` is standard error. This sink is for writing errors, as the
|
- `err` is standard error. This sink is for writing errors, as the
|
||||||
name would suggest.
|
name would suggest.
|
||||||
|
|
||||||
A sink has 2 methods:
|
|
||||||
- `write(str)` will write to the sink.
|
|
||||||
- `writeln(str)` will write to the sink with a newline at the end.
|
|
||||||
|
|
||||||
## Functions
|
## Functions
|
||||||
### deregister(name)
|
### deregister(name)
|
||||||
Deregisters any command registered with `name`
|
Deregisters any command registered with `name`
|
||||||
|
|
|
@ -103,3 +103,15 @@ This creates a timer that starts immediately.
|
||||||
Checks if `name` is a valid command.
|
Checks if `name` is a valid command.
|
||||||
Will return the path of the binary, or a basename if it's a commander.
|
Will return the path of the binary, or a basename if it's a commander.
|
||||||
|
|
||||||
|
## Types
|
||||||
|
## Sink
|
||||||
|
A sink is a structure that has input and/or output to/from
|
||||||
|
a desination.
|
||||||
|
|
||||||
|
### Methods
|
||||||
|
#### write(str)
|
||||||
|
Writes data to a sink.
|
||||||
|
|
||||||
|
#### writeln(str)
|
||||||
|
Writes data to a sink with a newline at the end.
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,22 @@ The exit code has to be a number, it will be 0 otherwise and the error can be
|
||||||
These are the "low level" functions for the `hilbish.runner` interface.
|
These are the "low level" functions for the `hilbish.runner` interface.
|
||||||
|
|
||||||
+ setMode(mode) > The same as `hilbish.runnerMode`
|
+ setMode(mode) > The same as `hilbish.runnerMode`
|
||||||
+ sh(input) -> input, code, err > Runs `input` in Hilbish's sh interpreter
|
+ sh(input) -> table > Runs `input` in Hilbish's sh interpreter
|
||||||
+ lua(input) -> input, code, err > Evals `input` as Lua code
|
+ lua(input) -> table > Evals `input` as Lua code
|
||||||
|
|
||||||
|
The table value that runners return can have at least 4 values:
|
||||||
|
+ input (string): The full input text.
|
||||||
|
+ exitCode (number): Exit code (usually from a command)
|
||||||
|
+ continue (boolean): Whether to prompt the user for more input
|
||||||
|
(in the case of incomplete syntax)
|
||||||
|
+ err (string): A string that represents an error from the runner.
|
||||||
|
This should only be set when, for example, there is a syntax error.
|
||||||
|
It can be set to a few special values for Hilbish to throw the right
|
||||||
|
hooks and have a better looking message.
|
||||||
|
|
||||||
|
+ `<command>: not-found` will throw a `command.not-found` hook
|
||||||
|
based on what `<command>` is.
|
||||||
|
+ `<command>: not-executable` will throw a `command.not-executable` hook.
|
||||||
|
|
||||||
The others here are defined in Lua and have EmmyLua documentation.
|
The others here are defined in Lua and have EmmyLua documentation.
|
||||||
These functions should be preferred over the previous ones.
|
These functions should be preferred over the previous ones.
|
||||||
|
|
|
@ -179,6 +179,12 @@ function hilbish.jobs:foreground() end
|
||||||
--- @param cmd string
|
--- @param cmd string
|
||||||
function hilbish.runner.lua(cmd) end
|
function hilbish.runner.lua(cmd) end
|
||||||
|
|
||||||
|
--- Writes data to a sink.
|
||||||
|
function hilbish:write(str) end
|
||||||
|
|
||||||
|
--- Writes data to a sink with a newline at the end.
|
||||||
|
function hilbish:writeln(str) end
|
||||||
|
|
||||||
--- Starts running the job.
|
--- Starts running the job.
|
||||||
function hilbish.jobs:start() end
|
function hilbish.jobs:start() end
|
||||||
|
|
||||||
|
|
|
@ -18,22 +18,15 @@ In this example, a command with the name of `hello` is created
|
||||||
that will print `Hello world!` to output. One question you may
|
that will print `Hello world!` to output. One question you may
|
||||||
have is: What is the `sinks` parameter?
|
have is: What is the `sinks` parameter?
|
||||||
|
|
||||||
A sink is a writable/readable pipe, or you can imagine a Lua
|
The `sinks` parameter is a table with 3 keys: `in`, `out`,
|
||||||
file. It's used in this case to write to the proper output,
|
and `err`. The values of these is a @Sink.
|
||||||
incase a user either pipes to another command or redirects somewhere else.
|
|
||||||
|
|
||||||
So, the `sinks` parameter is a table containing 3 sinks:
|
|
||||||
`in`, `out`, and `err`.
|
|
||||||
- `in` is the standard input. You can read from this sink
|
- `in` is the standard input. You can read from this sink
|
||||||
to get user input. (**This is currently unimplemented.**)
|
to get user input. (**This is currently unimplemented.**)
|
||||||
- `out` is standard output. This is usually where text meant for
|
- `out` is standard output. This is usually where text meant for
|
||||||
output should go.
|
output should go.
|
||||||
- `err` is standard error. This sink is for writing errors, as the
|
- `err` is standard error. This sink is for writing errors, as the
|
||||||
name would suggest.
|
name would suggest.
|
||||||
|
|
||||||
A sink has 2 methods:
|
|
||||||
- `write(str)` will write to the sink.
|
|
||||||
- `writeln(str)` will write to the sink with a newline at the end.
|
|
||||||
*/
|
*/
|
||||||
package commander
|
package commander
|
||||||
|
|
||||||
|
|
1
job.go
1
job.go
|
@ -18,6 +18,7 @@ import (
|
||||||
var jobs *jobHandler
|
var jobs *jobHandler
|
||||||
var jobMetaKey = rt.StringValue("hshjob")
|
var jobMetaKey = rt.StringValue("hshjob")
|
||||||
|
|
||||||
|
// #type
|
||||||
// #interface jobs
|
// #interface jobs
|
||||||
// #property cmd The user entered command string for the job.
|
// #property cmd The user entered command string for the job.
|
||||||
// #property running Whether the job is running or not.
|
// #property running Whether the job is running or not.
|
||||||
|
|
|
@ -2,8 +2,8 @@ local bait = require 'bait'
|
||||||
local lunacolors = require 'lunacolors'
|
local lunacolors = require 'lunacolors'
|
||||||
|
|
||||||
hilbish.motd = [[
|
hilbish.motd = [[
|
||||||
Hilbish 2.0 is a {red}major{reset} update! If your config doesn't work
|
1000 commits on the Hilbish repository brings us to {cyan}Version 2.1!{reset}
|
||||||
anymore, that will definitely be why! A MOTD, very message, much day.
|
Docs, docs, docs... At least builtins work with pipes now.
|
||||||
]]
|
]]
|
||||||
|
|
||||||
bait.catch('hilbish.init', function()
|
bait.catch('hilbish.init', function()
|
||||||
|
|
11
sink.go
11
sink.go
|
@ -11,8 +11,9 @@ import (
|
||||||
|
|
||||||
var sinkMetaKey = rt.StringValue("hshsink")
|
var sinkMetaKey = rt.StringValue("hshsink")
|
||||||
|
|
||||||
// a sink is a structure that has input and/or output
|
// #type
|
||||||
// it is like a lua file when used in popen, but specific to hilbish
|
// A sink is a structure that has input and/or output to/from
|
||||||
|
// a desination.
|
||||||
type sink struct{
|
type sink struct{
|
||||||
writer io.Writer
|
writer io.Writer
|
||||||
reader io.Reader
|
reader io.Reader
|
||||||
|
@ -40,6 +41,9 @@ func setupSinkType(rtm *rt.Runtime) {
|
||||||
l.SetRegistry(sinkMetaKey, rt.TableValue(sinkMeta))
|
l.SetRegistry(sinkMetaKey, rt.TableValue(sinkMeta))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #member
|
||||||
|
// write(str)
|
||||||
|
// Writes data to a sink.
|
||||||
func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||||
if err := c.CheckNArgs(2); err != nil {
|
if err := c.CheckNArgs(2); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -59,6 +63,9 @@ func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||||
return c.Next(), nil
|
return c.Next(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// #member
|
||||||
|
// writeln(str)
|
||||||
|
// Writes data to a sink with a newline at the end.
|
||||||
func luaSinkWriteln(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
func luaSinkWriteln(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
|
||||||
if err := c.CheckNArgs(2); err != nil {
|
if err := c.CheckNArgs(2); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
1
timer.go
1
timer.go
|
@ -15,6 +15,7 @@ const (
|
||||||
timerTimeout
|
timerTimeout
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// #type
|
||||||
// #interface timers
|
// #interface timers
|
||||||
// #property type What type of timer it is
|
// #property type What type of timer it is
|
||||||
// #property running If the timer is running
|
// #property running If the timer is running
|
||||||
|
|
Loading…
Reference in New Issue