标记实例
默认情况下,Marked 将选项和扩展存储在全局范围内。这意味着更改一个脚本中的选项也会更改另一个脚本中的选项,因为它们共享同一个实例。
¥By default, Marked stores options and extensions in the global scope. That means changing the options in one script will also change the options in another script since they share the same instance.
如果你不想改变全局范围,你可以创建一个新的 Marked 实例,以确保选项和扩展是本地范围的。
¥If you don't want to mutate global scope, you can create a new instance of Marked to ensure options and extensions are locally scoped.
import { Marked } from 'marked';
const marked = new Marked([options, extension, ...]);
参数 | 类型 | 注释 |
---|---|---|
options | object |
可以传递给 marked.use 的相同参数 |
注意:marked.use(...) 不应在循环或函数中使用。它只能在创建新的 Marked 或导入 marked 后直接使用。
¥Be careful: marked.use(...) should not be used in a loop or function. It should only be used directly after new Marked is created or marked is imported.
parse
功能
¥The parse
function
import { marked } from 'marked';
marked.parse(markdownString [,options])
参数 | 类型 | 注释 |
---|---|---|
markdownString | string |
要编译的 markdown 源字符串。 |
options | object |
选项哈希。也可以使用 marked.use 设置全局选项 |
使用参考的替代方案
¥Alternative using reference
// Create reference instance
import { marked } from 'marked';
// Set options
marked.use({
async: true,
pedantic: false,
gfm: true,
});
// Compile
console.log(marked.parse(markdownString));
选项
成员 | 类型 | 默认 | 因为 | 注释 |
---|---|---|---|---|
async | boolean |
false |
4.1.0 | 如果为 true,walkTokens 函数可以是异步的,marked.parse 将返回一个 promise,当所有 walk tokens 函数解析时,该 promise 将解析。 |
breaks | boolean |
false |
v0.2.7 | 如果为 true,则在单个换行符上添加 <br> (复制评论上的 GitHub 行为,但不复制渲染的 markdown 文件上的行为)。要求 gfm 为 true 。 |
gfm | boolean |
true |
v0.2.1 | 如果为 true,请使用已批准的 GitHub Flavored Markdown (GFM) 规范。 |
pedantic | boolean |
false |
v0.2.1 | 如果为 true,则尽可能符合原始 markdown.pl 。不要修复原始 markdown 错误或行为。关闭并覆盖 gfm 。 |
renderer | object |
new Renderer() |
v0.3.0 | 包含将标记渲染为 HTML 的函数的对象。有关更多详细信息,请参阅 extensibility。 |
silent | boolean |
false |
v0.2.7 | 如果为 true,则解析器不会抛出任何异常或记录任何警告。任何错误都将作为字符串返回。 |
tokenizer | object |
new Tokenizer() |
v1.0.0 | 包含从 markdown 创建标记的函数的对象。有关更多详细信息,请参阅 extensibility。 |
walkTokens | function |
null |
v1.1.0 | 每个标记都会调用的函数。有关更多详细信息,请参阅 extensibility。 |
旧选项
¥Old Options
成员 | 类型 | 默认 | 因为 | 注释 |
---|---|---|---|---|
smartLists(已删除) | boolean |
false |
v0.2.8 | 在 v3.0.0 中已删除。 |
baseUrl(已移除) | string |
null |
v0.3.9 | 在 v8.0.0 中已删除,使用 marked-base-url 为任何相对链接添加 url 前缀。 |
headerIds(已移除) | boolean |
true |
v0.4.0 | 在 v8.0.0 中已删除,使用 marked-gfm-heading-id 在发出标题(h1、h2、h3 等)时包含 id 属性。 |
headerPrefix(已移除) | string |
'' |
v0.3.0 | 在 v8.0.0 中删除,使用 marked-gfm-heading-id 在发出标题(h1、h2、h3 等)时添加一个字符串作为 id 属性的前缀。 |
highlight(已移除) | function |
null |
v0.3.0 | 在 v8.0.0 中删除,使用 marked-highlight 为代码块添加高亮。 |
langPrefix(已删除) | string |
'language-' |
v0.3.0 | 在 v8.0.0 中已删除,使用 marked-highlight 在 <code> 块中为 className 添加前缀。用于语法高亮。 |
mangle(已删除) | boolean |
true |
v0.3.4 | 在 v8.0.0 中已删除,使用 marked-mangle 来破坏电子邮件地址。 |
sanitize(已删除) | boolean |
false |
v0.2.1 | 在 v8.0.0 中已删除,在输出 HTML 上使用清理库,如 DOMPurify(推荐)、sanitize-html 或 insane! |
sanitizer(已删除) | function |
null |
v0.3.4 | 在 v8.0.0 中已删除,在输出 HTML 上使用清理库,如 DOMPurify(推荐)、sanitize-html 或 insane! |
smartypants(已删除) | boolean |
false |
v0.2.9 | 在 v8.0.0 中已删除,使用 marked-smartypants 使用 "smart" 印刷标点符号来表示引号和破折号等。 |
xhtml(已删除) | boolean |
false |
v0.3.2 | 在 v8.0.0 中已删除,使用 marked-xhtml 为空元素(<br/>、<img/> 等)发出自闭合 HTML 标签,并按照 XHTML 的要求使用 "/"。 |
已知扩展
Marked 可以使用 自定义扩展 进行扩展。这是可以与 marked.use(extension)
一起使用的扩展列表。
¥Marked can be extended using custom extensions. This is a list of extensions that can be used with marked.use(extension)
.
内联 Markdown
你可以通过 marked.parseInline
运行 markdown 来解析内联 markdown。
¥You can parse inline markdown by running markdown through marked.parseInline
.
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
高亮代码块。
¥Use marked-highlight
to highlight code blocks.
工作线程
要防止 ReDoS 攻击,你可以在工作程序上运行 marked,并在解析时间比平时长时终止它。
¥To prevent ReDoS attacks you can run marked on a worker and terminate it when parsing takes longer than usual.
Marked 可以在节点服务器上的 Worker 线程 中运行,也可以在浏览器中的 Web Worker 中运行。
¥Marked can be run in a worker thread on a node server, or a web worker in a browser.
节点工作线程
¥Node Worker Thread
// 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 Worker
注意:Web Workers 将有效负载从
postMessage
发送到对象中,并将有效负载发送到.data
属性中¥NOTE: Web Workers send the payload from
postMessage
in an object with the payload in a.data
property
// 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 扩展
你可以通过创建一个导入 marked 和 marked 二进制文件的新 CLI 来在 CLI 中使用扩展。
¥You can use extensions in the CLI by creating a new CLI that imports marked and the marked binary.
// 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>