Skip to content
This repository was archived by the owner on May 29, 2026. It is now read-only.

Commit 060ddd4

Browse files
authored
fix: revert @muyajs/core to 0.0.39 to unblock Features/Themes preview (#103)
@muyajs/core@0.1.0 ships its mermaid integration as separate ESM chunks that have a circular import between chunk-5ZQYHXKU and mermaid.core. The consumer chunk runs `var Ie = pe()` at module init while `pe` (the default-export of mermaid.core, lazily wrapped through the `t` helper) hasn't been assigned yet, so it throws `TypeError: pe is not a function` inside MarkdownToHtml.renderHtml(). The promise rejects and both Feature.tsx and Theme.tsx fall into their `.catch` branches, rendering "Error rendering content" / "Error rendering theme content" on the live site (https://marktext.me) and any local build using 0.1.0. Revert PR #99 to restore @muyajs/core@^0.0.39, the explicit `mermaid` dependency, and the existing `rewrapMermaidSource` + manual `mermaid.run()` workaround for 0.0.39's walkTokens accumulation bug. Re-upgrade once @muyajs/core ships a release that fixes the circular chunk init. This reverts commit aae5452.
1 parent f2d3a2f commit 060ddd4

5 files changed

Lines changed: 257 additions & 13 deletions

File tree

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
"type-check": "tsc --noEmit"
1212
},
1313
"dependencies": {
14-
"@muyajs/core": "^0.1.0",
14+
"@muyajs/core": "^0.0.39",
1515
"katex": "^0.16.9",
16+
"mermaid": "^11.12.1",
1617
"react": "^18.2.0",
1718
"react-dom": "^18.2.0"
1819
},

pnpm-lock.yaml

Lines changed: 156 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Feature.tsx

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import React, { useState, useEffect } from 'react'
1+
import React, { useState, useRef, useEffect } from 'react'
2+
import mermaid from 'mermaid'
23
import tableMd from '../markdowns/table.md'
34
import diagramMd from '../markdowns/diagram.md'
45
import inlineFormatsMd from '../markdowns/inlineFormats.md'
@@ -45,6 +46,38 @@ const features: FeatureItem[] = [
4546
const Feature: React.FC = () => {
4647
const [selectedFeature, setSelectedFeature] = useState<FeatureItem>(features[0])
4748
const [htmlContent, setHtmlContent] = useState<string>('')
49+
const muyaContainerRef = useRef<HTMLDivElement>(null)
50+
51+
// 初始化 mermaid 配置
52+
useEffect(() => {
53+
mermaid.initialize({
54+
startOnLoad: false,
55+
theme: 'default'
56+
})
57+
}, [])
58+
59+
const renderMermaid = async () => {
60+
if (!muyaContainerRef.current) return
61+
62+
const codes = muyaContainerRef.current.querySelectorAll('code.language-mermaid')
63+
codes.forEach((code) => {
64+
const preEle = code.parentNode as HTMLElement
65+
const mermaidContainer = document.createElement('div')
66+
mermaidContainer.textContent = code.textContent ?? ''
67+
mermaidContainer.classList.add('mermaid')
68+
preEle.replaceWith(mermaidContainer)
69+
})
70+
71+
const divs = muyaContainerRef.current.querySelectorAll<HTMLElement>('div.mermaid')
72+
const unrendered = Array.from(divs).filter((d) => !d.querySelector('svg'))
73+
if (unrendered.length === 0) return
74+
75+
try {
76+
await mermaid.run({ nodes: unrendered })
77+
} catch (error) {
78+
console.error('Mermaid render error:', error)
79+
}
80+
}
4881

4982
useEffect(() => {
5083
let cancelled = false
@@ -61,6 +94,13 @@ const Feature: React.FC = () => {
6194
}
6295
}, [selectedFeature])
6396

97+
useEffect(() => {
98+
if (!htmlContent) return
99+
if (selectedFeature.title === 'Diagram') {
100+
void renderMermaid()
101+
}
102+
}, [htmlContent, selectedFeature])
103+
64104
const handleSelect = (feature: FeatureItem) => {
65105
setSelectedFeature(feature)
66106
}
@@ -91,7 +131,10 @@ const Feature: React.FC = () => {
91131
<span className="dot green"></span>
92132
<span className="feature-name">{selectedFeature.title}</span>
93133
</div>
94-
<div dangerouslySetInnerHTML={{ __html: htmlContent }}></div>
134+
<div
135+
dangerouslySetInnerHTML={{ __html: htmlContent }}
136+
ref={muyaContainerRef}
137+
></div>
95138
</div>
96139
</div>
97140
</div>

0 commit comments

Comments
 (0)