Skip to content

0.1.0 - #1

Merged
breezykermo merged 39 commits into
mainfrom
0.1.0
Sep 20, 2026
Merged

breezykermo merged 39 commits into
mainfrom
0.1.0

Conversation

@breezykermo

Copy link
Copy Markdown
Contributor

No description provided.

@breezykermo
breezykermo force-pushed the 0.1.0 branch 2 times, most recently from 296d7d5 to ba4d3c4 Compare September 9, 2026 14:20
@breezykermo
breezykermo force-pushed the 0.1.0 branch 2 times, most recently from 5bcc70b to 04c5cc8 Compare September 17, 2026 08:53
@breezykermo
breezykermo marked this pull request as ready for review September 17, 2026 18:26
@breezykermo
breezykermo force-pushed the 0.1.0 branch 3 times, most recently from 5cbdb96 to 89d8ff1 Compare September 19, 2026 20:49
A #window(limit: n) renders its body through _blocks, which decides what a
paragraph is by element name and treats an unknown name as a block. Five
names an author writes mid-sentence were missing: smartquote, ref, cite,
smallcaps and symbol.

An apostrophe was the visible cost. "the reader's own browser" came out as
three paragraphs — "the reader", "'", "s own browser" — and the isolated
quote, having no word in front of it, resolved as an opening quote rather
than the apostrophe it was written as. A ref cost the same three-way cut, so
a transcluded sentence pointing at another note broke wherever a limit sent
it through here.

context stays out of the list on purpose: it can hold block-level content, so
naming it inline would merge two real blocks, which is the more expensive of
the two errors.

The demo's w-inner count rises from 6 to 8 because two of those renderings
were being spelled with the split apostrophe and never matched the string the
check counts.
Records the container-ordinal scheme's failure on a real site, the
algorithm that replaces it, and the Typst facts that constrain it.
_name-slug derives a note name from a URL's tail (for reading-list style
bare-link content) or from ordinary lowercase-hyphenated words, dropping a
leading filler word and any leftover scheme word, and keeping whole words
within a configurable character limit. _h3 is a three-character base36 djb2
digest for breaking slug collisions, built on _b36, a fixed-width base36
renderer that keeps a value's low-order digits when it overflows the
requested width.
…dinal

An unnamed note with no usable title now mints its id from a slug of its
own body plus a short content digest, both pure functions of the note's
content — so the id survives being re-rendered by #window, a minted
page, or a nested transclusion, where the old container-ordinal counter
answered for whichever copy of the note happened to render first.
Deletes the container-mint stack and its push/pop pairs entirely, and
rewrites every comment that explained the deleted mechanism to describe
the current one.
Groups every note marker at bundle root by resolved id and compares payloads:
two distinct payloads sharing an id panic naming both notes, one payload
repeated under an id (a note replayed by its authoring vertebra, a minted
page, or a #window) is left alone.
…e URL-tail slug rule, a nested titleless note deriving its own id, and a note keeping the same id across two renderings, plus a rheo-side note whose minted page filename is checked against the id on its authoring vertebra
Rewrites core's readme to describe the four-rung id ladder an unnamed note
now mints through — pinned name, title slug, body slug plus digest, error —
in place of the retired container-ordinal scheme, including the URL-tail
rule and a worked example verified against the actual slug/hash code.
Updates every #ideate fallback description that referenced the old
container-ordinal mechanism to point at the same body-derived fallback.
Marks naming.md as superseded by generating-idea-names.md, and fixes a
stale ideate.typ comment describing beacon-id precedence.
…e name.

_flatten's IK rule (transclusion.typ) stamps each note replay it rebuilds with
a <rookery-replay> marker naming the id being replayed. _assert-unique-names
(validate.typ) uses figure(kind: IK) placements minus those stamps to count
genuine authoring call sites under an id whose payloads are otherwise
identical: one call site is an ordinary replayed note, two or more is two
authored notes landing on the same derived name. The latter now renders a
non-fatal notice (_dup-warning-content) naming the note and suggesting a
pinned name or distinct title, rather than merging silently. Typst has no
warning() builtin, so the notice is plain visible content — rendered inline
on the vertebra for a non-rheo build (template.typ), or on the affected
note's own minted page for a rheo build (.marrow.typ), since bundle-root
content itself cannot carry visible output there.
The native root builds one document from the files it names, where rheo's
spine finds every vertebra under content/ whether a root names it or not. A
window onto a note nobody included panics, which is what content/sub/page.typ's
window onto same-title did.

Also corrects _id-slug's comment, which described a fallback to a counter that
no longer exists.
…t is being laid out

A footnote's inline number used to come from a counter read through context
at layout time, freshly named per rendering to avoid sharing one timeline
across every placement of a transcluded note — but a fresh counter still
needs Typst's layout to converge on its value, and on a heavily-windowed
site it never did: every trial pass read 0 and only the final pass read the
true number.

A footnote's position among its own note's footnotes is knowable the moment
the body is assembled, with no layout involved at all. pure.typ's
_number-footnotes walks a body in document order and replaces each footnote
marker with its literal numbered reference right there, reconstructing every
node it passes through from its own fields so nothing else about the body
changes. _footnoted (bib.typ) calls it instead of installing a show rule
over a per-rendering counter, and the counter is gone.
A #window(tagged: ..)/#window(match: ..) selector now rides the same
<rookery-window-mark> marker as a named window's ids, and _page-links
resolves it against the final registry at render time -- so a page whose
window selects notes by tag, not by name, now appears in those notes'
Backlinks the same way a page naming them directly already did. A window
carrying filter: (a function, which cannot ride on metadata) still
announces nothing resolvable, since filter: narrows a tag selection rather
than replacing it.

Adds a cross-vertebra #window(tagged: "phd") to the demo's root page and a
check.sh assertion pinning the new backlink; a same-page tag window can't
exercise this, since Context already names a note's own origin page and
Backlinks excludes it there on purpose.
…g the selector against the final registry once every note is registered
Neither function reads it — a note's id is now a pure function of its own
content, and the parameter only ever forwarded between the two and from
their four call sites. Removes the parameter from both signatures, strips
the id: argument at every call site (idea.typ, window.typ x2, .marrow.typ),
and drops the now-unused own-id binding and the comments explaining why the
dead parameter was being kept around.
The naming beacon for #ideate now matches the name: vocabulary the rest of
the package uses — #ideate's own name: parameter, #idea-href, #idea-path
and #idea-body all already spoke of a name rather than an id. The metadata
key it writes moves with it (rookery-ideate-name) and so does the private
reader, kept in lockstep so the beacon and its reader never disagree on the
key. No alias: a stale call to #ideate-id is now an unknown-variable error
at compile time.

The rheo demo keeps its file name (demo/rheo/content/ideated-id.typ) and its
minted note names (fixed-id-note, second-para-note) unchanged — only the
import, the two calls, and check.sh's messages move. The readme gains a
migration note alongside the package's existing 0.1.0 migration sections.
…ding to display-name

The permalink a note's hat shows IS the note's name — display-id: false /
display: (id: ..) drops that permalink, so the flag now says display-name: /
display: (name: ..), matching #idea/#idea-href/#idea-path/#idea-body's own
name: vocabulary. Breaking, with no alias: a stale display-id: fails the
compile with #idea's or #window's own unknown-named-argument panic.
… name-color and --idea-name-color

The permalink they colour shows a note's name, not an id, matching the rest
of the package's name-only vocabulary. Adds a Migrating from id-color readme
section alongside the sibling id-to-name migration notes.
…nce per page-link pass

Both reads were being redone inside a loop: the BibTeX entry regex was
rebuilt for every bibliography source, and the page-link walk resolved the
whole note registry again for every window carrying a tag selector.
…t an earlier revision did

The deliberate migration sections stay: they address projects upgrading from
the pre-release lineage, which is a different job from explaining a feature.
…ore's own helper

The builtin folds EPUB into "html", which is what lets one comparison accept
both and reject only the paged target; core's _target() reports EPUB
distinctly, so adopting it here would reject EPUB outright.
…n what it did before

Each keeps the rule it was protecting — the permalink's replay hazard, the
slug-suffix trade, the display keys' auto tier — and drops only the framing
that explained them as departures from an earlier shape.
Covers the unit fixture, both demo suites and the marrow, including two demo
note bodies whose own prose narrated a fixed defect. The printed failure
messages keep their 'no longer' wording: they describe what a future failure
would mean, not a past one.
@breezykermo
breezykermo merged commit b70ae21 into main Sep 20, 2026
2 checks passed
@breezykermo
breezykermo deleted the 0.1.0 branch September 20, 2026 18:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant