github-markdown-adf 0.0.0-semantic-release → 1.0.1
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 +5 -1
- package/dist/browser/index.iife.js +20 -20
- package/dist/browser/index.js +16 -16
- package/dist/index.cjs +153 -13
- package/dist/index.mjs +153 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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/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\nexport function parseMarkdown(markdown: string): Root {\n const processor = unified().use(remarkParse).use(remarkGfm);\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 { Html } from 'mdast';\nimport type { ParagraphNode } from '../../types/index.js';\n\nexport function transformHtmlBlock(node: Html): ParagraphNode | null {\n const detailsMatch =\n /<details[^>]*>\\s*<summary[^>]*>(.*?)<\\/summary>([\\s\\S]*?)<\\/details>/i.exec(\n node.value,\n );\n if (detailsMatch) {\n const title = (detailsMatch[1] ?? '').trim();\n return { type: 'paragraph', content: [{ type: 'text', text: title }] };\n }\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 { transformHtmlBlock } from './inlines.js';\nimport { transformList } from './lists.js';\nimport { transformTable } from './tables.js';\n\nexport function transformRoot(root: Root): AdfDoc {\n const content = root.children.flatMap((node) => {\n const result = transformBlock(node as BlockContent);\n return result ? [result] : [];\n });\n return { version: 1, type: 'doc', content };\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\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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "github-markdown-adf",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.1",
|
|
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",
|