remons-render-markdown 1.0.0-beta.1 → 1.0.0-beta.3
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/dist/components/MermaidRenderer/index.d.ts +37 -2
- package/dist/components/RenderMarkdown/index.d.ts +30 -0
- package/dist/components/RenderMarkdown/utils/render-markdown/index.d.ts +5 -0
- package/dist/components/RenderMarkdown/utils/render-markdown/languagesCommon.d.ts +10 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.mjs +6425 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -4
- package/readme.md +339 -12
- package/dist/MermaidRenderer-DupOXIdE.js +0 -1889
- package/dist/MermaidRenderer-DupOXIdE.js.map +0 -1
- package/dist/RenderMarkdown-TzdhCUFl.js +0 -4521
- package/dist/RenderMarkdown-TzdhCUFl.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remons-render-markdown",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
4
|
-
"description": "一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)、代码高亮、Mermaid
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
|
+
"description": "一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)、代码高亮、Mermaid 图表、Tabs 渲染等功能。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.mjs",
|
|
7
7
|
"module": "./dist/index.mjs",
|
|
@@ -13,7 +13,6 @@
|
|
|
13
13
|
},
|
|
14
14
|
"./dist/index.css": "./dist/index.css"
|
|
15
15
|
},
|
|
16
|
-
"style": "./dist/index.css",
|
|
17
16
|
"files": [
|
|
18
17
|
"dist"
|
|
19
18
|
],
|
|
@@ -34,7 +33,7 @@
|
|
|
34
33
|
"gfm",
|
|
35
34
|
"mermaid"
|
|
36
35
|
],
|
|
37
|
-
"author": "",
|
|
36
|
+
"author": "remons",
|
|
38
37
|
"license": "MIT",
|
|
39
38
|
"peerDependencies": {
|
|
40
39
|
"react": ">=18.0.0",
|
|
@@ -79,5 +78,9 @@
|
|
|
79
78
|
"markdown-it-link-attributes": "^4.0.1",
|
|
80
79
|
"markdown-it-toc-done-right": "^4.2.0",
|
|
81
80
|
"methods-r": "^2.0.0-rc.1"
|
|
81
|
+
},
|
|
82
|
+
"repository": {
|
|
83
|
+
"type": "git",
|
|
84
|
+
"url": "https://github.com/liRemons/render-markdown.git"
|
|
82
85
|
}
|
|
83
86
|
}
|
package/readme.md
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# render-markdown
|
|
2
2
|
|
|
3
|
-
一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown
|
|
3
|
+
一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)Tabs 标签、代码高亮、Mermaid 图表等功能。
|
|
4
|
+
|
|
5
|
+
渲染效果
|
|
6
|
+

|
|
4
7
|
|
|
5
8
|
## 技术方案
|
|
6
9
|
|
|
@@ -17,20 +20,344 @@
|
|
|
17
20
|
|
|
18
21
|
### 核心功能
|
|
19
22
|
|
|
23
|
+
- **GFM 支持**: 完整的 GitHub Flavored Markdown 渲染
|
|
24
|
+
- **代码高亮**: 基于 highlight.js 的代码语法高亮
|
|
25
|
+
- **Mermaid 图表**: 支持 Mermaid 语法渲染流程图、时序图等
|
|
26
|
+
- **Tab 标签页**: 支持 Tab 标签页语法
|
|
27
|
+
- **Alert 提示框**: 支持警告、提示等信息框
|
|
28
|
+
- **目录锚点**: 自动生成文档目录和锚点链接(自行实现目录渲染)
|
|
29
|
+
- **代码复制**: 一键复制代码块
|
|
30
|
+
- **代码折叠**: 支持代码块折叠展开
|
|
31
|
+
|
|
32
|
+
## API
|
|
33
|
+
|
|
34
|
+
### 安装
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install remons-render-markdown
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 导出内容
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import RenderMarkdown, { markdownFormat, languagesCommon, initHighlighter } from 'remons-render-markdown';
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
#### 默认导出
|
|
47
|
+
|
|
48
|
+
- **RenderMarkdown**: React 组件,用于渲染 Markdown 内容
|
|
49
|
+
|
|
50
|
+
#### 命名导出
|
|
51
|
+
|
|
52
|
+
- **markdownFormat**: Markdown 解析函数,返回 `{ anchor: AnchorItem[], info: string }`
|
|
53
|
+
- **languagesCommon**: 默认支持的语言包配置(javascript, typescript, css, json, bash, xml, plaintext)
|
|
54
|
+
- **initHighlighter**: 初始化高亮语言包的函数
|
|
55
|
+
|
|
56
|
+
### RenderMarkdown 组件 Props
|
|
57
|
+
|
|
58
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
59
|
+
|------|------|------|--------|------|
|
|
60
|
+
| content | string | ✅ | - | Markdown 内容 |
|
|
61
|
+
| createTime | string | ❌ | - | 创建时间,用于显示文档更新时间 |
|
|
62
|
+
| isSlotMermaid | boolean | ❌ | true | 是否使用 Mermaid 插件渲染图表 |
|
|
63
|
+
| isShowCollapsed | boolean | ❌ | true | 是否显示代码折叠按钮 |
|
|
64
|
+
| codeType | string | ❌ | - | 指定代码类型(如 'javascript' 等),不传则按 Markdown 渲染 |
|
|
65
|
+
| editButton | React.ReactNode | ❌ | - | 自定义编辑按钮 |
|
|
66
|
+
| backTopTarget | HTMLElement | ❌ | body | 返回顶部按钮监听的容器 |
|
|
67
|
+
|
|
68
|
+
### markdownFormat 函数
|
|
69
|
+
|
|
70
|
+
解析 Markdown 内容并返回结构化数据。
|
|
71
|
+
|
|
72
|
+
**参数:**
|
|
73
|
+
|
|
74
|
+
- `content: string` - Markdown 文本内容
|
|
75
|
+
|
|
76
|
+
**返回值:**
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
{
|
|
80
|
+
anchor: Array<{
|
|
81
|
+
title: string; // 标题文本
|
|
82
|
+
href: string; // 锚点链接
|
|
83
|
+
nodeName: string; // 节点名称,如 "H1", "H2"
|
|
84
|
+
nodeTitle: string; // 完整节点 HTML
|
|
85
|
+
children: Array<...>; // 子标题
|
|
86
|
+
}>;
|
|
87
|
+
info: string; // 渲染后的 HTML 字符串
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### initHighlighter 函数
|
|
92
|
+
|
|
93
|
+
注册自定义的代码高亮语言。
|
|
94
|
+
|
|
95
|
+
**参数:**
|
|
96
|
+
|
|
97
|
+
- `languages: Record<string, any>` - 语言包对象,格式为 `{ languageName: languageModule }`
|
|
98
|
+
|
|
99
|
+
**示例:**
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import javascript from 'highlight.js/lib/languages/javascript';
|
|
103
|
+
import python from 'highlight.js/lib/languages/python';
|
|
104
|
+
|
|
105
|
+
initHighlighter({
|
|
106
|
+
javascript,
|
|
107
|
+
python,
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 使用方式
|
|
112
|
+
|
|
113
|
+
### 基础用法
|
|
114
|
+
|
|
115
|
+
```tsx
|
|
116
|
+
import RenderMarkdown from 'remons-render-markdown';
|
|
117
|
+
import 'render-markdown/dist/index.css';
|
|
118
|
+
|
|
119
|
+
function App() {
|
|
120
|
+
const markdownContent = `
|
|
121
|
+
# Hello World
|
|
122
|
+
|
|
123
|
+
This is a **Markdown** renderer.
|
|
124
|
+
|
|
125
|
+
\`\`\`javascript
|
|
126
|
+
console.log('Hello');
|
|
127
|
+
\`\`\`
|
|
128
|
+
`;
|
|
129
|
+
|
|
130
|
+
return <RenderMarkdown content={markdownContent} />;
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 完整示例
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
import RenderMarkdown from 'remons-render-markdown';
|
|
138
|
+
import 'render-markdown/dist/index.css';
|
|
139
|
+
|
|
140
|
+
function ArticlePage() {
|
|
141
|
+
const content = `
|
|
142
|
+
# 文章标题
|
|
143
|
+
|
|
144
|
+
这是一篇示例文章。
|
|
145
|
+
|
|
146
|
+
## 代码示例
|
|
147
|
+
|
|
148
|
+
\`\`\`javascript
|
|
149
|
+
const greeting = 'Hello World';
|
|
150
|
+
console.log(greeting);
|
|
151
|
+
\`\`\`
|
|
20
152
|
|
|
21
|
-
|
|
153
|
+
## Mermaid 图表
|
|
22
154
|
|
|
155
|
+
\`\`\`mermaid
|
|
156
|
+
graph TD
|
|
157
|
+
A[开始] --> B[处理]
|
|
158
|
+
B --> C[结束]
|
|
159
|
+
\`\`\`
|
|
160
|
+
`;
|
|
161
|
+
|
|
162
|
+
return (
|
|
163
|
+
<RenderMarkdown
|
|
164
|
+
content={content}
|
|
165
|
+
createTime="2026-07-23T12:00:00Z"
|
|
166
|
+
isSlotMermaid={true}
|
|
167
|
+
isShowCollapsed={true}
|
|
168
|
+
editButton={<button>编辑</button>}
|
|
169
|
+
/>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 使用 markdownFormat 获取目录结构
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import { markdownFormat } from 'remons-render-markdown';
|
|
178
|
+
|
|
179
|
+
function TableOfContents() {
|
|
180
|
+
const content = '# 标题1\n## 标题1.1\n## 标题1.2\n# 标题2';
|
|
181
|
+
const { anchor, info } = markdownFormat(content);
|
|
182
|
+
|
|
183
|
+
console.log(anchor);
|
|
184
|
+
// [
|
|
185
|
+
// { title: '标题1', href: '标题1', nodeName: 'H1', children: [...] },
|
|
186
|
+
// { title: '标题2', href: '标题2', nodeName: 'H1', children: [] }
|
|
187
|
+
// ]
|
|
188
|
+
|
|
189
|
+
return <div dangerouslySetInnerHTML={{ __html: info }} />;
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 自定义代码高亮语言
|
|
194
|
+
|
|
195
|
+
```tsx
|
|
196
|
+
import RenderMarkdown, { initHighlighter, languagesCommon } from 'remons-render-markdown';
|
|
197
|
+
import 'render-markdown/dist/index.css';
|
|
198
|
+
import python from 'highlight.js/lib/languages/python';
|
|
199
|
+
import go from 'highlight.js/lib/languages/go';
|
|
200
|
+
|
|
201
|
+
// 注册额外的语言
|
|
202
|
+
initHighlighter({
|
|
203
|
+
...languagesCommon, // 包含默认语言
|
|
204
|
+
python,
|
|
205
|
+
go,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
function App() {
|
|
209
|
+
return (
|
|
210
|
+
<RenderMarkdown
|
|
211
|
+
content={`
|
|
212
|
+
\`\`\`python
|
|
213
|
+
def hello():
|
|
214
|
+
print('Hello')
|
|
215
|
+
\`\`\`
|
|
216
|
+
|
|
217
|
+
\`\`\`go
|
|
218
|
+
package main
|
|
219
|
+
import "fmt"
|
|
220
|
+
func main() {
|
|
221
|
+
fmt.Println("Hello")
|
|
222
|
+
}
|
|
223
|
+
\`\`\`
|
|
224
|
+
`}
|
|
225
|
+
/>
|
|
226
|
+
);
|
|
227
|
+
}
|
|
23
228
|
```
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
229
|
+
|
|
230
|
+
### 仅渲染特定代码类型
|
|
231
|
+
|
|
232
|
+
```tsx
|
|
233
|
+
import RenderMarkdown from 'remons-render-markdown';
|
|
234
|
+
import 'render-markdown/dist/index.css';
|
|
235
|
+
|
|
236
|
+
function CodeViewer() {
|
|
237
|
+
const code = `
|
|
238
|
+
const x = 1;
|
|
239
|
+
const y = 2;
|
|
240
|
+
console.log(x + y);
|
|
241
|
+
`;
|
|
242
|
+
|
|
243
|
+
return (
|
|
244
|
+
<RenderMarkdown
|
|
245
|
+
content={code}
|
|
246
|
+
codeType="javascript"
|
|
247
|
+
isSlotMermaid={false}
|
|
248
|
+
/>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
29
251
|
```
|
|
30
252
|
|
|
31
|
-
###
|
|
253
|
+
### 关于语法
|
|
254
|
+
|
|
255
|
+
#### mermaid 图表
|
|
256
|
+
|
|
257
|
+
```code
|
|
258
|
+
---
|
|
259
|
+
title: 图表标题
|
|
260
|
+
---
|
|
261
|
+
......... 图表内容
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
- 折叠图
|
|
265
|
+

|
|
266
|
+
|
|
267
|
+
- 缩略图
|
|
268
|
+

|
|
269
|
+
#### Tabs 标签页
|
|
270
|
+
|
|
271
|
+
依赖于 `@mdit/plugin-tab` 插件,参考 [mdit-plugin-tab](https://mdit-plugins.github.io/zh/tab.html) 的文档。
|
|
272
|
+
*暂不支持 tabs 嵌套*
|
|
273
|
+
|
|
274
|
+
语法示例:
|
|
275
|
+
|
|
276
|
+
```markdown
|
|
277
|
+
:::markdown-tabs
|
|
278
|
+
|
|
279
|
+
@tab:active tab1
|
|
280
|
+
```javascript
|
|
281
|
+
console.log('Hello');
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
@tab tab2
|
|
285
|
+
```typescript
|
|
286
|
+
console.log('World');
|
|
287
|
+
```
|
|
288
|
+
:::
|
|
289
|
+
```
|
|
290
|
+

|
|
291
|
+
|
|
292
|
+
#### Alert 提示框
|
|
293
|
+
|
|
294
|
+
依赖于 `@mdit/plugin-alert` 插件,参考 [mdit-plugin-alert](https://mdit-plugins.github.io/zh/alert.html) 的文档。
|
|
295
|
+
|
|
296
|
+
语法示例:
|
|
297
|
+
|
|
298
|
+
```markdown
|
|
299
|
+
> [!warning]
|
|
300
|
+
> 我是一个警告信息
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+

|
|
304
|
+
|
|
305
|
+
#### MermaidRenderer 组件
|
|
306
|
+
|
|
307
|
+
独立的 Mermaid 图表渲染组件,支持缩放、全屏、下载、源码查看等功能。
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
import { renderMermaid } from 'remons-render-markdown';
|
|
311
|
+
import 'remons-render-markdown/dist/index.css';
|
|
312
|
+
|
|
313
|
+
function MermaidComponent() {
|
|
314
|
+
const mermaidCode = `
|
|
315
|
+
---
|
|
316
|
+
title: 流程图示例
|
|
317
|
+
---
|
|
318
|
+
graph TD
|
|
319
|
+
A[开始] --> B[处理]
|
|
320
|
+
B --> C[结束]
|
|
321
|
+
`;
|
|
322
|
+
|
|
323
|
+
return (
|
|
324
|
+
<div>
|
|
325
|
+
{
|
|
326
|
+
renderMermaid({ source: mermaidCode })
|
|
327
|
+
}
|
|
328
|
+
</div>
|
|
329
|
+
);
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
334
|
+
|------|------|------|--------|------|
|
|
335
|
+
| source | string | ✅ | - | Mermaid 代码字符串,支持 `---title: xxx---` 格式设置标题 |
|
|
336
|
+
| debounceMs | number | ❌ | 300 | 图表渲染时的 debounce 时间(毫秒) |
|
|
337
|
+
| enablePanzoom | boolean | ❌ | true | 是否启用缩放和平移功能 |
|
|
338
|
+
| showDownload | boolean | ❌ | true | 是否显示下载按钮(支持 SVG/PNG 格式) |
|
|
339
|
+
| showSourceView | boolean | ❌ | false | 是否显示源码查看按钮和工具栏 |
|
|
340
|
+
| showCollapse | boolean | ❌ | false | 是否显示折叠/展开按钮 |
|
|
341
|
+
| defaultCollapsed | boolean | ❌ | true | 默认折叠状态 |
|
|
342
|
+
| className | string | ❌ | "" | 自定义样式类名 |
|
|
343
|
+
| minHeight | number | ❌ | 200 | 最小高度(像素) |
|
|
344
|
+
| showDriverGuide | boolean | ❌ | false | 是否显示新手引导 |
|
|
345
|
+
|
|
346
|
+
**功能特性:**
|
|
347
|
+
- 缩放:支持放大、缩小、重置视图
|
|
348
|
+
- 全屏:支持浏览器原生全屏模式
|
|
349
|
+
- 下载:支持下载 SVG 和 PNG 格式
|
|
350
|
+
- 源码查看:点击按钮可查看 Mermaid 源码
|
|
351
|
+
- 折叠/展开:支持图表的折叠和展开
|
|
352
|
+
- 缩略图模式:最小化时显示缩略图
|
|
353
|
+
- 深色模式:自动适配主题
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
## 注意事项
|
|
357
|
+
|
|
358
|
+
1. **样式引入**:务必引入 `remons-render-markdown/dist/index.css` 以确保正确的样式渲染
|
|
359
|
+
2. **Mermaid 支持**:当 `isSlotMermaid` 为 `true` 时,会自动渲染 mermaid 代码块为图表
|
|
360
|
+
3. **代码高亮**:请使用 `initHighlighter` 注册(必须)
|
|
361
|
+
4. **安全性**:外部链接会自动添加 `target="_blank"` 和 `rel="noopener"` 属性
|
|
362
|
+
5. **性能优化**:Mermaid 渲染会延迟执行,以优化首屏加载速度
|
|
32
363
|
|
|
33
|
-
1. 初始化项目结构与 package.json
|
|
34
|
-
2. 配置 Vite + TypeScript 构建
|
|
35
|
-
3. 实现核心功能
|
|
36
|
-
4. 配置 changesets 并发布到 npm
|