@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 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 { mdcToTiptap } from '@hywax/mdc-tiptap'
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
- ```ts
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 mdcToTiptapMap = {
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, frontmatter) {
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
- if (mdcToTiptapMap[type]) {
11762
- return mdcToTiptapMap[type](node);
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) => mdcToTiptapMap.img(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 tiptapToMDCMap = {
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
- if (tiptapToMDCMap[node.type]) {
12040
- return tiptapToMDCMap[node.type](node);
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 (tiptapToMDCMap[mark.type]) {
12204
- return tiptapToMDCMap[mark.type]({ ...mark, children: [acc] });
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
- declare function tiptapToMarkdown(node: JSONContent): Promise<string | null>;
5
- declare function markdownToTiptap(markdown: string): Promise<JSONContent>;
6
-
7
- declare function mdcToTiptap(body: MDCRoot, frontmatter: Record<string, unknown>): JSONContent;
8
- declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode): JSONContent;
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
- export { createMark, createParagraphElement, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
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
- declare function tiptapToMarkdown(node: JSONContent): Promise<string | null>;
5
- declare function markdownToTiptap(markdown: string): Promise<JSONContent>;
6
-
7
- declare function mdcToTiptap(body: MDCRoot, frontmatter: Record<string, unknown>): JSONContent;
8
- declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode): JSONContent;
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
- export { createMark, createParagraphElement, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
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
- declare function tiptapToMarkdown(node: JSONContent): Promise<string | null>;
5
- declare function markdownToTiptap(markdown: string): Promise<JSONContent>;
6
-
7
- declare function mdcToTiptap(body: MDCRoot, frontmatter: Record<string, unknown>): JSONContent;
8
- declare function mdcNodeToTiptap(node: MDCRoot | MDCNode, parent?: MDCNode): JSONContent;
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
- export { createMark, createParagraphElement, markdownToTiptap, mdcNodeToTiptap, mdcToTiptap, tiptapNodeToMDC, tiptapToMarkdown, tiptapToMdc };
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 mdcToTiptapMap = {
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, frontmatter) {
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
- if (mdcToTiptapMap[type]) {
11755
- return mdcToTiptapMap[type](node);
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) => mdcToTiptapMap.img(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 tiptapToMDCMap = {
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
- if (tiptapToMDCMap[node.type]) {
12033
- return tiptapToMDCMap[node.type](node);
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 (tiptapToMDCMap[mark.type]) {
12197
- return tiptapToMDCMap[mark.type]({ ...mark, children: [acc] });
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 };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hywax/mdc-tiptap",
3
3
  "type": "module",
4
- "version": "0.0.1",
4
+ "version": "0.1.0",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/hywax/mdc-tiptap.git"