From fd045ca4a1461867a3276ec5d60857e04f19c3aa Mon Sep 17 00:00:00 2001 From: sammyette Date: Tue, 3 Jun 2025 22:50:22 -0400 Subject: [PATCH] fix: some additions and changes use base url in more places collapse sidebar on every screen size transition to djot --- cmd/docgen/docgen.go | 113 ++++---- docs/api/hilbish.md | 549 ++++++++++++++++++++++++++++++++++++ emmyLuaDocs/hilbish.lua | 44 +-- website/gleam.toml | 1 + website/manifest.toml | 1 + website/package-lock.json | 13 + website/package.json | 1 + website/src/conf.gleam | 5 + website/src/pages/doc.gleam | 70 ++++- website/src/website.gleam | 84 +++--- 10 files changed, 759 insertions(+), 122 deletions(-) create mode 100644 docs/api/hilbish.md create mode 100644 website/src/conf.gleam diff --git a/cmd/docgen/docgen.go b/cmd/docgen/docgen.go index 1521e0e0..a402ef7d 100644 --- a/cmd/docgen/docgen.go +++ b/cmd/docgen/docgen.go @@ -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(`%s`, 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(`%s`, 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(`%s`, 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("") @@ -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("
\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(`%s`, 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("
\n") + b.WriteString("\n") + b.WriteString("\n") + for _, line := range elems { + b.WriteString("\n") + for _, col := range line { + b.WriteString("\n") + } + b.WriteString("\n") + } + b.WriteString("\n") + b.WriteString("
") + b.WriteString(col) + b.WriteString("
\n") + b.WriteString("
\n") + b.WriteString("```\n\n") + + return b.String() +} diff --git a/docs/api/hilbish.md b/docs/api/hilbish.md new file mode 100644 index 00000000..909168e2 --- /dev/null +++ b/docs/api/hilbish.md @@ -0,0 +1,549 @@ +--- +title: Module hilbish +description: +layout: doc +menu: + docs: + parent: "API" +--- + +## Introduction + + + +## Functions + +``` =html +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
alias(cmd, orig)Sets an alias, with a name of `cmd` to another command.
appendPath(dir)Appends the provided dir to the command path (`$PATH`)
complete(scope, cb)Registers a completion handler for the specified scope.
cwd() -> stringReturns the current directory of the shell.
exec(cmd)Replaces the currently running Hilbish instance with the supplied command.
goro(fn)Puts `fn` in a Goroutine.
highlighter(line)Line highlighter handler.
hinter(line, pos)The command line hint handler. It gets called on every key insert to
inputMode(mode)Sets the input mode for Hilbish's line reader.
interval(cb, time) -> @TimerRuns the `cb` function every specified amount of `time`.
multiprompt(str)Changes the text prompt when Hilbish asks for more input.
prependPath(dir)Prepends `dir` to $PATH.
prompt(str, typ)Changes the shell prompt to the provided string.
read(prompt) -> input (string)Read input from the user, using Hilbish's line editor/input reader.
timeout(cb, time) -> @TimerExecuted the `cb` function after a period of `time`.
which(name) -> stringChecks if `name` is a valid command.
+
+``` + +
+
+

+hilbish.alias(cmd, orig) + + + +

+ +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). +``` +
+ +
+
+

+hilbish.appendPath(dir) + + + +

+ +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' +} +``` +
+ +
+
+

+hilbish.complete(scope, cb) + + + +

+ +Registers a completion handler for the specified scope. +A `scope` is expected to be `command.`, +replacing 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) +``` +
+ +
+
+

+hilbish.cwd() -> string + + + +

+ +Returns the current directory of the shell. + +#### Parameters + +This function has no parameters. +
+ +
+
+

+hilbish.exec(cmd) + + + +

+ +Replaces the currently running Hilbish instance with the supplied command. +This can be used to do an in-place restart. + +#### Parameters + +`string` *`cmd`* + + +
+ +
+
+

+hilbish.goro(fn) + + + +

+ +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`* + + +
+ +
+
+

+hilbish.highlighter(line) + + + +

+ +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 +``` +
+ +
+
+

+hilbish.hinter(line, pos) + + + +

+ +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 +``` +
+ +
+
+

+hilbish.inputMode(mode) + + + +

+ +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` + +
+ +
+
+

+hilbish.interval(cb, time) -> Timer + + + +

+ +Runs the `cb` function every specified amount of `time`. +This creates a timer that ticking immediately. + +#### Parameters + +`function` *`cb`* + + +`number` *`time`* +Time in milliseconds. + +
+ +
+
+

+hilbish.multiprompt(str) + + + +

+ +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 '-->' +``` +
+ +
+
+

+hilbish.prependPath(dir) + + + +

+ +Prepends `dir` to $PATH. + +#### Parameters + +`string` *`dir`* + + +
+ +
+
+

+hilbish.prompt(str, typ) + + + +

+ +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 $ +``` +
+ +
+
+

+hilbish.read(prompt) -> input (string) + + + +

+ +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. + +
+ +
+
+

+hilbish.timeout(cb, time) -> Timer + + + +

+ +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. + +
+ +
+
+

+hilbish.which(name) -> string + + + +

+ +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`* + + +
+ +## Types + +
+ +## 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. + diff --git a/emmyLuaDocs/hilbish.lua b/emmyLuaDocs/hilbish.lua index a2935bba..4e5f4f1d 100644 --- a/emmyLuaDocs/hilbish.lua +++ b/emmyLuaDocs/hilbish.lua @@ -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 diff --git a/website/gleam.toml b/website/gleam.toml index d5167f28..7e6bf7a0 100644 --- a/website/gleam.toml +++ b/website/gleam.toml @@ -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" diff --git a/website/manifest.toml b/website/manifest.toml index f1916b16..455b767e 100644 --- a/website/manifest.toml +++ b/website/manifest.toml @@ -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" } diff --git a/website/package-lock.json b/website/package-lock.json index c7c8a357..452a8255 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -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", diff --git a/website/package.json b/website/package.json index 23dd124a..e4c0a702 100644 --- a/website/package.json +++ b/website/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "@djot/djot": "^0.3.2", "@tailwindcss/cli": "^4.1.4", "tailwindcss": "^4.1.4" } diff --git a/website/src/conf.gleam b/website/src/conf.gleam new file mode 100644 index 00000000..53251ca5 --- /dev/null +++ b/website/src/conf.gleam @@ -0,0 +1,5 @@ +pub const base_url = "" + +pub fn base_url_join(cont: String) -> String { + base_url <> "/" <> cont +} diff --git a/website/src/pages/doc.gleam b/website/src/pages/doc.gleam index 131cf5eb..2486cfaf 100644 --- a/website/src/pages/doc.gleam +++ b/website/src/pages/doc.gleam @@ -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", [], ""), ]), 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")], [ diff --git a/website/src/website.gleam b/website/src/website.gleam index b3da6a46..acc2afae 100644 --- a/website/src/website.gleam +++ b/website/src/website.gleam @@ -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(), ]) ]) }