Answer prose round 2: the slot rule gives the decided reason, and the touched paragraphs rewrap
CI / gate (push) Successful in 52s
CI / publish (push) Has been skipped

This commit is contained in:
2026-10-04 21:11:18 +02:00
parent 03dbc46763
commit 7dd3ef0b24
3 changed files with 17 additions and 17 deletions
+4 -5
View File
@@ -23,8 +23,8 @@ sanitized and a mention keeps the test user's real account id.
## Markdown in is a canonical fixpoint ## Markdown in is a canonical fixpoint
2026-08-23, the maintainer; every parsed document converts back since 2026-10-04. Goals 1 and 4. Valid while 2026-08-23, the maintainer; every parsed document has converted back since 2026-10-04. Goals 1 and
markdown input may be written by hand. 4. Valid while markdown input may be written by hand.
The other direction is a canonical fixpoint, not byte-identity: human markdown normalizes, the way The other direction is a canonical fixpoint, not byte-identity: human markdown normalizes, the way
back yields the library's canonical spelling, and that spelling round-trips byte-identically. back yields the library's canonical spelling, and that spelling round-trips byte-identically.
@@ -494,9 +494,8 @@ exits 0 on.
while `todo.md` items 59, 60, 61 and 62 are open. while `todo.md` items 59, 60, 61 and 62 are open.
A four-seat comprehension panel scored the project under the floor of 7. Its scoring run of A four-seat comprehension panel scored the project under the floor of 7. Its scoring run of
2026-10-04 is the baseline. Since 2026-10-04, a chunk whose panel scores any dimension 2026-10-04 is the baseline. Since 2026-10-04, a chunk whose panel scores any dimension lower
lower improves what the seats named and scores again, and after three such rounds asks the improves what the seats named and scores again, and after three such rounds asks the maintainer.
maintainer.
| Seat | Navigation | Locality | Shape | Self-sufficiency | Overall | | Seat | Navigation | Locality | Shape | Self-sufficiency | Overall |
|---|---|---|---|---|---| |---|---|---|---|---|---|
+12 -11
View File
@@ -474,15 +474,15 @@ The rest take no content, `!adf:text` included; content on a node that takes non
Shipped !adf:emoji[🎉]{shortName=":tada:"} on !adf:date{timestamp=1756080000000}. Shipped !adf:emoji[🎉]{shortName=":tada:"} on !adf:date{timestamp=1756080000000}.
``` ```
**Text CommonMark cannot hold plainly.** A carriage return in text is `
`, which CommonMark reads **Text CommonMark cannot hold plainly.** A carriage return in text is `
`, which CommonMark
back as the character. Three things are spelled `!adf:text{text="…"}`: a newline inside a text reads back as the character. Three things are spelled `!adf:text{text="…"}`: a newline inside a text
node; a null character, which CommonMark reads as U+FFFD; and a space or tab where CommonMark strips node; a null character, which CommonMark reads as U+FFFD; and a space or tab where CommonMark strips
or refuses one — a block's inline content edges, either side of a line break, an em, strong or or refuses one — a block's inline content edges, either side of a line break, an em, strong or
strike spelling's inner edges, a pipe cell's edges. The reserved key carries the node's text, strike spelling's inner edges, a pipe cell's edges. The reserved key carries the node's text,
escaped by the attribute grammar and never literal: pipe cells trim and pad. The emitter wraps the run alone and escaped by the attribute grammar and never literal: pipe cells trim and pad. The emitter wraps the
leaves the rest plain text, which the spelled run joins on reading. Input reads that spelling run alone and leaves the rest plain text, which the spelled run joins on reading. Input reads that
alone: the value is one run of spaces and tabs, one run of newlines, or one run of null characters, spelling alone: the value is one run of spaces and tabs, one run of newlines, or one run of null
and anything else — a mixed run, or text CommonMark carries plainly — is a named error. characters, and anything else — a mixed run, or text CommonMark carries plainly — is a named error.
``` ```
!adf:text{text=" "}Two leading spaces held, and one text node split!adf:text{text="\n"}over two lines. !adf:text{text=" "}Two leading spaces held, and one text node split!adf:text{text="\n"}over two lines.
@@ -536,11 +536,12 @@ An inline node whose marks no nesting spells — a mark type not listed here, an
spelling does not list, a value that is not the spelling's type, an attribute the spelling needs and spelling does not list, a value that is not the spelling's type, an attribute the spelling needs and
the mark lacks, an empty `attrs` on a mark CommonMark spells, an order putting a code span outside the mark lacks, an empty `attrs` on a mark CommonMark spells, an order putting a code span outside
another mark, `code` over anything but a text node holding text, or over text holding a line ending another mark, `code` over anything but a text node holding text, or over text holding a line ending
or a null character, or a spelling CommonMark's flanking rules cannot open or close where the run sits (`un**-real**istic`), or one or a null character, or a spelling CommonMark's flanking rules cannot open or close where the run
CommonMark's matching pairs elsewhere — the intra-word `*` runs together with a neighbouring `**`, sits (`un**-real**istic`), or one CommonMark's matching pairs elsewhere — the intra-word `*` runs
and the multiple-of-3 rule can leave the merged run's pairing to another delimiter — rides the together with a neighbouring `**`, and the multiple-of-3 rule can leave the merged run's pairing to
inline carry whole. An opaque carry inside a mark spelling is a named error in input: the carry another delimiter — rides the inline carry whole. An opaque carry inside a mark spelling is a named
restores its node exactly, marks included (`docs/decisions.md` §Unknown nodes ride the carry). error in input: the carry restores its node exactly, marks included (`docs/decisions.md` §Unknown
nodes ride the carry).
``` ```
!adf:textColor[**Overdue**]{color="#ae2e24"}, H!adf:subsup[2]{type=sub}O, !adf:underline[signed]. !adf:textColor[**Overdue**]{color="#ae2e24"}, H!adf:subsup[2]{type=sub}O, !adf:underline[signed].
+1 -1
View File
@@ -100,7 +100,7 @@ export function readSoleStringAttribute(span: DirectiveSpan, key: string): Read<
return { value: spelled.decoded } return { value: spelled.decoded }
} }
// No content slot holds a line ending or a null character, which only the text directive spells; the emitter carries such a node. // An inline directive never spans lines, and no content slot holds a null character; the emitter carries such a node.
export function slotFault(type: string, text: string): ConvertFault | undefined { export function slotFault(type: string, text: string): ConvertFault | undefined {
if (/[\n\r]/.test(text)) return { code: 'unspellable-whitespace', message: `the ${type} content slot holds a newline no inline directive spans` } if (/[\n\r]/.test(text)) return { code: 'unspellable-whitespace', message: `the ${type} content slot holds a newline no inline directive spans` }
return holdsNullCharacter(text) ? unsupportedNodeShape(`the ${type} content slot holds a null character: write the node as !adf:carry`) : undefined return holdsNullCharacter(text) ? unsupportedNodeShape(`the ${type} content slot holds a null character: write the node as !adf:carry`) : undefined