高阶使用
Marked 实例
默认情况下,Marked将选项和扩展存储在全局作用域中。这意味着更改一个脚本中的选项也会更改另一个脚本中的选项,因为它们共享同一个实例。 如果您不想修改全局作用域,可以创建一个新的Marked实例以确保选项和扩展是局部作用域的。
import { Marked } from 'marked';
const marked = new Marked([options, extension, ...]);
名称 | 类型 | 说明 |
---|---|---|
options | 对象 | 与marked.use 可以传递的相同参数。 |
parse
函数
import { marked } from 'marked'; marked.parse(markdownString [,options])
参数名 | 类型 | 说明 |
---|---|---|
markdownString | 字符串 | 要编译的Markdown源字符串。 |
options | 对象 | 选项的哈希。也可以使用marked.use 设置全局选项。 |
使用引用的替代方案
// 创建引用实例
import { marked } from 'marked';
// 设置选项
marked.use({
async: true,
pedantic: false,
gfm: true,
});
// 编译
console.log(marked.parse(markdownString));
选项
以下是在marked.use
中设置的选项:
成员 | 类型 | 默认值 | 自从版本 | 说明 |
---|---|---|---|---|
async | 布尔值 | false | 4.1.0 | 如果为true,walkTokens 函数可以是异步的,并且marked.parse 将返回一个当所有walkTokens 函数解决时解决的promise。 |
breaks | 布尔值 | false | v0.2.7 | 如果为true,在单行换行处添加<br> (模仿GitHub在注释上的行为,但在渲染的Markdown文件上不这样做)。要求gfm 为true。 |
gfm | 布尔值 | true | v0.2.1 | 如果为true,使用经过批准的GitHub Flavored Markdown(GFM)规范。 |
pedantic | 布尔值 | false | v0.2.1 | 如果为true,尽可能符合原始markdown.pl。不修复原始markdown的bug或行为。关闭并覆盖gfm。 |
renderer | 对象 | new Renderer() | v0.3.0 | 包含将标记转换为HTML的函数的对象。有关更多详细信息,请参阅可扩展性。 |
silent | 布尔值 | false | v0.2.7 | 如果为true,解析器不会抛出任何异常或记录任何警告。任何错误都将作为字符串返回。 |
tokenizer | 对象 | new Tokenizer() | v1.0.0 | 包含从markdown创建标记的函数的对象。有关更多详细信息,请参阅可扩展性。 |
walkTokens | 函数 | null | v1.1.0 | 调用每个标记的函数。有关更多详细信息,请参阅可扩展性。 |
已知扩展
Marked可以使用自定义扩展进行扩展。以下是可与marked.use(extension)
一起使用的扩展列表:
名称 | 包名 | 描述 |
---|---|---|
Admonition | marked-admonition-extension | Admonition扩展 |
Alert | marked-alert | 启用GFM警报 |
Base URL | marked-base-url | 使用基本URL前缀相对URL |
Bidi | marked-bidi | 为HTML添加双向文本支持 |
Code Format | marked-code-format | 使用Prettier格式化代码块 |
Code JSX Renderer | marked-code-jsx-renderer | 使用自定义渲染器和组件渲染JSX代码块 |
Code Preview | marked-code-preview | 将代码块转换为代码预览 |
Custom Heading ID | marked-custom-heading-id | 在使用Markdown扩展语法的标题中指定自定义ID |
Directive | marked-directive | 支持指令语法 |
Emoji | marked-emoji | 添加类似GitHub的emoji支持 |
Extended Tables | marked-extended-tables | 扩展标准GitHub Flavored表格以支持高级功能:列跨越、行跨越、多行标题 |
Footnote | marked-footnote | 启用GFM脚注 |
GFM Heading ID | marked-gfm-heading-id | 使用github-slugger创建标题ID,并允许自定义前缀。 |
Highlight | marked-highlight | 突出显示代码块 |
Katex Code | marked-katex-extension | 渲染katex代码 |
LinkifyIt | marked-linkify-it | 使用linkify-it进行URL |
Mangle | marked-mangle | 使用HTML字符引用混淆mailto链接 |
Misskey-flavored Markdown | marked-mfm | Misskey Flavored Markdown的自定义扩展 |
Plaintify | marked-plaintify | 将Markdown转换为纯文本 |
Shiki | marked-shiki | 集成Shiki语法高亮 |
Sequential Hooks | marked-sequential-hooks | 启用在顺序钩子内的顺序预处理和后处理 |
Smartypants | marked-smartypants | 使用smartypants使用“智能”排版标点,例如引号和破折号。 |
Smartypants lite | marked-smartypants-lite | marked-smartypants的更轻、更快的版本,不使用任何外部依赖项来创建“智能”排版标点,例如引号和破折号。 |
XHTML | marked-xhtml | 为空元素(如<br/> 、<img/> 等)发出自闭合HTML标签,如XHTML所要求的/ 。 |
Inline Markdown | 无 | 可以通过运行通过marked.parseInline 运行的markdown来解析内联Markdown。 |
Highlighting | 无 | 使用marked-highlight 来突出显示代码块。 |
Workers | 无 | 为了防止ReDoS攻击,可以在工作者上运行marked,并在解析时间超过正常时间时终止它。Marked可以在Node服务器上的工作者线程或浏览器中的web工 作者上运行。 |
Node Worker Thread | 无 | 在Node服务器上的工作者线程中运行marked,或在其解析时间超过常规时间时终止它。 |
Web Worker | 无 | 在浏览器中的web工作者上运行marked,或在其解析时间超过常规时间时终止它。 |
CLI Extensions | 无 | 您可以通过创建一个新CLI,导入marked和marked二进制文件来使用扩展。 |
内联Markdown
您可以通过运行通过marked.parseInline
运行的markdown来解析内联Markdown。
const blockHtml = marked.parse('**strong** _em_');
console.log(blockHtml); // '<p><strong>strong</strong> <em>em</em></p>'
const inlineHtml = marked.parseInline('**strong** _em_');
console.log(inlineHtml); // '<strong>strong</strong> <em>em</em>'
高亮显示
使用marked-highlight
来突出显示代码块。
工作者
为了防止ReDoS攻击,可以在工作者上运行marked,并在解析时间超过常规时间时终止它。 Marked可以在Node服务器上的工作者线程或浏览器中的web工作者上运行。
Node工作者线程
// markedWorker.js
import { marked } from 'marked';
import { parentPort } from 'worker_threads';
parentPort.on('message', (markdownString) => {
parentPort.postMessage(marked.parse(markdownString));
});
// index.js
import { Worker } from 'worker_threads';
const markedWorker = new Worker('./markedWorker.js');
const markedTimeout = setTimeout(() => {
markedWorker.terminate();
throw new Error('Marked took too long!');
}, timeoutLimit);
markedWorker.on('message', (html) => {
clearTimeout(markedTimeout);
console.log(html);
markedWorker.terminate();
});
markedWorker.postMessage(markdownString);
Web工作者
// markedWorker.js
importScripts('path/to/marked.min.js');
onmessage = (e) => {
const markdownString = e.data
postMessage(marked.parse(markdownString));
};
// script.js
const markedWorker = new Worker('./markedWorker.js');
const markedTimeout = setTimeout(() => {
markedWorker.terminate();
throw new Error('Marked took too long!');
}, timeoutLimit);
markedWorker.onmessage = (e) => {
clearTimeout(markedTimeout);
const html = e.data;
console.log(html);
markedWorker.terminate();
};
markedWorker.postMessage(markdownString);