diff --git a/packages/mermaid/package.json b/packages/mermaid/package.json
index bec56d3a0..982b9d063 100644
--- a/packages/mermaid/package.json
+++ b/packages/mermaid/package.json
@@ -81,7 +81,7 @@
"katex": "^0.16.9",
"khroma": "^2.1.0",
"lodash-es": "^4.17.21",
- "mdast-util-from-markdown": "^2.0.0",
+ "marked": "^13.0.2",
"stylis": "^4.3.1",
"ts-dedent": "^2.2.0",
"uuid": "^9.0.1"
diff --git a/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts b/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts
index 7362e6f70..dec76ffd7 100644
--- a/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts
+++ b/packages/mermaid/src/rendering-util/handle-markdown-text.spec.ts
@@ -1,4 +1,3 @@
-/* eslint-disable no-irregular-whitespace */
import { markdownToLines, markdownToHTML } from './handle-markdown-text.js';
import { test, expect } from 'vitest';
@@ -215,13 +214,13 @@ test('markdownToLines - No auto wrapping', () => {
[
[
{
- "content": "Hello, how do",
+ "content": "Hello, how do",
"type": "normal",
},
],
[
{
- "content": "you do?",
+ "content": "you do?",
"type": "normal",
},
],
@@ -296,5 +295,5 @@ test('markdownToHTML - no auto wrapping', () => {
you do?`,
{ markdownAutoWrap: false }
)
- ).toMatchInlineSnapshot('"
Hello, how do
you do?
"');
+ ).toMatchInlineSnapshot(`"Hello, how do
you do?
"`);
});
diff --git a/packages/mermaid/src/rendering-util/handle-markdown-text.ts b/packages/mermaid/src/rendering-util/handle-markdown-text.ts
index c539f7268..1d481e652 100644
--- a/packages/mermaid/src/rendering-util/handle-markdown-text.ts
+++ b/packages/mermaid/src/rendering-util/handle-markdown-text.ts
@@ -1,5 +1,5 @@
-import type { Content } from 'mdast';
-import { fromMarkdown } from 'mdast-util-from-markdown';
+import type { MarkedToken, Token } from 'marked';
+import { marked } from 'marked';
import { dedent } from 'ts-dedent';
import type { MarkdownLine, MarkdownWordType } from './types.js';
import type { MermaidConfig } from '../config.type.js';
@@ -24,13 +24,13 @@ function preprocessMarkdown(markdown: string, { markdownAutoWrap }: MermaidConfi
*/
export function markdownToLines(markdown: string, config: MermaidConfig = {}): MarkdownLine[] {
const preprocessedMarkdown = preprocessMarkdown(markdown, config);
- const { children } = fromMarkdown(preprocessedMarkdown);
+ const nodes = marked.lexer(preprocessedMarkdown);
const lines: MarkdownLine[] = [[]];
let currentLine = 0;
- function processNode(node: Content, parentType: MarkdownWordType = 'normal') {
+ function processNode(node: MarkedToken, parentType: MarkdownWordType = 'normal') {
if (node.type === 'text') {
- const textLines = node.value.split('\n');
+ const textLines = node.text.split('\n');
textLines.forEach((textLine, index) => {
if (index !== 0) {
currentLine++;
@@ -42,17 +42,17 @@ export function markdownToLines(markdown: string, config: MermaidConfig = {}): M
}
});
});
- } else if (node.type === 'strong' || node.type === 'emphasis') {
- node.children.forEach((contentNode) => {
- processNode(contentNode, node.type);
+ } else if (node.type === 'strong' || node.type === 'em') {
+ node.tokens.forEach((contentNode) => {
+ processNode(contentNode as MarkedToken, node.type === 'em' ? 'emphasis' : node.type);
});
}
}
- children.forEach((treeNode) => {
+ nodes.forEach((treeNode) => {
if (treeNode.type === 'paragraph') {
- treeNode.children.forEach((contentNode) => {
- processNode(contentNode);
+ treeNode.tokens?.forEach((contentNode) => {
+ processNode(contentNode as MarkedToken);
});
}
});
@@ -61,23 +61,23 @@ export function markdownToLines(markdown: string, config: MermaidConfig = {}): M
}
export function markdownToHTML(markdown: string, { markdownAutoWrap }: MermaidConfig = {}) {
- const { children } = fromMarkdown(markdown);
+ const nodes = marked.lexer(markdown);
- function output(node: Content): string {
+ function output(node: Token): string {
if (node.type === 'text') {
if (markdownAutoWrap === false) {
- return node.value.replace(/\n/g, '
').replace(/ /g, ' ');
+ return node.text.replace(/\n/g, '
').replace(/ /g, ' ');
}
- return node.value.replace(/\n/g, '
');
+ return node.text.replace(/\n/g, '
');
} else if (node.type === 'strong') {
- return `${node.children.map(output).join('')}`;
- } else if (node.type === 'emphasis') {
- return `${node.children.map(output).join('')}`;
+ return `${node.tokens?.map(output).join('')}`;
+ } else if (node.type === 'em') {
+ return `${node.tokens?.map(output).join('')}`;
} else if (node.type === 'paragraph') {
- return `${node.children.map(output).join('')}
`;
+ return `${node.tokens?.map(output).join('')}
`;
}
return `Unsupported markdown: ${node.type}`;
}
- return children.map(output).join('');
+ return nodes.map(output).join('');
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 57da8f81b..7066d62b5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -239,9 +239,9 @@ importers:
lodash-es:
specifier: ^4.17.21
version: 4.17.21
- mdast-util-from-markdown:
- specifier: ^2.0.0
- version: 2.0.1
+ marked:
+ specifier: ^13.0.2
+ version: 13.0.2
stylis:
specifier: ^4.3.1
version: 4.3.2
@@ -6784,6 +6784,11 @@ packages:
markdown-table@3.0.3:
resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==}
+ marked@13.0.2:
+ resolution: {integrity: sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==}
+ engines: {node: '>= 18'}
+ hasBin: true
+
marked@4.3.0:
resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
engines: {node: '>= 12'}
@@ -16893,6 +16898,8 @@ snapshots:
markdown-table@3.0.3: {}
+ marked@13.0.2: {}
+
marked@4.3.0: {}
mdast-builder@1.1.1: