# Changelog ## Unreleased - The package's description and keywords say it needs no React, Atlaskit or runtime dependency and runs in Node, Forge, Deno, Bun and browsers, and the README opens with the call to take for each need. The README's first comparison table lists the npm packages running in Node that convert ADF to or from markdown, wrappers and forks aside; its second table lists other ecosystems' libraries and Atlassian's own paths. - `adfToHtml` writes ADF as HTML: paragraphs, headings, lists, quotes, code blocks, rules, hard breaks, a centered, uncaptioned external image holding no attribute but its URL and alt, and `em`, `strong`, `code` and links as their elements. A paragraph, heading, quote, list, list item, code block or rule writes its other attributes as `data-*` attributes, `localId` as `data-local-id`. Every other node is an element of class `adf-carry` holding the node's JSON in `data-adf` and showing its content, links included. Every URL is written as the ADF holds it, `javascript:` included: sanitize HTML from an author you do not trust before showing it. - `htmlToAdf` reads `adfToHtml`'s HTML back to the document it came from, a carry element from its `data-adf`. It refuses any other HTML, including an edit to what a carry element shows, with the codes README §The calls lists. - **Breaking:** `losslessMarkdownToAdf` gives a `date`, `emoji`, `inlineCard`, `mention`, `status` or `mediaInline` only the marks Atlassian's schema lets it hold: `**!adf:mention[@A]{id=…}**` now reads as a plain mention. A link or directive mark around only nodes that cannot take it is `unsupported-node-shape`, even in markdown `adfToLosslessMarkdown` wrote. A link around hard breaks alone still reads as before. `adfToLosslessMarkdown` writes a node holding a mark its type cannot take as `!adf:carry{json="…"}`. `MIGRATION.md` says how to convert stored markdown. - **Breaking:** every reader gives code text no mark but `link` and `annotation`, as Atlassian's schema requires: ``**`npm ci`**`` now reads as plain code, and a directive mark other than a link around only code spans is `unsupported-node-shape`. `adfToLosslessMarkdown` writes code text holding another mark as `!adf:carry{json="…"}`, and `adfToPortableMarkdown` drops that mark. - Every reader keeps the URL and title of an image inside a link's text, where it dropped them: after the link comes `(image)`, which links to the image, so `[look at ![the moon](moon.png "Full") tonight](/moon)` reads as `[look at the moon tonight](/moon) ([image](moon.png "Full"))`. A link to the image's own URL takes no `(image)`, unless the image's title is one the link lacks. - `adfToPortableMarkdown` keeps both targets of a linked external image standing inline, as in a table cell: `[alt](href) ([image](url))`, where it wrote `[alt](url)` and dropped the link's target. - `adfToPortableMarkdown` keeps a link title holding a backslash or an entity reference such as `&`, and in a table cell one holding a `|`, where it dropped the title. It escapes the character where CommonMark would read it otherwise, as in `[docs](https://example.com "AT\&T")`, and `portableMarkdownToAdf` reads the title back. - `losslessMarkdownToAdf` names the CommonMark spelling to write when it refuses a directive whose node CommonMark spells, such as `[![alt](url)](href)` for a linked `!adf:mediaSingle`. - Every reader and writer takes time linear in the text when it holds many `