mirror of
				https://github.com/sammy-ette/Hilbish
				synced 2025-08-10 02:52:03 +00:00 
			
		
		
		
	Compare commits
	
		
			5 Commits
		
	
	
		
			efc69ab769
			...
			f2ee600c28
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f2ee600c28 | |||
| 61914f8dc7 | |||
| 6dbb39d404 | |||
| 890f10e176 | |||
| 6b27d14f45 | 
| @ -126,12 +126,12 @@ func docPieceTag(tagName string, tags map[string][]tag) []docPiece { | ||||
| 
 | ||||
| func setupDocType(mod string, typ *doc.Type) *docPiece { | ||||
| 	docs := strings.TrimSpace(typ.Doc) | ||||
| 	inInterface := strings.HasPrefix(docs, "#interface") | ||||
| 	if !inInterface { | ||||
| 	tags, doc := getTagsAndDocs(docs) | ||||
| 
 | ||||
| 	if tags["type"] == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	tags, doc := getTagsAndDocs(docs) | ||||
| 	inInterface := tags["interface"] != nil | ||||
| 
 | ||||
| 	var interfaces string | ||||
| 	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 { | ||||
| 		isMember = true | ||||
| 	} | ||||
| 	var parentMod string | ||||
| 	if inInterface { | ||||
| 		parentMod = mod | ||||
| 	} | ||||
| 	parentMod := mod | ||||
| 	dps := &docPiece{ | ||||
| 		Doc: typeDoc, | ||||
| 		FuncName: typeName, | ||||
| @ -191,13 +188,19 @@ func setupDocType(mod string, typ *doc.Type) *docPiece { | ||||
| 
 | ||||
| func setupDoc(mod string, fun *doc.Func) *docPiece { | ||||
| 	docs := strings.TrimSpace(fun.Doc) | ||||
| 	inInterface := strings.HasPrefix(docs, "#interface") | ||||
| 	if (!strings.HasPrefix(fun.Name, prefix[mod]) && !inInterface) || (strings.ToLower(fun.Name) == "loader" && !inInterface) { | ||||
| 	tags, parts := getTagsAndDocs(docs) | ||||
| 
 | ||||
| 	// 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 | ||||
| 	} | ||||
| 
 | ||||
| 	tags, parts := getTagsAndDocs(docs) | ||||
| 
 | ||||
| start: | ||||
| 	inInterface := tags["interface"] != nil | ||||
| 	var interfaces string | ||||
| 	funcsig := parts[0] | ||||
| 	doc := parts[1:] | ||||
| @ -418,7 +421,11 @@ func main() { | ||||
| 			modDescription := typeTag.ReplaceAllStringFunc(strings.Replace(modu.Description, "<", `\<`, -1), func(typ string) string { | ||||
| 				typName := typ[1:] | ||||
| 				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) | ||||
| 			}) | ||||
| 			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 { | ||||
| 						typName := typ[1:] | ||||
| 						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) | ||||
| 					}) | ||||
| 					f.WriteString(fmt.Sprintf("### %s\n", htmlSig)) | ||||
| @ -487,10 +498,10 @@ func main() { | ||||
| 							continue | ||||
| 						} | ||||
| 						htmlSig := typeTag.ReplaceAllStringFunc(strings.Replace(dps.FuncSig, "<", `\<`, -1), func(typ string) string { | ||||
| 							// todo: get type from global table to link to | ||||
| 							// other pages (hilbish page can link to hilbish.jobs#Job) | ||||
| 							typName := typ[1:] | ||||
| 							linkedTyp := strings.ToLower(typName) // TODO: link | ||||
| 							typName := regexp.MustCompile(`\w+`).FindString(typ[1:]) | ||||
| 							typLookup := typeTable[strings.ToLower(typName)] | ||||
| 							fmt.Printf("%+q, \n", typLookup) | ||||
| 							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) | ||||
| 						}) | ||||
| 						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) { | ||||
| 	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) { | ||||
| 	q := splitForFile(ctx) | ||||
| 	query = q[len(q) - 1] | ||||
| 	query = "" | ||||
| 	if len(q) != 0 { | ||||
| 		query = q[len(q) - 1] | ||||
| 	} | ||||
| 
 | ||||
| 	var completions []string | ||||
| 
 | ||||
| @ -151,11 +158,12 @@ func matchPath(query string) ([]string, string) { | ||||
| 	files, _ := os.ReadDir(path) | ||||
| 	for _, entry := range files { | ||||
| 		// should we handle errors here? | ||||
| 		file, _ := entry.Info() | ||||
| 		fileInfo, err := entry.Info() | ||||
| 		if err == nil && fileInfo.Mode() & os.ModeSymlink != 0 { | ||||
| 			path, _ := filepath.EvalSymlinks(filepath.Join(path, file.Name())) | ||||
| 			file, _ = os.Lstat(path) | ||||
| 		file, err := entry.Info() | ||||
| 		if err == nil && file.Mode() & os.ModeSymlink != 0 { | ||||
| 			path, err := filepath.EvalSymlinks(filepath.Join(path, file.Name())) | ||||
| 			if err == nil { | ||||
| 				file, err = os.Lstat(path) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		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 | ||||
| have is: What is the `sinks` parameter? | ||||
| 
 | ||||
| A sink is a writable/readable pipe, or you can imagine a Lua | ||||
| file. It's used in this case to write to the proper output, | ||||
| incase a user either pipes to another command or redirects somewhere else. | ||||
| The `sinks` parameter is a table with 3 keys: `in`, `out`, | ||||
| and `err`. The values of these is a <a href="/Hilbish/docs/api/hilbish/#sink" style="text-decoration: none;">Sink</a>. | ||||
| 
 | ||||
| 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 | ||||
| to get user input. (**This is currently unimplemented.**) | ||||
| - `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 | ||||
| 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 | ||||
| ### deregister(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. | ||||
| 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. | ||||
| 
 | ||||
| + setMode(mode) > The same as `hilbish.runnerMode` | ||||
| + sh(input) -> input, code, err > Runs `input` in Hilbish's sh interpreter | ||||
| + lua(input) -> input, code, err > Evals `input` as Lua code | ||||
| + sh(input) -> table > Runs `input` in Hilbish's sh interpreter | ||||
| + 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. | ||||
| These functions should be preferred over the previous ones. | ||||
|  | ||||
| @ -179,6 +179,12 @@ function hilbish.jobs:foreground() end | ||||
| --- @param cmd string | ||||
| 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. | ||||
| 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 | ||||
| have is: What is the `sinks` parameter? | ||||
| 
 | ||||
| A sink is a writable/readable pipe, or you can imagine a Lua | ||||
| file. It's used in this case to write to the proper output, | ||||
| incase a user either pipes to another command or redirects somewhere else. | ||||
| The `sinks` parameter is a table with 3 keys: `in`, `out`, | ||||
| and `err`. The values of these is a @Sink. | ||||
| 
 | ||||
| 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 | ||||
| to get user input. (**This is currently unimplemented.**) | ||||
| - `out` is standard output. This is usually where text meant for | ||||
| output should go. | ||||
| - `err` is standard error. This sink is for writing errors, as the | ||||
| 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 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										1
									
								
								job.go
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								job.go
									
									
									
									
									
								
							| @ -18,6 +18,7 @@ import ( | ||||
| var jobs *jobHandler | ||||
| var jobMetaKey = rt.StringValue("hshjob") | ||||
| 
 | ||||
| // #type | ||||
| // #interface jobs | ||||
| // #property cmd The user entered command string for the job. | ||||
| // #property running Whether the job is running or not. | ||||
|  | ||||
| @ -2,8 +2,8 @@ local bait = require 'bait' | ||||
| local lunacolors = require 'lunacolors' | ||||
| 
 | ||||
| hilbish.motd = [[ | ||||
| Hilbish 2.0 is a {red}major{reset} update! If your config doesn't work | ||||
| anymore, that will definitely be why! A MOTD, very message, much day. | ||||
| 1000 commits on the Hilbish repository brings us to {cyan}Version 2.1!{reset} | ||||
| Docs, docs, docs... At least builtins work with pipes now. | ||||
| ]] | ||||
| 
 | ||||
| bait.catch('hilbish.init', function() | ||||
|  | ||||
							
								
								
									
										11
									
								
								sink.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								sink.go
									
									
									
									
									
								
							| @ -11,8 +11,9 @@ import ( | ||||
| 
 | ||||
| var sinkMetaKey = rt.StringValue("hshsink") | ||||
| 
 | ||||
| // a sink is a structure that has input and/or output | ||||
| // it is like a lua file when used in popen, but specific to hilbish | ||||
| // #type | ||||
| // A sink is a structure that has input and/or output to/from | ||||
| // a desination. | ||||
| type sink struct{ | ||||
| 	writer io.Writer | ||||
| 	reader io.Reader | ||||
| @ -40,6 +41,9 @@ func setupSinkType(rtm *rt.Runtime) { | ||||
| 	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) { | ||||
| 	if err := c.CheckNArgs(2); err != nil { | ||||
| 		return nil, err | ||||
| @ -59,6 +63,9 @@ func luaSinkWrite(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { | ||||
| 	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) { | ||||
| 	if err := c.CheckNArgs(2); err != nil { | ||||
| 		return nil, err | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user