@commonpub/editor 0.4.2 → 0.5.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/dist/index.d.ts CHANGED
@@ -23,4 +23,5 @@ export { CommonPubCheckpoint } from './extensions/checkpoint.js';
23
23
  export { CommonPubMathNotation } from './extensions/mathNotation.js';
24
24
  export { createCommonPubEditor } from './editorKit.js';
25
25
  export type { CreateCommonPubEditorOptions } from './editorKit.js';
26
+ export { markdownToBlockTuples, blockTuplesToMarkdown, type MarkdownParseOptions } from './markdown/index.js';
26
27
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAGnE,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -24,4 +24,6 @@ export { CommonPubCheckpoint } from './extensions/checkpoint.js';
24
24
  export { CommonPubMathNotation } from './extensions/mathNotation.js';
25
25
  // Editor factory
26
26
  export { createCommonPubEditor } from './editorKit.js';
27
+ // Markdown conversion
28
+ export { markdownToBlockTuples, blockTuplesToMarkdown } from './markdown/index.js';
27
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAuB7B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,gBAAgB;AAChB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,iBAAiB,EACjB,8BAA8B,EAC9B,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,GAC3B,MAAM,qBAAqB,CAAC;AAuB7B,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,gBAAgB;AAChB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,iBAAiB;AACjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,sBAAsB;AACtB,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAA6B,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { markdownToBlockTuples, type MarkdownParseOptions } from './parser.js';
2
+ export { blockTuplesToMarkdown } from './serializer.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { markdownToBlockTuples } from './parser.js';
2
+ export { blockTuplesToMarkdown } from './serializer.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAA6B,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { BlockTuple } from '../blocks/types.js';
2
+ export interface MarkdownParseOptions {
3
+ /** Handle wikilinks [[page]] or [[page|text]]. Default: strip to display text. */
4
+ wikilinkHandler?: (page: string, displayText?: string) => string;
5
+ }
6
+ /**
7
+ * Convert a markdown string to an array of BlockTuples.
8
+ */
9
+ export declare function markdownToBlockTuples(md: string, options?: MarkdownParseOptions): BlockTuple[];
10
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/markdown/parser.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,kFAAkF;IAClF,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CAClE;AAmBD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,UAAU,EAAE,CA0B9F"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Markdown → BlockTuple[] converter.
3
+ * Uses unified/remark to parse markdown into an AST, then maps each node
4
+ * to the corresponding BlockTuple type.
5
+ *
6
+ * Pure and synchronous — no async, no DOM, no side effects.
7
+ */
8
+ import { unified } from 'unified';
9
+ import remarkParse from 'remark-parse';
10
+ import remarkGfm from 'remark-gfm';
11
+ import remarkRehype from 'remark-rehype';
12
+ import rehypeStringify from 'rehype-stringify';
13
+ const CALLOUT_REGEX = /^\[!(NOTE|TIP|WARNING|DANGER|INFO|CAUTION|EXAMPLE|ABSTRACT|TODO|BUG|QUOTE|IMPORTANT)\]\s*/i;
14
+ const CALLOUT_VARIANT_MAP = {
15
+ note: 'info',
16
+ info: 'info',
17
+ abstract: 'info',
18
+ todo: 'info',
19
+ example: 'info',
20
+ quote: 'info',
21
+ bug: 'warning',
22
+ caution: 'warning',
23
+ important: 'warning',
24
+ tip: 'tip',
25
+ warning: 'warning',
26
+ danger: 'danger',
27
+ };
28
+ /**
29
+ * Convert a markdown string to an array of BlockTuples.
30
+ */
31
+ export function markdownToBlockTuples(md, options) {
32
+ if (!md || !md.trim())
33
+ return [];
34
+ // Preprocess wikilinks before parsing
35
+ const processed = preprocessWikilinks(md, options?.wikilinkHandler);
36
+ const tree = unified()
37
+ .use(remarkParse)
38
+ .use(remarkGfm)
39
+ .parse(processed);
40
+ const blocks = [];
41
+ for (const node of tree.children) {
42
+ const mapped = mapNode(node);
43
+ if (mapped) {
44
+ if (Array.isArray(mapped[0]) && Array.isArray(mapped[0])) {
45
+ // Multiple blocks returned (e.g., from consecutive paragraphs)
46
+ blocks.push(...mapped);
47
+ }
48
+ else {
49
+ blocks.push(mapped);
50
+ }
51
+ }
52
+ }
53
+ return blocks;
54
+ }
55
+ function mapNode(node) {
56
+ switch (node.type) {
57
+ case 'heading':
58
+ return mapHeading(node);
59
+ case 'paragraph':
60
+ return mapParagraph(node);
61
+ case 'code':
62
+ return mapCode(node);
63
+ case 'image':
64
+ return mapImage(node);
65
+ case 'blockquote':
66
+ return mapBlockquote(node);
67
+ case 'thematicBreak':
68
+ return ['divider', {}];
69
+ case 'list':
70
+ return mapList(node);
71
+ case 'table':
72
+ return mapTable(node);
73
+ case 'html':
74
+ return mapHtml(node);
75
+ default:
76
+ return null;
77
+ }
78
+ }
79
+ function mapHeading(node) {
80
+ const level = Math.min(node.depth, 4);
81
+ const text = extractPlainText(node);
82
+ return ['heading', { text, level }];
83
+ }
84
+ function mapParagraph(node) {
85
+ // Check if paragraph contains only an image
86
+ if (node.children.length === 1 && node.children[0].type === 'image') {
87
+ return mapImage(node.children[0]);
88
+ }
89
+ const html = inlineToHtml(node);
90
+ if (!html.trim())
91
+ return null;
92
+ return ['text', { html: `<p>${html}</p>` }];
93
+ }
94
+ function mapCode(node) {
95
+ let language = node.lang || '';
96
+ let filename;
97
+ // Parse lang:filename format (e.g., "ts:utils.ts")
98
+ if (language.includes(':')) {
99
+ const parts = language.split(':');
100
+ language = parts[0];
101
+ filename = parts.slice(1).join(':');
102
+ }
103
+ return ['code', { code: node.value, language, ...(filename ? { filename } : {}) }];
104
+ }
105
+ function mapImage(node) {
106
+ return ['image', { src: node.url, alt: node.alt || '', caption: node.title || '' }];
107
+ }
108
+ function mapBlockquote(node) {
109
+ // Check for Obsidian callout syntax
110
+ const firstChild = node.children[0];
111
+ if (firstChild?.type === 'paragraph') {
112
+ const firstText = firstChild.children[0];
113
+ if (firstText?.type === 'text') {
114
+ const match = firstText.value.match(CALLOUT_REGEX);
115
+ if (match) {
116
+ const calloutType = match[1].toLowerCase();
117
+ const variant = CALLOUT_VARIANT_MAP[calloutType] || 'info';
118
+ // Remove the callout marker from the text
119
+ const modifiedNode = structuredClone(node);
120
+ const modFirst = modifiedNode.children[0].children[0];
121
+ modFirst.value = modFirst.value.replace(CALLOUT_REGEX, '');
122
+ const html = childrenToHtml(modifiedNode.children);
123
+ return ['callout', { html, variant }];
124
+ }
125
+ }
126
+ }
127
+ const html = childrenToHtml(node.children);
128
+ return ['quote', { html }];
129
+ }
130
+ function mapList(node) {
131
+ const html = nodeToHtml(node);
132
+ return ['text', { html }];
133
+ }
134
+ function mapTable(node) {
135
+ const html = nodeToHtml(node);
136
+ return ['text', { html }];
137
+ }
138
+ function mapHtml(node) {
139
+ return ['text', { html: node.value }];
140
+ }
141
+ // --- Utilities ---
142
+ /** Extract plain text from an inline node (strips all marks) */
143
+ function extractPlainText(node) {
144
+ if (!node.children)
145
+ return '';
146
+ return node.children.map((child) => {
147
+ if ('value' in child)
148
+ return child.value;
149
+ if ('children' in child)
150
+ return extractPlainText(child);
151
+ return '';
152
+ }).join('');
153
+ }
154
+ /**
155
+ * Convert inline mdast nodes to HTML string.
156
+ * Uses remark-rehype + rehype-stringify on a synthetic paragraph.
157
+ */
158
+ function inlineToHtml(node) {
159
+ // Build a minimal tree with just this paragraph
160
+ const tree = { type: 'root', children: [node] };
161
+ const result = unified()
162
+ .use(remarkRehype, { allowDangerousHtml: true })
163
+ .use(rehypeStringify, { allowDangerousHtml: true })
164
+ .stringify(unified()
165
+ .use(remarkRehype, { allowDangerousHtml: true })
166
+ .runSync(tree));
167
+ // Strip wrapping <p> tags since we add them ourselves
168
+ return result.replace(/^<p>/, '').replace(/<\/p>\s*$/, '').trim();
169
+ }
170
+ /** Convert mdast children to an HTML string */
171
+ function childrenToHtml(children) {
172
+ const tree = { type: 'root', children: children };
173
+ return unified()
174
+ .use(remarkRehype, { allowDangerousHtml: true })
175
+ .use(rehypeStringify, { allowDangerousHtml: true })
176
+ .stringify(unified()
177
+ .use(remarkRehype, { allowDangerousHtml: true })
178
+ .runSync(tree));
179
+ }
180
+ /** Convert a single mdast node to HTML */
181
+ function nodeToHtml(node) {
182
+ return childrenToHtml([node]);
183
+ }
184
+ /** Replace [[wikilinks]] with plain text or custom handler output */
185
+ function preprocessWikilinks(md, handler) {
186
+ return md.replace(/\[\[([^\]|]+?)(?:\|([^\]]+?))?\]\]/g, (_match, page, display) => {
187
+ if (handler)
188
+ return handler(page, display);
189
+ return display || page;
190
+ });
191
+ }
192
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/markdown/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * BlockTuple[] → Markdown string serializer.
3
+ * Converts block tuples back to markdown for export.
4
+ */
5
+ import type { BlockTuple } from '../blocks/types.js';
6
+ /**
7
+ * Convert BlockTuple[] to a markdown string.
8
+ */
9
+ export declare function blockTuplesToMarkdown(blocks: BlockTuple[]): string;
10
+ //# sourceMappingURL=serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.d.ts","sourceRoot":"","sources":["../../src/markdown/serializer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAWlE"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Convert BlockTuple[] to a markdown string.
3
+ */
4
+ export function blockTuplesToMarkdown(blocks) {
5
+ const parts = [];
6
+ for (const [type, content] of blocks) {
7
+ const md = serializeBlock(type, content);
8
+ if (md !== null) {
9
+ parts.push(md);
10
+ }
11
+ }
12
+ return parts.join('\n\n');
13
+ }
14
+ function serializeBlock(type, content) {
15
+ switch (type) {
16
+ case 'text':
17
+ return htmlToMarkdown(content.html);
18
+ case 'heading': {
19
+ const level = Math.min(Math.max(content.level, 1), 4);
20
+ const hashes = '#'.repeat(level);
21
+ return `${hashes} ${content.text}`;
22
+ }
23
+ case 'code': {
24
+ const lang = content.language || '';
25
+ const filename = content.filename;
26
+ const info = filename ? `${lang}:${filename}` : lang;
27
+ return `\`\`\`${info}\n${content.code}\n\`\`\``;
28
+ }
29
+ case 'image': {
30
+ const alt = content.alt || '';
31
+ const caption = content.caption || '';
32
+ const md = `![${alt}](${content.src})`;
33
+ return caption ? `${md}\n*${caption}*` : md;
34
+ }
35
+ case 'quote':
36
+ return blockquoteLines(htmlToMarkdown(content.html));
37
+ case 'callout': {
38
+ const variant = content.variant || 'info';
39
+ const typeMap = { info: 'NOTE', tip: 'TIP', warning: 'WARNING', danger: 'DANGER' };
40
+ const label = typeMap[variant] || 'NOTE';
41
+ const body = htmlToMarkdown(content.html);
42
+ return `> [!${label}]\n${blockquoteLines(body)}`;
43
+ }
44
+ case 'divider':
45
+ return '---';
46
+ case 'markdown':
47
+ return content.source;
48
+ case 'video':
49
+ return `[Video](${content.url})`;
50
+ case 'embed':
51
+ return `[Embed](${content.url})`;
52
+ case 'gallery': {
53
+ const images = content.images || [];
54
+ return images.map(img => `![${img.alt || ''}](${img.src})`).join('\n\n');
55
+ }
56
+ case 'mathNotation':
57
+ return `$$\n${content.expression}\n$$`;
58
+ case 'partsList': {
59
+ const parts = content.parts || [];
60
+ if (parts.length === 0)
61
+ return null;
62
+ const rows = parts.map(p => `| ${p.name} | ${p.qty ?? 1} | ${p.price || '-'} |`);
63
+ return `| Part | Qty | Price |\n| --- | --- | --- |\n${rows.join('\n')}`;
64
+ }
65
+ case 'buildStep': {
66
+ const title = content.title || '';
67
+ const body = content.html || content.description || '';
68
+ return `### ${title}\n\n${htmlToMarkdown(body)}`;
69
+ }
70
+ case 'toolList': {
71
+ const tools = content.tools || [];
72
+ return tools.map(t => t.url ? `- [${t.name}](${t.url})` : `- ${t.name}`).join('\n');
73
+ }
74
+ case 'downloads': {
75
+ const files = content.files || [];
76
+ return files.map(f => `- [${f.name}](${f.url})`).join('\n');
77
+ }
78
+ case 'sectionHeader':
79
+ return `## ${content.title || ''}`;
80
+ default:
81
+ return null;
82
+ }
83
+ }
84
+ /** Simple HTML → markdown conversion for inline content */
85
+ function htmlToMarkdown(html) {
86
+ if (!html)
87
+ return '';
88
+ return html
89
+ .replace(/<br\s*\/?>/gi, '\n')
90
+ .replace(/<\/p>\s*<p>/gi, '\n\n')
91
+ .replace(/<p>/gi, '')
92
+ .replace(/<\/p>/gi, '')
93
+ .replace(/<strong>(.*?)<\/strong>/gi, '**$1**')
94
+ .replace(/<b>(.*?)<\/b>/gi, '**$1**')
95
+ .replace(/<em>(.*?)<\/em>/gi, '*$1*')
96
+ .replace(/<i>(.*?)<\/i>/gi, '*$1*')
97
+ .replace(/<s>(.*?)<\/s>/gi, '~~$1~~')
98
+ .replace(/<del>(.*?)<\/del>/gi, '~~$1~~')
99
+ .replace(/<code>(.*?)<\/code>/gi, '`$1`')
100
+ .replace(/<a\s+href="([^"]*)"[^>]*>(.*?)<\/a>/gi, '[$2]($1)')
101
+ .replace(/<ul>(.*?)<\/ul>/gis, (_, inner) => inner.replace(/<li>(.*?)<\/li>/gi, '- $1').trim())
102
+ .replace(/<ol>(.*?)<\/ol>/gis, (_, inner) => {
103
+ let i = 0;
104
+ return inner.replace(/<li>(.*?)<\/li>/gi, () => `${++i}. `).trim();
105
+ })
106
+ .replace(/<[^>]+>/g, '') // Strip remaining tags
107
+ .trim();
108
+ }
109
+ /** Prefix each line with `> ` for blockquotes */
110
+ function blockquoteLines(text) {
111
+ return text.split('\n').map(line => `> ${line}`).join('\n');
112
+ }
113
+ //# sourceMappingURL=serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializer.js","sourceRoot":"","sources":["../../src/markdown/serializer.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,OAAkC,CAAC,CAAC;QACpE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,OAAgC;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,cAAc,CAAC,OAAO,CAAC,IAAc,CAAC,CAAC;QAChD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,IAAc,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,OAAO,CAAC,QAAkB,IAAI,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAA8B,CAAC;YACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACrD,OAAO,SAAS,IAAI,KAAK,OAAO,CAAC,IAAc,UAAU,CAAC;QAC5D,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,GAAG,GAAG,OAAO,CAAC,GAAa,IAAI,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiB,IAAI,EAAE,CAAC;YAChD,MAAM,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,CAAC,GAAa,GAAG,CAAC;YACjD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,CAAC;QACD,KAAK,OAAO;YACV,OAAO,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,IAAc,CAAC,CAAC,CAAC;QACjE,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,OAAiB,IAAI,MAAM,CAAC;YACpD,MAAM,OAAO,GAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC3G,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;YACzC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAc,CAAC,CAAC;YACpD,OAAO,OAAO,KAAK,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf,KAAK,UAAU;YACb,OAAO,OAAO,CAAC,MAAgB,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,WAAW,OAAO,CAAC,GAAa,GAAG,CAAC;QAC7C,KAAK,OAAO;YACV,OAAO,WAAW,OAAO,CAAC,GAAa,GAAG,CAAC;QAC7C,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAA6C,IAAI,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,cAAc;YACjB,OAAO,OAAO,OAAO,CAAC,UAAoB,MAAM,CAAC;QACnD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,OAAO,CAAC,KAA8D,IAAI,EAAE,CAAC;YAC3F,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;YACjF,OAAO,gDAAgD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAe,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAc,IAAI,OAAO,CAAC,WAAqB,IAAI,EAAE,CAAC;YAC3E,OAAO,OAAO,KAAK,OAAO,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,OAAO,CAAC,KAA8C,IAAI,EAAE,CAAC;YAC3E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,OAAO,CAAC,KAA6C,IAAI,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,eAAe;YAClB,OAAO,MAAM,OAAO,CAAC,KAAe,IAAI,EAAE,EAAE,CAAC;QAC/C;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,OAAO,IAAI;SACR,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;SAChC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,2BAA2B,EAAE,QAAQ,CAAC;SAC9C,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACpC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC;SACpC,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC;SAClC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACpC,OAAO,CAAC,qBAAqB,EAAE,QAAQ,CAAC;SACxC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC;SACxC,OAAO,CAAC,uCAAuC,EAAE,UAAU,CAAC;SAC5D,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,KAAa,EAAE,EAAE,CAClD,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAClD;SACA,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,KAAa,EAAE,EAAE;QAClD,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC,CAAC;SACD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,uBAAuB;SAC/C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,iDAAiD;AACjD,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commonpub/editor",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "description": "TipTap block editor with 18+ maker-focused extensions for CommonPub",
6
6
  "license": "AGPL-3.0-or-later",
@@ -40,28 +40,34 @@
40
40
  "LICENSE"
41
41
  ],
42
42
  "dependencies": {
43
+ "rehype-stringify": "^10.0.1",
44
+ "remark-gfm": "^4.0.1",
45
+ "remark-parse": "^11.0.0",
46
+ "remark-rehype": "^11.1.2",
47
+ "unified": "^11.0.5",
43
48
  "zod": "^4.3.6",
44
- "@commonpub/config": "0.4.2",
45
- "@commonpub/schema": "0.4.2"
49
+ "@commonpub/config": "0.5.0",
50
+ "@commonpub/schema": "0.5.0"
46
51
  },
47
52
  "peerDependencies": {
48
53
  "@tiptap/core": "^2.11.0",
49
54
  "@tiptap/extension-bold": "^2.11.0",
55
+ "@tiptap/extension-bullet-list": "^2.11.0",
50
56
  "@tiptap/extension-code": "^2.11.0",
51
57
  "@tiptap/extension-document": "^2.11.0",
52
58
  "@tiptap/extension-history": "^2.11.0",
59
+ "@tiptap/extension-horizontal-rule": "^2.11.0",
53
60
  "@tiptap/extension-italic": "^2.11.0",
54
61
  "@tiptap/extension-link": "^2.11.0",
62
+ "@tiptap/extension-list-item": "^2.11.0",
63
+ "@tiptap/extension-ordered-list": "^2.11.0",
55
64
  "@tiptap/extension-placeholder": "^2.11.0",
56
65
  "@tiptap/extension-strike": "^2.11.0",
57
- "@tiptap/extension-bullet-list": "^2.11.0",
58
- "@tiptap/extension-ordered-list": "^2.11.0",
59
- "@tiptap/extension-list-item": "^2.11.0",
60
- "@tiptap/extension-horizontal-rule": "^2.11.0",
61
66
  "@tiptap/extension-text": "^2.11.0",
62
67
  "@tiptap/pm": "^2.11.0"
63
68
  },
64
69
  "devDependencies": {
70
+ "@types/mdast": "^4.0.4",
65
71
  "jsdom": "^25.0.0",
66
72
  "typescript": "^5.7.0",
67
73
  "vitest": "^3.0.0"