mirror of
https://github.com/larvit/adf-codec.git
synced 2026-11-12 19:58:28 +01:00
7.5 KiB
7.5 KiB
Changelog
Unreleased
- Breaking: each call names the markdown it reads or writes.
adfToMarkdownandmarkdownToAdfare nowadfToLosslessMarkdownandlosslessMarkdownToAdf. A bot's or a model's markdown reads inportableMarkdownToAdf, and markdown known to be strict CommonMark in the newcommonMarkToAdf, where a directive, a pipe table,~~and anadf:fence read as text and code.MIGRATION.mdsays which call to take. - Breaking: the markdown readers refuse a value that is not a string with the new code
not-a-string;MIGRATION.mdlists what each value did before. - Breaking: an attribute value that is not a plain object, array or JSON primitive, such as a
Date,Map, typed array or class instance, makesisAdfDocumentreturnfalseand the converters refuse it asnot-an-adf-document. Before, the converters wrote it as{}or its own keys. Build it as JSON holds it:date.toISOString(),Object.fromEntries(map),Array.from(bytes),{ ...instance }. - Breaking: directives, the inline opaque carry among them (now
!adf:carry{json="…"}), are spelled under an!adf:prefix (!adf:name … !adf:/name,!adf:name[content]{attrs},!adf:name arg {attrs}) in place of the:::/::/:nameforms: text holding an unescaped!adf:is claimed. Convert stored markdown perMIGRATION.md. - Breaking: the block carry is a code fence whose info string
adf:<type>names the node's type, its body the node's JSON withouttype, and a code fence whose info string opensadf:is claimed, andadfis an ordinary code block language. Convert stored markdown perMIGRATION.md. - Breaking: the markdown readers read markdown holding no block as a document whose
contentis empty, as Atlassian's schema requires;!adf:doc {content=none}spells a document holding nocontentkey. - Breaking:
unspellable-characterandunspellable-line-startleaveConvertErrorCode, andadfToLosslessMarkdownno longer returnsunspellable-whitespace. A carriage return in text is spelled and a null character!adf:text{text="\u0000"}; a paragraph line opening with a code span is spelled as that code span, its backticks opening no fence; a code block holding either character, a code span holding a null character, a text node holding no text or holdingcontent, and anemoji,mentionorstatuswhosetextholds a line ending or a null character ride the carry. SeeMIGRATION.md. - Breaking:
unspellable-linkleavesConvertErrorCode; a link whosehrefortitleno CommonMark escape spells is written as!adf:link[text]{attrs}. - Breaking: some directive refusals carry
malformed-directivewhere they carriedunsupported-node-shape, and an empty node's leaf and closed spellings swap which one parses;MIGRATION.mdlists each. - Breaking: a link whose text holds another link keeps the inner link and leaves the outer
brackets literal text, where
0.1.0split the outer link around it; seeMIGRATION.md. - Breaking:
unmappable-imageleavesConvertErrorCode, and every image reads. An image reads as an image only alone in its paragraph, and its title becomes the caption. Anywhere else, after a task marker too, it reads as its alt text linked to its URL; inside a link, as plain text the link marks. A link alone in its paragraph whose whole text is one image reads as that image, with the link marking it. To keep an image an image, give it a paragraph of its own. SeeMIGRATION.md. - Breaking: an empty link text reads as its destination,
[](/url)as/urllinked, and[]()as nothing, where both spellings stayed literal text. SeeMIGRATION.md. - Breaking: a hard break inside emphasis, strike, a link or a directive mark reads holding no
marks, as Atlassian's schema requires, where every reader gave it the marks around it. A link
whose text is only hard breaks reads as its destination linked, followed by those breaks, and
losslessMarkdownToAdfrefuses a directive mark wrapping only hard breaks asunsupported-node-shape.adfToLosslessMarkdownwrites a hard break holding marks as!adf:carry{json="…"}. SeeMIGRATION.md. - Breaking: a list whose bullet character or ordered delimiter changes reads as two lists, as
CommonMark reads it:
- athen* b,1. athen1) b.adfToLosslessMarkdowngives a list right after one of its kind the other marker,*or1), in place of the::listBreakseparator. Convert stored markdown perMIGRATION.md. - Breaking: a link reference definition between two list items, after a blank line and at the
list's own indentation, ends the list, as CommonMark reads it;
0.1.0read one list. SeeMIGRATION.md. - Breaking:
adfToLosslessMarkdownwrites a centered, uncaptioned external image whose one mark is a link holding onlyhrefandtitleas[](href "title"), where it wrote themediaSingledirective. Convert stored markdown perMIGRATION.md. - Fix the time
adfToLosslessMarkdownandadfToPortableMarkdowntake on text holding a long run of*,_,~or backticks, or a heading ending in a long run of#: the time is linear in the run, and a run of 20000*takes milliseconds where it took seconds. - Fix the round-trip, so
losslessMarkdownToAdf(adfToLosslessMarkdown(doc))deep-equalsdocasJSON.parsebuilds it. Two adjacent text nodes CommonMark would read back as one are parted by!adf:textBreak{}, an emptyattrs,contentormarksis spelled{attrs=empty},{content=empty}or{marks=empty},-0is spelled-0, and acodeBlockof several text nodes is a fence per node. AcodeBlockholding other than plain text nodes rides the block carry, where it was refused. - Fix a link
titleholding a null character: it is written as!adf:link[text]{attrs}, where it read back as U+FFFD. - Fix an image inside another image's description: it flattens into the alt text, where it was refused.
- Fix a JSON key holding an escape, in a carried node or a JSON attribute such as
parameters:losslessMarkdownToAdfreads it as the key it spells, where on V8 13.6 and later (Node 24, Deno, Chrome)markdownToAdfcould refuse markdownadfToMarkdownwrote, asunsupported-node-shape, once the process had read a key holding a backslash (V8 bug). - Fix a cyclic document, in which an object holds itself:
adfToLosslessMarkdownandadfToPortableMarkdownrefuse it asnot-an-adf-documentandisAdfDocumentreturnsfalse, where all three hung. - Add
adfToPortableMarkdownandportableMarkdownToAdf, a lossy pair converting ADF to and from markdown GitHub, GitLab and Obsidian render: alerts, callouts, task lists,==highlights==and pipe tables. A task item keeps its paragraphs, then its nested task lists; the rest of the item, such as an image or a code block, stands after the task list. - Spell
rule'scolor,styleandweight,layoutSection'scolumnRuleStyleand a link'scollection,idandoccurrenceKeydirectly where they rode the opaque carry. - The README opens with what the package does and for whom, and
package.jsoncarries search keywords. - The source moves to github.com/larvit/adf-codec, where issues and pull requests go.
0.1.0
- First release: lossless conversion between ADF and an extended markdown flavour —
adfToMarkdown,markdownToAdfandisAdfDocument. Nothing throws, and every error carries acodefrom a closed list.