From 1b0eec19d1cebc93e2bc35879b3c5a88d9f73c9f Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Wed, 4 Nov 2026 16:44:10 +0100 Subject: [PATCH] =?UTF-8?q?Answer=20prose=20round=201:=200=20=F0=9F=94=B4,?= =?UTF-8?q?=207=20=F0=9F=9F=A1=20(0=20misread);=20say=20a=20card=20shows?= =?UTF-8?q?=20its=20name,=20else=20its=20URL,=20and=20tighten=20the=20item?= =?UTF-8?q?=20133=20detail?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/decisions.md | 6 ++---- src/html/node-element.ts | 6 +++--- src/html/parse/html-to-adf.test.ts | 4 ++-- todo.md | 17 ++++++----------- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/docs/decisions.md b/docs/decisions.md index 21f5229..bb016e1 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -442,7 +442,7 @@ it joins the second panel's `` to that portable spelling. Inside a carry element, a card a link marks links to the link's target, and shows its own URL as its text where it has one, so both stay. A card showing only its name keeps its URL in `data-adf` alone. Atlassian's schema gives no card a link mark, so only a hand-built document meets this; -`todo.md` item 133 ends it, in 0.3.0, by writing such cards as their own element. Recorded 2026-10-24 +`todo.md` item 133 settles, in 0.3.0, how such a card is written. Recorded 2026-10-24 without a panel of its own: it puts the second panel's `` around the text a card shows. A fifth panel (2026-11-04, three readers in the same roles, then four more for what the first three @@ -463,9 +463,7 @@ Seven readers picked a date as and `` 2. The maintainer took the leading spelling of each, 2026-11-04: - a mention is `@Mikael`, its `text` the content; -- a card holding `data` and no URL is `Release plan`, `href` the URL its `data` holds and the text its name, else that URL. A card holding both `data` and a `url` rides the carry, since read back its `href` would not say which of the two it spells. - -A card a link marks waits on a spelling of its own, `todo.md` item 133, so it rides the carry. +- a card holding `data` and no URL is `Release plan`, `href` the URL its `data` holds and the text its name, else that URL. A card holding both `data` and a `url` rides the carry: its `href`, read back, could not say which of the two URLs it spells. ## `htmlToAdf` also reads the dialect as a browser serializes it diff --git a/src/html/node-element.ts b/src/html/node-element.ts index 9bc1f25..89323b5 100644 --- a/src/html/node-element.ts +++ b/src/html/node-element.ts @@ -4,7 +4,7 @@ import { inlineNodeModel } from '../adf/inline-nodes.ts' import { nodeAttrs } from '../adf/document.ts' import { shownText, shownUrl } from '../adf/shown-text.ts' -// `shown` is the text the element holds and `leading.value` the attribute right after the class, each `undefined` where the node cannot be written as this element and rides the carry. The reader builds the node from the element's `data-*` attributes and text, then holds both to what `shown` and `leading.value` answer for it, so only what the writer writes reads back. `written` names the attributes the text stands in for, which no `data-*` attribute repeats. +// `shown` is the text the element holds and `leading.value` the attribute right after the class, each `undefined` where the node cannot be written as this element and rides the carry. The reader builds a node from the element's `data-*` attributes and text, and refuses it unless `shown` and `leading.value` give back that text and attribute, so only what the writer writes reads back. `written` names the attributes no `data-*` attribute may hold, since the text or `leading` spells them. export type NodeElement = { build(data: AdfAttributes, shown: string): AdfAttributes class: string @@ -33,7 +33,7 @@ const nodeElements: Readonly> = { class: 'adf-inline-card', element: 'a', leading: { name: 'href', value: (node) => card(node)?.href }, - mismatch: 'holds one URL, as its href and as its text, or the name and URL its data-data holds, as its text and its href; to change the card, change them together', + mismatch: 'holds one URL, as its href and as its text, or the URL its data-data holds as its href and its name, else that URL, as its text; to change the card, change them together', shown: (node) => card(node)?.text, vocabulary: attributesOf('inlineCard'), written: ['url'], @@ -46,7 +46,7 @@ function attributesOf(type: string): AttributeVocabulary { return inlineNodeModel(type)?.attributes ?? {} } -// A card holding `data` shows its name and links to the URL `data` holds; one holding both `data` and a `url` rides the carry, since read back its href would not say which of the two it spells. +// A card holding both `data` and a `url` rides the carry: its href, read back, could not say which of the two URLs it spells. function card(node: AdfNode): { href: string; text: string } | undefined { const { data, url } = nodeAttrs(node) if (data === undefined) return typeof url === 'string' && url !== '' ? { href: url, text: url } : undefined diff --git a/src/html/parse/html-to-adf.test.ts b/src/html/parse/html-to-adf.test.ts index 7dbd2b0..8516f12 100644 --- a/src/html/parse/html-to-adf.test.ts +++ b/src/html/parse/html-to-adf.test.ts @@ -430,8 +430,8 @@ const messages: readonly (readonly [string, string])[] = [ ['
    \n
  1. a
  2. \n
\n', '
    takes start once, before its data-* attributes: found start after start'], ['
    x
    \n', 'data-wrap holds no boolean written as compact JSON'], ['

    \n', ' holds its text, which is not empty: found "

    \\n"'], - ['

    Spec

    \n', ' holds one URL, as its href and as its text, or the name and URL its data-data holds, as its text and its href; to change the card, change them together: found "Spec

    \\n"'], - [`

    Plan

    \n`, ' holds one URL, as its href and as its text, or the name and URL its data-data holds, as its text and its href; to change the card, change them together: found "Plan

    \\n"'], + ['

    Spec

    \n', ' holds one URL, as its href and as its text, or the URL its data-data holds as its href and its name, else that URL, as its text; to change the card, change them together: found "Spec

    \\n"'], + [`

    Plan

    \n`, ' holds one URL, as its href and as its text, or the URL its data-data holds as its href and its name, else that URL, as its text; to change the card, change them together: found "Plan

    \\n"'], ['

    \n', '

    \\n"'], ['

    a

    \n', ' takes no data-size attribute'], ['

    a&b

    \n', 'text escapes & as &, < as < and > as >, and holds no character HTML cannot hold: found "&b

    \\n"'], diff --git a/todo.md b/todo.md index 47a08fe..302dc1c 100644 --- a/todo.md +++ b/todo.md @@ -12,7 +12,7 @@ | ID | Release | Blocked by | Exempt | Item | L | E | I | R | S | Moves | Score | |---|---|---|---|---|---|---|---|---|---|---|---| -| 133 | 0.3.0 | | question | **Write an inline card a link marks as semantic HTML in `adfToHtml` and read it back in `htmlToAdf`, in place of the carry element.** | 2 | 2 | 2 | 4 | 4 | 6 by 3 | 3.0 | +| 133 | 0.3.0 | | question | **Record how `adfToHtml` writes an inline card a link marks in `docs/decisions.md` §The HTML dialect, and make `adfToHtml` and `htmlToAdf` follow it.** | 2 | 2 | 2 | 4 | 4 | 6 by 3 | 3.0 | | 163 | 0.3.0 | | | **Gather a corpus of real-world ADF documents from public Jira and Confluence sites, each recording where it came from and under what licence.** | 3 | 2 | 4 | 7 | 4 | 6 by 3 | 3.0 | | 164 | 0.3.0 | 163 | | **Publish a feature table setting chosen corpus examples beside what each call writes for them, readable at a glance by people and parseable by LLMs, and kept current by the gate.** | 3 | 2 | 1 | 4 | 5 | 3 by 6, 6 by 4 | 6.2 | | 165 | 0.3.0 | 164 | | **Have a reader panel seated from `## Audience` judge each feature-table row reasonable or not, and file an item for each row it rejects.** | 2 | 2 | 1 | 3 | 3 | 6 by 5 | 7.5 | @@ -69,18 +69,13 @@ ## Details -### 133. Write an inline card a link marks as semantic HTML in `adfToHtml` and read it back in `htmlToAdf`, in place of the carry element. - -Mentions and cards holding `data` are elements since the maintainer took the fifth writer panel's -leading spellings (`docs/decisions.md` §The HTML dialect). A card a link marks still rides the carry, -which shows the link's target as the link and the card's URL as its text, so both stay in sight. -Atlassian's schema gives no card a link mark, so only a hand-built document meets this. +### 133. Record how `adfToHtml` writes an inline card a link marks in `docs/decisions.md` §The HTML dialect, and make `adfToHtml` and `htmlToAdf` follow it. Class: the HTML dialect's spellings. Earlier entries: a card is ``, -and HTML nests no `` in an ``, so the card's element has no room for the link beside it. The -nearest candidate keeps the carry: "A card a link marks rides the carry, which keeps both targets in -sight; no document Atlassian's editor writes holds one." Its instance is today's output, so the -choice is the maintainer's: this item ends with that entry, or with a spelling the maintainer names. +and HTML nests no `` in an ``, so the card's element leaves no room for the link. Candidate +entry: "A card a link marks rides the carry, which links to the link's target and shows the card's +URL where it has one; no document Atlassian's editor writes holds one." Its instance is today's +output. The item ends with that entry or with a spelling the maintainer names. ### 163. Gather a corpus of real-world ADF documents from public Jira and Confluence sites, each recording where it came from and under what licence.