github-markdown-adf 1.2.0 → 1.3.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 +27 -3
- package/dist/browser/index.iife.js +17 -17
- package/dist/browser/index.js +16 -16
- package/dist/index.cjs +100 -52
- package/dist/index.d.cts +24 -7
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +24 -7
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +100 -52
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -38,6 +38,7 @@ function normalizeLanguage(lang) {
|
|
|
38
38
|
//#region src/md-to-adf/transform/marks.ts
|
|
39
39
|
const OPEN_HTML_TAG = /^<(ins|sub|sup)>$/i;
|
|
40
40
|
const CLOSE_HTML_TAG = /^<\/(ins|sub|sup)>$/i;
|
|
41
|
+
const MENTION_PATTERN = /(^|[^A-Za-z0-9_@])@([A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?)(?=$|[^A-Za-z0-9._@-])/g;
|
|
41
42
|
function htmlTagToMark(tag) {
|
|
42
43
|
const t = tag.toLowerCase();
|
|
43
44
|
if (t === "ins") return { type: "underline" };
|
|
@@ -51,7 +52,7 @@ function htmlTagToMark(tag) {
|
|
|
51
52
|
};
|
|
52
53
|
return null;
|
|
53
54
|
}
|
|
54
|
-
function phrasingToInlineNodes(nodes) {
|
|
55
|
+
function phrasingToInlineNodes(nodes, options) {
|
|
55
56
|
const markStack = [];
|
|
56
57
|
const result = [];
|
|
57
58
|
for (const node of nodes) {
|
|
@@ -67,22 +68,22 @@ function phrasingToInlineNodes(nodes) {
|
|
|
67
68
|
continue;
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
|
-
result.push(...phrasingToInline(node, markStack.slice()));
|
|
71
|
+
result.push(...phrasingToInline(node, markStack.slice(), options));
|
|
71
72
|
}
|
|
72
73
|
return result;
|
|
73
74
|
}
|
|
74
|
-
function phrasingToInline(node, inheritedMarks) {
|
|
75
|
+
function phrasingToInline(node, inheritedMarks, options) {
|
|
75
76
|
switch (node.type) {
|
|
76
77
|
case "text":
|
|
77
78
|
if (!node.value) return [];
|
|
78
|
-
return
|
|
79
|
+
return textToInlineNodes(node.value, inheritedMarks, options);
|
|
79
80
|
case "inlineCode": {
|
|
80
81
|
const marks = [...inheritedMarks.filter((m) => m.type === "link"), { type: "code" }];
|
|
81
82
|
return [makeText(node.value, marks)];
|
|
82
83
|
}
|
|
83
|
-
case "strong": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "strong" }]));
|
|
84
|
-
case "emphasis": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "em" }]));
|
|
85
|
-
case "delete": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "strike" }]));
|
|
84
|
+
case "strong": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "strong" }], options));
|
|
85
|
+
case "emphasis": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "em" }], options));
|
|
86
|
+
case "delete": return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, { type: "strike" }], options));
|
|
86
87
|
case "link": {
|
|
87
88
|
const linkMark = {
|
|
88
89
|
type: "link",
|
|
@@ -91,7 +92,7 @@ function phrasingToInline(node, inheritedMarks) {
|
|
|
91
92
|
...node.title ? { title: node.title } : {}
|
|
92
93
|
}
|
|
93
94
|
};
|
|
94
|
-
return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, linkMark]));
|
|
95
|
+
return node.children.flatMap((c) => phrasingToInline(c, [...inheritedMarks, linkMark], options));
|
|
95
96
|
}
|
|
96
97
|
case "image": return [{
|
|
97
98
|
type: "inlineCard",
|
|
@@ -104,6 +105,27 @@ function phrasingToInline(node, inheritedMarks) {
|
|
|
104
105
|
default: return [];
|
|
105
106
|
}
|
|
106
107
|
}
|
|
108
|
+
function textToInlineNodes(value, marks, options) {
|
|
109
|
+
if (!options?.mentions || marks.length > 0) return [makeText(value, marks)];
|
|
110
|
+
const result = [];
|
|
111
|
+
let lastIndex = 0;
|
|
112
|
+
for (const match of value.matchAll(MENTION_PATTERN)) {
|
|
113
|
+
const matchIndex = match.index ?? 0;
|
|
114
|
+
const prefix = match[1] ?? "";
|
|
115
|
+
const username = match[2];
|
|
116
|
+
if (!username) continue;
|
|
117
|
+
const mentionStart = matchIndex + prefix.length;
|
|
118
|
+
const mentionEnd = matchIndex + match[0].length;
|
|
119
|
+
appendTextNode(result, value.slice(lastIndex, mentionStart), marks);
|
|
120
|
+
const mentionNode = makeMentionNode(username, options.mentions);
|
|
121
|
+
if (mentionNode) result.push(mentionNode);
|
|
122
|
+
else appendTextNode(result, value.slice(mentionStart, mentionEnd), marks);
|
|
123
|
+
lastIndex = mentionEnd;
|
|
124
|
+
}
|
|
125
|
+
if (result.length === 0) return [makeText(value, marks)];
|
|
126
|
+
appendTextNode(result, value.slice(lastIndex), marks);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
107
129
|
function makeText(value, marks) {
|
|
108
130
|
const node = {
|
|
109
131
|
type: "text",
|
|
@@ -112,6 +134,31 @@ function makeText(value, marks) {
|
|
|
112
134
|
if (marks.length > 0) node.marks = marks;
|
|
113
135
|
return node;
|
|
114
136
|
}
|
|
137
|
+
function appendTextNode(result, value, marks) {
|
|
138
|
+
if (!value) return;
|
|
139
|
+
const previousNode = result[result.length - 1];
|
|
140
|
+
if (previousNode?.type === "text" && sameMarks(previousNode.marks, marks)) {
|
|
141
|
+
previousNode.text += value;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
result.push(makeText(value, marks));
|
|
145
|
+
}
|
|
146
|
+
function makeMentionNode(username, mentions) {
|
|
147
|
+
const attrs = typeof mentions === "function" ? mentions(username) : {
|
|
148
|
+
id: username,
|
|
149
|
+
text: `@${username}`
|
|
150
|
+
};
|
|
151
|
+
if (!attrs) return null;
|
|
152
|
+
return {
|
|
153
|
+
type: "mention",
|
|
154
|
+
attrs
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function sameMarks(leftMarks, rightMarks) {
|
|
158
|
+
const normalizedLeft = leftMarks ?? [];
|
|
159
|
+
if (normalizedLeft.length !== rightMarks.length) return false;
|
|
160
|
+
return normalizedLeft.every((mark, index) => JSON.stringify(mark) === JSON.stringify(rightMarks[index]));
|
|
161
|
+
}
|
|
115
162
|
function parseHtmlInline(html, inheritedMarks) {
|
|
116
163
|
const stripped = html.replace(/<[^>]+>/g, "");
|
|
117
164
|
if (stripped) return [makeText(stripped, inheritedMarks)];
|
|
@@ -119,17 +166,17 @@ function parseHtmlInline(html, inheritedMarks) {
|
|
|
119
166
|
}
|
|
120
167
|
//#endregion
|
|
121
168
|
//#region src/md-to-adf/transform/blocks.ts
|
|
122
|
-
function transformHeading(node) {
|
|
169
|
+
function transformHeading(node, options) {
|
|
123
170
|
return {
|
|
124
171
|
type: "heading",
|
|
125
172
|
attrs: { level: node.depth },
|
|
126
|
-
content: phrasingToInlineNodes(node.children)
|
|
173
|
+
content: phrasingToInlineNodes(node.children, options)
|
|
127
174
|
};
|
|
128
175
|
}
|
|
129
|
-
function transformParagraph(node) {
|
|
176
|
+
function transformParagraph(node, options) {
|
|
130
177
|
return {
|
|
131
178
|
type: "paragraph",
|
|
132
|
-
content: phrasingToInlineNodes(node.children)
|
|
179
|
+
content: phrasingToInlineNodes(node.children, options)
|
|
133
180
|
};
|
|
134
181
|
}
|
|
135
182
|
function transformCode(node) {
|
|
@@ -153,7 +200,7 @@ const ALERT_TO_PANEL = {
|
|
|
153
200
|
WARNING: "warning",
|
|
154
201
|
CAUTION: "error"
|
|
155
202
|
};
|
|
156
|
-
function buildPanelContent(firstChild, restChildren, transformChildren) {
|
|
203
|
+
function buildPanelContent(firstChild, restChildren, transformChildren, options) {
|
|
157
204
|
const remainingText = firstChild.children[0].value.replace(ALERT_PATTERN, "").trim();
|
|
158
205
|
const remainingInlines = firstChild.children.slice(1);
|
|
159
206
|
const contentNodes = [];
|
|
@@ -165,7 +212,7 @@ function buildPanelContent(firstChild, restChildren, transformChildren) {
|
|
|
165
212
|
value: remainingText
|
|
166
213
|
}] : [], ...remainingInlines]
|
|
167
214
|
};
|
|
168
|
-
if (paragraph.children.length > 0) contentNodes.push(transformParagraph(paragraph));
|
|
215
|
+
if (paragraph.children.length > 0) contentNodes.push(transformParagraph(paragraph, options));
|
|
169
216
|
}
|
|
170
217
|
contentNodes.push(...transformChildren(restChildren));
|
|
171
218
|
if (contentNodes.length === 0) contentNodes.push({
|
|
@@ -174,7 +221,7 @@ function buildPanelContent(firstChild, restChildren, transformChildren) {
|
|
|
174
221
|
});
|
|
175
222
|
return contentNodes;
|
|
176
223
|
}
|
|
177
|
-
function tryTransformAlert(node, transformChildren) {
|
|
224
|
+
function tryTransformAlert(node, transformChildren, options) {
|
|
178
225
|
const firstChild = node.children[0];
|
|
179
226
|
if (firstChild?.type !== "paragraph") return null;
|
|
180
227
|
const firstText = firstChild.children[0];
|
|
@@ -182,15 +229,15 @@ function tryTransformAlert(node, transformChildren) {
|
|
|
182
229
|
const match = ALERT_PATTERN.exec(firstText.value);
|
|
183
230
|
if (!match) return null;
|
|
184
231
|
const panelType = ALERT_TO_PANEL[(match[1] ?? "NOTE").toUpperCase()] ?? "info";
|
|
185
|
-
const content = buildPanelContent(firstChild, node.children.slice(1), transformChildren);
|
|
232
|
+
const content = buildPanelContent(firstChild, node.children.slice(1), transformChildren, options);
|
|
186
233
|
return {
|
|
187
234
|
type: "panel",
|
|
188
235
|
attrs: { panelType },
|
|
189
236
|
content
|
|
190
237
|
};
|
|
191
238
|
}
|
|
192
|
-
function transformBlockquote(node, transformChildren) {
|
|
193
|
-
const panel = tryTransformAlert(node, transformChildren);
|
|
239
|
+
function transformBlockquote(node, transformChildren, options) {
|
|
240
|
+
const panel = tryTransformAlert(node, transformChildren, options);
|
|
194
241
|
if (panel) return panel;
|
|
195
242
|
const content = transformChildren(node.children);
|
|
196
243
|
return {
|
|
@@ -354,33 +401,33 @@ function generateId() {
|
|
|
354
401
|
}
|
|
355
402
|
//#endregion
|
|
356
403
|
//#region src/md-to-adf/transform/lists.ts
|
|
357
|
-
function transformList(node, transformBlock) {
|
|
358
|
-
if (node.children.some((item) => item.checked !== null && item.checked !== void 0)) return transformTaskList(node);
|
|
359
|
-
if (node.ordered) return transformOrderedList(node, transformBlock);
|
|
360
|
-
return transformBulletList(node, transformBlock);
|
|
404
|
+
function transformList(node, transformBlock, options) {
|
|
405
|
+
if (node.children.some((item) => item.checked !== null && item.checked !== void 0)) return transformTaskList(node, options);
|
|
406
|
+
if (node.ordered) return transformOrderedList(node, transformBlock, options);
|
|
407
|
+
return transformBulletList(node, transformBlock, options);
|
|
361
408
|
}
|
|
362
|
-
function transformBulletList(node, transformBlock) {
|
|
409
|
+
function transformBulletList(node, transformBlock, options) {
|
|
363
410
|
return {
|
|
364
411
|
type: "bulletList",
|
|
365
|
-
content: node.children.map((item) => transformListItem(item, transformBlock))
|
|
412
|
+
content: node.children.map((item) => transformListItem(item, transformBlock, options))
|
|
366
413
|
};
|
|
367
414
|
}
|
|
368
|
-
function transformOrderedList(node, transformBlock) {
|
|
415
|
+
function transformOrderedList(node, transformBlock, options) {
|
|
369
416
|
const result = {
|
|
370
417
|
type: "orderedList",
|
|
371
|
-
content: node.children.map((item) => transformListItem(item, transformBlock))
|
|
418
|
+
content: node.children.map((item) => transformListItem(item, transformBlock, options))
|
|
372
419
|
};
|
|
373
420
|
if (node.start !== null && node.start !== void 0 && node.start !== 1) result.attrs = { order: node.start };
|
|
374
421
|
return result;
|
|
375
422
|
}
|
|
376
|
-
function transformListItem(node, transformBlock) {
|
|
423
|
+
function transformListItem(node, transformBlock, options) {
|
|
377
424
|
const content = [];
|
|
378
425
|
for (const child of node.children) if (child.type === "paragraph") content.push({
|
|
379
426
|
type: "paragraph",
|
|
380
|
-
content: phrasingToInlineNodes(child.children)
|
|
427
|
+
content: phrasingToInlineNodes(child.children, options)
|
|
381
428
|
});
|
|
382
429
|
else if (child.type === "list") {
|
|
383
|
-
const nestedList = transformList(child, transformBlock);
|
|
430
|
+
const nestedList = transformList(child, transformBlock, options);
|
|
384
431
|
if (nestedList.type === "taskList") {
|
|
385
432
|
const para = {
|
|
386
433
|
type: "paragraph",
|
|
@@ -417,11 +464,11 @@ function transformListItem(node, transformBlock) {
|
|
|
417
464
|
content
|
|
418
465
|
};
|
|
419
466
|
}
|
|
420
|
-
function transformTaskList(node) {
|
|
467
|
+
function transformTaskList(node, options) {
|
|
421
468
|
const listId = generateId();
|
|
422
469
|
const items = node.children.map((listItem) => {
|
|
423
470
|
const state = listItem.checked === true ? "DONE" : "TODO";
|
|
424
|
-
const inlineContent = listItem.children.filter((c) => c.type === "paragraph").flatMap((c) => phrasingToInlineNodes(c.children));
|
|
471
|
+
const inlineContent = listItem.children.filter((c) => c.type === "paragraph").flatMap((c) => phrasingToInlineNodes(c.children, options));
|
|
425
472
|
const taskItem = {
|
|
426
473
|
type: "taskItem",
|
|
427
474
|
attrs: {
|
|
@@ -440,7 +487,7 @@ function transformTaskList(node) {
|
|
|
440
487
|
}
|
|
441
488
|
//#endregion
|
|
442
489
|
//#region src/md-to-adf/transform/tables.ts
|
|
443
|
-
function transformTable(node) {
|
|
490
|
+
function transformTable(node, options) {
|
|
444
491
|
const rows = node.children;
|
|
445
492
|
if (rows.length === 0) return {
|
|
446
493
|
type: "table",
|
|
@@ -451,19 +498,19 @@ function transformTable(node) {
|
|
|
451
498
|
const adfRows = [];
|
|
452
499
|
if (headerRow) adfRows.push({
|
|
453
500
|
type: "tableRow",
|
|
454
|
-
content: headerRow.children.map((cell) => transformTableHeader(cell))
|
|
501
|
+
content: headerRow.children.map((cell) => transformTableHeader(cell, options))
|
|
455
502
|
});
|
|
456
503
|
for (const row of bodyRows) adfRows.push({
|
|
457
504
|
type: "tableRow",
|
|
458
|
-
content: row.children.map((cell) => transformTableCell(cell))
|
|
505
|
+
content: row.children.map((cell) => transformTableCell(cell, options))
|
|
459
506
|
});
|
|
460
507
|
return {
|
|
461
508
|
type: "table",
|
|
462
509
|
content: adfRows
|
|
463
510
|
};
|
|
464
511
|
}
|
|
465
|
-
function transformTableHeader(cell) {
|
|
466
|
-
const inlines = phrasingToInlineNodes(cell.children);
|
|
512
|
+
function transformTableHeader(cell, options) {
|
|
513
|
+
const inlines = phrasingToInlineNodes(cell.children, options);
|
|
467
514
|
return {
|
|
468
515
|
type: "tableHeader",
|
|
469
516
|
attrs: {},
|
|
@@ -473,8 +520,8 @@ function transformTableHeader(cell) {
|
|
|
473
520
|
}]
|
|
474
521
|
};
|
|
475
522
|
}
|
|
476
|
-
function transformTableCell(cell) {
|
|
477
|
-
const inlines = phrasingToInlineNodes(cell.children);
|
|
523
|
+
function transformTableCell(cell, options) {
|
|
524
|
+
const inlines = phrasingToInlineNodes(cell.children, options);
|
|
478
525
|
return {
|
|
479
526
|
type: "tableCell",
|
|
480
527
|
attrs: {},
|
|
@@ -486,42 +533,42 @@ function transformTableCell(cell) {
|
|
|
486
533
|
}
|
|
487
534
|
//#endregion
|
|
488
535
|
//#region src/md-to-adf/transform/index.ts
|
|
489
|
-
function transformRoot(root) {
|
|
536
|
+
function transformRoot(root, options) {
|
|
490
537
|
return {
|
|
491
538
|
version: 1,
|
|
492
539
|
type: "doc",
|
|
493
|
-
content: transformNodes(root.children)
|
|
540
|
+
content: transformNodes(root.children, options)
|
|
494
541
|
};
|
|
495
542
|
}
|
|
496
|
-
function transformNodes(nodes) {
|
|
543
|
+
function transformNodes(nodes, options) {
|
|
497
544
|
const result = [];
|
|
498
545
|
const detailsPairs = buildDetailsPairs(nodes);
|
|
499
546
|
let i = 0;
|
|
500
547
|
while (i < nodes.length) {
|
|
501
|
-
const expand = tryTransformExpand(nodes, i, detailsPairs, transformBlock);
|
|
548
|
+
const expand = tryTransformExpand(nodes, i, detailsPairs, (node) => transformBlock(node, options));
|
|
502
549
|
if (expand) {
|
|
503
550
|
result.push(expand.node);
|
|
504
551
|
i = expand.next;
|
|
505
552
|
continue;
|
|
506
553
|
}
|
|
507
|
-
const transformed = transformBlock(nodes[i]);
|
|
554
|
+
const transformed = transformBlock(nodes[i], options);
|
|
508
555
|
if (transformed) result.push(transformed);
|
|
509
556
|
i++;
|
|
510
557
|
}
|
|
511
558
|
return result;
|
|
512
559
|
}
|
|
513
|
-
function transformBlock(node) {
|
|
560
|
+
function transformBlock(node, options) {
|
|
514
561
|
switch (node.type) {
|
|
515
|
-
case "heading": return transformHeading(node);
|
|
516
|
-
case "paragraph": return transformParagraph(node);
|
|
562
|
+
case "heading": return transformHeading(node, options);
|
|
563
|
+
case "paragraph": return transformParagraph(node, options);
|
|
517
564
|
case "code": return transformCode(node);
|
|
518
565
|
case "thematicBreak": return transformThematicBreak(node);
|
|
519
566
|
case "blockquote": return transformBlockquote(node, (children) => children.flatMap((c) => {
|
|
520
|
-
const r = transformBlock(c);
|
|
567
|
+
const r = transformBlock(c, options);
|
|
521
568
|
return r ? [r] : [];
|
|
522
|
-
}));
|
|
523
|
-
case "list": return transformList(node, transformBlock);
|
|
524
|
-
case "table": return transformTable(node);
|
|
569
|
+
}), options);
|
|
570
|
+
case "list": return transformList(node, (blockNode) => transformBlock(blockNode, options), options);
|
|
571
|
+
case "table": return transformTable(node, options);
|
|
525
572
|
case "html": return transformHtmlBlock(node);
|
|
526
573
|
default: return null;
|
|
527
574
|
}
|
|
@@ -548,8 +595,8 @@ function sanitizeText(text) {
|
|
|
548
595
|
}
|
|
549
596
|
//#endregion
|
|
550
597
|
//#region src/md-to-adf/index.ts
|
|
551
|
-
function mdToAdf(markdown) {
|
|
552
|
-
return transformRoot(parseMarkdown(sanitizeText(markdown)));
|
|
598
|
+
function mdToAdf(markdown, options) {
|
|
599
|
+
return transformRoot(parseMarkdown(sanitizeText(markdown)), options);
|
|
553
600
|
}
|
|
554
601
|
//#endregion
|
|
555
602
|
//#region src/utils/escape.ts
|
|
@@ -616,6 +663,7 @@ function serializeInline(node, options) {
|
|
|
616
663
|
case "hardBreak": return "\\\n";
|
|
617
664
|
case "mention":
|
|
618
665
|
if (options?.mentions === false) return node.attrs.text ?? node.attrs.id;
|
|
666
|
+
if (typeof options?.mentions === "function") return options.mentions(node.attrs);
|
|
619
667
|
return node.attrs.text ?? `@${node.attrs.id}`;
|
|
620
668
|
case "emoji": return node.attrs.text ?? `:${node.attrs.shortName}:`;
|
|
621
669
|
case "date": return node.attrs.timestamp;
|
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 { fromMarkdown } from 'mdast-util-from-markdown';\nimport { gfmFromMarkdown } from 'mdast-util-gfm';\nimport { gfm } from 'micromark-extension-gfm';\nimport type { Root } from 'mdast';\n\nconst markdownParseOptions = {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n};\n\nexport function parseMarkdown(markdown: string): Root {\n return fromMarkdown(markdown, markdownParseOptions);\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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"}
|
|
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 { fromMarkdown } from 'mdast-util-from-markdown';\nimport { gfmFromMarkdown } from 'mdast-util-gfm';\nimport { gfm } from 'micromark-extension-gfm';\nimport type { Root } from 'mdast';\n\nconst markdownParseOptions = {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n};\n\nexport function parseMarkdown(markdown: string): Root {\n return fromMarkdown(markdown, markdownParseOptions);\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 {\n AdfInlineNode,\n AdfMark,\n MdToAdfOptions,\n MentionNode,\n TextNode,\n} from '../../types/index.js';\n\nconst OPEN_HTML_TAG = /^<(ins|sub|sup)>$/i;\nconst CLOSE_HTML_TAG = /^<\\/(ins|sub|sup)>$/i;\nconst MENTION_PATTERN =\n /(^|[^A-Za-z0-9_@])@([A-Za-z0-9](?:[A-Za-z0-9._-]*[A-Za-z0-9])?)(?=$|[^A-Za-z0-9._@-])/g;\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 options?: MdToAdfOptions,\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(), options));\n }\n\n return result;\n}\n\nfunction phrasingToInline(\n node: PhrasingContent,\n inheritedMarks: AdfMark[],\n options?: MdToAdfOptions,\n): AdfInlineNode[] {\n switch (node.type) {\n case 'text':\n if (!node.value) return [];\n return textToInlineNodes(node.value, inheritedMarks, options);\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' }], options),\n );\n case 'emphasis':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'em' }], options),\n );\n case 'delete':\n return node.children.flatMap((c) =>\n phrasingToInline(c, [...inheritedMarks, { type: 'strike' }], options),\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], options),\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 textToInlineNodes(\n value: string,\n marks: AdfMark[],\n options?: MdToAdfOptions,\n): AdfInlineNode[] {\n if (!options?.mentions || marks.length > 0) return [makeText(value, marks)];\n\n const result: AdfInlineNode[] = [];\n let lastIndex = 0;\n\n for (const match of value.matchAll(MENTION_PATTERN)) {\n const matchIndex = match.index ?? 0;\n const prefix = match[1] ?? '';\n const username = match[2];\n if (!username) continue;\n\n const mentionStart = matchIndex + prefix.length;\n const mentionEnd = matchIndex + match[0].length;\n\n appendTextNode(result, value.slice(lastIndex, mentionStart), marks);\n\n const mentionNode = makeMentionNode(username, options.mentions);\n if (mentionNode) {\n result.push(mentionNode);\n } else {\n appendTextNode(result, value.slice(mentionStart, mentionEnd), marks);\n }\n\n lastIndex = mentionEnd;\n }\n\n if (result.length === 0) return [makeText(value, marks)];\n\n appendTextNode(result, value.slice(lastIndex), marks);\n return result;\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 appendTextNode(\n result: AdfInlineNode[],\n value: string,\n marks: AdfMark[],\n): void {\n if (!value) return;\n\n const previousNode = result[result.length - 1];\n if (\n previousNode?.type === 'text' &&\n sameMarks((previousNode as TextNode).marks, marks)\n ) {\n previousNode.text += value;\n return;\n }\n\n result.push(makeText(value, marks));\n}\n\nfunction makeMentionNode(\n username: string,\n mentions: NonNullable<MdToAdfOptions['mentions']>,\n): MentionNode | null {\n const attrs =\n typeof mentions === 'function'\n ? mentions(username)\n : { id: username, text: `@${username}` };\n\n if (!attrs) return null;\n return { type: 'mention', attrs };\n}\n\nfunction sameMarks(\n leftMarks: AdfMark[] | undefined,\n rightMarks: AdfMark[],\n): boolean {\n const normalizedLeft = leftMarks ?? [];\n if (normalizedLeft.length !== rightMarks.length) return false;\n\n return normalizedLeft.every(\n (mark, index) => JSON.stringify(mark) === JSON.stringify(rightMarks[index]),\n );\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 MdToAdfOptions,\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(\n node: Heading,\n options?: MdToAdfOptions,\n): HeadingNode {\n return {\n type: 'heading',\n attrs: { level: node.depth as 1 | 2 | 3 | 4 | 5 | 6 },\n content: phrasingToInlineNodes(node.children, options),\n };\n}\n\nexport function transformParagraph(\n node: Paragraph,\n options?: MdToAdfOptions,\n): ParagraphNode {\n const content = phrasingToInlineNodes(node.children, options);\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 options?: MdToAdfOptions,\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, options));\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 options?: MdToAdfOptions,\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, options);\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 options?: MdToAdfOptions,\n): BlockquoteNode | PanelNode {\n const panel = tryTransformAlert(node, transformChildren, options);\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 MdToAdfOptions,\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 options?: MdToAdfOptions,\n): ListResult {\n const isTask = node.children.some(\n (item) => item.checked !== null && item.checked !== undefined,\n );\n if (isTask) return transformTaskList(node, options);\n if (node.ordered) return transformOrderedList(node, transformBlock, options);\n return transformBulletList(node, transformBlock, options);\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 options?: MdToAdfOptions,\n): BulletListNode {\n return {\n type: 'bulletList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock, options),\n ),\n };\n}\n\nfunction transformOrderedList(\n node: List,\n transformBlock: TransformBlockFn,\n options?: MdToAdfOptions,\n): OrderedListNode {\n const result: OrderedListNode = {\n type: 'orderedList',\n content: node.children.map((item) =>\n transformListItem(item, transformBlock, options),\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 options?: MdToAdfOptions,\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, options),\n });\n } else if (child.type === 'list') {\n const nestedList = transformList(child, transformBlock, options);\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, options?: MdToAdfOptions): 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, options),\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 MdToAdfOptions,\n TableCellNode,\n TableHeaderNode,\n TableNode,\n TableRowNode,\n} from '../../types/index.js';\nimport { phrasingToInlineNodes } from './marks.js';\n\nexport function transformTable(\n node: Table,\n options?: MdToAdfOptions,\n): 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, options)),\n });\n }\n\n for (const row of bodyRows) {\n adfRows.push({\n type: 'tableRow',\n content: row.children.map((cell) => transformTableCell(cell, options)),\n });\n }\n\n return { type: 'table', content: adfRows };\n}\n\nfunction transformTableHeader(\n cell: TableRow['children'][number],\n options?: MdToAdfOptions,\n): TableHeaderNode {\n const inlines = phrasingToInlineNodes(cell.children, options);\n return {\n type: 'tableHeader',\n attrs: {},\n content: [\n { type: 'paragraph', content: inlines.length > 0 ? inlines : [] },\n ],\n };\n}\n\nfunction transformTableCell(\n cell: TableRow['children'][number],\n options?: MdToAdfOptions,\n): TableCellNode {\n const inlines = phrasingToInlineNodes(cell.children, options);\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 {\n AdfDoc,\n AdfTopLevelBlockNode,\n MdToAdfOptions,\n} 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, options?: MdToAdfOptions): AdfDoc {\n const content = transformNodes(root.children as BlockContent[], options);\n return { version: 1, type: 'doc', content };\n}\n\nfunction transformNodes(\n nodes: BlockContent[],\n options?: MdToAdfOptions,\n): 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, (node) =>\n transformBlock(node, options),\n );\n if (expand) {\n result.push(expand.node);\n i = expand.next;\n continue;\n }\n const transformed = transformBlock(nodes[i]!, options);\n if (transformed) result.push(transformed);\n i++;\n }\n return result;\n}\n\nexport function transformBlock(\n node: BlockContent,\n options?: MdToAdfOptions,\n): AdfTopLevelBlockNode | null {\n switch (node.type) {\n case 'heading':\n return transformHeading(node, options);\n case 'paragraph':\n return transformParagraph(node, options);\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, options);\n return r ? [r] : [];\n }),\n options,\n );\n case 'list':\n return transformList(node, (blockNode) => transformBlock(blockNode, options), options);\n case 'table':\n return transformTable(node, options);\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, MdToAdfOptions } 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, options?: MdToAdfOptions): AdfDoc {\n const sanitized = sanitizeText(markdown);\n const mdast = parseMarkdown(sanitized);\n return transformRoot(mdast, options);\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 if (typeof options?.mentions === 'function') return options.mentions(node.attrs);\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.
|
|
3
|
+
"version": "1.3.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",
|