github-markdown-adf 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -2
- package/dist/browser/index.iife.js +25 -25
- package/dist/browser/index.js +16 -16
- package/dist/index.cjs +76 -70
- package/dist/index.d.cts +14 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +14 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +76 -70
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -150,41 +150,45 @@ const ALERT_TO_PANEL = {
|
|
|
150
150
|
WARNING: "warning",
|
|
151
151
|
CAUTION: "error"
|
|
152
152
|
};
|
|
153
|
-
function
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
type: "paragraph",
|
|
167
|
-
children: [...remainingFirstParagraphText ? [{
|
|
168
|
-
type: "text",
|
|
169
|
-
value: remainingFirstParagraphText
|
|
170
|
-
}] : [], ...remainingChildren]
|
|
171
|
-
};
|
|
172
|
-
if (newParagraph.children.length > 0) contentNodes.push(transformParagraph(newParagraph));
|
|
173
|
-
}
|
|
174
|
-
const restChildren = node.children.slice(1);
|
|
175
|
-
contentNodes.push(...transformChildren(restChildren));
|
|
176
|
-
if (contentNodes.length === 0) contentNodes.push({
|
|
177
|
-
type: "paragraph",
|
|
178
|
-
content: []
|
|
179
|
-
});
|
|
180
|
-
return {
|
|
181
|
-
type: "panel",
|
|
182
|
-
attrs: { panelType },
|
|
183
|
-
content: contentNodes
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
}
|
|
153
|
+
function buildPanelContent(firstChild, restChildren, transformChildren) {
|
|
154
|
+
const remainingText = firstChild.children[0].value.replace(ALERT_PATTERN, "").trim();
|
|
155
|
+
const remainingInlines = firstChild.children.slice(1);
|
|
156
|
+
const contentNodes = [];
|
|
157
|
+
if (remainingText || remainingInlines.length > 0) {
|
|
158
|
+
const paragraph = {
|
|
159
|
+
type: "paragraph",
|
|
160
|
+
children: [...remainingText ? [{
|
|
161
|
+
type: "text",
|
|
162
|
+
value: remainingText
|
|
163
|
+
}] : [], ...remainingInlines]
|
|
164
|
+
};
|
|
165
|
+
if (paragraph.children.length > 0) contentNodes.push(transformParagraph(paragraph));
|
|
187
166
|
}
|
|
167
|
+
contentNodes.push(...transformChildren(restChildren));
|
|
168
|
+
if (contentNodes.length === 0) contentNodes.push({
|
|
169
|
+
type: "paragraph",
|
|
170
|
+
content: []
|
|
171
|
+
});
|
|
172
|
+
return contentNodes;
|
|
173
|
+
}
|
|
174
|
+
function tryTransformAlert(node, transformChildren) {
|
|
175
|
+
const firstChild = node.children[0];
|
|
176
|
+
if (firstChild?.type !== "paragraph") return null;
|
|
177
|
+
const firstText = firstChild.children[0];
|
|
178
|
+
if (firstText?.type !== "text") return null;
|
|
179
|
+
const match = ALERT_PATTERN.exec(firstText.value);
|
|
180
|
+
if (!match) return null;
|
|
181
|
+
const panelType = ALERT_TO_PANEL[(match[1] ?? "NOTE").toUpperCase()] ?? "info";
|
|
182
|
+
const content = buildPanelContent(firstChild, node.children.slice(1), transformChildren);
|
|
183
|
+
return {
|
|
184
|
+
type: "panel",
|
|
185
|
+
attrs: { panelType },
|
|
186
|
+
content
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function transformBlockquote(node, transformChildren) {
|
|
190
|
+
const panel = tryTransformAlert(node, transformChildren);
|
|
191
|
+
if (panel) return panel;
|
|
188
192
|
const content = transformChildren(node.children);
|
|
189
193
|
return {
|
|
190
194
|
type: "blockquote",
|
|
@@ -599,15 +603,17 @@ function applyMarks(text, marks) {
|
|
|
599
603
|
}
|
|
600
604
|
//#endregion
|
|
601
605
|
//#region src/adf-to-md/serialize/inlines.ts
|
|
602
|
-
function serializeInlineNodes(nodes) {
|
|
606
|
+
function serializeInlineNodes(nodes, options) {
|
|
603
607
|
if (!nodes || nodes.length === 0) return "";
|
|
604
|
-
return nodes.map(serializeInline).join("");
|
|
608
|
+
return nodes.map((node) => serializeInline(node, options)).join("");
|
|
605
609
|
}
|
|
606
|
-
function serializeInline(node) {
|
|
610
|
+
function serializeInline(node, options) {
|
|
607
611
|
switch (node.type) {
|
|
608
612
|
case "text": return applyMarks(escapeMarkdown(node.text), node.marks);
|
|
609
613
|
case "hardBreak": return "\\\n";
|
|
610
|
-
case "mention":
|
|
614
|
+
case "mention":
|
|
615
|
+
if (options?.mentions === false) return node.attrs.text ?? node.attrs.id;
|
|
616
|
+
return node.attrs.text ?? `@${node.attrs.id}`;
|
|
611
617
|
case "emoji": return node.attrs.text ?? `:${node.attrs.shortName}:`;
|
|
612
618
|
case "date": return node.attrs.timestamp;
|
|
613
619
|
case "status": return `\`[${node.attrs.text}]\``;
|
|
@@ -618,11 +624,11 @@ function serializeInline(node) {
|
|
|
618
624
|
}
|
|
619
625
|
//#endregion
|
|
620
626
|
//#region src/adf-to-md/serialize/blocks.ts
|
|
621
|
-
function serializeHeading(node) {
|
|
622
|
-
return `${"#".repeat(node.attrs.level)} ${serializeInlineNodes(node.content)}`;
|
|
627
|
+
function serializeHeading(node, options) {
|
|
628
|
+
return `${"#".repeat(node.attrs.level)} ${serializeInlineNodes(node.content, options)}`;
|
|
623
629
|
}
|
|
624
|
-
function serializeParagraph(node) {
|
|
625
|
-
return serializeInlineNodes(node.content);
|
|
630
|
+
function serializeParagraph(node, options) {
|
|
631
|
+
return serializeInlineNodes(node.content, options);
|
|
626
632
|
}
|
|
627
633
|
function serializeCodeBlock(node) {
|
|
628
634
|
return `\`\`\`${node.attrs?.language ?? ""}\n${node.content?.map((t) => t.text).join("") ?? ""}\n\`\`\``;
|
|
@@ -635,29 +641,29 @@ function serializeBlockquote(node, serializeBlock) {
|
|
|
635
641
|
}
|
|
636
642
|
//#endregion
|
|
637
643
|
//#region src/adf-to-md/serialize/lists.ts
|
|
638
|
-
function serializeBulletList(node, depth = 0) {
|
|
639
|
-
return node.content.map((item) => serializeListItem(item, "-", depth)).join("\n");
|
|
644
|
+
function serializeBulletList(node, depth = 0, options) {
|
|
645
|
+
return node.content.map((item) => serializeListItem(item, "-", depth, options)).join("\n");
|
|
640
646
|
}
|
|
641
|
-
function serializeOrderedList(node, depth = 0) {
|
|
647
|
+
function serializeOrderedList(node, depth = 0, options) {
|
|
642
648
|
const start = node.attrs?.order ?? 1;
|
|
643
|
-
return node.content.map((item, i) => serializeListItem(item, `${start + i}.`, depth)).join("\n");
|
|
649
|
+
return node.content.map((item, i) => serializeListItem(item, `${start + i}.`, depth, options)).join("\n");
|
|
644
650
|
}
|
|
645
|
-
function serializeTaskList(node, depth = 0) {
|
|
651
|
+
function serializeTaskList(node, depth = 0, options) {
|
|
646
652
|
return node.content.map((item) => {
|
|
647
|
-
return `${" ".repeat(depth)}- ${item.attrs.state === "DONE" ? "[x]" : "[ ]"} ${serializeInlineNodes(item.content)}`;
|
|
653
|
+
return `${" ".repeat(depth)}- ${item.attrs.state === "DONE" ? "[x]" : "[ ]"} ${serializeInlineNodes(item.content, options)}`;
|
|
648
654
|
}).join("\n");
|
|
649
655
|
}
|
|
650
|
-
function serializeDecisionList(node, depth = 0) {
|
|
656
|
+
function serializeDecisionList(node, depth = 0, options) {
|
|
651
657
|
return node.content.map((item) => {
|
|
652
|
-
return `${" ".repeat(depth)}- [x] ${serializeInlineNodes(item.content)}`;
|
|
658
|
+
return `${" ".repeat(depth)}- [x] ${serializeInlineNodes(item.content, options)}`;
|
|
653
659
|
}).join("\n");
|
|
654
660
|
}
|
|
655
|
-
function serializeListItem(node, bullet, depth) {
|
|
661
|
+
function serializeListItem(node, bullet, depth, options) {
|
|
656
662
|
const indent = " ".repeat(depth);
|
|
657
663
|
const parts = [];
|
|
658
|
-
for (const child of node.content) if (child.type === "paragraph") parts.push(serializeInlineNodes(child.content));
|
|
659
|
-
else if (child.type === "bulletList") parts.push("\n" + serializeBulletList(child, depth + 1));
|
|
660
|
-
else if (child.type === "orderedList") parts.push("\n" + serializeOrderedList(child, depth + 1));
|
|
664
|
+
for (const child of node.content) if (child.type === "paragraph") parts.push(serializeInlineNodes(child.content, options));
|
|
665
|
+
else if (child.type === "bulletList") parts.push("\n" + serializeBulletList(child, depth + 1, options));
|
|
666
|
+
else if (child.type === "orderedList") parts.push("\n" + serializeOrderedList(child, depth + 1, options));
|
|
661
667
|
else if (child.type === "codeBlock") {
|
|
662
668
|
const lang = child.attrs?.language ?? "";
|
|
663
669
|
const code = child.content?.map((t) => t.text).join("") ?? "";
|
|
@@ -738,35 +744,35 @@ function serializeTable(node) {
|
|
|
738
744
|
}
|
|
739
745
|
//#endregion
|
|
740
746
|
//#region src/adf-to-md/serialize/index.ts
|
|
741
|
-
function serializeBlock(node) {
|
|
747
|
+
function serializeBlock(node, options) {
|
|
742
748
|
switch (node.type) {
|
|
743
|
-
case "paragraph": return serializeParagraph(node);
|
|
744
|
-
case "heading": return serializeHeading(node);
|
|
749
|
+
case "paragraph": return serializeParagraph(node, options);
|
|
750
|
+
case "heading": return serializeHeading(node, options);
|
|
745
751
|
case "codeBlock": return serializeCodeBlock(node);
|
|
746
752
|
case "rule": return serializeRule(node);
|
|
747
|
-
case "blockquote": return serializeBlockquote(node, serializeBlock);
|
|
748
|
-
case "bulletList": return serializeBulletList(node);
|
|
749
|
-
case "orderedList": return serializeOrderedList(node);
|
|
750
|
-
case "taskList": return serializeTaskList(node);
|
|
751
|
-
case "decisionList": return serializeDecisionList(node);
|
|
753
|
+
case "blockquote": return serializeBlockquote(node, (n) => serializeBlock(n, options));
|
|
754
|
+
case "bulletList": return serializeBulletList(node, 0, options);
|
|
755
|
+
case "orderedList": return serializeOrderedList(node, 0, options);
|
|
756
|
+
case "taskList": return serializeTaskList(node, 0, options);
|
|
757
|
+
case "decisionList": return serializeDecisionList(node, 0, options);
|
|
752
758
|
case "table": return serializeTable(node);
|
|
753
|
-
case "panel": return serializePanel(node, serializeBlock);
|
|
754
|
-
case "expand": return serializeExpand(node, serializeBlock);
|
|
755
|
-
case "nestedExpand": return serializeExpand(node, serializeBlock);
|
|
759
|
+
case "panel": return serializePanel(node, (n) => serializeBlock(n, options));
|
|
760
|
+
case "expand": return serializeExpand(node, (n) => serializeBlock(n, options));
|
|
761
|
+
case "nestedExpand": return serializeExpand(node, (n) => serializeBlock(n, options));
|
|
756
762
|
case "mediaSingle": return serializeMediaSingle(node);
|
|
757
763
|
case "blockCard": return serializeBlockCard(node);
|
|
758
764
|
case "embedCard": return serializeEmbedCard(node);
|
|
759
|
-
case "layoutSection": return serializeLayoutSection(node);
|
|
765
|
+
case "layoutSection": return serializeLayoutSection(node, options);
|
|
760
766
|
default: return "";
|
|
761
767
|
}
|
|
762
768
|
}
|
|
763
|
-
function serializeLayoutSection(node) {
|
|
764
|
-
return node.content.map((col) => col.content.map((child) => serializeBlock(child)).join("\n\n")).join("\n\n---\n\n");
|
|
769
|
+
function serializeLayoutSection(node, options) {
|
|
770
|
+
return node.content.map((col) => col.content.map((child) => serializeBlock(child, options)).join("\n\n")).join("\n\n---\n\n");
|
|
765
771
|
}
|
|
766
772
|
//#endregion
|
|
767
773
|
//#region src/adf-to-md/index.ts
|
|
768
|
-
function adfToMd(adf) {
|
|
769
|
-
return sanitizeMarkdown(adf.content.map((node) => serializeBlock(node)).filter((p) => p.length > 0).join("\n\n"));
|
|
774
|
+
function adfToMd(adf, options) {
|
|
775
|
+
return sanitizeMarkdown(adf.content.map((node) => serializeBlock(node, options)).filter((p) => p.length > 0).join("\n\n"));
|
|
770
776
|
}
|
|
771
777
|
//#endregion
|
|
772
778
|
export { adfToMd, mdToAdf };
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/md-to-adf/parser.ts","../src/utils/language.ts","../src/md-to-adf/transform/marks.ts","../src/md-to-adf/transform/blocks.ts","../src/md-to-adf/transform/expand.ts","../src/md-to-adf/transform/inlines.ts","../src/utils/id.ts","../src/md-to-adf/transform/lists.ts","../src/md-to-adf/transform/tables.ts","../src/md-to-adf/transform/index.ts","../src/utils/sanitize.ts","../src/md-to-adf/index.ts","../src/utils/escape.ts","../src/adf-to-md/serialize/marks.ts","../src/adf-to-md/serialize/inlines.ts","../src/adf-to-md/serialize/blocks.ts","../src/adf-to-md/serialize/lists.ts","../src/adf-to-md/serialize/panels.ts","../src/adf-to-md/serialize/tables.ts","../src/adf-to-md/serialize/index.ts","../src/adf-to-md/index.ts"],"sourcesContent":["import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkGfm from 'remark-gfm';\nimport type { Root } from 'mdast';\n\nconst processor = unified().use(remarkParse).use(remarkGfm);\n\nexport function parseMarkdown(markdown: string): Root {\n return processor.parse(markdown) as Root;\n}\n","const LANGUAGE_ALIASES: Record<string, string> = {\n ts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n tsx: 'typescript',\n py: 'python',\n rb: 'ruby',\n sh: 'bash',\n zsh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n md: 'markdown',\n rs: 'rust',\n kt: 'kotlin',\n tf: 'hcl',\n dockerfile: 'docker',\n};\n\nexport function normalizeLanguage(\n lang: string | null | undefined,\n): string | undefined {\n if (!lang) return undefined;\n const lower = lang.toLowerCase().trim();\n if (!lower) return undefined;\n return LANGUAGE_ALIASES[lower] ?? lower;\n}\n","import type { PhrasingContent } from 'mdast';\nimport type { AdfInlineNode, AdfMark, TextNode } from '../../types/index.js';\n\nconst OPEN_HTML_TAG = /^<(ins|sub|sup)>$/i;\nconst CLOSE_HTML_TAG = /^<\\/(ins|sub|sup)>$/i;\n\nfunction htmlTagToMark(tag: string): AdfMark | null {\n const t = tag.toLowerCase();\n if (t === 'ins') return { type: 'underline' };\n if (t === 'sub') return { type: 'subsup', attrs: { type: 'sub' } };\n if (t === 'sup') return { type: 'subsup', attrs: { type: 'sup' } };\n return null;\n}\n\nexport function phrasingToInlineNodes(\n nodes: PhrasingContent[],\n): AdfInlineNode[] {\n const markStack: AdfMark[] = [];\n const result: AdfInlineNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'html') {\n const openMatch = OPEN_HTML_TAG.exec(node.value);\n if (openMatch) {\n const mark = htmlTagToMark(openMatch[1] ?? '');\n if (mark) markStack.push(mark);\n continue;\n }\n const closeMatch = CLOSE_HTML_TAG.exec(node.value);\n if (closeMatch) {\n markStack.pop();\n continue;\n }\n }\n result.push(...phrasingToInline(node, markStack.slice()));\n }\n\n return result;\n}\n\nfunction phrasingToInline(\n node: PhrasingContent,\n inheritedMarks: AdfMark[],\n): AdfInlineNode[] {\n switch (node.type) {\n case 'text':\n if (!node.value) return [];\n return [makeText(node.value, inheritedMarks)];\n case 'inlineCode': {\n const marks: AdfMark[] = [\n ...inheritedMarks.filter((m) => m.type === 'link'),\n { type: 'code' },\n ];\n return [makeText(node.value, marks)];\n }\n case 'strong':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'strong' }]),\n );\n case 'emphasis':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'em' }]),\n );\n case 'delete':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'strike' }]),\n );\n case 'link': {\n const linkMark: AdfMark = {\n type: 'link',\n attrs: { href: node.url, ...(node.title ? { title: node.title } : {}) },\n };\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, linkMark]),\n );\n }\n case 'image':\n return [{ type: 'inlineCard', attrs: { url: node.url } }];\n case 'break':\n return [{ type: 'hardBreak' }];\n case 'html':\n return parseHtmlInline(node.value, inheritedMarks);\n case 'linkReference':\n case 'imageReference':\n return [];\n default:\n return [];\n }\n}\n\nfunction makeText(value: string, marks: AdfMark[]): TextNode {\n const node: TextNode = { type: 'text', text: value };\n if (marks.length > 0) node.marks = marks;\n return node;\n}\n\nfunction parseHtmlInline(\n html: string,\n inheritedMarks: AdfMark[],\n): AdfInlineNode[] {\n const stripped = html.replace(/<[^>]+>/g, '');\n if (stripped) return [makeText(stripped, inheritedMarks)];\n return [];\n}\n","import type {\n BlockContent,\n Blockquote,\n Code,\n Heading,\n Paragraph,\n ThematicBreak,\n} from 'mdast';\nimport type {\n AdfTopLevelBlockNode,\n BlockquoteNode,\n CodeBlockNode,\n HeadingNode,\n PanelNode,\n PanelType,\n ParagraphNode,\n RuleNode,\n} from '../../types/index.js';\nimport { normalizeLanguage } from '../../utils/language.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\nexport function transformHeading(node: Heading): HeadingNode {\n return {\n type: 'heading',\n attrs: { level: node.depth as 1 | 2 | 3 | 4 | 5 | 6 },\n content: phrasingToInlineNodes(node.children),\n };\n}\n\nexport function transformParagraph(node: Paragraph): ParagraphNode {\n const content = phrasingToInlineNodes(node.children);\n return { type: 'paragraph', content };\n}\n\nexport function transformCode(node: Code): CodeBlockNode {\n const result: CodeBlockNode = { type: 'codeBlock' };\n const lang = normalizeLanguage(node.lang);\n if (lang) result.attrs = { language: lang };\n if (node.value) result.content = [{ type: 'text', text: node.value }];\n return result;\n}\n\nexport function transformThematicBreak(_node: ThematicBreak): RuleNode {\n return { type: 'rule' };\n}\n\nconst ALERT_PATTERN = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*/i;\n\nconst ALERT_TO_PANEL: Record<string, PanelType> = {\n NOTE: 'note',\n TIP: 'info',\n IMPORTANT: 'warning',\n WARNING: 'warning',\n CAUTION: 'error',\n};\n\nexport function transformBlockquote(\n node: Blockquote,\n transformChildren: (nodes: BlockContent[]) => AdfTopLevelBlockNode[],\n): BlockquoteNode | PanelNode {\n const firstChild = node.children[0];\n if (firstChild?.type === 'paragraph') {\n const firstText = firstChild.children[0];\n if (firstText?.type === 'text') {\n const match = ALERT_PATTERN.exec(firstText.value);\n if (match) {\n const alertType = (match[1] ?? 'NOTE').toUpperCase();\n const panelType: PanelType = ALERT_TO_PANEL[alertType] ?? 'info';\n const remainingFirstParagraphText = firstText.value\n .replace(ALERT_PATTERN, '')\n .trim();\n const remainingChildren = [...firstChild.children.slice(1)];\n const contentNodes: AdfTopLevelBlockNode[] = [];\n if (remainingFirstParagraphText || remainingChildren.length > 0) {\n const newParagraph: Paragraph = {\n type: 'paragraph',\n children: [\n ...(remainingFirstParagraphText\n ? [\n {\n type: 'text' as const,\n value: remainingFirstParagraphText,\n },\n ]\n : []),\n ...remainingChildren,\n ],\n };\n if (newParagraph.children.length > 0) {\n contentNodes.push(transformParagraph(newParagraph));\n }\n }\n const restChildren = node.children.slice(1) as BlockContent[];\n contentNodes.push(\n ...(transformChildren(restChildren) as Array<\n PanelNode['content'][number]\n >),\n );\n if (contentNodes.length === 0)\n contentNodes.push({ type: 'paragraph', content: [] });\n return {\n type: 'panel',\n attrs: { panelType },\n content: contentNodes as PanelNode['content'],\n };\n }\n }\n }\n const content = transformChildren(\n node.children as BlockContent[],\n ) as BlockquoteNode['content'];\n return {\n type: 'blockquote',\n content:\n content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n}\n","import type { BlockContent } from 'mdast';\nimport type { AdfTopLevelBlockNode, ExpandContent } from '../../types/index.js';\nimport { parseMarkdown } from '../parser.js';\n\nconst DETAILS_OPENER =\n /^<details[^>]*>\\s*<summary[^>]*>([\\s\\S]*?)<\\/summary>\\s*$/i;\nconst DETAILS_CLOSER = /^<\\/details>\\s*$/i;\n\nconst EXPAND_CONTENT_TYPES = new Set<string>([\n 'paragraph', 'heading', 'bulletList', 'orderedList', 'codeBlock',\n 'blockquote', 'panel', 'rule', 'table', 'mediaGroup', 'mediaSingle', 'nestedExpand',\n]);\n\nfunction isExpandContent(node: AdfTopLevelBlockNode | ExpandContent): node is ExpandContent {\n return EXPAND_CONTENT_TYPES.has(node.type);\n}\n\nfunction parseSingleDetails(\n html: string,\n): { title: string; body: string } | null {\n const detailsOpenMatch = /^<details[^>]*>\\s*/i.exec(html);\n if (!detailsOpenMatch) return null;\n\n let offset = detailsOpenMatch[0].length;\n const afterDetailsOpen = html.slice(offset);\n\n const summaryOpenMatch = /^<summary[^>]*>/i.exec(afterDetailsOpen);\n if (!summaryOpenMatch) return null;\n\n offset += summaryOpenMatch[0].length;\n const afterSummaryOpen = html.slice(offset);\n\n const summaryCloseIdx = afterSummaryOpen.search(/<\\/summary>/i);\n if (summaryCloseIdx === -1) return null;\n\n const title = afterSummaryOpen.slice(0, summaryCloseIdx);\n offset += summaryCloseIdx + '</summary>'.length;\n\n const bodyStart = offset;\n\n const openRe = /<details[^>]*>/gi;\n const closeRe = /<\\/details>/gi;\n let depth = 1;\n openRe.lastIndex = bodyStart;\n closeRe.lastIndex = bodyStart;\n let closingIndex = -1;\n\n while (depth > 0) {\n const nextOpen = openRe.exec(html);\n const nextClose = closeRe.exec(html);\n if (!nextClose) return null;\n if (nextOpen && nextOpen.index < nextClose.index) {\n depth++;\n closeRe.lastIndex = openRe.lastIndex;\n continue;\n }\n depth--;\n if (depth === 0) {\n closingIndex = nextClose.index;\n offset = nextClose.index + nextClose[0].length;\n break;\n }\n openRe.lastIndex = closeRe.lastIndex;\n }\n\n if (closingIndex === -1) return null;\n if (html.slice(offset).trim().length > 0) return null;\n\n return { title, body: html.slice(bodyStart, closingIndex) };\n}\n\nfunction buildDetailsPairs(nodes: BlockContent[]): Map<number, number> {\n const pairs = new Map<number, number>();\n const stack: number[] = [];\n for (let idx = 0; idx < nodes.length; idx++) {\n const n = nodes[idx]!;\n if (n.type === 'html') {\n const value = (n as { value: string }).value;\n if (DETAILS_OPENER.test(value)) {\n stack.push(idx);\n } else if (DETAILS_CLOSER.test(value)) {\n const openerIdx = stack.pop();\n if (openerIdx !== undefined) {\n pairs.set(openerIdx, idx);\n }\n }\n }\n }\n return pairs;\n}\n\nexport function transformExpandNodes(\n nodes: BlockContent[],\n transformBlock: (node: BlockContent) => AdfTopLevelBlockNode | null,\n): ExpandContent[] {\n const result: ExpandContent[] = [];\n const pairs = buildDetailsPairs(nodes);\n let i = 0;\n while (i < nodes.length) {\n const expand = tryTransformExpand(nodes, i, pairs, transformBlock);\n if (expand) {\n if (isExpandContent(expand.node)) {\n result.push(expand.node);\n }\n i = expand.next;\n continue;\n }\n const transformed = transformBlock(nodes[i]!);\n if (transformed && isExpandContent(transformed)) {\n result.push(transformed);\n }\n i++;\n }\n return result;\n}\n\nexport function tryTransformExpand(\n nodes: BlockContent[],\n i: number,\n detailsPairs: Map<number, number>,\n transformBlock: (node: BlockContent) => AdfTopLevelBlockNode | null,\n): { node: AdfTopLevelBlockNode; next: number } | null {\n const node = nodes[i]!;\n if (node.type !== 'html') return null;\n\n const parsedDetails = parseSingleDetails(node.value);\n if (parsedDetails) {\n const title = parsedDetails.title.trim();\n const innerContent = parsedDetails.body.trim();\n const content = innerContent\n ? transformExpandNodes(\n parseMarkdown(innerContent).children as BlockContent[],\n transformBlock,\n )\n : [];\n return { node: { type: 'expand', attrs: { title }, content }, next: i + 1 };\n }\n\n const openerMatch = DETAILS_OPENER.exec(node.value);\n if (openerMatch) {\n const title = (openerMatch[1] ?? '').trim();\n const closerIdx = detailsPairs.get(i) ?? -1;\n if (closerIdx !== -1) {\n const content = transformExpandNodes(\n nodes.slice(i + 1, closerIdx),\n transformBlock,\n );\n return {\n node: { type: 'expand', attrs: { title }, content },\n next: closerIdx + 1,\n };\n }\n }\n\n return null;\n}\n\nexport { buildDetailsPairs };\n","import type { Html } from 'mdast';\nimport type { ParagraphNode } from '../../types/index.js';\n\nexport function transformHtmlBlock(node: Html): ParagraphNode | null {\n const stripped = node.value.replace(/<[^>]+>/g, '').trim();\n if (!stripped) return null;\n return { type: 'paragraph', content: [{ type: 'text', text: stripped }] };\n}\n","export function generateId(): string {\n return crypto.randomUUID();\n}\n","import type { List, ListItem } from 'mdast';\nimport type {\n BulletListNode,\n ListItemNode,\n OrderedListNode,\n ParagraphNode,\n TaskItemNode,\n TaskListNode,\n} from '../../types/index.js';\nimport { generateId } from '../../utils/id.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\ntype ListResult = BulletListNode | OrderedListNode | TaskListNode;\n\nexport function transformList(\n node: List,\n transformBlock: TransformBlockFn,\n): ListResult {\n const isTask = node.children.some(\n (item) => item.checked !== null && item.checked !== undefined,\n );\n if (isTask) return transformTaskList(node);\n if (node.ordered) return transformOrderedList(node, transformBlock);\n return transformBulletList(node, transformBlock);\n}\n\ntype TransformBlockFn = (\n node: import('mdast').BlockContent,\n) => import('../../types/index.js').AdfTopLevelBlockNode | null;\n\nfunction transformBulletList(\n node: List,\n transformBlock: TransformBlockFn,\n): BulletListNode {\n return {\n type: 'bulletList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock),\n ),\n };\n}\n\nfunction transformOrderedList(\n node: List,\n transformBlock: TransformBlockFn,\n): OrderedListNode {\n const result: OrderedListNode = {\n type: 'orderedList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock),\n ),\n };\n if (node.start !== null && node.start !== undefined && node.start !== 1) {\n result.attrs = { order: node.start };\n }\n return result;\n}\n\nfunction transformListItem(\n node: ListItem,\n transformBlock: TransformBlockFn,\n): ListItemNode {\n const content: ListItemNode['content'] = [];\n for (const child of node.children) {\n if (child.type === 'paragraph') {\n content.push({\n type: 'paragraph',\n content: phrasingToInlineNodes(child.children),\n });\n } else if (child.type === 'list') {\n const nestedList = transformList(child, transformBlock);\n if (nestedList.type === 'taskList') {\n const para: ParagraphNode = { type: 'paragraph', content: [] };\n if (content.length === 0) content.push(para);\n } else {\n if (content.length === 0)\n content.push({ type: 'paragraph', content: [] });\n content.push(nestedList as BulletListNode | OrderedListNode);\n }\n } else if (child.type === 'code') {\n content.push({\n type: 'codeBlock',\n content: [{ type: 'text', text: child.value }],\n ...(child.lang ? { attrs: { language: child.lang } } : {}),\n });\n } else {\n const transformed = transformBlock(child as import('mdast').BlockContent);\n if (transformed) {\n if (transformed.type === 'paragraph')\n content.push(transformed as ParagraphNode);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'paragraph', content: [] });\n return { type: 'listItem', content };\n}\n\nfunction transformTaskList(node: List): TaskListNode {\n const listId = generateId();\n const items: TaskItemNode[] = node.children.map((listItem) => {\n const state: 'TODO' | 'DONE' = listItem.checked === true ? 'DONE' : 'TODO';\n const inlineContent = listItem.children\n .filter((c) => c.type === 'paragraph')\n .flatMap((c) =>\n phrasingToInlineNodes((c as import('mdast').Paragraph).children),\n );\n const taskItem: TaskItemNode = {\n type: 'taskItem',\n attrs: { localId: generateId(), state },\n };\n if (inlineContent.length > 0) taskItem.content = inlineContent;\n return taskItem;\n });\n return { type: 'taskList', attrs: { localId: listId }, content: items };\n}\n","import type { Table, TableRow } from 'mdast';\nimport type {\n TableCellNode,\n TableHeaderNode,\n TableNode,\n TableRowNode,\n} from '../../types/index.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\nexport function transformTable(node: Table): TableNode {\n const rows = node.children;\n if (rows.length === 0) return { type: 'table', content: [] };\n\n const headerRow = rows[0];\n const bodyRows = rows.slice(1);\n\n const adfRows: TableRowNode[] = [];\n\n if (headerRow) {\n adfRows.push({\n type: 'tableRow',\n content: headerRow.children.map((cell) => transformTableHeader(cell)),\n });\n }\n\n for (const row of bodyRows) {\n adfRows.push({\n type: 'tableRow',\n content: row.children.map((cell) => transformTableCell(cell)),\n });\n }\n\n return { type: 'table', content: adfRows };\n}\n\nfunction transformTableHeader(\n cell: TableRow['children'][number],\n): TableHeaderNode {\n const inlines = phrasingToInlineNodes(cell.children);\n return {\n type: 'tableHeader',\n attrs: {},\n content: [\n { type: 'paragraph', content: inlines.length > 0 ? inlines : [] },\n ],\n };\n}\n\nfunction transformTableCell(cell: TableRow['children'][number]): TableCellNode {\n const inlines = phrasingToInlineNodes(cell.children);\n return {\n type: 'tableCell',\n attrs: {},\n content: [\n { type: 'paragraph', content: inlines.length > 0 ? inlines : [] },\n ],\n };\n}\n","import type { BlockContent, Root } from 'mdast';\nimport type { AdfDoc, AdfTopLevelBlockNode } from '../../types/index.js';\nimport {\n transformBlockquote,\n transformCode,\n transformHeading,\n transformParagraph,\n transformThematicBreak,\n} from './blocks.js';\nimport { buildDetailsPairs, tryTransformExpand } from './expand.js';\nimport { transformHtmlBlock } from './inlines.js';\nimport { transformList } from './lists.js';\nimport { transformTable } from './tables.js';\n\nexport function transformRoot(root: Root): AdfDoc {\n const content = transformNodes(root.children as BlockContent[]);\n return { version: 1, type: 'doc', content };\n}\n\nfunction transformNodes(nodes: BlockContent[]): AdfTopLevelBlockNode[] {\n const result: AdfTopLevelBlockNode[] = [];\n const detailsPairs = buildDetailsPairs(nodes);\n let i = 0;\n while (i < nodes.length) {\n const expand = tryTransformExpand(nodes, i, detailsPairs, transformBlock);\n if (expand) {\n result.push(expand.node);\n i = expand.next;\n continue;\n }\n const transformed = transformBlock(nodes[i]!);\n if (transformed) result.push(transformed);\n i++;\n }\n return result;\n}\n\nexport function transformBlock(\n node: BlockContent,\n): AdfTopLevelBlockNode | null {\n switch (node.type) {\n case 'heading':\n return transformHeading(node);\n case 'paragraph':\n return transformParagraph(node);\n case 'code':\n return transformCode(node);\n case 'thematicBreak':\n return transformThematicBreak(node);\n case 'blockquote':\n return transformBlockquote(node, (children) =>\n children.flatMap((c) => {\n const r = transformBlock(c);\n return r ? [r] : [];\n }),\n );\n case 'list':\n return transformList(node, transformBlock);\n case 'table':\n return transformTable(node);\n case 'html':\n return transformHtmlBlock(node);\n default:\n return null;\n }\n}\n","export function stripNullBytes(text: string): string {\n return text.replace(/\\0/g, '');\n}\n\nexport function normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\nexport function trimTrailingWhitespace(text: string): string {\n return text.replace(/[^\\S\\n]+$/gm, '');\n}\n\nexport function collapseBlankLines(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n');\n}\n\nexport function sanitizeMarkdown(text: string): string {\n return collapseBlankLines(\n trimTrailingWhitespace(normalizeNewlines(stripNullBytes(text))),\n );\n}\n\nexport function sanitizeText(text: string): string {\n return stripNullBytes(normalizeNewlines(text));\n}\n","import type { AdfDoc } from '../types/index.js';\nimport { parseMarkdown } from './parser.js';\nimport { transformRoot } from './transform/index.js';\nimport { sanitizeText } from '../utils/sanitize.js';\n\nexport function mdToAdf(markdown: string): AdfDoc {\n const sanitized = sanitizeText(markdown);\n const mdast = parseMarkdown(sanitized);\n return transformRoot(mdast);\n}\n","const INLINE_ESCAPE = /([\\\\`*_[\\]~|<])/g;\n\nexport function escapeMarkdown(text: string): string {\n let result = text.replace(INLINE_ESCAPE, '\\\\$1');\n result = result.replace(/^(#{1,6} )/m, '\\\\$1');\n result = result.replace(/^([-+]) /m, '\\\\$1 ');\n result = result.replace(/^> /m, '\\\\> ');\n result = result.replace(/^(\\d+)\\./m, '$1\\\\.');\n return result;\n}\n\nexport function escapePipeInTableCell(text: string): string {\n return text.replace(/\\|/g, '\\\\|');\n}\n\nexport function unescapeMarkdown(text: string): string {\n return text.replace(/\\\\([\\\\`*_[\\]~|#\\->+<])/g, '$1');\n}\n","import type { AdfMark } from '../../types/index.js';\n\nexport function applyMarks(text: string, marks: AdfMark[] | undefined): string {\n if (!marks || marks.length === 0) return text;\n let result = text;\n const hasCode = marks.some((m) => m.type === 'code');\n if (hasCode) {\n const linkMark = marks.find(\n (m): m is Extract<AdfMark, { type: 'link' }> => m.type === 'link',\n );\n result = `\\`${result}\\``;\n if (linkMark) result = `[${result}](${linkMark.attrs.href})`;\n return result;\n }\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n result = `**${result}**`;\n break;\n case 'em':\n result = `*${result}*`;\n break;\n case 'strike':\n result = `~~${result}~~`;\n break;\n case 'underline':\n result = `<ins>${result}</ins>`;\n break;\n case 'subsup':\n result =\n mark.attrs.type === 'sub'\n ? `<sub>${result}</sub>`\n : `<sup>${result}</sup>`;\n break;\n case 'link':\n result = `[${result}](${mark.attrs.href}${mark.attrs.title ? ` \"${mark.attrs.title}\"` : ''})`;\n break;\n case 'textColor':\n case 'backgroundColor':\n case 'alignment':\n case 'indentation':\n case 'breakout':\n case 'border':\n case 'annotation':\n case 'dataConsumer':\n case 'fragment':\n break;\n }\n }\n return result;\n}\n","import type { AdfInlineNode } from '../../types/index.js';\nimport { escapeMarkdown } from '../../utils/escape.js';\nimport { applyMarks } from './marks.js';\n\nexport function serializeInlineNodes(\n nodes: AdfInlineNode[] | undefined,\n): string {\n if (!nodes || nodes.length === 0) return '';\n return nodes.map(serializeInline).join('');\n}\n\nfunction serializeInline(node: AdfInlineNode): string {\n switch (node.type) {\n case 'text':\n return applyMarks(escapeMarkdown(node.text), node.marks);\n case 'hardBreak':\n return '\\\\\\n';\n case 'mention':\n return node.attrs.text ?? `@${node.attrs.id}`;\n case 'emoji':\n return node.attrs.text ?? `:${node.attrs.shortName}:`;\n case 'date':\n return node.attrs.timestamp;\n case 'status':\n return `\\`[${node.attrs.text}]\\``;\n case 'inlineCard':\n return node.attrs.url ? `<${node.attrs.url}>` : '';\n case 'mediaInline':\n return '';\n default:\n return '';\n }\n}\n","import type {\n AdfNode,\n AdfTopLevelBlockNode,\n BlockquoteNode,\n CodeBlockNode,\n HeadingNode,\n ParagraphNode,\n RuleNode,\n} from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport type SerializeBlockFn = (node: AdfTopLevelBlockNode | AdfNode) => string;\n\nexport function serializeHeading(node: HeadingNode): string {\n const prefix = '#'.repeat(node.attrs.level);\n return `${prefix} ${serializeInlineNodes(node.content)}`;\n}\n\nexport function serializeParagraph(node: ParagraphNode): string {\n return serializeInlineNodes(node.content);\n}\n\nexport function serializeCodeBlock(node: CodeBlockNode): string {\n const lang = node.attrs?.language ?? '';\n const code = node.content?.map((t) => t.text).join('') ?? '';\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\nexport function serializeRule(_node: RuleNode): string {\n return '---';\n}\n\nexport function serializeBlockquote(\n node: BlockquoteNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const lines = node.content.map((child) => serializeBlock(child)).join('\\n\\n');\n return lines\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n}\n","import type {\n BulletListNode,\n DecisionListNode,\n ListItemNode,\n OrderedListNode,\n TaskListNode,\n} from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport function serializeBulletList(node: BulletListNode, depth = 0): string {\n return node.content\n .map((item) => serializeListItem(item, '-', depth))\n .join('\\n');\n}\n\nexport function serializeOrderedList(node: OrderedListNode, depth = 0): string {\n const start = node.attrs?.order ?? 1;\n return node.content\n .map((item, i) => serializeListItem(item, `${start + i}.`, depth))\n .join('\\n');\n}\n\nexport function serializeTaskList(node: TaskListNode, depth = 0): string {\n return node.content\n .map((item) => {\n const indent = ' '.repeat(depth);\n const checkbox = item.attrs.state === 'DONE' ? '[x]' : '[ ]';\n const text = serializeInlineNodes(item.content);\n return `${indent}- ${checkbox} ${text}`;\n })\n .join('\\n');\n}\n\nexport function serializeDecisionList(\n node: DecisionListNode,\n depth = 0,\n): string {\n return node.content\n .map((item) => {\n const indent = ' '.repeat(depth);\n const text = serializeInlineNodes(item.content);\n return `${indent}- [x] ${text}`;\n })\n .join('\\n');\n}\n\nfunction serializeListItem(\n node: ListItemNode,\n bullet: string,\n depth: number,\n): string {\n const indent = ' '.repeat(depth);\n const parts: string[] = [];\n for (const child of node.content) {\n if (child.type === 'paragraph') {\n parts.push(serializeInlineNodes(child.content));\n } else if (child.type === 'bulletList') {\n parts.push('\\n' + serializeBulletList(child, depth + 1));\n } else if (child.type === 'orderedList') {\n parts.push('\\n' + serializeOrderedList(child, depth + 1));\n } else if (child.type === 'codeBlock') {\n const lang = child.attrs?.language ?? '';\n const code = child.content?.map((t) => t.text).join('') ?? '';\n parts.push(`\\n\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``);\n }\n }\n return `${indent}${bullet} ${parts.join('')}`;\n}\n","import type {\n BlockCardNode,\n EmbedCardNode,\n ExpandNode,\n MediaSingleNode,\n NestedExpandNode,\n PanelNode,\n} from '../../types/index.js';\nimport type { SerializeBlockFn } from './blocks.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nconst PANEL_TO_ALERT: Record<string, string> = {\n note: 'NOTE',\n info: 'TIP',\n tip: 'TIP',\n warning: 'WARNING',\n success: 'NOTE',\n error: 'CAUTION',\n custom: 'NOTE',\n};\n\nexport function serializePanel(\n node: PanelNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const alertType = PANEL_TO_ALERT[node.attrs.panelType] ?? 'NOTE';\n const contentLines = node.content\n .map((child) => serializeBlock(child))\n .join('\\n\\n');\n const lines = [\n `> [!${alertType}]`,\n ...contentLines.split('\\n').map((l) => `> ${l}`),\n ];\n return lines.join('\\n');\n}\n\nexport function serializeExpand(\n node: ExpandNode | NestedExpandNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const title = node.attrs.title ?? '';\n const contentLines = node.content\n .map((child) => serializeBlock(child))\n .join('\\n\\n');\n return `<details>\\n<summary>${title}</summary>\\n\\n${contentLines}\\n</details>`;\n}\n\nexport function serializeMediaSingle(node: MediaSingleNode): string {\n const media = node.content[0];\n if (!media) return '';\n const alt = media.attrs.alt ?? 'image';\n if (media.attrs.type === 'link') {\n const url = (media.attrs as unknown as { url?: string }).url;\n if (url) return ``;\n }\n return `[media: ${media.attrs.id}]`;\n}\n\nexport function serializeBlockCard(node: BlockCardNode): string {\n const url = node.attrs.url;\n if (!url) return '';\n return `[${url}](${url})`;\n}\n\nexport function serializeEmbedCard(node: EmbedCardNode): string {\n return `[${node.attrs.url}](${node.attrs.url})`;\n}\n\nexport { serializeInlineNodes };\n","import type { ParagraphNode, TableNode } from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport function serializeTable(node: TableNode): string {\n const rows = node.content;\n if (rows.length === 0) return '';\n\n const firstRow = rows[0];\n if (!firstRow) return '';\n\n const isHeaderRow = firstRow.content.some((c) => c.type === 'tableHeader');\n\n const serializeCell = (cell: {\n content: import('../../types/index.js').AdfTableCellContent[];\n }): string => {\n const para = cell.content.find((c) => c.type === 'paragraph') as\n | ParagraphNode\n | undefined;\n if (!para) return ' ';\n return serializeInlineNodes(para.content).trim() || ' ';\n };\n\n const lines: string[] = [];\n\n if (isHeaderRow) {\n const headerCells = firstRow.content.map(serializeCell);\n lines.push(`| ${headerCells.join(' | ')} |`);\n lines.push(`| ${headerCells.map(() => '---').join(' | ')} |`);\n for (const row of rows.slice(1)) {\n const cells = row.content.map(serializeCell);\n lines.push(`| ${cells.join(' | ')} |`);\n }\n } else {\n const colCount = firstRow.content.length;\n const headerPlaceholders = Array<string>(colCount).fill(' ');\n lines.push(`| ${headerPlaceholders.join(' | ')} |`);\n lines.push(`| ${headerPlaceholders.map(() => '---').join(' | ')} |`);\n for (const row of rows) {\n const cells = row.content.map(serializeCell);\n lines.push(`| ${cells.join(' | ')} |`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type {\n AdfNode,\n AdfTopLevelBlockNode,\n LayoutSectionNode,\n} from '../../types/index.js';\nimport {\n serializeBlockquote,\n serializeCodeBlock,\n serializeHeading,\n serializeParagraph,\n serializeRule,\n} from './blocks.js';\nimport {\n serializeBulletList,\n serializeDecisionList,\n serializeOrderedList,\n serializeTaskList,\n} from './lists.js';\nimport {\n serializeBlockCard,\n serializeEmbedCard,\n serializeExpand,\n serializeMediaSingle,\n serializePanel,\n} from './panels.js';\nimport { serializeTable } from './tables.js';\n\nexport function serializeBlock(node: AdfTopLevelBlockNode | AdfNode): string {\n switch (node.type) {\n case 'paragraph':\n return serializeParagraph(node);\n case 'heading':\n return serializeHeading(node);\n case 'codeBlock':\n return serializeCodeBlock(node);\n case 'rule':\n return serializeRule(node);\n case 'blockquote':\n return serializeBlockquote(node, serializeBlock);\n case 'bulletList':\n return serializeBulletList(node);\n case 'orderedList':\n return serializeOrderedList(node);\n case 'taskList':\n return serializeTaskList(node);\n case 'decisionList':\n return serializeDecisionList(node);\n case 'table':\n return serializeTable(node);\n case 'panel':\n return serializePanel(node, serializeBlock);\n case 'expand':\n return serializeExpand(node, serializeBlock);\n case 'nestedExpand':\n return serializeExpand(node, serializeBlock);\n case 'mediaSingle':\n return serializeMediaSingle(node);\n case 'blockCard':\n return serializeBlockCard(node);\n case 'embedCard':\n return serializeEmbedCard(node);\n case 'layoutSection':\n return serializeLayoutSection(node);\n default:\n return '';\n }\n}\n\nfunction serializeLayoutSection(node: LayoutSectionNode): string {\n return node.content\n .map((col) =>\n col.content.map((child) => serializeBlock(child)).join('\\n\\n'),\n )\n .join('\\n\\n---\\n\\n');\n}\n","import type { AdfDoc } from '../types/index.js';\nimport { sanitizeMarkdown } from '../utils/sanitize.js';\nimport { serializeBlock } from './serialize/index.js';\n\nexport function adfToMd(adf: AdfDoc): string {\n const parts = adf.content.map((node) => serializeBlock(node));\n const joined = parts.filter((p) => p.length > 0).join('\\n\\n');\n return sanitizeMarkdown(joined);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/md-to-adf/parser.ts","../src/utils/language.ts","../src/md-to-adf/transform/marks.ts","../src/md-to-adf/transform/blocks.ts","../src/md-to-adf/transform/expand.ts","../src/md-to-adf/transform/inlines.ts","../src/utils/id.ts","../src/md-to-adf/transform/lists.ts","../src/md-to-adf/transform/tables.ts","../src/md-to-adf/transform/index.ts","../src/utils/sanitize.ts","../src/md-to-adf/index.ts","../src/utils/escape.ts","../src/adf-to-md/serialize/marks.ts","../src/adf-to-md/serialize/inlines.ts","../src/adf-to-md/serialize/blocks.ts","../src/adf-to-md/serialize/lists.ts","../src/adf-to-md/serialize/panels.ts","../src/adf-to-md/serialize/tables.ts","../src/adf-to-md/serialize/index.ts","../src/adf-to-md/index.ts"],"sourcesContent":["import { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkGfm from 'remark-gfm';\nimport type { Root } from 'mdast';\n\nconst processor = unified().use(remarkParse).use(remarkGfm);\n\nexport function parseMarkdown(markdown: string): Root {\n return processor.parse(markdown) as Root;\n}\n","const LANGUAGE_ALIASES: Record<string, string> = {\n ts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n tsx: 'typescript',\n py: 'python',\n rb: 'ruby',\n sh: 'bash',\n zsh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n md: 'markdown',\n rs: 'rust',\n kt: 'kotlin',\n tf: 'hcl',\n dockerfile: 'docker',\n};\n\nexport function normalizeLanguage(\n lang: string | null | undefined,\n): string | undefined {\n if (!lang) return undefined;\n const lower = lang.toLowerCase().trim();\n if (!lower) return undefined;\n return LANGUAGE_ALIASES[lower] ?? lower;\n}\n","import type { PhrasingContent } from 'mdast';\nimport type { AdfInlineNode, AdfMark, TextNode } from '../../types/index.js';\n\nconst OPEN_HTML_TAG = /^<(ins|sub|sup)>$/i;\nconst CLOSE_HTML_TAG = /^<\\/(ins|sub|sup)>$/i;\n\nfunction htmlTagToMark(tag: string): AdfMark | null {\n const t = tag.toLowerCase();\n if (t === 'ins') return { type: 'underline' };\n if (t === 'sub') return { type: 'subsup', attrs: { type: 'sub' } };\n if (t === 'sup') return { type: 'subsup', attrs: { type: 'sup' } };\n return null;\n}\n\nexport function phrasingToInlineNodes(\n nodes: PhrasingContent[],\n): AdfInlineNode[] {\n const markStack: AdfMark[] = [];\n const result: AdfInlineNode[] = [];\n\n for (const node of nodes) {\n if (node.type === 'html') {\n const openMatch = OPEN_HTML_TAG.exec(node.value);\n if (openMatch) {\n const mark = htmlTagToMark(openMatch[1] ?? '');\n if (mark) markStack.push(mark);\n continue;\n }\n const closeMatch = CLOSE_HTML_TAG.exec(node.value);\n if (closeMatch) {\n markStack.pop();\n continue;\n }\n }\n result.push(...phrasingToInline(node, markStack.slice()));\n }\n\n return result;\n}\n\nfunction phrasingToInline(\n node: PhrasingContent,\n inheritedMarks: AdfMark[],\n): AdfInlineNode[] {\n switch (node.type) {\n case 'text':\n if (!node.value) return [];\n return [makeText(node.value, inheritedMarks)];\n case 'inlineCode': {\n const marks: AdfMark[] = [\n ...inheritedMarks.filter((m) => m.type === 'link'),\n { type: 'code' },\n ];\n return [makeText(node.value, marks)];\n }\n case 'strong':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'strong' }]),\n );\n case 'emphasis':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'em' }]),\n );\n case 'delete':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'strike' }]),\n );\n case 'link': {\n const linkMark: AdfMark = {\n type: 'link',\n attrs: { href: node.url, ...(node.title ? { title: node.title } : {}) },\n };\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, linkMark]),\n );\n }\n case 'image':\n return [{ type: 'inlineCard', attrs: { url: node.url } }];\n case 'break':\n return [{ type: 'hardBreak' }];\n case 'html':\n return parseHtmlInline(node.value, inheritedMarks);\n case 'linkReference':\n case 'imageReference':\n return [];\n default:\n return [];\n }\n}\n\nfunction makeText(value: string, marks: AdfMark[]): TextNode {\n const node: TextNode = { type: 'text', text: value };\n if (marks.length > 0) node.marks = marks;\n return node;\n}\n\nfunction parseHtmlInline(\n html: string,\n inheritedMarks: AdfMark[],\n): AdfInlineNode[] {\n const stripped = html.replace(/<[^>]+>/g, '');\n if (stripped) return [makeText(stripped, inheritedMarks)];\n return [];\n}\n","import type {\n BlockContent,\n Blockquote,\n Code,\n Heading,\n Paragraph,\n ThematicBreak,\n} from 'mdast';\nimport type {\n AdfTopLevelBlockNode,\n BlockquoteNode,\n CodeBlockNode,\n HeadingNode,\n PanelNode,\n PanelType,\n ParagraphNode,\n RuleNode,\n} from '../../types/index.js';\nimport { normalizeLanguage } from '../../utils/language.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\nexport function transformHeading(node: Heading): HeadingNode {\n return {\n type: 'heading',\n attrs: { level: node.depth as 1 | 2 | 3 | 4 | 5 | 6 },\n content: phrasingToInlineNodes(node.children),\n };\n}\n\nexport function transformParagraph(node: Paragraph): ParagraphNode {\n const content = phrasingToInlineNodes(node.children);\n return { type: 'paragraph', content };\n}\n\nexport function transformCode(node: Code): CodeBlockNode {\n const result: CodeBlockNode = { type: 'codeBlock' };\n const lang = normalizeLanguage(node.lang);\n if (lang) result.attrs = { language: lang };\n if (node.value) result.content = [{ type: 'text', text: node.value }];\n return result;\n}\n\nexport function transformThematicBreak(_node: ThematicBreak): RuleNode {\n return { type: 'rule' };\n}\n\nconst ALERT_PATTERN = /^\\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\\s*/i;\n\nconst ALERT_TO_PANEL: Record<string, PanelType> = {\n NOTE: 'note',\n TIP: 'info',\n IMPORTANT: 'warning',\n WARNING: 'warning',\n CAUTION: 'error',\n};\n\nfunction buildPanelContent(\n firstChild: Paragraph,\n restChildren: BlockContent[],\n transformChildren: (nodes: BlockContent[]) => AdfTopLevelBlockNode[],\n): AdfTopLevelBlockNode[] {\n const firstText = firstChild.children[0] as { type: 'text'; value: string };\n const remainingText = firstText.value.replace(ALERT_PATTERN, '').trim();\n const remainingInlines = firstChild.children.slice(1);\n\n const contentNodes: AdfTopLevelBlockNode[] = [];\n\n if (remainingText || remainingInlines.length > 0) {\n const paragraph: Paragraph = {\n type: 'paragraph',\n children: [\n ...(remainingText ? [{ type: 'text' as const, value: remainingText }] : []),\n ...remainingInlines,\n ],\n };\n if (paragraph.children.length > 0) {\n contentNodes.push(transformParagraph(paragraph));\n }\n }\n\n contentNodes.push(\n ...(transformChildren(restChildren) as Array<PanelNode['content'][number]>),\n );\n\n if (contentNodes.length === 0) {\n contentNodes.push({ type: 'paragraph', content: [] });\n }\n\n return contentNodes;\n}\n\nfunction tryTransformAlert(\n node: Blockquote,\n transformChildren: (nodes: BlockContent[]) => AdfTopLevelBlockNode[],\n): PanelNode | null {\n const firstChild = node.children[0];\n if (firstChild?.type !== 'paragraph') return null;\n\n const firstText = firstChild.children[0];\n if (firstText?.type !== 'text') return null;\n\n const match = ALERT_PATTERN.exec(firstText.value);\n if (!match) return null;\n\n const alertType = (match[1] ?? 'NOTE').toUpperCase();\n const panelType: PanelType = ALERT_TO_PANEL[alertType] ?? 'info';\n const restChildren = node.children.slice(1) as BlockContent[];\n const content = buildPanelContent(firstChild, restChildren, transformChildren);\n\n return { type: 'panel', attrs: { panelType }, content: content as PanelNode['content'] };\n}\n\nexport function transformBlockquote(\n node: Blockquote,\n transformChildren: (nodes: BlockContent[]) => AdfTopLevelBlockNode[],\n): BlockquoteNode | PanelNode {\n const panel = tryTransformAlert(node, transformChildren);\n if (panel) return panel;\n\n const content = transformChildren(\n node.children as BlockContent[],\n ) as BlockquoteNode['content'];\n return {\n type: 'blockquote',\n content: content.length > 0 ? content : [{ type: 'paragraph', content: [] }],\n };\n}\n","import type { BlockContent } from 'mdast';\nimport type { AdfTopLevelBlockNode, ExpandContent } from '../../types/index.js';\nimport { parseMarkdown } from '../parser.js';\n\nconst DETAILS_OPENER =\n /^<details[^>]*>\\s*<summary[^>]*>([\\s\\S]*?)<\\/summary>\\s*$/i;\nconst DETAILS_CLOSER = /^<\\/details>\\s*$/i;\n\nconst EXPAND_CONTENT_TYPES = new Set<string>([\n 'paragraph', 'heading', 'bulletList', 'orderedList', 'codeBlock',\n 'blockquote', 'panel', 'rule', 'table', 'mediaGroup', 'mediaSingle', 'nestedExpand',\n]);\n\nfunction isExpandContent(node: AdfTopLevelBlockNode | ExpandContent): node is ExpandContent {\n return EXPAND_CONTENT_TYPES.has(node.type);\n}\n\nfunction parseSingleDetails(\n html: string,\n): { title: string; body: string } | null {\n const detailsOpenMatch = /^<details[^>]*>\\s*/i.exec(html);\n if (!detailsOpenMatch) return null;\n\n let offset = detailsOpenMatch[0].length;\n const afterDetailsOpen = html.slice(offset);\n\n const summaryOpenMatch = /^<summary[^>]*>/i.exec(afterDetailsOpen);\n if (!summaryOpenMatch) return null;\n\n offset += summaryOpenMatch[0].length;\n const afterSummaryOpen = html.slice(offset);\n\n const summaryCloseIdx = afterSummaryOpen.search(/<\\/summary>/i);\n if (summaryCloseIdx === -1) return null;\n\n const title = afterSummaryOpen.slice(0, summaryCloseIdx);\n offset += summaryCloseIdx + '</summary>'.length;\n\n const bodyStart = offset;\n\n const openRe = /<details[^>]*>/gi;\n const closeRe = /<\\/details>/gi;\n let depth = 1;\n openRe.lastIndex = bodyStart;\n closeRe.lastIndex = bodyStart;\n let closingIndex = -1;\n\n while (depth > 0) {\n const nextOpen = openRe.exec(html);\n const nextClose = closeRe.exec(html);\n if (!nextClose) return null;\n if (nextOpen && nextOpen.index < nextClose.index) {\n depth++;\n closeRe.lastIndex = openRe.lastIndex;\n continue;\n }\n depth--;\n if (depth === 0) {\n closingIndex = nextClose.index;\n offset = nextClose.index + nextClose[0].length;\n break;\n }\n openRe.lastIndex = closeRe.lastIndex;\n }\n\n if (closingIndex === -1) return null;\n if (html.slice(offset).trim().length > 0) return null;\n\n return { title, body: html.slice(bodyStart, closingIndex) };\n}\n\nfunction buildDetailsPairs(nodes: BlockContent[]): Map<number, number> {\n const pairs = new Map<number, number>();\n const stack: number[] = [];\n for (let idx = 0; idx < nodes.length; idx++) {\n const n = nodes[idx]!;\n if (n.type === 'html') {\n const value = (n as { value: string }).value;\n if (DETAILS_OPENER.test(value)) {\n stack.push(idx);\n } else if (DETAILS_CLOSER.test(value)) {\n const openerIdx = stack.pop();\n if (openerIdx !== undefined) {\n pairs.set(openerIdx, idx);\n }\n }\n }\n }\n return pairs;\n}\n\nexport function transformExpandNodes(\n nodes: BlockContent[],\n transformBlock: (node: BlockContent) => AdfTopLevelBlockNode | null,\n): ExpandContent[] {\n const result: ExpandContent[] = [];\n const pairs = buildDetailsPairs(nodes);\n let i = 0;\n while (i < nodes.length) {\n const expand = tryTransformExpand(nodes, i, pairs, transformBlock);\n if (expand) {\n if (isExpandContent(expand.node)) {\n result.push(expand.node);\n }\n i = expand.next;\n continue;\n }\n const transformed = transformBlock(nodes[i]!);\n if (transformed && isExpandContent(transformed)) {\n result.push(transformed);\n }\n i++;\n }\n return result;\n}\n\nexport function tryTransformExpand(\n nodes: BlockContent[],\n i: number,\n detailsPairs: Map<number, number>,\n transformBlock: (node: BlockContent) => AdfTopLevelBlockNode | null,\n): { node: AdfTopLevelBlockNode; next: number } | null {\n const node = nodes[i]!;\n if (node.type !== 'html') return null;\n\n const parsedDetails = parseSingleDetails(node.value);\n if (parsedDetails) {\n const title = parsedDetails.title.trim();\n const innerContent = parsedDetails.body.trim();\n const content = innerContent\n ? transformExpandNodes(\n parseMarkdown(innerContent).children as BlockContent[],\n transformBlock,\n )\n : [];\n return { node: { type: 'expand', attrs: { title }, content }, next: i + 1 };\n }\n\n const openerMatch = DETAILS_OPENER.exec(node.value);\n if (openerMatch) {\n const title = (openerMatch[1] ?? '').trim();\n const closerIdx = detailsPairs.get(i) ?? -1;\n if (closerIdx !== -1) {\n const content = transformExpandNodes(\n nodes.slice(i + 1, closerIdx),\n transformBlock,\n );\n return {\n node: { type: 'expand', attrs: { title }, content },\n next: closerIdx + 1,\n };\n }\n }\n\n return null;\n}\n\nexport { buildDetailsPairs };\n","import type { Html } from 'mdast';\nimport type { ParagraphNode } from '../../types/index.js';\n\nexport function transformHtmlBlock(node: Html): ParagraphNode | null {\n const stripped = node.value.replace(/<[^>]+>/g, '').trim();\n if (!stripped) return null;\n return { type: 'paragraph', content: [{ type: 'text', text: stripped }] };\n}\n","export function generateId(): string {\n return crypto.randomUUID();\n}\n","import type { List, ListItem } from 'mdast';\nimport type {\n BulletListNode,\n ListItemNode,\n OrderedListNode,\n ParagraphNode,\n TaskItemNode,\n TaskListNode,\n} from '../../types/index.js';\nimport { generateId } from '../../utils/id.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\ntype ListResult = BulletListNode | OrderedListNode | TaskListNode;\n\nexport function transformList(\n node: List,\n transformBlock: TransformBlockFn,\n): ListResult {\n const isTask = node.children.some(\n (item) => item.checked !== null && item.checked !== undefined,\n );\n if (isTask) return transformTaskList(node);\n if (node.ordered) return transformOrderedList(node, transformBlock);\n return transformBulletList(node, transformBlock);\n}\n\ntype TransformBlockFn = (\n node: import('mdast').BlockContent,\n) => import('../../types/index.js').AdfTopLevelBlockNode | null;\n\nfunction transformBulletList(\n node: List,\n transformBlock: TransformBlockFn,\n): BulletListNode {\n return {\n type: 'bulletList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock),\n ),\n };\n}\n\nfunction transformOrderedList(\n node: List,\n transformBlock: TransformBlockFn,\n): OrderedListNode {\n const result: OrderedListNode = {\n type: 'orderedList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock),\n ),\n };\n if (node.start !== null && node.start !== undefined && node.start !== 1) {\n result.attrs = { order: node.start };\n }\n return result;\n}\n\nfunction transformListItem(\n node: ListItem,\n transformBlock: TransformBlockFn,\n): ListItemNode {\n const content: ListItemNode['content'] = [];\n for (const child of node.children) {\n if (child.type === 'paragraph') {\n content.push({\n type: 'paragraph',\n content: phrasingToInlineNodes(child.children),\n });\n } else if (child.type === 'list') {\n const nestedList = transformList(child, transformBlock);\n if (nestedList.type === 'taskList') {\n const para: ParagraphNode = { type: 'paragraph', content: [] };\n if (content.length === 0) content.push(para);\n } else {\n if (content.length === 0)\n content.push({ type: 'paragraph', content: [] });\n content.push(nestedList as BulletListNode | OrderedListNode);\n }\n } else if (child.type === 'code') {\n content.push({\n type: 'codeBlock',\n content: [{ type: 'text', text: child.value }],\n ...(child.lang ? { attrs: { language: child.lang } } : {}),\n });\n } else {\n const transformed = transformBlock(child as import('mdast').BlockContent);\n if (transformed) {\n if (transformed.type === 'paragraph')\n content.push(transformed as ParagraphNode);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'paragraph', content: [] });\n return { type: 'listItem', content };\n}\n\nfunction transformTaskList(node: List): TaskListNode {\n const listId = generateId();\n const items: TaskItemNode[] = node.children.map((listItem) => {\n const state: 'TODO' | 'DONE' = listItem.checked === true ? 'DONE' : 'TODO';\n const inlineContent = listItem.children\n .filter((c) => c.type === 'paragraph')\n .flatMap((c) =>\n phrasingToInlineNodes((c as import('mdast').Paragraph).children),\n );\n const taskItem: TaskItemNode = {\n type: 'taskItem',\n attrs: { localId: generateId(), state },\n };\n if (inlineContent.length > 0) taskItem.content = inlineContent;\n return taskItem;\n });\n return { type: 'taskList', attrs: { localId: listId }, content: items };\n}\n","import type { Table, TableRow } from 'mdast';\nimport type {\n TableCellNode,\n TableHeaderNode,\n TableNode,\n TableRowNode,\n} from '../../types/index.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\nexport function transformTable(node: Table): TableNode {\n const rows = node.children;\n if (rows.length === 0) return { type: 'table', content: [] };\n\n const headerRow = rows[0];\n const bodyRows = rows.slice(1);\n\n const adfRows: TableRowNode[] = [];\n\n if (headerRow) {\n adfRows.push({\n type: 'tableRow',\n content: headerRow.children.map((cell) => transformTableHeader(cell)),\n });\n }\n\n for (const row of bodyRows) {\n adfRows.push({\n type: 'tableRow',\n content: row.children.map((cell) => transformTableCell(cell)),\n });\n }\n\n return { type: 'table', content: adfRows };\n}\n\nfunction transformTableHeader(\n cell: TableRow['children'][number],\n): TableHeaderNode {\n const inlines = phrasingToInlineNodes(cell.children);\n return {\n type: 'tableHeader',\n attrs: {},\n content: [\n { type: 'paragraph', content: inlines.length > 0 ? inlines : [] },\n ],\n };\n}\n\nfunction transformTableCell(cell: TableRow['children'][number]): TableCellNode {\n const inlines = phrasingToInlineNodes(cell.children);\n return {\n type: 'tableCell',\n attrs: {},\n content: [\n { type: 'paragraph', content: inlines.length > 0 ? inlines : [] },\n ],\n };\n}\n","import type { BlockContent, Root } from 'mdast';\nimport type { AdfDoc, AdfTopLevelBlockNode } from '../../types/index.js';\nimport {\n transformBlockquote,\n transformCode,\n transformHeading,\n transformParagraph,\n transformThematicBreak,\n} from './blocks.js';\nimport { buildDetailsPairs, tryTransformExpand } from './expand.js';\nimport { transformHtmlBlock } from './inlines.js';\nimport { transformList } from './lists.js';\nimport { transformTable } from './tables.js';\n\nexport function transformRoot(root: Root): AdfDoc {\n const content = transformNodes(root.children as BlockContent[]);\n return { version: 1, type: 'doc', content };\n}\n\nfunction transformNodes(nodes: BlockContent[]): AdfTopLevelBlockNode[] {\n const result: AdfTopLevelBlockNode[] = [];\n const detailsPairs = buildDetailsPairs(nodes);\n let i = 0;\n while (i < nodes.length) {\n const expand = tryTransformExpand(nodes, i, detailsPairs, transformBlock);\n if (expand) {\n result.push(expand.node);\n i = expand.next;\n continue;\n }\n const transformed = transformBlock(nodes[i]!);\n if (transformed) result.push(transformed);\n i++;\n }\n return result;\n}\n\nexport function transformBlock(\n node: BlockContent,\n): AdfTopLevelBlockNode | null {\n switch (node.type) {\n case 'heading':\n return transformHeading(node);\n case 'paragraph':\n return transformParagraph(node);\n case 'code':\n return transformCode(node);\n case 'thematicBreak':\n return transformThematicBreak(node);\n case 'blockquote':\n return transformBlockquote(node, (children) =>\n children.flatMap((c) => {\n const r = transformBlock(c);\n return r ? [r] : [];\n }),\n );\n case 'list':\n return transformList(node, transformBlock);\n case 'table':\n return transformTable(node);\n case 'html':\n return transformHtmlBlock(node);\n default:\n return null;\n }\n}\n","export function stripNullBytes(text: string): string {\n return text.replace(/\\0/g, '');\n}\n\nexport function normalizeNewlines(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\nexport function trimTrailingWhitespace(text: string): string {\n return text.replace(/[^\\S\\n]+$/gm, '');\n}\n\nexport function collapseBlankLines(text: string): string {\n return text.replace(/\\n{3,}/g, '\\n\\n');\n}\n\nexport function sanitizeMarkdown(text: string): string {\n return collapseBlankLines(\n trimTrailingWhitespace(normalizeNewlines(stripNullBytes(text))),\n );\n}\n\nexport function sanitizeText(text: string): string {\n return stripNullBytes(normalizeNewlines(text));\n}\n","import type { AdfDoc } from '../types/index.js';\nimport { parseMarkdown } from './parser.js';\nimport { transformRoot } from './transform/index.js';\nimport { sanitizeText } from '../utils/sanitize.js';\n\nexport function mdToAdf(markdown: string): AdfDoc {\n const sanitized = sanitizeText(markdown);\n const mdast = parseMarkdown(sanitized);\n return transformRoot(mdast);\n}\n","const INLINE_ESCAPE = /([\\\\`*_[\\]~|<])/g;\n\nexport function escapeMarkdown(text: string): string {\n let result = text.replace(INLINE_ESCAPE, '\\\\$1');\n result = result.replace(/^(#{1,6} )/m, '\\\\$1');\n result = result.replace(/^([-+]) /m, '\\\\$1 ');\n result = result.replace(/^> /m, '\\\\> ');\n result = result.replace(/^(\\d+)\\./m, '$1\\\\.');\n return result;\n}\n\nexport function escapePipeInTableCell(text: string): string {\n return text.replace(/\\|/g, '\\\\|');\n}\n\nexport function unescapeMarkdown(text: string): string {\n return text.replace(/\\\\([\\\\`*_[\\]~|#\\->+<])/g, '$1');\n}\n","import type { AdfMark } from '../../types/index.js';\n\nexport function applyMarks(text: string, marks: AdfMark[] | undefined): string {\n if (!marks || marks.length === 0) return text;\n let result = text;\n const hasCode = marks.some((m) => m.type === 'code');\n if (hasCode) {\n const linkMark = marks.find(\n (m): m is Extract<AdfMark, { type: 'link' }> => m.type === 'link',\n );\n result = `\\`${result}\\``;\n if (linkMark) result = `[${result}](${linkMark.attrs.href})`;\n return result;\n }\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n result = `**${result}**`;\n break;\n case 'em':\n result = `*${result}*`;\n break;\n case 'strike':\n result = `~~${result}~~`;\n break;\n case 'underline':\n result = `<ins>${result}</ins>`;\n break;\n case 'subsup':\n result =\n mark.attrs.type === 'sub'\n ? `<sub>${result}</sub>`\n : `<sup>${result}</sup>`;\n break;\n case 'link':\n result = `[${result}](${mark.attrs.href}${mark.attrs.title ? ` \"${mark.attrs.title}\"` : ''})`;\n break;\n case 'textColor':\n case 'backgroundColor':\n case 'alignment':\n case 'indentation':\n case 'breakout':\n case 'border':\n case 'annotation':\n case 'dataConsumer':\n case 'fragment':\n break;\n }\n }\n return result;\n}\n","import type { AdfInlineNode } from '../../types/index.js';\nimport type { AdfToMdOptions } from '../../types/index.js';\nimport { escapeMarkdown } from '../../utils/escape.js';\nimport { applyMarks } from './marks.js';\n\nexport function serializeInlineNodes(\n nodes: AdfInlineNode[] | undefined,\n options?: AdfToMdOptions,\n): string {\n if (!nodes || nodes.length === 0) return '';\n return nodes.map((node) => serializeInline(node, options)).join('');\n}\n\nfunction serializeInline(node: AdfInlineNode, options?: AdfToMdOptions): string {\n switch (node.type) {\n case 'text':\n return applyMarks(escapeMarkdown(node.text), node.marks);\n case 'hardBreak':\n return '\\\\\\n';\n case 'mention':\n if (options?.mentions === false) return node.attrs.text ?? node.attrs.id;\n return node.attrs.text ?? `@${node.attrs.id}`;\n case 'emoji':\n return node.attrs.text ?? `:${node.attrs.shortName}:`;\n case 'date':\n return node.attrs.timestamp;\n case 'status':\n return `\\`[${node.attrs.text}]\\``;\n case 'inlineCard':\n return node.attrs.url ? `<${node.attrs.url}>` : '';\n case 'mediaInline':\n return '';\n default:\n return '';\n }\n}\n","import type {\n AdfNode,\n AdfTopLevelBlockNode,\n BlockquoteNode,\n CodeBlockNode,\n HeadingNode,\n ParagraphNode,\n RuleNode,\n} from '../../types/index.js';\nimport type { AdfToMdOptions } from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport type SerializeBlockFn = (node: AdfTopLevelBlockNode | AdfNode) => string;\n\nexport function serializeHeading(node: HeadingNode, options?: AdfToMdOptions): string {\n const prefix = '#'.repeat(node.attrs.level);\n return `${prefix} ${serializeInlineNodes(node.content, options)}`;\n}\n\nexport function serializeParagraph(node: ParagraphNode, options?: AdfToMdOptions): string {\n return serializeInlineNodes(node.content, options);\n}\n\nexport function serializeCodeBlock(node: CodeBlockNode): string {\n const lang = node.attrs?.language ?? '';\n const code = node.content?.map((t) => t.text).join('') ?? '';\n return `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``;\n}\n\nexport function serializeRule(_node: RuleNode): string {\n return '---';\n}\n\nexport function serializeBlockquote(\n node: BlockquoteNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const lines = node.content.map((child) => serializeBlock(child)).join('\\n\\n');\n return lines\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n}\n","import type {\n BulletListNode,\n DecisionListNode,\n ListItemNode,\n OrderedListNode,\n TaskListNode,\n} from '../../types/index.js';\nimport type { AdfToMdOptions } from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport function serializeBulletList(node: BulletListNode, depth = 0, options?: AdfToMdOptions): string {\n return node.content\n .map((item) => serializeListItem(item, '-', depth, options))\n .join('\\n');\n}\n\nexport function serializeOrderedList(node: OrderedListNode, depth = 0, options?: AdfToMdOptions): string {\n const start = node.attrs?.order ?? 1;\n return node.content\n .map((item, i) => serializeListItem(item, `${start + i}.`, depth, options))\n .join('\\n');\n}\n\nexport function serializeTaskList(node: TaskListNode, depth = 0, options?: AdfToMdOptions): string {\n return node.content\n .map((item) => {\n const indent = ' '.repeat(depth);\n const checkbox = item.attrs.state === 'DONE' ? '[x]' : '[ ]';\n const text = serializeInlineNodes(item.content, options);\n return `${indent}- ${checkbox} ${text}`;\n })\n .join('\\n');\n}\n\nexport function serializeDecisionList(\n node: DecisionListNode,\n depth = 0,\n options?: AdfToMdOptions,\n): string {\n return node.content\n .map((item) => {\n const indent = ' '.repeat(depth);\n const text = serializeInlineNodes(item.content, options);\n return `${indent}- [x] ${text}`;\n })\n .join('\\n');\n}\n\nfunction serializeListItem(\n node: ListItemNode,\n bullet: string,\n depth: number,\n options?: AdfToMdOptions,\n): string {\n const indent = ' '.repeat(depth);\n const parts: string[] = [];\n for (const child of node.content) {\n if (child.type === 'paragraph') {\n parts.push(serializeInlineNodes(child.content, options));\n } else if (child.type === 'bulletList') {\n parts.push('\\n' + serializeBulletList(child, depth + 1, options));\n } else if (child.type === 'orderedList') {\n parts.push('\\n' + serializeOrderedList(child, depth + 1, options));\n } else if (child.type === 'codeBlock') {\n const lang = child.attrs?.language ?? '';\n const code = child.content?.map((t) => t.text).join('') ?? '';\n parts.push(`\\n\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\``);\n }\n }\n return `${indent}${bullet} ${parts.join('')}`;\n}\n","import type {\n BlockCardNode,\n EmbedCardNode,\n ExpandNode,\n MediaSingleNode,\n NestedExpandNode,\n PanelNode,\n} from '../../types/index.js';\nimport type { SerializeBlockFn } from './blocks.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nconst PANEL_TO_ALERT: Record<string, string> = {\n note: 'NOTE',\n info: 'TIP',\n tip: 'TIP',\n warning: 'WARNING',\n success: 'NOTE',\n error: 'CAUTION',\n custom: 'NOTE',\n};\n\nexport function serializePanel(\n node: PanelNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const alertType = PANEL_TO_ALERT[node.attrs.panelType] ?? 'NOTE';\n const contentLines = node.content\n .map((child) => serializeBlock(child))\n .join('\\n\\n');\n const lines = [\n `> [!${alertType}]`,\n ...contentLines.split('\\n').map((l) => `> ${l}`),\n ];\n return lines.join('\\n');\n}\n\nexport function serializeExpand(\n node: ExpandNode | NestedExpandNode,\n serializeBlock: SerializeBlockFn,\n): string {\n const title = node.attrs.title ?? '';\n const contentLines = node.content\n .map((child) => serializeBlock(child))\n .join('\\n\\n');\n return `<details>\\n<summary>${title}</summary>\\n\\n${contentLines}\\n</details>`;\n}\n\nexport function serializeMediaSingle(node: MediaSingleNode): string {\n const media = node.content[0];\n if (!media) return '';\n const alt = media.attrs.alt ?? 'image';\n if (media.attrs.type === 'link') {\n const url = (media.attrs as unknown as { url?: string }).url;\n if (url) return ``;\n }\n return `[media: ${media.attrs.id}]`;\n}\n\nexport function serializeBlockCard(node: BlockCardNode): string {\n const url = node.attrs.url;\n if (!url) return '';\n return `[${url}](${url})`;\n}\n\nexport function serializeEmbedCard(node: EmbedCardNode): string {\n return `[${node.attrs.url}](${node.attrs.url})`;\n}\n\nexport { serializeInlineNodes };\n","import type { ParagraphNode, TableNode } from '../../types/index.js';\nimport { serializeInlineNodes } from './inlines.js';\n\nexport function serializeTable(node: TableNode): string {\n const rows = node.content;\n if (rows.length === 0) return '';\n\n const firstRow = rows[0];\n if (!firstRow) return '';\n\n const isHeaderRow = firstRow.content.some((c) => c.type === 'tableHeader');\n\n const serializeCell = (cell: {\n content: import('../../types/index.js').AdfTableCellContent[];\n }): string => {\n const para = cell.content.find((c) => c.type === 'paragraph') as\n | ParagraphNode\n | undefined;\n if (!para) return ' ';\n return serializeInlineNodes(para.content).trim() || ' ';\n };\n\n const lines: string[] = [];\n\n if (isHeaderRow) {\n const headerCells = firstRow.content.map(serializeCell);\n lines.push(`| ${headerCells.join(' | ')} |`);\n lines.push(`| ${headerCells.map(() => '---').join(' | ')} |`);\n for (const row of rows.slice(1)) {\n const cells = row.content.map(serializeCell);\n lines.push(`| ${cells.join(' | ')} |`);\n }\n } else {\n const colCount = firstRow.content.length;\n const headerPlaceholders = Array<string>(colCount).fill(' ');\n lines.push(`| ${headerPlaceholders.join(' | ')} |`);\n lines.push(`| ${headerPlaceholders.map(() => '---').join(' | ')} |`);\n for (const row of rows) {\n const cells = row.content.map(serializeCell);\n lines.push(`| ${cells.join(' | ')} |`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type {\n AdfNode,\n AdfTopLevelBlockNode,\n LayoutSectionNode,\n} from '../../types/index.js';\nimport type { AdfToMdOptions } from '../../types/index.js';\nimport {\n serializeBlockquote,\n serializeCodeBlock,\n serializeHeading,\n serializeParagraph,\n serializeRule,\n} from './blocks.js';\nimport {\n serializeBulletList,\n serializeDecisionList,\n serializeOrderedList,\n serializeTaskList,\n} from './lists.js';\nimport {\n serializeBlockCard,\n serializeEmbedCard,\n serializeExpand,\n serializeMediaSingle,\n serializePanel,\n} from './panels.js';\nimport { serializeTable } from './tables.js';\n\nexport function serializeBlock(node: AdfTopLevelBlockNode | AdfNode, options?: AdfToMdOptions): string {\n switch (node.type) {\n case 'paragraph':\n return serializeParagraph(node, options);\n case 'heading':\n return serializeHeading(node, options);\n case 'codeBlock':\n return serializeCodeBlock(node);\n case 'rule':\n return serializeRule(node);\n case 'blockquote':\n return serializeBlockquote(node, (n) => serializeBlock(n, options));\n case 'bulletList':\n return serializeBulletList(node, 0, options);\n case 'orderedList':\n return serializeOrderedList(node, 0, options);\n case 'taskList':\n return serializeTaskList(node, 0, options);\n case 'decisionList':\n return serializeDecisionList(node, 0, options);\n case 'table':\n return serializeTable(node);\n case 'panel':\n return serializePanel(node, (n) => serializeBlock(n, options));\n case 'expand':\n return serializeExpand(node, (n) => serializeBlock(n, options));\n case 'nestedExpand':\n return serializeExpand(node, (n) => serializeBlock(n, options));\n case 'mediaSingle':\n return serializeMediaSingle(node);\n case 'blockCard':\n return serializeBlockCard(node);\n case 'embedCard':\n return serializeEmbedCard(node);\n case 'layoutSection':\n return serializeLayoutSection(node, options);\n default:\n return '';\n }\n}\n\nfunction serializeLayoutSection(node: LayoutSectionNode, options?: AdfToMdOptions): string {\n return node.content\n .map((col) =>\n col.content.map((child) => serializeBlock(child, options)).join('\\n\\n'),\n )\n .join('\\n\\n---\\n\\n');\n}\n","import type { AdfDoc, AdfToMdOptions } from '../types/index.js';\nimport { sanitizeMarkdown } from '../utils/sanitize.js';\nimport { serializeBlock } from './serialize/index.js';\n\nexport function adfToMd(adf: AdfDoc, options?: AdfToMdOptions): string {\n const parts = adf.content.map((node) => serializeBlock(node, options));\n const joined = parts.filter((p) => p.length > 0).join('\\n\\n');\n return sanitizeMarkdown(joined);\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-markdown-adf",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Bidirectional GitHub Flavored Markdown (GFM) to/from Atlassian Document Format (ADF) converter for Node.js, browsers, and TypeScript.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Unlicense",
|