remons-render-markdown 1.0.0-beta.1 → 1.0.0-beta.2

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.
@@ -1,11 +1,32 @@
1
1
  import { default as React } from 'react';
2
2
  interface Props {
3
+ /**
4
+ * Markdown 内容
5
+ */
3
6
  content: string;
7
+ /**
8
+ * 创建时间
9
+ */
4
10
  createTime?: string;
11
+ /**
12
+ * 是否显示返回顶部
13
+ */
5
14
  showBackTop?: boolean;
15
+ /**
16
+ * 是否使用 Mermaid 插件
17
+ */
6
18
  isSlotMermaid?: boolean;
19
+ /**
20
+ * 是否显示代码折叠
21
+ */
7
22
  isShowCollapsed?: boolean;
23
+ /**
24
+ * 代码类型
25
+ */
8
26
  codeType?: string;
27
+ /**
28
+ * 显示编辑按钮
29
+ */
9
30
  editButton?: React.ReactNode;
10
31
  }
11
32
  export default function RenderMarkdown(props: Props): React.JSX.Element;
@@ -8,4 +8,9 @@ declare function renderMarkdown(content: string): {
8
8
  anchor: AnchorItem[];
9
9
  info: any;
10
10
  };
11
+ /**
12
+ * 初始化高亮语言包
13
+ * @param {Object} languages - 语言包对象,如 { javascript: javascriptModule, css: cssModule }
14
+ */
15
+ export declare function initHighlighter(languages: Record<string, any> | null | undefined): void;
11
16
  export default renderMarkdown;
@@ -0,0 +1,10 @@
1
+ declare const _default: {
2
+ javascript: any;
3
+ typescript: any;
4
+ css: any;
5
+ json: any;
6
+ bash: any;
7
+ xml: any;
8
+ plaintext: any;
9
+ };
10
+ export default _default;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { default as RenderMarkdown } from './components/RenderMarkdown';
2
- import { default as markdownFormat } from './components/RenderMarkdown/utils/render-markdown';
2
+ import { default as markdownFormat, initHighlighter } from './components/RenderMarkdown/utils/render-markdown';
3
+ import { default as languagesCommon } from './components/RenderMarkdown/utils/render-markdown/languagesCommon';
3
4
  export default RenderMarkdown;
4
- export { markdownFormat };
5
+ export { markdownFormat, languagesCommon, initHighlighter };
package/dist/index.mjs CHANGED
@@ -1,7 +1,22 @@
1
- import { n as e, t } from "./RenderMarkdown-TzdhCUFl.js";
2
- //#region src/index.ts
3
- var n = t;
1
+ import { n as e, r as t, t as n } from "./RenderMarkdown-Br1PK06M.js";
2
+ import r from "highlight.js/lib/languages/javascript";
3
+ import i from "highlight.js/lib/languages/typescript";
4
+ import a from "highlight.js/lib/languages/css";
5
+ import o from "highlight.js/lib/languages/json";
6
+ import s from "highlight.js/lib/languages/bash";
7
+ import c from "highlight.js/lib/languages/xml";
8
+ import l from "highlight.js/lib/languages/plaintext";
9
+ //#region src/components/RenderMarkdown/utils/render-markdown/languagesCommon.ts
10
+ var u = {
11
+ javascript: r,
12
+ typescript: i,
13
+ css: a,
14
+ json: o,
15
+ bash: s,
16
+ xml: c,
17
+ plaintext: l
18
+ }, d = n;
4
19
  //#endregion
5
- export { n as default, e as markdownFormat };
20
+ export { d as default, e as initHighlighter, u as languagesCommon, t as markdownFormat };
6
21
 
7
22
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import RenderMarkdown from './components/RenderMarkdown';\nimport markdownFormat from './components/RenderMarkdown/utils/render-markdown';\n\nexport default RenderMarkdown;\n\nexport { markdownFormat}"],"mappings":";;AAGA,IAAA,IAAe"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/components/RenderMarkdown/utils/render-markdown/languagesCommon.ts","../src/index.ts"],"sourcesContent":["// common.js\r\nimport javascript from 'highlight.js/lib/languages/javascript';\r\nimport typescript from 'highlight.js/lib/languages/typescript';\r\nimport css from 'highlight.js/lib/languages/css';\r\nimport json from 'highlight.js/lib/languages/json';\r\nimport bash from 'highlight.js/lib/languages/bash';\r\nimport xml from 'highlight.js/lib/languages/xml';\r\nimport plaintext from 'highlight.js/lib/languages/plaintext';\r\n\r\nexport default {\r\n javascript,\r\n typescript,\r\n css,\r\n json,\r\n bash,\r\n xml,\r\n plaintext,\r\n};","import RenderMarkdown from './components/RenderMarkdown';\nimport markdownFormat from './components/RenderMarkdown/utils/render-markdown';\n/** \n * languagesCommon\n * 默认语言配置\n */\nimport languagesCommon from './components/RenderMarkdown/utils/render-markdown/languagesCommon';\n/**\n * initHighlighter 初始化高亮器\n * @param languages - 高亮器语言配置\n */\nimport { initHighlighter } from './components/RenderMarkdown/utils/render-markdown';\n\nexport default RenderMarkdown;\n\nexport { markdownFormat, languagesCommon, initHighlighter }"],"mappings":";;;;;;;;;AASA,IAAA,IAAe;CACb;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GCJA,IAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remons-render-markdown",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "一个基于 React 的 Markdown 渲染组件,支持 GFM(GitHub Flavored Markdown)、代码高亮、Mermaid 图表等功能。",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
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,294 @@
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
+
67
+ ### markdownFormat 函数
68
+
69
+ 解析 Markdown 内容并返回结构化数据。
70
+
71
+ **参数:**
72
+
73
+ - `content: string` - Markdown 文本内容
74
+
75
+ **返回值:**
76
+
77
+ ```typescript
78
+ {
79
+ anchor: Array<{
80
+ title: string; // 标题文本
81
+ href: string; // 锚点链接
82
+ nodeName: string; // 节点名称,如 "H1", "H2"
83
+ nodeTitle: string; // 完整节点 HTML
84
+ children: Array<...>; // 子标题
85
+ }>;
86
+ info: string; // 渲染后的 HTML 字符串
87
+ }
88
+ ```
89
+
90
+ ### initHighlighter 函数
91
+
92
+ 注册自定义的代码高亮语言。
93
+
94
+ **参数:**
95
+
96
+ - `languages: Record<string, any>` - 语言包对象,格式为 `{ languageName: languageModule }`
97
+
98
+ **示例:**
99
+
100
+ ```typescript
101
+ import javascript from 'highlight.js/lib/languages/javascript';
102
+ import python from 'highlight.js/lib/languages/python';
103
+
104
+ initHighlighter({
105
+ javascript,
106
+ python,
107
+ });
108
+ ```
109
+
110
+ ## 使用方式
111
+
112
+ ### 基础用法
113
+
114
+ ```tsx
115
+ import RenderMarkdown from 'remons-render-markdown';
116
+ import 'render-markdown/dist/index.css';
117
+
118
+ function App() {
119
+ const markdownContent = `
120
+ # Hello World
121
+
122
+ This is a **Markdown** renderer.
123
+
124
+ \`\`\`javascript
125
+ console.log('Hello');
126
+ \`\`\`
127
+ `;
128
+
129
+ return <RenderMarkdown content={markdownContent} />;
130
+ }
131
+ ```
132
+
133
+ ### 完整示例
134
+
135
+ ```tsx
136
+ import RenderMarkdown from 'remons-render-markdown';
137
+ import 'render-markdown/dist/index.css';
20
138
 
21
- ### 目录结构(计划)
139
+ function ArticlePage() {
140
+ const content = `
141
+ # 文章标题
22
142
 
143
+ 这是一篇示例文章。
144
+
145
+ ## 代码示例
146
+
147
+ \`\`\`javascript
148
+ const greeting = 'Hello World';
149
+ console.log(greeting);
150
+ \`\`\`
151
+
152
+ ## Mermaid 图表
153
+
154
+ \`\`\`mermaid
155
+ graph TD
156
+ A[开始] --> B[处理]
157
+ B --> C[结束]
158
+ \`\`\`
159
+ `;
160
+
161
+ return (
162
+ <RenderMarkdown
163
+ content={content}
164
+ createTime="2026-07-23T12:00:00Z"
165
+ isSlotMermaid={true}
166
+ isShowCollapsed={true}
167
+ editButton={<button>编辑</button>}
168
+ />
169
+ );
170
+ }
171
+ ```
172
+
173
+ ### 使用 markdownFormat 获取目录结构
174
+
175
+ ```tsx
176
+ import { markdownFormat } from 'remons-render-markdown';
177
+
178
+ function TableOfContents() {
179
+ const content = '# 标题1\n## 标题1.1\n## 标题1.2\n# 标题2';
180
+ const { anchor, info } = markdownFormat(content);
181
+
182
+ console.log(anchor);
183
+ // [
184
+ // { title: '标题1', href: '标题1', nodeName: 'H1', children: [...] },
185
+ // { title: '标题2', href: '标题2', nodeName: 'H1', children: [] }
186
+ // ]
187
+
188
+ return <div dangerouslySetInnerHTML={{ __html: info }} />;
189
+ }
190
+ ```
191
+
192
+ ### 自定义代码高亮语言
193
+
194
+ ```tsx
195
+ import RenderMarkdown, { initHighlighter, languagesCommon } from 'remons-render-markdown';
196
+ import 'render-markdown/dist/index.css';
197
+ import python from 'highlight.js/lib/languages/python';
198
+ import go from 'highlight.js/lib/languages/go';
199
+
200
+ // 注册额外的语言
201
+ initHighlighter({
202
+ ...languagesCommon, // 包含默认语言
203
+ python,
204
+ go,
205
+ });
206
+
207
+ function App() {
208
+ return (
209
+ <RenderMarkdown
210
+ content={`
211
+ \`\`\`python
212
+ def hello():
213
+ print('Hello')
214
+ \`\`\`
215
+
216
+ \`\`\`go
217
+ package main
218
+ import "fmt"
219
+ func main() {
220
+ fmt.Println("Hello")
221
+ }
222
+ \`\`\`
223
+ `}
224
+ />
225
+ );
226
+ }
23
227
  ```
24
- ├── dist/ # 打包输出
25
- ├── package.json
26
- ├── tsconfig.json
27
- ├── vite.config.ts
28
- └── README.md
228
+
229
+ ### 仅渲染特定代码类型
230
+
231
+ ```tsx
232
+ import RenderMarkdown from 'remons-render-markdown';
233
+ import 'render-markdown/dist/index.css';
234
+
235
+ function CodeViewer() {
236
+ const code = `
237
+ const x = 1;
238
+ const y = 2;
239
+ console.log(x + y);
240
+ `;
241
+
242
+ return (
243
+ <RenderMarkdown
244
+ content={code}
245
+ codeType="javascript"
246
+ isSlotMermaid={false}
247
+ />
248
+ );
249
+ }
29
250
  ```
30
251
 
31
- ### 发布计划
252
+ ### 关于语法
253
+
254
+ #### mermaid 图表
255
+
256
+ ```code
257
+ ---
258
+ title: 图表标题
259
+ ---
260
+ ......... 图表内容
261
+ ```
262
+
263
+ - 折叠图
264
+ ![mermaid 渲染图](https://remons.cn:3008/upload/md_assets/mermaid%20%E7%BC%A9%E7%95%A5%E5%9B%BE.png)
265
+
266
+ - 缩略图
267
+ ![mermaid 渲染图](https://remons.cn:3008/upload/md_assets/mermaid%20%E5%B1%95%E5%BC%80%E5%9B%BE.png)
268
+ #### Tabs 标签页
269
+
270
+ 依赖于 `@mdit/plugin-tab` 插件,参考 [mdit-plugin-tab](https://mdit-plugins.github.io/zh/tab.html) 的文档。
271
+ *暂不支持 tabs 嵌套*
272
+
273
+ 语法示例:
274
+
275
+ ```markdown
276
+ :::markdown-tabs
277
+
278
+ @tab:active tab1
279
+ ```javascript
280
+ console.log('Hello');
281
+ ```
282
+
283
+ @tab tab2
284
+ ```typescript
285
+ console.log('World');
286
+ ```
287
+ :::
288
+ ```
289
+ ![tabs 渲染图](https://remons.cn:3008/upload/md_assets/tabs.png)
290
+
291
+ #### Alert 提示框
292
+
293
+ 依赖于 `@mdit/plugin-alert` 插件,参考 [mdit-plugin-alert](https://mdit-plugins.github.io/zh/alert.html) 的文档。
294
+
295
+ 语法示例:
296
+
297
+ ```markdown
298
+ > [!warning]
299
+ > 我是一个警告信息
300
+ ```
301
+
302
+ ![alert 渲染图](https://remons.cn:3008/upload/md_assets/alert.png)
303
+
304
+ #### 目录锚点
305
+
306
+ ## 注意事项
307
+
308
+ 1. **样式引入**:务必引入 `remons-render-markdown/dist/index.css` 以确保正确的样式渲染
309
+ 2. **Mermaid 支持**:当 `isSlotMermaid` 为 `true` 时,会自动渲染 mermaid 代码块为图表
310
+ 3. **代码高亮**:请使用 `initHighlighter` 注册(必须)
311
+ 4. **安全性**:外部链接会自动添加 `target="_blank"` 和 `rel="noopener"` 属性
312
+ 5. **性能优化**:Mermaid 渲染会延迟执行,以优化首屏加载速度
32
313
 
33
- 1. 初始化项目结构与 package.json
34
- 2. 配置 Vite + TypeScript 构建
35
- 3. 实现核心功能
36
- 4. 配置 changesets 并发布到 npm