@mathcrowd/mmarked 2.0.3 → 3.0.0
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/CHANGELOG.md +15 -0
- package/LICENSE_SYSTEM_DOCS.md +341 -0
- package/README.md +290 -54
- package/README.zh.md +291 -54
- package/dist/browser.umd.js +1 -1
- package/dist/demo.esm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +84 -2
- package/dist/index.mjs +1 -1
- package/package.json +8 -2
package/README.zh.md
CHANGED
|
@@ -1,109 +1,346 @@
|
|
|
1
1
|
# mmarked
|
|
2
2
|
|
|
3
|
-
[](https://
|
|
4
|
-
[](https://www.npmjs.com/package/@mathcrowd/mmarked)
|
|
4
|
+
[](https://www.npmjs.com/package/@mathcrowd/mmarked)
|
|
5
|
+
[](https://creativecommons.org/licenses/by-nc/4.0)
|
|
5
6
|
|
|
6
7
|

|
|
7
8
|
|
|
8
|
-
[English](./README.md)
|
|
9
|
+
[English](./README.md) | [在线演示](https://mathedu4all.github.io/mmarked/) | [VSCode 扩展](https://marketplace.visualstudio.com/items?itemName=MCLab.mmarked) | [Logseq 插件](https://github.com/mathedu4all/mmarked-logseq-extension)
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
## 📖 概述
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
用 **mmarked** 改变你的 Markdown 体验 —— 一个专为教育和数学内容设计的强大 TypeScript 库。支持实时渲染复杂 LaTeX 公式、定理块和自定义教育语法。
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
- 🔢 **脚注块:** 支持自动编号的脚注,并带有易于引用的链接
|
|
16
|
-
- 📘 **定理样式块:** 支持以标题、自动编号和引用链接的形式呈现数学定理、引理和例子
|
|
17
|
-
- 🖼️ **图像缩放功能:** 使用简单的语法可自定义渲染图像和视频
|
|
18
|
-
- 🔍 **隐藏/显示解决方案块:** 带有切换按钮的解决方案块,轻松控制可见性
|
|
19
|
-
- 🧮 **TeX 转 SVG:** 将 TeX 方程式转换为矢量图形,实现高质量渲染
|
|
20
|
-
- 🔗 **与现有系统轻松集成:** 支持服务器端和浏览器端实现
|
|
15
|
+
**完美适用于:**
|
|
21
16
|
|
|
22
|
-
|
|
17
|
+
- 📚 **教育工作者** 制作数学课程材料
|
|
18
|
+
- 🎓 **学生** 撰写技术笔记和作业
|
|
19
|
+
- 📝 **研究人员** 编写学术论文
|
|
20
|
+
- 💻 **开发者** 构建教育平台
|
|
21
|
+
- 💡 **任何人** 在 Markdown 中使用数学符号
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
## ✨ 功能特性
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
在 Logseq 中使用 mmarked: https://github.com/mathedu4all/mmarked-logseq-extension
|
|
25
|
+
### 核心能力
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
- ✅ **完整 CommonMark 支持** - 与标准 Markdown 语法完全兼容
|
|
28
|
+
- 🔗 **轻松集成** - 在 Node.js 和浏览器环境中无缝运行
|
|
29
|
+
- 📦 **轻量核心** - 最少依赖,可扩展架构
|
|
30
|
+
- ⚡ **高性能** - 优化的渲染管道,输出快速
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
### 数学内容
|
|
33
|
+
|
|
34
|
+
- 🧮 **高级 LaTeX 渲染** - 由 MathJax 驱动,呈现专业品质的公式
|
|
35
|
+
- 📐 **TeX 转 SVG** - 高质量 SVG 格式的方程输出
|
|
36
|
+
- 🔢 **自动编号脚注** - 易用的引用系统,自动编号
|
|
37
|
+
|
|
38
|
+
### 教育功能
|
|
39
|
+
|
|
40
|
+
- 📘 **定理样式块** - 专用语法支持定理、引理、定义和例子
|
|
41
|
+
- 自动编号支持
|
|
42
|
+
- 使用 `[~id]` 语法进行交叉引用
|
|
43
|
+
- 可自定义标题
|
|
44
|
+
- 🔍 **可折叠解答块** - 通过切换功能隐藏/显示答案和证明
|
|
45
|
+
- 🎯 **语法高亮** - highlight.js 增强的代码块
|
|
46
|
+
|
|
47
|
+
### 媒体与自定义
|
|
48
|
+
|
|
49
|
+
- 🖼️ **增强图片** - 使用简单的 `=宽x高` 语法灵活调整尺寸
|
|
50
|
+
- 📹 **视频支持** - 视频元素支持相同的尺寸选项
|
|
51
|
+
- 🎨 **可扩展** - 基于 marked.js 构建,易于自定义
|
|
52
|
+
|
|
53
|
+
## 🚀 快速开始
|
|
54
|
+
|
|
55
|
+
### 安装
|
|
32
56
|
|
|
33
57
|
```bash
|
|
34
58
|
npm install @mathcrowd/mmarked mathjax-full highlight.js
|
|
35
59
|
```
|
|
36
60
|
|
|
37
|
-
|
|
61
|
+
### 基本用法
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { renderMarkdown } from '@mathcrowd/mmarked'
|
|
65
|
+
|
|
66
|
+
// 渲染带 LaTeX 支持的 Markdown
|
|
67
|
+
const result = renderMarkdown(`
|
|
68
|
+
# 勾股定理
|
|
69
|
+
|
|
70
|
+
\`\`\`[theorem,pythagoras,勾股定理]
|
|
71
|
+
对于直角三角形,设两直角边为 $a$、$b$,斜边为 $c$:
|
|
72
|
+
$$a^2 + b^2 = c^2$$
|
|
73
|
+
\`\`\`
|
|
74
|
+
|
|
75
|
+
这个基本定理(见 [~pythagoras])描述了直角三角形边长的关系。
|
|
76
|
+
`)
|
|
77
|
+
|
|
78
|
+
console.log(result.parsed) // HTML 输出
|
|
79
|
+
console.log(result.time) // 渲染耗时(毫秒)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 许可证配置(仅 Node.js)
|
|
83
|
+
|
|
84
|
+
**重要提示:** 许可证验证**仅适用于 Node.js 服务端使用**。浏览器环境不需要配置许可证。
|
|
85
|
+
|
|
86
|
+
在 Node.js 应用中商业使用时,必须配置有效的许可证:
|
|
38
87
|
|
|
39
88
|
```typescript
|
|
40
|
-
import {
|
|
89
|
+
import { configureLicense, renderMarkdown } from '@mathcrowd/mmarked'
|
|
90
|
+
|
|
91
|
+
// 配置你的许可证(在应用启动时执行一次)
|
|
92
|
+
configureLicense({
|
|
93
|
+
apiKey: 'MMARKED-XXXX-XXXX-XXXX-XXXX'
|
|
94
|
+
})
|
|
41
95
|
|
|
42
|
-
//
|
|
43
|
-
const
|
|
96
|
+
// 现在可以使用库了
|
|
97
|
+
const result = renderMarkdown('# Hello World')
|
|
98
|
+
```
|
|
44
99
|
|
|
45
|
-
|
|
46
|
-
|
|
100
|
+
**在 Node.js 中未配置许可证:**
|
|
101
|
+
```typescript
|
|
102
|
+
import { renderMarkdown } from '@mathcrowd/mmarked'
|
|
103
|
+
|
|
104
|
+
// 可以正常工作,但会在控制台显示警告
|
|
105
|
+
const result = renderMarkdown('# Hello')
|
|
106
|
+
// 控制台输出:
|
|
107
|
+
// ⚠️ 未配置 Node.js 服务端有效许可证。
|
|
108
|
+
// 商业使用请通过 configureLicense() 配置许可证。
|
|
109
|
+
// 联系 charles@mathcrowd.cn 获取商业许可。
|
|
110
|
+
// 浏览器使用无需许可证。
|
|
47
111
|
```
|
|
48
112
|
|
|
49
|
-
|
|
113
|
+
**系统要求:**
|
|
114
|
+
- **Node.js 18+** 用于远程许可证验证(使用 fetch API)
|
|
115
|
+
|
|
116
|
+
**获取许可证:**
|
|
117
|
+
- 📧 邮箱:**charles@mathcrowd.cn**
|
|
118
|
+
- 🌐 访问:[lab.mathcrowd.cn](https://lab.mathcrowd.cn)
|
|
119
|
+
|
|
120
|
+
### 浏览器端使用
|
|
50
121
|
|
|
51
122
|
```html
|
|
52
123
|
<!DOCTYPE html>
|
|
53
124
|
<html>
|
|
54
125
|
<head>
|
|
55
126
|
<meta charset="utf-8">
|
|
56
|
-
<title
|
|
127
|
+
<title>mmarked 演示</title>
|
|
57
128
|
</head>
|
|
58
129
|
<body>
|
|
59
130
|
<div id="content"></div>
|
|
60
|
-
<script
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
131
|
+
<script type="module">
|
|
132
|
+
import { renderMarkdown } from 'https://cdn.jsdelivr.net/npm/@mathcrowd/mmarked/dist/index.mjs'
|
|
133
|
+
|
|
134
|
+
const markdown = `
|
|
135
|
+
# 爱因斯坦质能方程
|
|
136
|
+
|
|
137
|
+
著名的方程 $E = mc^2$ 描述了能量与质量的关系。
|
|
138
|
+
|
|
139
|
+
**其中:**
|
|
140
|
+
- $E$ 是能量
|
|
141
|
+
- $m$ 是质量
|
|
142
|
+
- $c$ 是光速
|
|
143
|
+
`
|
|
144
|
+
|
|
145
|
+
document.getElementById('content').innerHTML = renderMarkdown(markdown).parsed
|
|
66
146
|
</script>
|
|
67
147
|
</body>
|
|
68
148
|
</html>
|
|
69
149
|
```
|
|
70
150
|
|
|
71
|
-
## 📚
|
|
151
|
+
## 📚 扩展语法指南
|
|
152
|
+
|
|
153
|
+
### 自动编号的定理块
|
|
154
|
+
|
|
155
|
+
```markdown
|
|
156
|
+
\`\`\`[theorem,fermat,费马大定理]
|
|
157
|
+
对于任意大于 2 的整数 $n$,不存在正整数 $a$、$b$、$c$
|
|
158
|
+
使得 $a^n + b^n = c^n$。
|
|
159
|
+
\`\`\`
|
|
160
|
+
|
|
161
|
+
\`\`\`[lemma,helper,辅助引理]
|
|
162
|
+
这个引理支持 [~fermat] 的证明。
|
|
163
|
+
\`\`\`
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**支持的块类型:** `theorem`(定理)、`lemma`(引理)、`corollary`(推论)、`axiom`(公理)、`definition`(定义)、`example`(例)
|
|
167
|
+
|
|
168
|
+
**自定义块:** 使用任何关键字创建自定义定理样式块,独立编号。
|
|
169
|
+
|
|
170
|
+
**隐藏编号:** 在关键字后添加 `*`(如 `theorem*`)可隐藏编号,但保持序列。
|
|
171
|
+
|
|
172
|
+
### 交互式解答块
|
|
173
|
+
|
|
174
|
+
```markdown
|
|
175
|
+
**问题:** 解方程 $x^2 - 5x + 6 = 0$
|
|
176
|
+
|
|
177
|
+
~~~[solution]
|
|
178
|
+
**解答:**
|
|
179
|
+
|
|
180
|
+
因式分解方程:
|
|
181
|
+
$$(x-2)(x-3) = 0$$
|
|
182
|
+
|
|
183
|
+
因此,解为:
|
|
184
|
+
- $x = 2$
|
|
185
|
+
- $x = 3$
|
|
186
|
+
~~~
|
|
187
|
+
|
|
188
|
+
~~~[proof]
|
|
189
|
+
**验证:** 代入 $x=2$:$(2)^2 - 5(2) + 6 = 4 - 10 + 6 = 0$ ✓
|
|
190
|
+
~~~
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### 增强的图片和视频
|
|
194
|
+
|
|
195
|
+
```markdown
|
|
196
|
+

|
|
197
|
+
|
|
198
|
+

|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 自动编号脚注
|
|
202
|
+
|
|
203
|
+
```markdown
|
|
204
|
+
黎曼猜想[^riemann]是最重要的未解决问题之一。
|
|
205
|
+
|
|
206
|
+
另一个著名猜想是孪生素数猜想[^twin]。
|
|
207
|
+
|
|
208
|
+
[^riemann]: 由伯恩哈德·黎曼于 1859 年提出。
|
|
209
|
+
[^twin]: 指出存在无穷多对孪生素数。
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## 🔧 API 参考
|
|
213
|
+
|
|
214
|
+
### 许可证管理(仅 Node.js)
|
|
215
|
+
|
|
216
|
+
#### `configureLicense(config: LicenseConfig)`
|
|
217
|
+
|
|
218
|
+
为 Node.js 环境中的商业使用配置许可证。必须在使用渲染函数之前调用。
|
|
219
|
+
|
|
220
|
+
**参数:**
|
|
221
|
+
```typescript
|
|
222
|
+
interface LicenseConfig {
|
|
223
|
+
apiKey: string // 你的许可证密钥(格式:MMARKED-XXXX-XXXX-XXXX-XXXX)
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**示例:**
|
|
228
|
+
```typescript
|
|
229
|
+
// 最简配置(推荐)
|
|
230
|
+
configureLicense({
|
|
231
|
+
apiKey: 'MMARKED-XXXX-XXXX-XXXX-XXXX'
|
|
232
|
+
})
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 核心函数
|
|
236
|
+
|
|
237
|
+
#### `renderMarkdown(markdown: string)`
|
|
238
|
+
|
|
239
|
+
将 Markdown 渲染为 HTML,支持所有功能。
|
|
240
|
+
|
|
241
|
+
**许可证:** Node.js 商业使用需要有效许可证。浏览器免费使用。
|
|
242
|
+
|
|
243
|
+
**返回值:**
|
|
244
|
+
```typescript
|
|
245
|
+
{
|
|
246
|
+
parsed: string, // HTML 输出
|
|
247
|
+
lexed: Token[], // Marked.js 令牌
|
|
248
|
+
time: number // 渲染时间(毫秒)
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**示例:**
|
|
253
|
+
```typescript
|
|
254
|
+
const { parsed, time } = renderMarkdown('# 你好 $x^2$')
|
|
255
|
+
console.log(`渲染耗时 ${time}ms`)
|
|
256
|
+
```
|
|
72
257
|
|
|
73
|
-
|
|
74
|
-
|----------|-------------|
|
|
75
|
-
| `tex2svg(tex: string): string` | 将 TeX 转换为 HTML 格式的 SVG |
|
|
76
|
-
| `renderMarkdown(markdown: string): {parsed: string, lexed: Token[], time: number}` | 将 Markdown 渲染为 HTML |
|
|
77
|
-
| `renderMarkdownCompact(markdown: string): {parsed: string, lexed: Token[], time: number}` | 将 Markdown 渲染为 HTML,不包含 `<p>` 标签 |
|
|
258
|
+
#### `renderMarkdownCompact(markdown: string)`
|
|
78
259
|
|
|
79
|
-
|
|
260
|
+
渲染 Markdown 但不包裹 `<p>` 标签,适合行内内容。
|
|
80
261
|
|
|
81
|
-
|
|
262
|
+
**许可证:** Node.js 商业使用需要有效许可证。浏览器免费使用。
|
|
82
263
|
|
|
83
|
-
|
|
264
|
+
**返回值:** 与 `renderMarkdown()` 相同的结构
|
|
84
265
|
|
|
85
|
-
|
|
266
|
+
**使用场景:** 渲染单行内容,不需要块级元素。
|
|
86
267
|
|
|
87
|
-
|
|
268
|
+
```typescript
|
|
269
|
+
const { parsed } = renderMarkdownCompact('**粗体** 和 $x^2$ 行内')
|
|
270
|
+
// 输出: <strong>粗体</strong> 和 <svg>...</svg> 行内
|
|
271
|
+
```
|
|
88
272
|
|
|
89
|
-
|
|
273
|
+
#### `tex2svg(html: string): string`
|
|
90
274
|
|
|
91
|
-
|
|
275
|
+
将 HTML 中的 LaTeX 表达式转换为 SVG。
|
|
92
276
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
277
|
+
**参数:**
|
|
278
|
+
- `html`: 包含 LaTeX 表达式的 HTML 字符串(`$...$` 表示行内,`$$...$$` 表示块)
|
|
279
|
+
|
|
280
|
+
**返回值:** LaTeX 转换为 SVG 图形后的 HTML
|
|
281
|
+
|
|
282
|
+
**示例:**
|
|
283
|
+
```typescript
|
|
284
|
+
const html = '<p>爱因斯坦:$E=mc^2$</p>'
|
|
285
|
+
const withSvg = tex2svg(html)
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### ⚠️ 安全警告
|
|
289
|
+
|
|
290
|
+
**始终使用 [DOMPurify](https://github.com/cure53/DOMPurify) 清理 HTML 输出**,然后再插入到 DOM 中:
|
|
291
|
+
|
|
292
|
+
```typescript
|
|
293
|
+
import DOMPurify from 'dompurify'
|
|
294
|
+
import { renderMarkdown } from '@mathcrowd/mmarked'
|
|
295
|
+
|
|
296
|
+
// 安全渲染用户输入
|
|
297
|
+
const userMarkdown = getUserInput()
|
|
298
|
+
const { parsed } = renderMarkdown(userMarkdown)
|
|
299
|
+
const safeHtml = DOMPurify.sanitize(parsed)
|
|
300
|
+
|
|
301
|
+
document.getElementById('content').innerHTML = safeHtml
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## 🔌 编辑器集成
|
|
305
|
+
|
|
306
|
+
通过官方集成增强编辑体验:
|
|
307
|
+
|
|
308
|
+
- **[VSCode 扩展](https://marketplace.visualstudio.com/items?itemName=MCLab.mmarked)** - 实时预览,支持主题
|
|
309
|
+
- **[Logseq 插件](https://github.com/mathedu4all/mmarked-logseq-extension)** - 无缝集成笔记应用
|
|
310
|
+
|
|
311
|
+
## 📖 文档与资源
|
|
312
|
+
|
|
313
|
+
- 🏠 **[产品主页](https://lab.mathcrowd.cn/products/mmarked)** - 官方产品页面
|
|
314
|
+
- 📘 **[完整文档](https://lab.mathcrowd.cn/docs/mmarked)** - 完整语法指南
|
|
315
|
+
- 🎮 **[在线演示](https://mathedu4all.github.io/mmarked/)** - 在浏览器中实时体验,内置快速参考
|
|
316
|
+
|
|
317
|
+
## 🏗️ 技术栈
|
|
318
|
+
|
|
319
|
+
- **[marked.js](https://marked.js.org/)** - 快速 Markdown 解析器
|
|
320
|
+
- **[MathJax](https://www.mathjax.org/)** - 精美数学渲染
|
|
321
|
+
- **[highlight.js](https://highlightjs.org/)** - 语法高亮
|
|
322
|
+
|
|
323
|
+
## 🏢 关于橘子数学
|
|
324
|
+
|
|
325
|
+
**橘子数学(Mathcrowd)** 致力于通过创新技术革新中国的数学教育。我们由经验丰富的开发者和数学教育工作者创立,正在构建工具和社区,让数学学习更易获取、更有吸引力。
|
|
326
|
+
|
|
327
|
+
- 🌐 **Mathcrowd Labs:** [lab.mathcrowd.cn](https://lab.mathcrowd.cn)
|
|
328
|
+
- 💬 **加入 Discord:** [discord.gg/6VMUVA5Yq2](https://discord.gg/6VMUVA5Yq2)
|
|
96
329
|
|
|
97
330
|
## 📄 许可证
|
|
98
331
|
|
|
99
|
-
|
|
332
|
+
采用 [CC BY-NC 4.0](./LICENSE.md) 许可 - 非商业用途免费。
|
|
333
|
+
|
|
334
|
+
商业许可请联系:**charles@mathcrowd.cn**
|
|
335
|
+
|
|
336
|
+
## 💬 支持
|
|
100
337
|
|
|
101
|
-
|
|
338
|
+
- 🐛 **错误报告:** [GitHub Issues](https://github.com/mathedu4all/mmarked/issues)
|
|
102
339
|
|
|
103
|
-
|
|
340
|
+
---
|
|
104
341
|
|
|
105
|
-
|
|
342
|
+
<div align="center">
|
|
106
343
|
|
|
107
|
-
|
|
344
|
+
由 [橘子数学](https://mathcrowd.cn) 团队用 ❤️ 打造
|
|
108
345
|
|
|
109
|
-
|
|
346
|
+
</div>
|