Files
khosra/examples
Claude Opus 5andbdeshi 661fb469e8 expand abbreviations from a definition line
`*[TERM]: expansion` on its own line, PHP Markdown Extra's form, and every
whole-word use in the document becomes <abbr title="…">.

A transformer rather than an inline parser, because a definition may appear
after the use it explains and a parser only ever sees what it has already read.
A block parser rather than a pattern found later, because the line has to stop
being content — an author would notice that going wrong before anything else.

Whole-word matching is the part that would have bitten: without it a definition
of HTML quietly rewrites HTMLish and xHTML too, so both have cases. Code spans,
autolinks, raw HTML and an already-expanded term are skipped, the longest
definition wins where two could match, and the expansion is escaped into the
attribute so a quoted phrase cannot end it.

Definitions are document-scoped. A term defined in a page does not reach an
included fragment, which is parsed on its own bytes exactly as footnotes are —
stated in content-model.md rather than left to be discovered.

The nesting gate caught firstMatch four levels deep; the inner search is its own
function now, which reads better than it did before the warning.

core 2794/2800, ext 1483/2000, 34 gates green, 0 warnings.
2026-08-01 21:25:44 +06:00
..

examples/

demo-site/ is a complete khosra site, kept here to be read and served — the demonstration a person walks through to see what the engine does, and the fixture the engine tests itself against (ADR-0051).

make demo                 # serves it at localhost:8080
khosra check -site examples/demo-site

It is content, not a fixture in disguise: every file is what an author would write. Two things keep it honest, both in verify.sh:

  • TestTheExampleSiteExercisesEveryFeature (in internal/web) serves this directory through the real handler and asserts one case per feature. A feature that changes shape breaks it.
  • khosra check runs over it and must report nothing fatal.

Adding a feature means adding it here, with a case in that test. A feature the example does not show is a feature nobody can see working, and the gates are what stop that from being optional.

What each part is for

Path Demonstrates
site.yaml the two site-level settings: base and title
content/posts/day-01…11 pagination — eleven dated posts against a page size of ten
content/posts/first-light/ two languages, a directory bundle owning a picture, a figure with a caption
content/posts/only-english the fallback chain, and a canonical link naming the variant actually served
content/posts/renamed-thing/ slug moving an address, aliases keeping the old one working
content/posts/unfinished a draft: invisible without -dev on
content/posts/scheduled a future date: published by the clock, with nothing to run
content/comics/the-long-monsoon/ a series — structural membership, sparse order, prev/next/first/last, an archive, and a landing page in two languages
content/art/monsoon-studies/ a gallery: three JPEGs sized into a srcset, and an SVG left exactly as drawn
content/writing/notes-on-water/ an include whose fragment has no URL, and an extras/ tree with a nested directory
content/writing/typography what the engine does to prose, and what it deliberately does not
content/pages/* undated bundles: reachable, and absent from every feed
content/pages/bengali-only a bundle that exists in one non-default language only
content/status/* a titleless bundle — legal, and the one check warning this site expects
templates/list.html overriding a single named block and inheriting the document
static/note.txt files served verbatim

The one expected warning

khosra check reports the titleless status note. That is deliberate: titleless is legal, the theme falls back to the bundle's key, and the warning exists so an author who did not mean it finds out. A fatal finding here would fail verify.sh.