feat: mermaid
This commit is contained in:
parent
e8ce7b7216
commit
b737e9f4ea
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
|
|
@ -32,23 +32,24 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@solidjs/router": "^0.15.0",
|
"@solidjs/router": "^0.15.0",
|
||||||
"chokidar": "^5.0.0",
|
"chokidar": "^5.0.0",
|
||||||
"commander": "^12.1.0",
|
"commander": "^14.0.3",
|
||||||
"csv-parse": "^5.5.6",
|
"csv-parse": "^6.1.0",
|
||||||
"js-yaml": "^4.1.1",
|
"js-yaml": "^4.1.1",
|
||||||
"marked": "^14.1.0",
|
"marked": "^17.0.3",
|
||||||
"marked-alert": "^2.1.2",
|
"marked-alert": "^2.1.2",
|
||||||
"marked-directive": "^1.0.7",
|
"marked-directive": "^1.0.7",
|
||||||
|
"mermaid": "^11.0.0",
|
||||||
"solid-element": "^1.9.1",
|
"solid-element": "^1.9.1",
|
||||||
"solid-js": "^1.9.3"
|
"solid-js": "^1.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@rsbuild/core": "^1.1.8",
|
"@rsbuild/core": "^1.1.8",
|
||||||
"@rsbuild/plugin-babel": "^1.1.0",
|
"@rsbuild/plugin-babel": "^1.1.0",
|
||||||
"@rsbuild/plugin-solid": "^1.0.7",
|
"@rsbuild/plugin-solid": "^1.1.0",
|
||||||
"@tailwindcss/postcss": "^4.2.1",
|
"@tailwindcss/postcss": "^4.2.1",
|
||||||
"@tailwindcss/typography": "^0.5.15",
|
"@tailwindcss/typography": "^0.5.15",
|
||||||
"@tailwindcss/vite": "^4.0.0",
|
"@tailwindcss/vite": "^4.0.0",
|
||||||
"@types/node": "^22.10.2",
|
"@types/node": "^22.19.13",
|
||||||
"tailwindcss": "^4.0.0",
|
"tailwindcss": "^4.0.0",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"typescript": "^5.7.2"
|
"typescript": "^5.7.2"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { Component, createSignal, createEffect, onCleanup, Show, createResource } from 'solid-js';
|
import { Component, createSignal, createEffect, onCleanup, Show, createResource } from 'solid-js';
|
||||||
import { parseMarkdown } from '../markdown';
|
import { parseMarkdown } from '../markdown';
|
||||||
import { fetchData, extractSection } from '../data-loader';
|
import { fetchData, extractSection } from '../data-loader';
|
||||||
|
import mermaid from 'mermaid';
|
||||||
|
|
||||||
export interface ArticleProps {
|
export interface ArticleProps {
|
||||||
src: string;
|
src: string;
|
||||||
|
|
@ -30,6 +31,8 @@ export const Article: Component<ArticleProps> = (props) => {
|
||||||
const data = content();
|
const data = content();
|
||||||
if (data) {
|
if (data) {
|
||||||
props.onLoaded?.();
|
props.onLoaded?.();
|
||||||
|
// 内容加载完成后,渲染 mermaid 图表
|
||||||
|
void mermaid.run();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,13 @@ export const HeadingNode: Component<{
|
||||||
const handleClick = (e: MouseEvent) => {
|
const handleClick = (e: MouseEvent) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
navigate(href);
|
navigate(href);
|
||||||
|
// 滚动到目标元素
|
||||||
|
requestAnimationFrame(() => {
|
||||||
|
const element = document.getElementById(anchor);
|
||||||
|
if (element) {
|
||||||
|
element.scrollIntoView({ behavior: "smooth", block: "start" });
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const indent = props.depth * 12;
|
const indent = props.depth * 12;
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,12 @@ import { Marked } from 'marked';
|
||||||
import {createDirectives, presetDirectiveConfigs} from 'marked-directive';
|
import {createDirectives, presetDirectiveConfigs} from 'marked-directive';
|
||||||
import yaml from 'js-yaml';
|
import yaml from 'js-yaml';
|
||||||
import markedAlert from "marked-alert";
|
import markedAlert from "marked-alert";
|
||||||
|
import markedMermaid from "./mermaid";
|
||||||
|
|
||||||
// 使用 marked-directive 来支持指令语法
|
// 使用 marked-directive 来支持指令语法
|
||||||
const marked = new Marked()
|
const marked = new Marked()
|
||||||
.use(markedAlert())
|
.use(markedAlert())
|
||||||
|
.use(markedMermaid())
|
||||||
.use(createDirectives([
|
.use(createDirectives([
|
||||||
...presetDirectiveConfigs,
|
...presetDirectiveConfigs,
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
import type {MarkedExtension} from "marked";
|
||||||
|
import mermaid from "mermaid";
|
||||||
|
|
||||||
|
mermaid.initialize({
|
||||||
|
theme: 'dark'
|
||||||
|
});
|
||||||
|
|
||||||
|
export default function markedMermaid(): MarkedExtension {
|
||||||
|
return {
|
||||||
|
renderer: {
|
||||||
|
code: (code) => {
|
||||||
|
// Use default render for other languages
|
||||||
|
if (code.lang !== 'mermaid') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use Mermaid to render the diagram
|
||||||
|
return `<pre class="mermaid">${code.text}</pre>`;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue