Answer prose round 1: the refusal list lives in the error row, the slot rule gives its reason, and stale item citations go
CI / gate (push) Successful in 51s
CI / publish (push) Has been skipped

This commit is contained in:
2026-10-04 21:09:51 +02:00
parent d88f4a4351
commit 04931ab35a
9 changed files with 37 additions and 39 deletions
+9 -10
View File
@@ -450,8 +450,8 @@ the nodes below, `emoji`, `mention` and `status` spell their `text` attribute in
plain text: `[]` is the empty string, absent content is the absent attribute, non-empty content
parsing to anything but one text node carrying neither marks, attributes nor content is a named
error, and so is a `text` key in `{attrs}`. An enclosing mark spelling does not reach into the slot.
A node whose `text` holds a line ending or a null character rides the inline carry; a slot spelling
one is a named error.
An `emoji`, `mention` or `status` whose `text` attribute holds a line ending or a null character
rides the inline carry; a content slot spelling one is a named error.
The rest take no content, `!adf:text` included; content on a node that takes none is a named error.
- `date` — Attributes: `localId` (string), `timestamp` (string, epoch milliseconds).
@@ -475,11 +475,11 @@ Shipped !adf:emoji[🎉]{shortName=":tada:"} on !adf:date{timestamp=175608000000
```
**Text CommonMark cannot hold plainly.** A carriage return in text is `
`, which CommonMark reads
back as the character. A newline inside a text 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 strike spelling's inner edges, a pipe cell's edges —
is spelled `!adf:text{text="…"}`, the reserved key carrying the node's text, escaped by the
attribute grammar and never literal: pipe cells trim and pad. The emitter wraps the run alone and
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
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,
escaped by the attribute grammar and never literal: pipe cells trim and pad. The emitter wraps the run alone and
leaves the rest plain text, which the spelled run joins on reading. Input reads that spelling
alone: the value is one run of spaces and tabs, one run of newlines, or one run of null characters,
and anything else — a mixed run, or text CommonMark carries plainly — is a named error.
@@ -535,9 +535,8 @@ breaks at every node the emitter carries, so no emitted carry sits inside a mark
An inline node whose marks no nesting spells — a mark type not listed here, an attrs key its
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
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
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
CommonMark's matching pairs elsewhere — the intra-word `*` runs together with a neighbouring `**`,
and the multiple-of-3 rule can leave the merged run's pairing to another delimiter — rides the
inline carry whole. An opaque carry inside a mark spelling is a named error in input: the carry