@commonpub/editor 0.4.2 → 0.4.3
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/markdown/index.d.ts +3 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +3 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parser.d.ts +10 -0
- package/dist/markdown/parser.d.ts.map +1 -0
- package/dist/markdown/parser.js +192 -0
- package/dist/markdown/parser.js.map +1 -0
- package/dist/markdown/serializer.d.ts +10 -0
- package/dist/markdown/serializer.d.ts.map +1 -0
- package/dist/markdown/serializer.js +113 -0
- package/dist/markdown/serializer.js.map +1 -0
- package/package.json +13 -7
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 = ``;
|
|
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 => ``).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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@commonpub/editor",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
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/
|
|
45
|
-
"@commonpub/
|
|
49
|
+
"@commonpub/schema": "0.4.2",
|
|
50
|
+
"@commonpub/config": "0.4.2"
|
|
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"
|