跳到主要内容

高阶使用

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布尔值false4.1.0如果为true,walkTokens函数可以是异步的,并且marked.parse将返回一个当所有walkTokens函数解决时解决的promise。
breaks布尔值falsev0.2.7如果为true,在单行换行处添加<br>(模仿GitHub在注释上的行为,但在渲染的Markdown文件上不这样做)。要求gfm为true。
gfm布尔值truev0.2.1如果为true,使用经过批准的GitHub Flavored Markdown(GFM)规范。
pedantic布尔值falsev0.2.1如果为true,尽可能符合原始markdown.pl。不修复原始markdown的bug或行为。关闭并覆盖gfm。
renderer对象new Renderer()v0.3.0包含将标记转换为HTML的函数的对象。有关更多详细信息,请参阅可扩展性。
silent布尔值falsev0.2.7如果为true,解析器不会抛出任何异常或记录任何警告。任何错误都将作为字符串返回。
tokenizer对象new Tokenizer()v1.0.0包含从markdown创建标记的函数的对象。有关更多详细信息,请参阅可扩展性。
walkTokens函数nullv1.1.0调用每个标记的函数。有关更多详细信息,请参阅可扩展性。

已知扩展

Marked可以使用自定义扩展进行扩展。以下是可与marked.use(extension)一起使用的扩展列表:

名称包名描述
Admonitionmarked-admonition-extensionAdmonition扩展
Alertmarked-alert启用GFM警报
Base URLmarked-base-url使用基本URL前缀相对URL
Bidimarked-bidi为HTML添加双向文本支持
Code Formatmarked-code-format使用Prettier格式化代码块
Code JSX Renderermarked-code-jsx-renderer使用自定义渲染器和组件渲染JSX代码块
Code Previewmarked-code-preview将代码块转换为代码预览
Custom Heading IDmarked-custom-heading-id在使用Markdown扩展语法的标题中指定自定义ID
Directivemarked-directive支持指令语法
Emojimarked-emoji添加类似GitHub的emoji支持
Extended Tablesmarked-extended-tables扩展标准GitHub Flavored表格以支持高级功能:列跨越、行跨越、多行标题
Footnotemarked-footnote启用GFM脚注
GFM Heading IDmarked-gfm-heading-id使用github-slugger创建标题ID,并允许自定义前缀。
Highlightmarked-highlight突出显示代码块
Katex Codemarked-katex-extension渲染katex代码
LinkifyItmarked-linkify-it使用linkify-it进行URL
Manglemarked-mangle使用HTML字符引用混淆mailto链接
Misskey-flavored Markdownmarked-mfmMisskey Flavored Markdown的自定义扩展
Plaintifymarked-plaintify将Markdown转换为纯文本
Shikimarked-shiki集成Shiki语法高亮
Sequential Hooksmarked-sequential-hooks启用在顺序钩子内的顺序预处理和后处理
Smartypantsmarked-smartypants使用smartypants使用“智能”排版标点,例如引号和破折号。
Smartypants litemarked-smartypants-litemarked-smartypants的更轻、更快的版本,不使用任何外部依赖项来创建“智能”排版标点,例如引号和破折号。
XHTMLmarked-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);

CLI扩展

您可以通过创建一个新CLI,导入marked和marked二进制文件来使用扩展。

// file: myMarked
// #!/usr/bin/node

import { marked } from 'marked';
import customHeadingId from 'marked-custom-heading-id';

marked.use(customHeadingId());

import 'marked/bin/marked';

$ ./myMarked -s "# heading {#custom-id}"
<h1 id="custom-id">heading</h1>