ludic/tools/docgen
Orkuncakilkaya 51ddfa3ce9
Some checks failed
docs / build-and-deploy (push) Failing after 38s
docs: automated documentation pipeline (per-symbol source → pages)
Replace the hardcoded landing page and minimal reference with a generated
documentation site driven by a single source of truth.

- docs/language/**: one file per symbol (93 keywords/types/builtins/namespace
  methods/operators/annotations), each with front-matter (id, kind, tokens,
  sig, tip) + description + a ```ludic example. Seeded by exploding the former
  inline SECTIONS list; these files are now the source of truth.
- docs/site/: site.json (editable hero/features/showcase/messaging, not
  hardcoded) + snippets/*.ludic (real programs shown on the landing page).
- tools/docgen/gen.py: generates index.html, api.html, ludic-highlight.js and
  symbols.json. The highlighter's symbol tables, hover tips and jump anchors
  are GENERATED from the per-symbol files — add a symbol and it is recognized,
  tipped and linked in every snippet automatically. Python stdlib only.
- tools/docgen/check.py: verifies the pages contract + that no snippet token
  links to a missing reference anchor.
- .forgejo/workflows/docs.yml: rebuilds and publishes to the pages branch on
  every push to main touching the docs sources.

Consumes the new Screen.*/Color.*/named-arg API and the 221-color palette.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-29 16:25:54 +03:00
..
assets docs: automated documentation pipeline (per-symbol source → pages) 2026-08-29 16:25:54 +03:00
check.py docs: automated documentation pipeline (per-symbol source → pages) 2026-08-29 16:25:54 +03:00
gen.py docs: automated documentation pipeline (per-symbol source → pages) 2026-08-29 16:25:54 +03:00
palette.py docs: automated documentation pipeline (per-symbol source → pages) 2026-08-29 16:25:54 +03:00
README.md docs: automated documentation pipeline (per-symbol source → pages) 2026-08-29 16:25:54 +03:00

Ludic documentation generator

Generates the public documentation site (the pages branch) from a single source of truth, so the site can never drift from the language.

Source of truth

docs/
  language/<category>/<id>.md    one file per symbol — keyword, type, builtin,
                                 namespace method, operator, annotation
  language/<category>/_section.md   section title + blurb + order
  language/colors/palette.json   the 221 named colors (generated by palette.py)
  site/site.json                 landing-page messaging (hero, features, …)
  site/snippets/*.ludic          the code shown on the landing page (real programs)

A symbol file

---
id: kw-handler            # anchor in api.html (kw-*, type-*, fn-*, <ns>-*, op-*, annot-*)
name: handler             # display name / heading
category: control         # which section (matches the directory)
kind: keyword             # keyword | type | phase | namespace-method | builtin | annotation | operator
tokens: handler           # the literal token(s) the highlighter recognizes & links
sig: handler Name phase P { … }
tip: A block that runs each frame in a given phase.   # one-line hover tip
order: 3
---

Full description — inline HTML (`<code>`, `<b>`) and `backtick code` both work.

```ludic
handler Move phase Update { … }

Add such a file and it appears in the API Reference, is recognized + tipped +
linked in **every** code snippet across the site, and lands in `symbols.json` —
with no other file to edit.

## Build

```bash
python3 tools/docgen/gen.py --out build/pages   # generate the whole site
python3 tools/docgen/check.py build/pages        # sanity-check before publish

Outputs into --out: index.html, api.html, ludic-highlight.js (its symbol tables generated from the sources above), symbols.json, .nojekyll.

No third-party dependencies — Python standard library only.

Publish

.forgejo/workflows/docs.yml runs this on every push to main that touches docs/** or tools/docgen/**, and force-publishes the result to the pages branch root (which the pages-server serves). It needs a repo secret PAGES_TOKEN with write access (or the automatic Actions token enabled for pushes). index.html + .nojekyll always stay at the branch root.

Colors

palette.json is generated by tools/docgen/palette.py from a single PALETTE table, which also generates selfhost/emit_color.ludic. Regenerate colors there; never hand-edit either output.