mirror of
https://github.com/Hilbis/Hilbish
synced 2025-06-06 20:42:03 +00:00
fix: some additions and changes
use base url in more places collapse sidebar on every screen size transition to djot
This commit is contained in:
parent
e9c0329e86
commit
fd045ca4a1
@ -11,8 +11,6 @@ import (
|
||||
"strings"
|
||||
"os"
|
||||
"sync"
|
||||
|
||||
md "github.com/atsushinee/go-markdown-generator/doc"
|
||||
)
|
||||
|
||||
var header = `---
|
||||
@ -495,7 +493,9 @@ provided by Hilbish.
|
||||
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))
|
||||
f.WriteString(heading("Introduction", 2))
|
||||
f.WriteString(modDescription)
|
||||
f.WriteString("\n\n")
|
||||
if len(modu.Docs) != 0 {
|
||||
funcCount := 0
|
||||
for _, dps := range modu.Docs {
|
||||
@ -505,65 +505,48 @@ provided by Hilbish.
|
||||
funcCount++
|
||||
}
|
||||
|
||||
f.WriteString("## Functions\n")
|
||||
f.WriteString(heading("Functions", 2))
|
||||
lastHeader = "functions"
|
||||
|
||||
mdTable := md.NewTable(funcCount, 2)
|
||||
mdTable.SetTitle(0, "")
|
||||
mdTable.SetTitle(1, "")
|
||||
|
||||
diff := 0
|
||||
for i, dps := range modu.Docs {
|
||||
funcTable := [][]string{}
|
||||
for _, dps := range modu.Docs {
|
||||
if dps.IsMember {
|
||||
diff++
|
||||
continue
|
||||
}
|
||||
|
||||
mdTable.SetContent(i - diff, 0, fmt.Sprintf(`<a href="#%s">%s</a>`, dps.FuncName, dps.FuncSig))
|
||||
if len(dps.Doc) == 0 {
|
||||
fmt.Printf("WARNING! Function %s on module %s has no documentation!\n", dps.FuncName, modname)
|
||||
} else {
|
||||
mdTable.SetContent(i - diff, 1, dps.Doc[0])
|
||||
funcTable = append(funcTable, []string{fmt.Sprintf(`<a href="#%s">%s</a>`, dps.FuncName, dps.FuncSig), dps.Doc[0]})
|
||||
}
|
||||
}
|
||||
f.WriteString(mdTable.String())
|
||||
f.WriteString("\n")
|
||||
f.WriteString(table(funcTable))
|
||||
}
|
||||
|
||||
if len(modu.Fields) != 0 {
|
||||
f.WriteString("## Static module fields\n")
|
||||
f.WriteString(heading("Static module fields", 2))
|
||||
|
||||
mdTable := md.NewTable(len(modu.Fields), 2)
|
||||
mdTable.SetTitle(0, "")
|
||||
mdTable.SetTitle(1, "")
|
||||
|
||||
|
||||
for i, dps := range modu.Fields {
|
||||
mdTable.SetContent(i, 0, dps.FuncName)
|
||||
mdTable.SetContent(i, 1, strings.Join(dps.Doc, " "))
|
||||
fieldsTable := [][]string{}
|
||||
for _, dps := range modu.Fields {
|
||||
fieldsTable = append(fieldsTable, []string{dps.FuncName, strings.Join(dps.Doc, " ")})
|
||||
}
|
||||
f.WriteString(mdTable.String())
|
||||
f.WriteString("\n")
|
||||
f.WriteString(table(fieldsTable))
|
||||
}
|
||||
if len(modu.Properties) != 0 {
|
||||
f.WriteString("## Object properties\n")
|
||||
f.WriteString(heading("Object properties", 2))
|
||||
|
||||
mdTable := md.NewTable(len(modu.Fields), 2)
|
||||
mdTable.SetTitle(0, "")
|
||||
mdTable.SetTitle(1, "")
|
||||
|
||||
|
||||
for i, dps := range modu.Properties {
|
||||
mdTable.SetContent(i, 0, dps.FuncName)
|
||||
mdTable.SetContent(i, 1, strings.Join(dps.Doc, " "))
|
||||
propertiesTable := [][]string{}
|
||||
for _, dps := range modu.Properties {
|
||||
propertiesTable = append(propertiesTable, []string{dps.FuncName, strings.Join(dps.Doc, " ")})
|
||||
}
|
||||
f.WriteString(mdTable.String())
|
||||
f.WriteString("\n")
|
||||
f.WriteString(table(propertiesTable))
|
||||
}
|
||||
|
||||
if len(modu.Docs) != 0 {
|
||||
if lastHeader != "functions" {
|
||||
f.WriteString("## Functions\n")
|
||||
f.WriteString(heading("Functions", 2))
|
||||
}
|
||||
for _, dps := range modu.Docs {
|
||||
if dps.IsMember {
|
||||
@ -594,7 +577,8 @@ provided by Hilbish.
|
||||
f.WriteString(doc + " \n")
|
||||
}
|
||||
}
|
||||
f.WriteString("\n#### Parameters\n")
|
||||
f.WriteString("\n")
|
||||
f.WriteString(heading("Parameters", 4))
|
||||
if len(dps.Params) == 0 {
|
||||
f.WriteString("This function has no parameters. \n")
|
||||
}
|
||||
@ -606,7 +590,7 @@ provided by Hilbish.
|
||||
typ = p.Type[3:]
|
||||
}
|
||||
|
||||
f.WriteString(fmt.Sprintf("`%s` **`%s`**", typ, p.Name))
|
||||
f.WriteString(fmt.Sprintf("`%s` *`%s`*", typ, p.Name))
|
||||
if isVariadic {
|
||||
f.WriteString(" (This type is variadic. You can pass an infinite amount of parameters with this type.)")
|
||||
}
|
||||
@ -615,7 +599,7 @@ provided by Hilbish.
|
||||
f.WriteString("\n\n")
|
||||
}
|
||||
if codeExample := dps.Tags["example"]; codeExample != nil {
|
||||
f.WriteString("#### Example\n")
|
||||
f.WriteString(heading("Example", 4))
|
||||
f.WriteString(fmt.Sprintf("```lua\n%s\n```\n", strings.Join(codeExample[0].fields, "\n")))
|
||||
}
|
||||
f.WriteString("</div>")
|
||||
@ -624,31 +608,26 @@ provided by Hilbish.
|
||||
}
|
||||
|
||||
if len(modu.Types) != 0 {
|
||||
f.WriteString("## Types\n")
|
||||
f.WriteString(heading("Types", 2))
|
||||
for _, dps := range modu.Types {
|
||||
f.WriteString("<hr>\n\n")
|
||||
f.WriteString(fmt.Sprintf("## %s\n", dps.FuncName))
|
||||
f.WriteString(heading(dps.FuncName, 2))
|
||||
for _, doc := range dps.Doc {
|
||||
if !strings.HasPrefix(doc, "---") {
|
||||
f.WriteString(doc + "\n")
|
||||
}
|
||||
}
|
||||
if len(dps.Properties) != 0 {
|
||||
f.WriteString("## Object properties\n")
|
||||
f.WriteString(heading("Object Properties", 2))
|
||||
|
||||
mdTable := md.NewTable(len(dps.Properties), 2)
|
||||
mdTable.SetTitle(0, "")
|
||||
mdTable.SetTitle(1, "")
|
||||
|
||||
for i, d := range dps.Properties {
|
||||
mdTable.SetContent(i, 0, d.FuncName)
|
||||
mdTable.SetContent(i, 1, strings.Join(d.Doc, " "))
|
||||
propertiesTable := [][]string{}
|
||||
for _, dps := range modu.Properties {
|
||||
propertiesTable = append(propertiesTable, []string{dps.FuncName, strings.Join(dps.Doc, " ")})
|
||||
}
|
||||
f.WriteString(mdTable.String())
|
||||
f.WriteString("\n")
|
||||
f.WriteString(table(propertiesTable))
|
||||
}
|
||||
f.WriteString("\n")
|
||||
f.WriteString("### Methods\n")
|
||||
f.WriteString(heading("Methods", 3))
|
||||
for _, dps := range modu.Docs {
|
||||
if !dps.IsMember {
|
||||
continue
|
||||
@ -660,7 +639,8 @@ provided by Hilbish.
|
||||
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))
|
||||
//f.WriteString(fmt.Sprintf("#### %s\n", htmlSig))
|
||||
f.WriteString(heading(htmlSig, 4))
|
||||
for _, doc := range dps.Doc {
|
||||
if !strings.HasPrefix(doc, "---") {
|
||||
f.WriteString(doc + "\n")
|
||||
@ -708,3 +688,30 @@ provided by Hilbish.
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func heading(name string, level int) string {
|
||||
return fmt.Sprintf("%s %s\n\n", strings.Repeat("#", level), name)
|
||||
}
|
||||
|
||||
func table(elems [][]string) string {
|
||||
var b strings.Builder
|
||||
b.WriteString("``` =html\n")
|
||||
b.WriteString("<div class='p-2 rounded'>\n")
|
||||
b.WriteString("<table class='w-full'>\n")
|
||||
b.WriteString("<tbody>\n")
|
||||
for _, line := range elems {
|
||||
b.WriteString("<tr class='m-2 bg-neutral-700'>\n")
|
||||
for _, col := range line {
|
||||
b.WriteString("<td>")
|
||||
b.WriteString(col)
|
||||
b.WriteString("</td>\n")
|
||||
}
|
||||
b.WriteString("</tr>\n")
|
||||
}
|
||||
b.WriteString("</tbody>\n")
|
||||
b.WriteString("</table>\n")
|
||||
b.WriteString("</div>\n")
|
||||
b.WriteString("```\n\n")
|
||||
|
||||
return b.String()
|
||||
}
|
||||
|
549
docs/api/hilbish.md
Normal file
549
docs/api/hilbish.md
Normal file
@ -0,0 +1,549 @@
|
||||
---
|
||||
title: Module hilbish
|
||||
description:
|
||||
layout: doc
|
||||
menu:
|
||||
docs:
|
||||
parent: "API"
|
||||
---
|
||||
|
||||
## Introduction
|
||||
|
||||
|
||||
|
||||
## Functions
|
||||
|
||||
``` =html
|
||||
<div class='p-2 rounded'>
|
||||
<table class='w-full'>
|
||||
<tbody>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#alias">alias(cmd, orig)</a></td>
|
||||
<td>Sets an alias, with a name of `cmd` to another command.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#appendPath">appendPath(dir)</a></td>
|
||||
<td>Appends the provided dir to the command path (`$PATH`)</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#complete">complete(scope, cb)</a></td>
|
||||
<td>Registers a completion handler for the specified scope.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#cwd">cwd() -> string</a></td>
|
||||
<td>Returns the current directory of the shell.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#exec">exec(cmd)</a></td>
|
||||
<td>Replaces the currently running Hilbish instance with the supplied command.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#goro">goro(fn)</a></td>
|
||||
<td>Puts `fn` in a Goroutine.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#highlighter">highlighter(line)</a></td>
|
||||
<td>Line highlighter handler.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#hinter">hinter(line, pos)</a></td>
|
||||
<td>The command line hint handler. It gets called on every key insert to</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#inputMode">inputMode(mode)</a></td>
|
||||
<td>Sets the input mode for Hilbish's line reader.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#interval">interval(cb, time) -> @Timer</a></td>
|
||||
<td>Runs the `cb` function every specified amount of `time`.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#multiprompt">multiprompt(str)</a></td>
|
||||
<td>Changes the text prompt when Hilbish asks for more input.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#prependPath">prependPath(dir)</a></td>
|
||||
<td>Prepends `dir` to $PATH.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#prompt">prompt(str, typ)</a></td>
|
||||
<td>Changes the shell prompt to the provided string.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#read">read(prompt) -> input (string)</a></td>
|
||||
<td>Read input from the user, using Hilbish's line editor/input reader.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#timeout">timeout(cb, time) -> @Timer</a></td>
|
||||
<td>Executed the `cb` function after a period of `time`.</td>
|
||||
</tr>
|
||||
<tr class='m-2 bg-neutral-700'>
|
||||
<td><a href="#which">which(name) -> string</a></td>
|
||||
<td>Checks if `name` is a valid command.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
```
|
||||
|
||||
<hr>
|
||||
<div id='alias'>
|
||||
<h4 class='heading'>
|
||||
hilbish.alias(cmd, orig)
|
||||
<a href="#alias" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Sets an alias, with a name of `cmd` to another command.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`cmd`*
|
||||
Name of the alias
|
||||
|
||||
`string` *`orig`*
|
||||
Command that will be aliased
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
-- With this, "ga file" will turn into "git add file"
|
||||
hilbish.alias('ga', 'git add')
|
||||
|
||||
-- Numbered substitutions are supported here!
|
||||
hilbish.alias('dircount', 'ls %1 | wc -l')
|
||||
-- "dircount ~" would count how many files are in ~ (home directory).
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='appendPath'>
|
||||
<h4 class='heading'>
|
||||
hilbish.appendPath(dir)
|
||||
<a href="#appendPath" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Appends the provided dir to the command path (`$PATH`)
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string|table` *`dir`*
|
||||
Directory (or directories) to append to path
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
hilbish.appendPath '~/go/bin'
|
||||
-- Will add ~/go/bin to the command path.
|
||||
|
||||
-- Or do multiple:
|
||||
hilbish.appendPath {
|
||||
'~/go/bin',
|
||||
'~/.local/bin'
|
||||
}
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='complete'>
|
||||
<h4 class='heading'>
|
||||
hilbish.complete(scope, cb)
|
||||
<a href="#complete" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Registers a completion handler for the specified scope.
|
||||
A `scope` is expected to be `command.<cmd>`,
|
||||
replacing <cmd> with the name of the command (for example `command.git`).
|
||||
The documentation for completions, under Features/Completions or `doc completions`
|
||||
provides more details.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`scope`*
|
||||
|
||||
|
||||
`function` *`cb`*
|
||||
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
-- This is a very simple example. Read the full doc for completions for details.
|
||||
hilbish.complete('command.sudo', function(query, ctx, fields)
|
||||
if #fields == 0 then
|
||||
-- complete for commands
|
||||
local comps, pfx = hilbish.completion.bins(query, ctx, fields)
|
||||
local compGroup = {
|
||||
items = comps, -- our list of items to complete
|
||||
type = 'grid' -- what our completions will look like.
|
||||
}
|
||||
|
||||
return {compGroup}, pfx
|
||||
end
|
||||
|
||||
-- otherwise just be boring and return files
|
||||
|
||||
local comps, pfx = hilbish.completion.files(query, ctx, fields)
|
||||
local compGroup = {
|
||||
items = comps,
|
||||
type = 'grid'
|
||||
}
|
||||
|
||||
return {compGroup}, pfx
|
||||
end)
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='cwd'>
|
||||
<h4 class='heading'>
|
||||
hilbish.cwd() -> string
|
||||
<a href="#cwd" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Returns the current directory of the shell.
|
||||
|
||||
#### Parameters
|
||||
|
||||
This function has no parameters.
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='exec'>
|
||||
<h4 class='heading'>
|
||||
hilbish.exec(cmd)
|
||||
<a href="#exec" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Replaces the currently running Hilbish instance with the supplied command.
|
||||
This can be used to do an in-place restart.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`cmd`*
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='goro'>
|
||||
<h4 class='heading'>
|
||||
hilbish.goro(fn)
|
||||
<a href="#goro" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Puts `fn` in a Goroutine.
|
||||
This can be used to run any function in another thread at the same time as other Lua code.
|
||||
**NOTE: THIS FUNCTION MAY CRASH HILBISH IF OUTSIDE VARIABLES ARE ACCESSED.**
|
||||
**This is a limitation of the Lua runtime.**
|
||||
|
||||
#### Parameters
|
||||
|
||||
`function` *`fn`*
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='highlighter'>
|
||||
<h4 class='heading'>
|
||||
hilbish.highlighter(line)
|
||||
<a href="#highlighter" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Line highlighter handler.
|
||||
This is mainly for syntax highlighting, but in reality could set the input
|
||||
of the prompt to *display* anything. The callback is passed the current line
|
||||
and is expected to return a line that will be used as the input display.
|
||||
Note that to set a highlighter, one has to override this function.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`line`*
|
||||
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
--This code will highlight all double quoted strings in green.
|
||||
function hilbish.highlighter(line)
|
||||
return line:gsub('"%w+"', function(c) return lunacolors.green(c) end)
|
||||
end
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='hinter'>
|
||||
<h4 class='heading'>
|
||||
hilbish.hinter(line, pos)
|
||||
<a href="#hinter" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
The command line hint handler. It gets called on every key insert to
|
||||
determine what text to use as an inline hint. It is passed the current
|
||||
line and cursor position. It is expected to return a string which is used
|
||||
as the text for the hint. This is by default a shim. To set hints,
|
||||
override this function with your custom handler.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`line`*
|
||||
|
||||
|
||||
`number` *`pos`*
|
||||
Position of cursor in line. Usually equals string.len(line)
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
-- this will display "hi" after the cursor in a dimmed color.
|
||||
function hilbish.hinter(line, pos)
|
||||
return 'hi'
|
||||
end
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='inputMode'>
|
||||
<h4 class='heading'>
|
||||
hilbish.inputMode(mode)
|
||||
<a href="#inputMode" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Sets the input mode for Hilbish's line reader.
|
||||
`emacs` is the default. Setting it to `vim` changes behavior of input to be
|
||||
Vim-like with modes and Vim keybinds.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`mode`*
|
||||
Can be set to either `emacs` or `vim`
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='interval'>
|
||||
<h4 class='heading'>
|
||||
hilbish.interval(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
|
||||
<a href="#interval" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Runs the `cb` function every specified amount of `time`.
|
||||
This creates a timer that ticking immediately.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`function` *`cb`*
|
||||
|
||||
|
||||
`number` *`time`*
|
||||
Time in milliseconds.
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='multiprompt'>
|
||||
<h4 class='heading'>
|
||||
hilbish.multiprompt(str)
|
||||
<a href="#multiprompt" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Changes the text prompt when Hilbish asks for more input.
|
||||
This will show up when text is incomplete, like a missing quote
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`str`*
|
||||
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
--[[
|
||||
imagine this is your text input:
|
||||
user ~ ∆ echo "hey
|
||||
|
||||
but there's a missing quote! hilbish will now prompt you so the terminal
|
||||
will look like:
|
||||
user ~ ∆ echo "hey
|
||||
--> ...!"
|
||||
|
||||
so then you get
|
||||
user ~ ∆ echo "hey
|
||||
--> ...!"
|
||||
hey ...!
|
||||
]]--
|
||||
hilbish.multiprompt '-->'
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='prependPath'>
|
||||
<h4 class='heading'>
|
||||
hilbish.prependPath(dir)
|
||||
<a href="#prependPath" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Prepends `dir` to $PATH.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`dir`*
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='prompt'>
|
||||
<h4 class='heading'>
|
||||
hilbish.prompt(str, typ)
|
||||
<a href="#prompt" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Changes the shell prompt to the provided string.
|
||||
There are a few verbs that can be used in the prompt text.
|
||||
These will be formatted and replaced with the appropriate values.
|
||||
`%d` - Current working directory
|
||||
`%u` - Name of current user
|
||||
`%h` - Hostname of device
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`str`*
|
||||
|
||||
|
||||
`string` *`typ?`*
|
||||
Type of prompt, being left or right. Left by default.
|
||||
|
||||
#### Example
|
||||
|
||||
```lua
|
||||
-- the default hilbish prompt without color
|
||||
hilbish.prompt '%u %d ∆'
|
||||
-- or something of old:
|
||||
hilbish.prompt '%u@%h :%d $'
|
||||
-- prompt: user@hostname: ~/directory $
|
||||
```
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='read'>
|
||||
<h4 class='heading'>
|
||||
hilbish.read(prompt) -> input (string)
|
||||
<a href="#read" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Read input from the user, using Hilbish's line editor/input reader.
|
||||
This is a separate instance from the one Hilbish actually uses.
|
||||
Returns `input`, will be nil if Ctrl-D is pressed, or an error occurs.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`prompt?`*
|
||||
Text to print before input, can be empty.
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='timeout'>
|
||||
<h4 class='heading'>
|
||||
hilbish.timeout(cb, time) -> <a href="/Hilbish/docs/api/hilbish/hilbish.timers/#timer" style="text-decoration: none;" id="lol">Timer</a>
|
||||
<a href="#timeout" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Executed the `cb` function after a period of `time`.
|
||||
This creates a Timer that starts ticking immediately.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`function` *`cb`*
|
||||
|
||||
|
||||
`number` *`time`*
|
||||
Time to run in milliseconds.
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
<div id='which'>
|
||||
<h4 class='heading'>
|
||||
hilbish.which(name) -> string
|
||||
<a href="#which" class='heading-link'>
|
||||
<i class="fas fa-paperclip"></i>
|
||||
</a>
|
||||
</h4>
|
||||
|
||||
Checks if `name` is a valid command.
|
||||
Will return the path of the binary, or a basename if it's a commander.
|
||||
|
||||
#### Parameters
|
||||
|
||||
`string` *`name`*
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
## Types
|
||||
|
||||
<hr>
|
||||
|
||||
## Sink
|
||||
|
||||
A sink is a structure that has input and/or output to/from a desination.
|
||||
|
||||
### Methods
|
||||
|
||||
#### autoFlush(auto)
|
||||
|
||||
Sets/toggles the option of automatically flushing output.
|
||||
A call with no argument will toggle the value.
|
||||
|
||||
#### flush()
|
||||
|
||||
Flush writes all buffered input to the sink.
|
||||
|
||||
#### read() -> string
|
||||
|
||||
Reads a liine of input from the sink.
|
||||
|
||||
#### readAll() -> string
|
||||
|
||||
Reads all input from the sink.
|
||||
|
||||
#### write(str)
|
||||
|
||||
Writes data to a sink.
|
||||
|
||||
#### writeln(str)
|
||||
|
||||
Writes data to a sink with a newline at the end.
|
||||
|
@ -2,6 +2,28 @@
|
||||
|
||||
local hilbish = {}
|
||||
|
||||
--- Sets/toggles the option of automatically flushing output.
|
||||
--- A call with no argument will toggle the value.
|
||||
--- @param auto boolean|nil
|
||||
function hilbish:autoFlush(auto) end
|
||||
|
||||
--- Flush writes all buffered input to the sink.
|
||||
function hilbish:flush() end
|
||||
|
||||
--- Reads a liine of input from the sink.
|
||||
--- @returns string
|
||||
function hilbish:read() end
|
||||
|
||||
--- Reads all input from the sink.
|
||||
--- @returns string
|
||||
function hilbish:readAll() 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
|
||||
|
||||
--- This is an alias (ha) for the [hilbish.alias](../#alias) function.
|
||||
--- @param alias string
|
||||
--- @param cmd string
|
||||
@ -215,26 +237,4 @@ function hilbish.timers.create(type, time, callback) end
|
||||
--- Retrieves a timer via its ID.
|
||||
function hilbish.timers.get(id) end
|
||||
|
||||
--- Sets/toggles the option of automatically flushing output.
|
||||
--- A call with no argument will toggle the value.
|
||||
--- @param auto boolean|nil
|
||||
function hilbish:autoFlush(auto) end
|
||||
|
||||
--- Flush writes all buffered input to the sink.
|
||||
function hilbish:flush() end
|
||||
|
||||
--- Reads a liine of input from the sink.
|
||||
--- @returns string
|
||||
function hilbish:read() end
|
||||
|
||||
--- Reads all input from the sink.
|
||||
--- @returns string
|
||||
function hilbish:readAll() 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
|
||||
|
||||
return hilbish
|
||||
|
@ -20,6 +20,7 @@ tom = ">= 1.1.1 and < 2.0.0"
|
||||
simplifile = ">= 2.2.1 and < 3.0.0"
|
||||
glaml = ">= 3.0.2 and < 4.0.0"
|
||||
mdex = ">= 0.6.1 and < 1.0.0"
|
||||
jot = ">= 4.0.0 and < 5.0.0"
|
||||
|
||||
[dev-dependencies]
|
||||
gleeunit = ">= 1.0.0 and < 2.0.0"
|
||||
|
@ -60,6 +60,7 @@ packages = [
|
||||
glaml = { version = ">= 3.0.2 and < 4.0.0" }
|
||||
gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" }
|
||||
gleeunit = { version = ">= 1.0.0 and < 2.0.0" }
|
||||
jot = { version = ">= 4.0.0 and < 5.0.0" }
|
||||
lustre = { version = ">= 5.0.2 and < 6.0.0" }
|
||||
lustre_dev_tools = { version = ">= 1.7.1 and < 2.0.0" }
|
||||
lustre_ssg = { git = "https://github.com/lustre-labs/ssg.git", ref = "v0.11.0" }
|
||||
|
13
website/package-lock.json
generated
13
website/package-lock.json
generated
@ -5,10 +5,23 @@
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"@djot/djot": "^0.3.2",
|
||||
"@tailwindcss/cli": "^4.1.4",
|
||||
"tailwindcss": "^4.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@djot/djot": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/@djot/djot/-/djot-0.3.2.tgz",
|
||||
"integrity": "sha512-joMKR24B8rxueyFiJbpZAqEiypjvOyzTxzkhyr0q5mM/sUBaOD3unna/9IxtOotFugViyYlkIRaiXg3xM//zxg==",
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"djot": "lib/cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=17.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@parcel/watcher": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz",
|
||||
|
@ -1,5 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"@djot/djot": "^0.3.2",
|
||||
"@tailwindcss/cli": "^4.1.4",
|
||||
"tailwindcss": "^4.1.4"
|
||||
}
|
||||
|
5
website/src/conf.gleam
Normal file
5
website/src/conf.gleam
Normal file
@ -0,0 +1,5 @@
|
||||
pub const base_url = ""
|
||||
|
||||
pub fn base_url_join(cont: String) -> String {
|
||||
base_url <> "/" <> cont
|
||||
}
|
@ -1,24 +1,26 @@
|
||||
import gleam/dict
|
||||
import gleam/list
|
||||
import gleam/string
|
||||
|
||||
import lustre/attribute
|
||||
import lustre/element
|
||||
import lustre/element/html
|
||||
import lustre/ssg/djot
|
||||
|
||||
import md
|
||||
import jot
|
||||
import post
|
||||
|
||||
pub fn page(p: post.Post, doc_pages_list) -> element.Element(a) {
|
||||
html.div([attribute.class("flex flex-col")], [
|
||||
html.div([attribute.class("block sm:hidden h-10 sticky top-12 flex py-2 px-4 border-b border-b-zinc-300 w-full gap-2 backdrop-blur-sm bg-zinc-300/50 z-50")], [
|
||||
html.div([attribute.class("h-10 flex py-2 px-4 border-b border-b-zinc-300 w-full gap-2 backdrop-blur-sm bg-zinc-300/50 dark:bg-zinc-800/50 z-50")], [
|
||||
html.label([attribute.for("sidebar-toggle"), attribute.class("cursor-pointer")], [
|
||||
element.unsafe_raw_html("", "tag", [], "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" class=\"fill-black\"><path d=\"M120-240v-80h240v80H120Zm0-200v-80h480v80H120Zm0-200v-80h720v80H120Z\"/></svg>"),
|
||||
]),
|
||||
html.span([], [element.text(p.title)])
|
||||
]),
|
||||
html.div([attribute.class("grid sm:flex")], [
|
||||
html.div([attribute.class("grid")], [
|
||||
html.input([attribute.type_("checkbox"), attribute.id("sidebar-toggle"), attribute.class("peer hidden")]),
|
||||
html.div([attribute.class("border-r border-r-zinc-300 col-start-1 row-start-1 sticky top-22 sm:top-12 h-full sm:h-svh bg-neutral-200 basis-3/5 transition-transform duration-300 -translate-x-full sm:translate-x-0 peer-checked:translate-x-0 z-30")], [
|
||||
html.div([attribute.class("border-r border-r-zinc-300 col-start-1 row-start-1 sticky top-22 sm:top-12 h-full sm:h-svh bg-neutral-200 dark:bg-neutral-900 basis-3/5 transition-transform duration-300 -translate-x-full peer-checked:translate-x-0 z-30")], [
|
||||
html.div([attribute.class("p-4 -mb-4 overflow-y-auto h-full")], [
|
||||
html.h2([attribute.class("text-xl font-semibold mb-4")], [element.text("Sidebar")]),
|
||||
html.ul([], list.map(doc_pages_list, fn(post: #(String, post.Post)) {
|
||||
@ -27,16 +29,72 @@ pub fn page(p: post.Post, doc_pages_list) -> element.Element(a) {
|
||||
])
|
||||
]),
|
||||
html.main([attribute.class("col-start-1 row-start-1 transition-all duration-300 peer-checked:filter peer-checked:blur-sm peer-checked:bg-black/30 px-4 pt-2")], [
|
||||
html.h1([], [element.text(p.title)]),
|
||||
html.h1([attribute.class("font-bold text-4xl")], [element.text(p.title)]),
|
||||
// todo: add date of publishing
|
||||
//html.time([], [])
|
||||
//html.small([], [element.text({{p.contents |> string.split(" ") |> list.length} / 200} |> int.to_string <> " min read")]),
|
||||
element.unsafe_raw_html("namespace", "Tag", [], md.md_to_html(p.contents))
|
||||
//element.unsafe_raw_html("namespace", "Tag", [], render_doc(p.contents))
|
||||
..render_doc(p.contents)
|
||||
])
|
||||
])
|
||||
])
|
||||
}
|
||||
|
||||
fn render_doc(md: String) {
|
||||
let renderer = djot.Renderer(
|
||||
..djot.default_renderer(),
|
||||
heading: fn(attrs, level, content) {
|
||||
let size = case level {
|
||||
1 -> "text-4xl"
|
||||
2 -> "text-3xl"
|
||||
3 -> "text-2xl"
|
||||
_ -> "text-xl"
|
||||
}
|
||||
let attr = dict.insert(attrs, "class", "font-bold " <> size)
|
||||
|
||||
case level {
|
||||
1 -> html.h1(to_attr(attr), content)
|
||||
2 -> html.h2(to_attr(attr), content)
|
||||
3 -> html.h3(to_attr(attr), content)
|
||||
_ -> html.p(to_attr(attr), content)
|
||||
}
|
||||
}
|
||||
)
|
||||
djot.render(md, renderer)
|
||||
}
|
||||
|
||||
fn to_attr(attrs) {
|
||||
use attrs, key, val <- dict.fold(attrs, [])
|
||||
[attribute.attribute(key, val), ..attrs]
|
||||
}
|
||||
|
||||
fn render_doc_(md: String) -> String {
|
||||
// w-full m-2 p-2 bg-neutral-700
|
||||
let doc = jot.parse(md)
|
||||
let updated_content = list.map(doc.content, fn(container) {
|
||||
case container {
|
||||
jot.Heading(attributes, level, content) -> {
|
||||
let size = case level {
|
||||
1 -> "text-4xl"
|
||||
2 -> "text-3xl"
|
||||
3 -> "text-2xl"
|
||||
_ -> "text-xl"
|
||||
}
|
||||
let attr = dict.insert(attributes, "class", "font-bold " <> size)
|
||||
jot.Heading(attr, level, content)
|
||||
}
|
||||
_ -> container
|
||||
}
|
||||
})
|
||||
echo doc
|
||||
|
||||
jot.document_to_html(jot.Document(
|
||||
content: updated_content,
|
||||
references: doc.references,
|
||||
footnotes: doc.footnotes
|
||||
))
|
||||
}
|
||||
|
||||
fn page_(p: post.Post, doc_pages_list) -> element.Element(a) {
|
||||
html.div([attribute.class("relative h-screen flex")], [
|
||||
html.div([attribute.class("-mt-2 -mx-4 py-2 px-4 border-b border-b-zinc-300 flex gap-2 font-semibold")], [
|
||||
|
@ -14,12 +14,11 @@ import tom
|
||||
import simplifile
|
||||
import glaml
|
||||
|
||||
import conf
|
||||
import post
|
||||
import pages/index
|
||||
import pages/doc
|
||||
|
||||
const base_url = "https://rosettea.github.io/Hilbish/versions/new-website"
|
||||
|
||||
pub fn main() {
|
||||
let assert Ok(files) = simplifile.get_files("./content")
|
||||
let posts = list.map(files, fn(path: String) {
|
||||
@ -55,8 +54,8 @@ pub fn main() {
|
||||
|
||||
let doc_pages = list.filter(posts, fn(page) {
|
||||
let isdoc = is_doc_page(page.0)
|
||||
io.debug(page.0)
|
||||
io.debug(isdoc)
|
||||
//io.debug(page.0)
|
||||
//io.debug(isdoc)
|
||||
isdoc
|
||||
}) |> list.filter(fn(page) {
|
||||
case page.1.metadata {
|
||||
@ -64,8 +63,8 @@ pub fn main() {
|
||||
option.None -> False
|
||||
}
|
||||
}) |> list.sort(fn(p1, p2) {
|
||||
io.debug(p1)
|
||||
io.debug(p2)
|
||||
//io.debug(p1)
|
||||
//io.debug(p2)
|
||||
let assert option.Some(p1_metadata) = p1.1.metadata
|
||||
let p1_weight = case glaml.select_sugar(glaml.document_root(p1_metadata), "weight") {
|
||||
Ok(glaml.NodeInt(w)) -> w
|
||||
@ -118,42 +117,14 @@ pub fn main() {
|
||||
}
|
||||
|
||||
fn is_doc_page(slug: String) {
|
||||
let is_docs = case slug {
|
||||
case slug {
|
||||
"/docs" <> _ -> True
|
||||
_ -> False
|
||||
}
|
||||
}
|
||||
|
||||
fn base_url_join(cont: String) -> String {
|
||||
base_url <> "/" <> cont
|
||||
}
|
||||
|
||||
fn create_page(content: element.Element(a)) -> element.Element(a) {
|
||||
let description = "Something Unique. Hilbish is the new interactive shell for Lua fans. Extensible, scriptable, configurable: All in Lua."
|
||||
|
||||
html.html([attribute.class("bg-stone-50 dark:bg-neutral-950 text-black dark:text-white")], [
|
||||
html.head([], [
|
||||
html.meta([
|
||||
attribute.name("viewport"),
|
||||
attribute.attribute("content", "width=device-width, initial-scale=1.0")
|
||||
]),
|
||||
html.link([
|
||||
attribute.rel("stylesheet"),
|
||||
attribute.href(base_url_join("tailwind.css"))
|
||||
]),
|
||||
html.title([], "Hilbish"),
|
||||
html.meta([attribute.name("theme-color"), attribute.content("#ff89dd")]),
|
||||
html.meta([attribute.content(base_url_join("hilbish-flower.png")), attribute.attribute("property", "og:image")]),
|
||||
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:title")]), // this should be same as title
|
||||
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:site_name")]),
|
||||
html.meta([attribute.content("website"), attribute.attribute("property", "og:type")]),
|
||||
html.meta([attribute.content(description), attribute.attribute("property", "og:description")]),
|
||||
html.meta([attribute.content(description), attribute.name("description")]),
|
||||
html.meta([attribute.name("keywords"), attribute.content("Lua,Shell,Hilbish,Linux,zsh,bash")]),
|
||||
html.meta([attribute.content(base_url), attribute.attribute("property", "og:url")])
|
||||
]),
|
||||
html.body([], [
|
||||
html.nav([attribute.class("flex sticky top-0 w-full z-50 border-b border-b-zinc-300 backdrop-blur-md h-12")], [
|
||||
fn nav() -> element.Element(a) {
|
||||
html.nav([attribute.class("flex sticky top-0 w-full z-50 border-b border-b-zinc-300 backdrop-blur-md h-12")], [
|
||||
html.div([attribute.class("flex my-auto px-2")], [
|
||||
html.div([], [
|
||||
html.a([attribute.href("/"), attribute.class("flex items-center gap-1")], [
|
||||
@ -169,11 +140,13 @@ fn create_page(content: element.Element(a)) -> element.Element(a) {
|
||||
]),
|
||||
])
|
||||
]),
|
||||
]),
|
||||
content,
|
||||
html.footer([attribute.class("py-4 px-6 flex flex-row justify-around border-t border-t-zinc-300")], [
|
||||
])
|
||||
}
|
||||
|
||||
fn footer() -> element.Element(a) {
|
||||
html.footer([attribute.class("py-4 px-6 flex flex-row justify-around border-t border-t-zinc-300")], [
|
||||
html.div([attribute.class("flex flex-col")], [
|
||||
html.a([attribute.href(base_url), attribute.class("flex items-center gap-1")], [
|
||||
html.a([attribute.href(conf.base_url), attribute.class("flex items-center gap-1")], [
|
||||
html.img([
|
||||
attribute.src("/hilbish-flower.png"),
|
||||
attribute.class("h-24")
|
||||
@ -191,6 +164,35 @@ fn create_page(content: element.Element(a)) -> element.Element(a) {
|
||||
link("https://github.com/Rosettea/Hilbish", "GitHub")
|
||||
])
|
||||
])
|
||||
}
|
||||
fn create_page(content: element.Element(a)) -> element.Element(a) {
|
||||
let description = "Something Unique. Hilbish is the new interactive shell for Lua fans. Extensible, scriptable, configurable: All in Lua."
|
||||
|
||||
html.html([attribute.class("bg-stone-50 dark:bg-neutral-900 text-black dark:text-white")], [
|
||||
html.head([], [
|
||||
html.meta([
|
||||
attribute.name("viewport"),
|
||||
attribute.attribute("content", "width=device-width, initial-scale=1.0")
|
||||
]),
|
||||
html.link([
|
||||
attribute.rel("stylesheet"),
|
||||
attribute.href(conf.base_url_join("tailwind.css"))
|
||||
]),
|
||||
html.title([], "Hilbish"),
|
||||
html.meta([attribute.name("theme-color"), attribute.content("#ff89dd")]),
|
||||
html.meta([attribute.content(conf.base_url_join("hilbish-flower.png")), attribute.attribute("property", "og:image")]),
|
||||
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:title")]), // this should be same as title
|
||||
html.meta([attribute.content("Hilbish"), attribute.attribute("property", "og:site_name")]),
|
||||
html.meta([attribute.content("website"), attribute.attribute("property", "og:type")]),
|
||||
html.meta([attribute.content(description), attribute.attribute("property", "og:description")]),
|
||||
html.meta([attribute.content(description), attribute.name("description")]),
|
||||
html.meta([attribute.name("keywords"), attribute.content("Lua,Shell,Hilbish,Linux,zsh,bash")]),
|
||||
html.meta([attribute.content(conf.base_url), attribute.attribute("property", "og:url")])
|
||||
]),
|
||||
html.body([attribute.class("min-h-screen flex flex-col")], [
|
||||
nav(),
|
||||
content,
|
||||
footer(),
|
||||
])
|
||||
])
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user