2
2
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:
sammyette 2025-06-03 22:50:22 -04:00
parent e9c0329e86
commit fd045ca4a1
Signed by: sammyette
GPG Key ID: 904FC49417B44DCD
10 changed files with 759 additions and 122 deletions

View File

@ -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
View 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.

View File

@ -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

View File

@ -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"

View File

@ -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" }

View File

@ -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",

View File

@ -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
View File

@ -0,0 +1,5 @@
pub const base_url = ""
pub fn base_url_join(cont: String) -> String {
base_url <> "/" <> cont
}

View File

@ -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")], [

View File

@ -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(),
])
])
}