logo

Marked 中文网

标记实例

默认情况下,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 的相同参数

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 文件上的行为)。要求 gfmtrue
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-htmlinsane
sanitizer(已删除) function null v0.3.4 在 v8.0.0 中已删除,在输出 HTML 上使用清理库,如 DOMPurify(推荐)、sanitize-htmlinsane
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).

名称 包名称 说明
警告 marked-admonition-extension 警告扩展
警报 marked-alert 启用 GFM 警报
基本 URL marked-base-url 使用基本 URL 为相对 URL 加前缀。
Bidi marked-bidi 为 HTML 添加双向文本支持
代码格式 marked-code-format 使用 Prettier 格式化代码块
代码 JSX 渲染器 marked-code-jsx-renderer 使用自定义渲染器和组件渲染 JSX 代码块
代码预览 marked-code-preview 将代码块转换为代码预览
自定义标题 ID marked-custom-heading-id 使用 Markdown 扩展语法 # heading {#custom-id} 在标题中指定自定义标题 ID
指令 marked-directive 支持 指令语法
表情符号 marked-emoji 添加像 GitHub 上的表情符号支持
扩展表格 marked-extended-tables 扩展标准 Github-Flavored 表以支持高级功能:列跨度、行跨度、多行标题
脚注 marked-footnote 启用 GFM 脚注
GFM 标题 ID marked-gfm-heading-id 使用 github-slugger 创建标题 ID 并允许自定义前缀。
亮点 marked-highlight 高亮代码块
Katex 代码 marked-katex-extension 渲染 katex 代码
LinkifyIt marked-linkify-it 使用 linkify-it 作为 URL
Mangle marked-mangle 使用 HTML 字符引用破坏 mailto 链接
Misskey 风格的 Markdown marked-mfm Misskey 风格的 Markdown 的自定义扩展。
Plaintify marked-plaintify 将 Markdown 转换为纯文本
Shiki marked-shiki 集成 Shiki 语法高亮
顺序钩子 marked-sequential-hooks 顺序钩子 中启用顺序预处理和后处理
Smartypants marked-smartypants 使用 smartypants 将 "smart" 印刷标点符号用于引号和破折号等。
Smartypants lite marked-smartypants-lite marked-smartypants 的更快更轻量级版本,不使用任何外部依赖来为引号和破折号等内容创建 "smart" 印刷标点符号。
XHTML marked-xhtml 根据 XHTML 的要求,使用 "/" 为空元素(<br/>、<img/> 等)发出自闭合 HTML 标签。

内联 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>