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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "remons-render-markdown",
3
- "version": "1.0.0-beta.1",
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)、代码高亮、Mermaid 图表等功能。
3
+ 一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)Tabs 标签、代码高亮、Mermaid 图表等功能。
4
+
5
+ 渲染效果
6
+ ![整体渲染效果](https://remons.cn:3008/upload/md_assets/%E6%95%B4%E4%BD%93%E6%B8%B2%E6%9F%93%E6%95%88%E6%9E%9C.png)
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
- ├── dist/ # 打包输出
25
- ├── package.json
26
- ├── tsconfig.json
27
- ├── vite.config.ts
28
- └── README.md
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
+ ![mermaid 渲染图](https://remons.cn:3008/upload/md_assets/mermaid%20%E7%BC%A9%E7%95%A5%E5%9B%BE.png)
266
+
267
+ - 缩略图
268
+ ![mermaid 渲染图](https://remons.cn:3008/upload/md_assets/mermaid%20%E5%B1%95%E5%BC%80%E5%9B%BE.png)
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
+ ![tabs 渲染图](https://remons.cn:3008/upload/md_assets/tabs.png)
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
+ ![alert 渲染图](https://remons.cn:3008/upload/md_assets/alert.png)
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