diff --git a/spec/flavour.md b/spec/flavour.md index db4b20b..d58b243 100644 --- a/spec/flavour.md +++ b/spec/flavour.md @@ -550,8 +550,8 @@ A block's `marks` key also holds these, which no inline spelling wraps: - `indentation` — Attributes: `level` (number, 1–6). A spelling adds its mark to every inline node it wraps that Atlassian's schema gives the mark. Text -takes every mark, except text marked `code`, which takes only `link`: ``**`npm ci`**`` reads as -plain code. Of the marks a spelling makes, `date`, `emoji`, `hardBreak`, `inlineCard`, `mention` +takes every mark, except text marked `code`, which takes no other spelled mark but `link`: +``**`npm ci`**`` reads as plain code. Of the marks a spelling makes, `date`, `emoji`, `hardBreak`, `inlineCard`, `mention` and `status` take none, and `mediaInline` takes only `border` and `link`. Nesting is the marks array in order, outermost first: `_!adf:underline[x]_` gives marks `[em, underline]`, `!adf:underline[_x_]` the reverse. `adfToLosslessMarkdown` nests in the order the array holds rather than sorting it — `docs/decisions.md` §Equality is deep restores diff --git a/src/markdown/emit/inline-line.ts b/src/markdown/emit/inline-line.ts index ec1a512..efb194d 100644 --- a/src/markdown/emit/inline-line.ts +++ b/src/markdown/emit/inline-line.ts @@ -54,7 +54,7 @@ export function openingLinkTakesDirective(nodes: readonly AdfNode[], path: Conve } export function portableLineFallback(nodes: readonly AdfNode[], container: LineContainer, path: ConvertErrorPath): Result { - const emission = lineSegments(nodes, container, path, freshFallbacks(nodes, 'portable')) + const emission = lineSegments(nodes, container, path, withheldMarkFallbacks(nodes, 'portable')) if (!emission.ok) return emission if (emission.value.carry !== undefined) return failure('unsupported-node-shape', 'an inline node on a portable line has no spelling but the carry', path) const verdict = lineVerdict(emission.value.segments, container, 'portable') @@ -80,7 +80,7 @@ export function tryImageLine(alt: string | undefined, url: string, link?: LinkDe } function emitLine(nodes: readonly AdfNode[], container: LineContainer, path: ConvertErrorPath, flavour: WrittenFlavour): Result { - const fallbacks = freshFallbacks(nodes, flavour) + const fallbacks = withheldMarkFallbacks(nodes, flavour) // Terminates because takeFallback refuses a pass that took no new fallback. for (;;) { const emission = lineSegments(nodes, container, path, fallbacks) @@ -100,7 +100,7 @@ function emitLine(nodes: readonly AdfNode[], container: LineContainer, path: Con } // Seeds the withheld-mark carries once per line, so the run at each mark depth does not rescan every node's marks. -function freshFallbacks(nodes: readonly AdfNode[], flavour: WrittenFlavour): LineFallbacks { +function withheldMarkFallbacks(nodes: readonly AdfNode[], flavour: WrittenFlavour): LineFallbacks { const carried = new Set() for (const [index, node] of nodes.entries()) { const taken = takenMarkTypes(node) @@ -231,7 +231,7 @@ function nodePath(context: InlineContext, index: number): ConvertErrorPath { return [...context.path, 'content', index] } -// Decides the text-node and slot-fault carries up front, so a line holding many of them is emitted once. +// Decides the text-node and slot-fault carries up front, `withheldMarkFallbacks` the withheld-mark ones, so a line holding many of them is emitted once. function carries(node: AdfNode, carried: ReadonlySet, index: number): boolean { if (carried.has(index)) return true if (node.type === 'text') return !isSpellableText(node) || typeof node.text !== 'string' || node.text === ''