@hywax/mdc-tiptap 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -24
- package/dist/index.cjs +33 -29
- package/dist/index.d.cts +26 -7
- package/dist/index.d.mts +26 -7
- package/dist/index.d.ts +26 -7
- package/dist/index.mjs +32 -30
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,37 +23,15 @@ npm install @hywax/mdc-tiptap -D
|
|
|
23
23
|
|
|
24
24
|
## Usage
|
|
25
25
|
|
|
26
|
-
### `mdcToTiptap`
|
|
27
|
-
|
|
28
26
|
```ts
|
|
29
|
-
import {
|
|
30
|
-
|
|
31
|
-
const mdc = await parseMarkdown(markdown) // AST MDC
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
### `mdcNodeToTiptap`
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
import { mdcNodeToTiptap } from '@hywax/mdc-tiptap'
|
|
38
|
-
|
|
39
|
-
const tiptap = mdcNodeToTiptap(mdc) // AST Tiptap
|
|
40
|
-
```
|
|
41
|
-
### `tiptapToMarkdown`
|
|
27
|
+
import { createMarkdown } from '@hywax/mdc-tiptap'
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
import { tiptapToMarkdown } from '@hywax/mdc-tiptap'
|
|
29
|
+
const { tiptapToMarkdown, markdownToTiptap } = createMarkdown()
|
|
45
30
|
|
|
46
31
|
const markdown = await tiptapToMarkdown(tiptap) // Markdown string
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
```ts
|
|
50
|
-
import { markdownToTiptap } from '@hywax/mdc-tiptap'
|
|
51
|
-
|
|
52
32
|
const tiptap = await markdownToTiptap(markdown) // AST Tiptap
|
|
53
33
|
```
|
|
54
34
|
|
|
55
|
-
### `markdownToTiptap`
|
|
56
|
-
|
|
57
35
|
## License
|
|
58
36
|
|
|
59
37
|
MDC to Tiptap is open sourced software licensed under the [MIT license](https://github.com/hywax/mdc-tiptap/blob/main/LICENSE.md).
|
package/dist/index.cjs
CHANGED
|
@@ -11720,7 +11720,7 @@ const tagToMark = {
|
|
|
11720
11720
|
code: "code",
|
|
11721
11721
|
a: "link"
|
|
11722
11722
|
};
|
|
11723
|
-
const
|
|
11723
|
+
const defaultMDCToTiptapMap = {
|
|
11724
11724
|
...Object.fromEntries(Object.entries(tagToMark).map(([key, value]) => [key, (node) => createMark(node, value)])),
|
|
11725
11725
|
root: (node) => ({ type: "doc", content: (node.children || []).flatMap((child) => mdcNodeToTiptap(child, node)) }),
|
|
11726
11726
|
text: (node) => createTextNode(node),
|
|
@@ -11744,22 +11744,20 @@ const mdcToTiptapMap = {
|
|
|
11744
11744
|
binding: (node) => createTipTapNode(node, "binding", { attrs: { value: node.props?.value, defaultValue: node.props?.defaultValue } }),
|
|
11745
11745
|
hr: (node) => createTipTapNode(node, "horizontalRule")
|
|
11746
11746
|
};
|
|
11747
|
-
function mdcToTiptap(body,
|
|
11747
|
+
function mdcToTiptap(body, options) {
|
|
11748
11748
|
body.children = (body.children || []).filter((child) => child.type !== "text");
|
|
11749
|
-
const tree = mdcNodeToTiptap(body);
|
|
11750
|
-
tree.content = [
|
|
11751
|
-
{
|
|
11752
|
-
type: "frontmatter",
|
|
11753
|
-
attrs: { frontmatter }
|
|
11754
|
-
},
|
|
11755
|
-
...isEmpty(tree.content) ? [{ type: "paragraph", content: [] }] : tree.content
|
|
11756
|
-
];
|
|
11749
|
+
const tree = mdcNodeToTiptap(body, void 0, options?.mdcToTiptapMap);
|
|
11750
|
+
tree.content = isEmpty(tree.content) ? [{ type: "paragraph", content: [] }] : tree.content;
|
|
11757
11751
|
return tree;
|
|
11758
11752
|
}
|
|
11759
|
-
function mdcNodeToTiptap(node, parent) {
|
|
11753
|
+
function mdcNodeToTiptap(node, parent, mdcToTiptapMap) {
|
|
11760
11754
|
const type = node.type === "element" ? node.tag : node.type;
|
|
11761
|
-
|
|
11762
|
-
|
|
11755
|
+
const nodes = {
|
|
11756
|
+
...mdcToTiptapMap,
|
|
11757
|
+
...defaultMDCToTiptapMap || {}
|
|
11758
|
+
};
|
|
11759
|
+
if (nodes[type]) {
|
|
11760
|
+
return nodes[type](node);
|
|
11763
11761
|
}
|
|
11764
11762
|
if (parent?.tag === "p") {
|
|
11765
11763
|
return createTipTapNode(node, "inline-element", { attrs: { tag: type } });
|
|
@@ -11886,7 +11884,7 @@ function createPreNode(node) {
|
|
|
11886
11884
|
}
|
|
11887
11885
|
function createParagraphNode(node) {
|
|
11888
11886
|
if (node.children?.length && node.children?.every((child) => child.tag === "img")) {
|
|
11889
|
-
return node.children?.map((child) =>
|
|
11887
|
+
return node.children?.map((child) => defaultMDCToTiptapMap.img(child));
|
|
11890
11888
|
}
|
|
11891
11889
|
node.children = node.children?.filter((child) => !(child.type === "text" && !child.value)) || [];
|
|
11892
11890
|
const content = node.children.map((child) => mdcNodeToTiptap(child, node)).flat();
|
|
@@ -11966,8 +11964,8 @@ const markToTag = {
|
|
|
11966
11964
|
strike: "del",
|
|
11967
11965
|
code: "code"
|
|
11968
11966
|
};
|
|
11969
|
-
const
|
|
11970
|
-
"doc": (node) => ({ type: "root", children: (node.content || []).flatMap(tiptapNodeToMDC) }),
|
|
11967
|
+
const defaultTiptapToMDCMap = {
|
|
11968
|
+
"doc": (node) => ({ type: "root", children: (node.content || []).flatMap((child) => tiptapNodeToMDC(child)) }),
|
|
11971
11969
|
"element": createElement,
|
|
11972
11970
|
"inline-element": createElement,
|
|
11973
11971
|
"span-style": (node) => createElement(node, "span", { props: cleanSpanProps(node.attrs) }),
|
|
@@ -12023,11 +12021,11 @@ async function tiptapToMdc(node, options) {
|
|
|
12023
12021
|
};
|
|
12024
12022
|
}
|
|
12025
12023
|
}
|
|
12026
|
-
mdc.body = tiptapNodeToMDC(nodeCopy);
|
|
12024
|
+
mdc.body = tiptapNodeToMDC(nodeCopy, options?.tiptapToMDCMap);
|
|
12027
12025
|
await applyShikiSyntaxHighlighting(mdc.body, options?.highlightTheme);
|
|
12028
12026
|
return mdc;
|
|
12029
12027
|
}
|
|
12030
|
-
function tiptapNodeToMDC(node) {
|
|
12028
|
+
function tiptapNodeToMDC(node, tiptapToMDCMap) {
|
|
12031
12029
|
if (!node) {
|
|
12032
12030
|
return {
|
|
12033
12031
|
type: "element",
|
|
@@ -12036,8 +12034,12 @@ function tiptapNodeToMDC(node) {
|
|
|
12036
12034
|
props: {}
|
|
12037
12035
|
};
|
|
12038
12036
|
}
|
|
12039
|
-
|
|
12040
|
-
|
|
12037
|
+
const nodes = {
|
|
12038
|
+
...tiptapToMDCMap,
|
|
12039
|
+
...defaultTiptapToMDCMap || {}
|
|
12040
|
+
};
|
|
12041
|
+
if (nodes[node.type]) {
|
|
12042
|
+
return nodes[node.type](node);
|
|
12041
12043
|
}
|
|
12042
12044
|
if (node.type === "emoji") {
|
|
12043
12045
|
return { type: "text", value: getEmojiUnicode(node.attrs?.name || "") };
|
|
@@ -12076,7 +12078,7 @@ function createElement(node, tag, extra = {}) {
|
|
|
12076
12078
|
return {
|
|
12077
12079
|
type: "element",
|
|
12078
12080
|
tag: tag || node.attrs?.tag,
|
|
12079
|
-
children: node.children || children.flatMap(tiptapNodeToMDC),
|
|
12081
|
+
children: node.children || children.flatMap((child) => tiptapNodeToMDC(child)),
|
|
12080
12082
|
...rest,
|
|
12081
12083
|
props: Object.fromEntries(propsArray)
|
|
12082
12084
|
};
|
|
@@ -12130,11 +12132,11 @@ function createParagraphElement(node, propsArray, rest = {}) {
|
|
|
12130
12132
|
return {
|
|
12131
12133
|
type: "element",
|
|
12132
12134
|
tag: markToTag[block.mark.type],
|
|
12133
|
-
children: block.content.flatMap(tiptapNodeToMDC),
|
|
12135
|
+
children: block.content.flatMap((child) => tiptapNodeToMDC(child)),
|
|
12134
12136
|
...props
|
|
12135
12137
|
};
|
|
12136
12138
|
}
|
|
12137
|
-
return block.content.flatMap(tiptapNodeToMDC);
|
|
12139
|
+
return block.content.flatMap((child) => tiptapNodeToMDC(child));
|
|
12138
12140
|
});
|
|
12139
12141
|
const mergedChildren = mergeSiblingsWithSameTag(children.flat(), Object.values(markToTag));
|
|
12140
12142
|
return {
|
|
@@ -12200,8 +12202,8 @@ function createTextElement(node) {
|
|
|
12200
12202
|
return { type: "text", value: node.text };
|
|
12201
12203
|
}
|
|
12202
12204
|
const res = node.marks.reduce((acc, mark) => {
|
|
12203
|
-
if (
|
|
12204
|
-
return
|
|
12205
|
+
if (defaultTiptapToMDCMap[mark.type]) {
|
|
12206
|
+
return defaultTiptapToMDCMap[mark.type]({ ...mark, children: [acc] });
|
|
12205
12207
|
}
|
|
12206
12208
|
return acc;
|
|
12207
12209
|
}, { type: "text", value: text });
|
|
@@ -12292,17 +12294,19 @@ function getNodeContent(node) {
|
|
|
12292
12294
|
return content;
|
|
12293
12295
|
}
|
|
12294
12296
|
|
|
12295
|
-
async function tiptapToMarkdown(node) {
|
|
12296
|
-
const mdc = await tiptapToMdc(node);
|
|
12297
|
+
async function tiptapToMarkdown(node, options) {
|
|
12298
|
+
const mdc = await tiptapToMdc(node, options);
|
|
12297
12299
|
return runtime.stringifyMarkdown(mdc.body, mdc.data);
|
|
12298
12300
|
}
|
|
12299
|
-
async function markdownToTiptap(markdown) {
|
|
12301
|
+
async function markdownToTiptap(markdown, options) {
|
|
12300
12302
|
const mdc = await runtime.parseMarkdown(markdown);
|
|
12301
|
-
return mdcToTiptap(mdc.body,
|
|
12303
|
+
return mdcToTiptap(mdc.body, options);
|
|
12302
12304
|
}
|
|
12303
12305
|
|
|
12306
|
+
exports.createElement = createElement;
|
|
12304
12307
|
exports.createMark = createMark;
|
|
12305
12308
|
exports.createParagraphElement = createParagraphElement;
|
|
12309
|
+
exports.createTipTapNode = createTipTapNode;
|
|
12306
12310
|
exports.markdownToTiptap = markdownToTiptap;
|
|
12307
12311
|
exports.mdcNodeToTiptap = mdcNodeToTiptap;
|
|
12308
12312
|
exports.mdcToTiptap = mdcToTiptap;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { JSONContent } from '@tiptap/vue-3';
|
|
2
2
|
import { MDCRoot, MDCNode, MDCElement } from '@nuxtjs/mdc';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
declare function
|
|
4
|
+
type MDCToTipTapMap = Record<string, (node: MDCRoot | MDCNode) => JSONContent>;
|
|
5
|
+
interface MDCToTiptapOptions {
|
|
6
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
7
|
+
}
|
|
8
|
+
declare function mdcToTiptap(body: MDCRoot, options?: MDCToTiptapOptions): JSONContent;
|
|
9
|
+
declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode, mdcToTiptapMap?: MDCToTipTapMap): JSONContent;
|
|
9
10
|
declare function createMark(node: MDCNode, mark: string, accumulatedMarks?: {
|
|
10
11
|
type: string;
|
|
11
12
|
attrs?: object;
|
|
12
13
|
}[]): JSONContent[];
|
|
14
|
+
declare function createTipTapNode(node: MDCElement, type: string, extra?: Record<string, unknown>): Record<string, unknown>;
|
|
13
15
|
|
|
14
16
|
interface SyntaxHighlightTheme {
|
|
15
17
|
default: string;
|
|
@@ -17,14 +19,31 @@ interface SyntaxHighlightTheme {
|
|
|
17
19
|
light?: string;
|
|
18
20
|
}
|
|
19
21
|
|
|
22
|
+
type TiptapToMDCMap = Record<string, (node: JSONContent) => MDCRoot | MDCNode | MDCNode[]>;
|
|
20
23
|
interface TiptapToMDCOptions {
|
|
21
24
|
highlightTheme?: SyntaxHighlightTheme;
|
|
25
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
22
26
|
}
|
|
23
27
|
declare function tiptapToMdc(node: JSONContent, options?: TiptapToMDCOptions): Promise<{
|
|
24
28
|
body: MDCRoot;
|
|
25
29
|
data: Record<string, unknown>;
|
|
26
30
|
}>;
|
|
27
|
-
declare function tiptapNodeToMDC(node: JSONContent): MDCRoot | MDCNode | MDCNode[];
|
|
31
|
+
declare function tiptapNodeToMDC(node: JSONContent, tiptapToMDCMap?: TiptapToMDCMap): MDCRoot | MDCNode | MDCNode[];
|
|
32
|
+
/***************************************************************
|
|
33
|
+
*********************** Create element methods ****************
|
|
34
|
+
***************************************************************/
|
|
35
|
+
declare function createElement(node: JSONContent, tag?: string, extra?: unknown): MDCElement;
|
|
28
36
|
declare function createParagraphElement(node: JSONContent, propsArray: string[][], rest?: object): MDCElement;
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
interface MarkdownToTiptapOptions {
|
|
39
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
40
|
+
highlightTheme?: SyntaxHighlightTheme;
|
|
41
|
+
}
|
|
42
|
+
interface TiptapToMarkdownOptions {
|
|
43
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
44
|
+
}
|
|
45
|
+
declare function tiptapToMarkdown(node: JSONContent, options?: MarkdownToTiptapOptions): Promise<string | null>;
|
|
46
|
+
declare function markdownToTiptap(markdown: string, options?: TiptapToMarkdownOptions): Promise<JSONContent>;
|
|
47
|
+
|
|
48
|
+
export { createElement, createMark, createParagraphElement, createTipTapNode, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
|
|
49
|
+
export type { MDCToTipTapMap, MDCToTiptapOptions, TiptapToMDCMap };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { JSONContent } from '@tiptap/vue-3';
|
|
2
2
|
import { MDCRoot, MDCNode, MDCElement } from '@nuxtjs/mdc';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
declare function
|
|
4
|
+
type MDCToTipTapMap = Record<string, (node: MDCRoot | MDCNode) => JSONContent>;
|
|
5
|
+
interface MDCToTiptapOptions {
|
|
6
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
7
|
+
}
|
|
8
|
+
declare function mdcToTiptap(body: MDCRoot, options?: MDCToTiptapOptions): JSONContent;
|
|
9
|
+
declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode, mdcToTiptapMap?: MDCToTipTapMap): JSONContent;
|
|
9
10
|
declare function createMark(node: MDCNode, mark: string, accumulatedMarks?: {
|
|
10
11
|
type: string;
|
|
11
12
|
attrs?: object;
|
|
12
13
|
}[]): JSONContent[];
|
|
14
|
+
declare function createTipTapNode(node: MDCElement, type: string, extra?: Record<string, unknown>): Record<string, unknown>;
|
|
13
15
|
|
|
14
16
|
interface SyntaxHighlightTheme {
|
|
15
17
|
default: string;
|
|
@@ -17,14 +19,31 @@ interface SyntaxHighlightTheme {
|
|
|
17
19
|
light?: string;
|
|
18
20
|
}
|
|
19
21
|
|
|
22
|
+
type TiptapToMDCMap = Record<string, (node: JSONContent) => MDCRoot | MDCNode | MDCNode[]>;
|
|
20
23
|
interface TiptapToMDCOptions {
|
|
21
24
|
highlightTheme?: SyntaxHighlightTheme;
|
|
25
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
22
26
|
}
|
|
23
27
|
declare function tiptapToMdc(node: JSONContent, options?: TiptapToMDCOptions): Promise<{
|
|
24
28
|
body: MDCRoot;
|
|
25
29
|
data: Record<string, unknown>;
|
|
26
30
|
}>;
|
|
27
|
-
declare function tiptapNodeToMDC(node: JSONContent): MDCRoot | MDCNode | MDCNode[];
|
|
31
|
+
declare function tiptapNodeToMDC(node: JSONContent, tiptapToMDCMap?: TiptapToMDCMap): MDCRoot | MDCNode | MDCNode[];
|
|
32
|
+
/***************************************************************
|
|
33
|
+
*********************** Create element methods ****************
|
|
34
|
+
***************************************************************/
|
|
35
|
+
declare function createElement(node: JSONContent, tag?: string, extra?: unknown): MDCElement;
|
|
28
36
|
declare function createParagraphElement(node: JSONContent, propsArray: string[][], rest?: object): MDCElement;
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
interface MarkdownToTiptapOptions {
|
|
39
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
40
|
+
highlightTheme?: SyntaxHighlightTheme;
|
|
41
|
+
}
|
|
42
|
+
interface TiptapToMarkdownOptions {
|
|
43
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
44
|
+
}
|
|
45
|
+
declare function tiptapToMarkdown(node: JSONContent, options?: MarkdownToTiptapOptions): Promise<string | null>;
|
|
46
|
+
declare function markdownToTiptap(markdown: string, options?: TiptapToMarkdownOptions): Promise<JSONContent>;
|
|
47
|
+
|
|
48
|
+
export { createElement, createMark, createParagraphElement, createTipTapNode, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
|
|
49
|
+
export type { MDCToTipTapMap, MDCToTiptapOptions, TiptapToMDCMap };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { JSONContent } from '@tiptap/vue-3';
|
|
2
2
|
import { MDCRoot, MDCNode, MDCElement } from '@nuxtjs/mdc';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
declare function
|
|
4
|
+
type MDCToTipTapMap = Record<string, (node: MDCRoot | MDCNode) => JSONContent>;
|
|
5
|
+
interface MDCToTiptapOptions {
|
|
6
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
7
|
+
}
|
|
8
|
+
declare function mdcToTiptap(body: MDCRoot, options?: MDCToTiptapOptions): JSONContent;
|
|
9
|
+
declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode, mdcToTiptapMap?: MDCToTipTapMap): JSONContent;
|
|
9
10
|
declare function createMark(node: MDCNode, mark: string, accumulatedMarks?: {
|
|
10
11
|
type: string;
|
|
11
12
|
attrs?: object;
|
|
12
13
|
}[]): JSONContent[];
|
|
14
|
+
declare function createTipTapNode(node: MDCElement, type: string, extra?: Record<string, unknown>): Record<string, unknown>;
|
|
13
15
|
|
|
14
16
|
interface SyntaxHighlightTheme {
|
|
15
17
|
default: string;
|
|
@@ -17,14 +19,31 @@ interface SyntaxHighlightTheme {
|
|
|
17
19
|
light?: string;
|
|
18
20
|
}
|
|
19
21
|
|
|
22
|
+
type TiptapToMDCMap = Record<string, (node: JSONContent) => MDCRoot | MDCNode | MDCNode[]>;
|
|
20
23
|
interface TiptapToMDCOptions {
|
|
21
24
|
highlightTheme?: SyntaxHighlightTheme;
|
|
25
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
22
26
|
}
|
|
23
27
|
declare function tiptapToMdc(node: JSONContent, options?: TiptapToMDCOptions): Promise<{
|
|
24
28
|
body: MDCRoot;
|
|
25
29
|
data: Record<string, unknown>;
|
|
26
30
|
}>;
|
|
27
|
-
declare function tiptapNodeToMDC(node: JSONContent): MDCRoot | MDCNode | MDCNode[];
|
|
31
|
+
declare function tiptapNodeToMDC(node: JSONContent, tiptapToMDCMap?: TiptapToMDCMap): MDCRoot | MDCNode | MDCNode[];
|
|
32
|
+
/***************************************************************
|
|
33
|
+
*********************** Create element methods ****************
|
|
34
|
+
***************************************************************/
|
|
35
|
+
declare function createElement(node: JSONContent, tag?: string, extra?: unknown): MDCElement;
|
|
28
36
|
declare function createParagraphElement(node: JSONContent, propsArray: string[][], rest?: object): MDCElement;
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
interface MarkdownToTiptapOptions {
|
|
39
|
+
tiptapToMDCMap?: TiptapToMDCMap;
|
|
40
|
+
highlightTheme?: SyntaxHighlightTheme;
|
|
41
|
+
}
|
|
42
|
+
interface TiptapToMarkdownOptions {
|
|
43
|
+
mdcToTiptapMap?: MDCToTipTapMap;
|
|
44
|
+
}
|
|
45
|
+
declare function tiptapToMarkdown(node: JSONContent, options?: MarkdownToTiptapOptions): Promise<string | null>;
|
|
46
|
+
declare function markdownToTiptap(markdown: string, options?: TiptapToMarkdownOptions): Promise<JSONContent>;
|
|
47
|
+
|
|
48
|
+
export { createElement, createMark, createParagraphElement, createTipTapNode, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
|
|
49
|
+
export type { MDCToTipTapMap, MDCToTiptapOptions, TiptapToMDCMap };
|
package/dist/index.mjs
CHANGED
|
@@ -11713,7 +11713,7 @@ const tagToMark = {
|
|
|
11713
11713
|
code: "code",
|
|
11714
11714
|
a: "link"
|
|
11715
11715
|
};
|
|
11716
|
-
const
|
|
11716
|
+
const defaultMDCToTiptapMap = {
|
|
11717
11717
|
...Object.fromEntries(Object.entries(tagToMark).map(([key, value]) => [key, (node) => createMark(node, value)])),
|
|
11718
11718
|
root: (node) => ({ type: "doc", content: (node.children || []).flatMap((child) => mdcNodeToTiptap(child, node)) }),
|
|
11719
11719
|
text: (node) => createTextNode(node),
|
|
@@ -11737,22 +11737,20 @@ const mdcToTiptapMap = {
|
|
|
11737
11737
|
binding: (node) => createTipTapNode(node, "binding", { attrs: { value: node.props?.value, defaultValue: node.props?.defaultValue } }),
|
|
11738
11738
|
hr: (node) => createTipTapNode(node, "horizontalRule")
|
|
11739
11739
|
};
|
|
11740
|
-
function mdcToTiptap(body,
|
|
11740
|
+
function mdcToTiptap(body, options) {
|
|
11741
11741
|
body.children = (body.children || []).filter((child) => child.type !== "text");
|
|
11742
|
-
const tree = mdcNodeToTiptap(body);
|
|
11743
|
-
tree.content = [
|
|
11744
|
-
{
|
|
11745
|
-
type: "frontmatter",
|
|
11746
|
-
attrs: { frontmatter }
|
|
11747
|
-
},
|
|
11748
|
-
...isEmpty(tree.content) ? [{ type: "paragraph", content: [] }] : tree.content
|
|
11749
|
-
];
|
|
11742
|
+
const tree = mdcNodeToTiptap(body, void 0, options?.mdcToTiptapMap);
|
|
11743
|
+
tree.content = isEmpty(tree.content) ? [{ type: "paragraph", content: [] }] : tree.content;
|
|
11750
11744
|
return tree;
|
|
11751
11745
|
}
|
|
11752
|
-
function mdcNodeToTiptap(node, parent) {
|
|
11746
|
+
function mdcNodeToTiptap(node, parent, mdcToTiptapMap) {
|
|
11753
11747
|
const type = node.type === "element" ? node.tag : node.type;
|
|
11754
|
-
|
|
11755
|
-
|
|
11748
|
+
const nodes = {
|
|
11749
|
+
...mdcToTiptapMap,
|
|
11750
|
+
...defaultMDCToTiptapMap || {}
|
|
11751
|
+
};
|
|
11752
|
+
if (nodes[type]) {
|
|
11753
|
+
return nodes[type](node);
|
|
11756
11754
|
}
|
|
11757
11755
|
if (parent?.tag === "p") {
|
|
11758
11756
|
return createTipTapNode(node, "inline-element", { attrs: { tag: type } });
|
|
@@ -11879,7 +11877,7 @@ function createPreNode(node) {
|
|
|
11879
11877
|
}
|
|
11880
11878
|
function createParagraphNode(node) {
|
|
11881
11879
|
if (node.children?.length && node.children?.every((child) => child.tag === "img")) {
|
|
11882
|
-
return node.children?.map((child) =>
|
|
11880
|
+
return node.children?.map((child) => defaultMDCToTiptapMap.img(child));
|
|
11883
11881
|
}
|
|
11884
11882
|
node.children = node.children?.filter((child) => !(child.type === "text" && !child.value)) || [];
|
|
11885
11883
|
const content = node.children.map((child) => mdcNodeToTiptap(child, node)).flat();
|
|
@@ -11959,8 +11957,8 @@ const markToTag = {
|
|
|
11959
11957
|
strike: "del",
|
|
11960
11958
|
code: "code"
|
|
11961
11959
|
};
|
|
11962
|
-
const
|
|
11963
|
-
"doc": (node) => ({ type: "root", children: (node.content || []).flatMap(tiptapNodeToMDC) }),
|
|
11960
|
+
const defaultTiptapToMDCMap = {
|
|
11961
|
+
"doc": (node) => ({ type: "root", children: (node.content || []).flatMap((child) => tiptapNodeToMDC(child)) }),
|
|
11964
11962
|
"element": createElement,
|
|
11965
11963
|
"inline-element": createElement,
|
|
11966
11964
|
"span-style": (node) => createElement(node, "span", { props: cleanSpanProps(node.attrs) }),
|
|
@@ -12016,11 +12014,11 @@ async function tiptapToMdc(node, options) {
|
|
|
12016
12014
|
};
|
|
12017
12015
|
}
|
|
12018
12016
|
}
|
|
12019
|
-
mdc.body = tiptapNodeToMDC(nodeCopy);
|
|
12017
|
+
mdc.body = tiptapNodeToMDC(nodeCopy, options?.tiptapToMDCMap);
|
|
12020
12018
|
await applyShikiSyntaxHighlighting(mdc.body, options?.highlightTheme);
|
|
12021
12019
|
return mdc;
|
|
12022
12020
|
}
|
|
12023
|
-
function tiptapNodeToMDC(node) {
|
|
12021
|
+
function tiptapNodeToMDC(node, tiptapToMDCMap) {
|
|
12024
12022
|
if (!node) {
|
|
12025
12023
|
return {
|
|
12026
12024
|
type: "element",
|
|
@@ -12029,8 +12027,12 @@ function tiptapNodeToMDC(node) {
|
|
|
12029
12027
|
props: {}
|
|
12030
12028
|
};
|
|
12031
12029
|
}
|
|
12032
|
-
|
|
12033
|
-
|
|
12030
|
+
const nodes = {
|
|
12031
|
+
...tiptapToMDCMap,
|
|
12032
|
+
...defaultTiptapToMDCMap || {}
|
|
12033
|
+
};
|
|
12034
|
+
if (nodes[node.type]) {
|
|
12035
|
+
return nodes[node.type](node);
|
|
12034
12036
|
}
|
|
12035
12037
|
if (node.type === "emoji") {
|
|
12036
12038
|
return { type: "text", value: getEmojiUnicode(node.attrs?.name || "") };
|
|
@@ -12069,7 +12071,7 @@ function createElement(node, tag, extra = {}) {
|
|
|
12069
12071
|
return {
|
|
12070
12072
|
type: "element",
|
|
12071
12073
|
tag: tag || node.attrs?.tag,
|
|
12072
|
-
children: node.children || children.flatMap(tiptapNodeToMDC),
|
|
12074
|
+
children: node.children || children.flatMap((child) => tiptapNodeToMDC(child)),
|
|
12073
12075
|
...rest,
|
|
12074
12076
|
props: Object.fromEntries(propsArray)
|
|
12075
12077
|
};
|
|
@@ -12123,11 +12125,11 @@ function createParagraphElement(node, propsArray, rest = {}) {
|
|
|
12123
12125
|
return {
|
|
12124
12126
|
type: "element",
|
|
12125
12127
|
tag: markToTag[block.mark.type],
|
|
12126
|
-
children: block.content.flatMap(tiptapNodeToMDC),
|
|
12128
|
+
children: block.content.flatMap((child) => tiptapNodeToMDC(child)),
|
|
12127
12129
|
...props
|
|
12128
12130
|
};
|
|
12129
12131
|
}
|
|
12130
|
-
return block.content.flatMap(tiptapNodeToMDC);
|
|
12132
|
+
return block.content.flatMap((child) => tiptapNodeToMDC(child));
|
|
12131
12133
|
});
|
|
12132
12134
|
const mergedChildren = mergeSiblingsWithSameTag(children.flat(), Object.values(markToTag));
|
|
12133
12135
|
return {
|
|
@@ -12193,8 +12195,8 @@ function createTextElement(node) {
|
|
|
12193
12195
|
return { type: "text", value: node.text };
|
|
12194
12196
|
}
|
|
12195
12197
|
const res = node.marks.reduce((acc, mark) => {
|
|
12196
|
-
if (
|
|
12197
|
-
return
|
|
12198
|
+
if (defaultTiptapToMDCMap[mark.type]) {
|
|
12199
|
+
return defaultTiptapToMDCMap[mark.type]({ ...mark, children: [acc] });
|
|
12198
12200
|
}
|
|
12199
12201
|
return acc;
|
|
12200
12202
|
}, { type: "text", value: text });
|
|
@@ -12285,13 +12287,13 @@ function getNodeContent(node) {
|
|
|
12285
12287
|
return content;
|
|
12286
12288
|
}
|
|
12287
12289
|
|
|
12288
|
-
async function tiptapToMarkdown(node) {
|
|
12289
|
-
const mdc = await tiptapToMdc(node);
|
|
12290
|
+
async function tiptapToMarkdown(node, options) {
|
|
12291
|
+
const mdc = await tiptapToMdc(node, options);
|
|
12290
12292
|
return stringifyMarkdown(mdc.body, mdc.data);
|
|
12291
12293
|
}
|
|
12292
|
-
async function markdownToTiptap(markdown) {
|
|
12294
|
+
async function markdownToTiptap(markdown, options) {
|
|
12293
12295
|
const mdc = await parseMarkdown(markdown);
|
|
12294
|
-
return mdcToTiptap(mdc.body,
|
|
12296
|
+
return mdcToTiptap(mdc.body, options);
|
|
12295
12297
|
}
|
|
12296
12298
|
|
|
12297
|
-
export { createMark, createParagraphElement, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
|
|
12299
|
+
export { createElement, createMark, createParagraphElement, createTipTapNode, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
|