在 GitHub 上 Fork 我

markdown-it

安装

Node.js:

npm install markdown-it

浏览器 (CDN)

使用示例

另请参阅

简单示例

// node.js
// can use `require('markdown-it')` for CJS
import markdownit from 'markdown-it'
const md = markdownit()
const result = md.render('# markdown-it rulezz!');

// browser with UMD build, added to "window" on script load
// Note, there is no dash in "markdownit".
const md = window.markdownit();
const result = md.render('# markdown-it rulezz!');

单行渲染,不带段落包裹

import markdownit from 'markdown-it'
const md = markdownit()
const result = md.renderInline('__markdown-it__ rulezz!');

使用预设和选项初始化

(*) 预设定义了活动规则和选项的组合。可以是 "commonmark""zero""default"(如果省略)。有关详细信息,请参阅API 文档

import markdownit from 'markdown-it'

// commonmark mode
const md = markdownit('commonmark')

// default mode
const md = markdownit()

// enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true
})

// full options list (defaults)
const md = markdownit({
  // Enable HTML tags in source
  html:         false,

  // Use '/' to close single tags (<br />).
  // This is only for full CommonMark compatibility.
  xhtmlOut:     false,

  // Convert '\n' in paragraphs into <br>
  breaks:       false,

  // CSS language prefix for fenced blocks. Can be
  // useful for external highlighters.
  langPrefix:   'language-',

  // Autoconvert URL-like text to links
  linkify:      false,

  // Enable some language-neutral replacement + quotes beautification
  // For the full list of replacements, see https://github.com/markdown-it/markdown-it/blob/master/lib/rules_core/replacements.mjs
  typographer:  false,

  // Double + single quotes replacement pairs, when typographer enabled,
  // and smartquotes on. Could be either a String or an Array.
  //
  // For example, you can use '«»„“' for Russian, '„“‚‘' for German,
  // and ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'] for French (including nbsp).
  quotes: '“”‘’',

  // Highlighter function. Should return escaped HTML,
  // or '' if the source string is not changed and should be escaped externally.
  // If result starts with <pre... internal wrapper is skipped.
  highlight: function (/*str, lang*/) { return ''; }
});

插件加载

import markdownit from 'markdown-it'

const md = markdownit
  .use(plugin1)
  .use(plugin2, opts, ...)
  .use(plugin3);

语法高亮

使用 highlight 选项对围栏代码块应用语法高亮

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang }).value;
      } catch (__) {}
    }

    return ''; // use external default escaping
  }
});

或者使用完整的包裹器覆盖(如果您需要为 <pre><code> 分配类)

import markdownit from 'markdown-it'
import hljs from 'highlight.js' // https://highlightjs.org

// Actual default values
const md = markdownit({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return '<pre><code class="hljs">' +
               hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
               '</code></pre>';
      } catch (__) {}
    }

    return '<pre><code class="hljs">' + md.utils.escapeHtml(str) + '</code></pre>';
  }
});

链接化

linkify: true 使用 linkify-it。要配置 linkify-it,请通过 md.linkify 访问 linkify 实例

md.linkify.set({ fuzzyEmail: false });  // disables converting email to link

语法扩展

内嵌(默认启用)

通过插件

管理规则

默认情况下,所有规则都已启用,但可以通过选项进行限制。加载插件时,其所有规则都会自动启用。

import markdownit from 'markdown-it'

// Activate/deactivate rules, with currying
const md = markdownit()
  .disable(['link', 'image'])
  .enable(['link'])
  .enable('image');

// Enable everything
const md = markdownit({
  html: true,
  linkify: true,
  typographer: true,
});

核心

内部

描述

顶层规则执行器。连接块级/行内解析器并执行中间转换。

构造函数

类方法

实例属性

Core.新建

    • new Core()

Core.处理

    • Core.process(state)

执行核心链规则。

Core#规则器

规则器实例。保存核心规则的配置。

MarkdownIt

描述

主解析器/渲染器类。

用法
// node.js, "classic" way:
var MarkdownIt = require('markdown-it'),
    md = new MarkdownIt();
var result = md.render('# markdown-it rulezz!');

// node.js, the same, but with sugar:
var md = require('markdown-it')();
var result = md.render('# markdown-it rulezz!');

// browser without AMD, added to "window" on script load
// Note, there are no dash.
var md = window.markdownit();
var result = md.render('# markdown-it rulezz!');

单行渲染,不带段落包裹

var md = require('markdown-it')();
var result = md.renderInline('__markdown-it__ rulezz!');

构造函数

MarkdownIt.新建

    • new MarkdownIt([presetName][, options])
    • presetName
      • 字符串
    • 可选,commonmark / zero

    • options
      • 对象

使用给定配置创建解析器实例。可以不使用 new 调用。

presetName

MarkdownIt 提供命名预设,方便快速启用/禁用常见用例的活动语法规则和选项。

  • "commonmark" - 将解析器配置为严格的 CommonMark 模式。
  • default - 与 GFM 类似,在未指定预设名称时使用。启用所有可用规则,但仍不包括 html、排版器和自动链接器。
  • "zero" - 所有规则禁用。方便通过 .enable() 快速设置您的配置。例如,当您只需要粗体和斜体标记而不需要其他任何东西时。
options
  • html - false。设置为 true 以在源代码中启用 HTML 标签。请小心!这不安全!您可能需要外部净化器来保护输出免受 XSS 攻击。最好通过插件扩展功能,而不是启用 HTML。
  • xhtmlOut - false。设置为 true 以在关闭单标签(<br />)时添加 '/'。这仅为了完全兼容 CommonMark。在实际应用中,您将需要 HTML 输出。
  • breaks - false。设置为 true 以将段落中的 \n 转换为 <br>
  • langPrefix - language-。围栏块的 CSS 语言类前缀。对外部高亮器可能有用。
  • linkify - false。设置为 true 以自动将 URL 样式的文本转换为链接。
  • typographer - false。设置为 true 以启用一些语言无关的替换 + 引号美化(智能引号)。
  • quotes - “”‘’,字符串或数组。当排版器和智能引号启用时,用于双引号和单引号替换的配对。例如,您可以为俄语使用 '«»„“',为德语使用 '„“‚‘',为法语使用 ['«\xA0', '\xA0»', '‹\xA0', '\xA0›'](包括不间断空格)。
  • highlight - null。围栏代码块的高亮函数。高亮函数 function (str, lang) 应该返回转义的 HTML。如果源未更改且应在外部转义,它也可以返回空字符串。如果结果以 <pre... 开头,则内部包裹器将被跳过。
示例
// commonmark mode
var md = require('markdown-it')('commonmark');

// default mode
var md = require('markdown-it')();

// enable everything
var md = require('markdown-it')({
  html: true,
  linkify: true,
  typographer: true
});
语法高亮
var hljs = require('highlight.js') // https://highlightjs.org/

var md = require('markdown-it')({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang, ignoreIllegals: true }).value;
      } catch (__) {}
    }

    return ''; // use external default escaping
  }
});

或者使用完整的包裹器覆盖(如果您需要为 <pre><code> 分配类)

var hljs = require('highlight.js') // https://highlightjs.org/

// Actual default values
var md = require('markdown-it')({
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return '<pre><code class="hljs">' +
               hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +
               '</code></pre>';
      } catch (__) {}
    }

    return '<pre><code class="hljs">' + md.utils.escapeHtml(str) + '</code></pre>';
  }
});

MarkdownIt.配置

链式内部
    • MarkdownIt.configure(presets)

批量加载所有选项和组件设置。这是一个内部方法,您可能不需要它。但如果您需要,请在此处查看可用预设和数据结构

我们强烈建议使用预设而不是直接加载配置。这将提供更好的与下一版本的兼容性。

MarkdownIt.禁用

链式
    • MarkdownIt.disable(list, ignoreInvalid)
    • list
      • 字符串
      • 数组
    • 要禁用的规则名称或规则名称列表。

    • ignoreInvalid
      • 布尔值
    • 设置为 true 以在找不到规则时忽略错误。

MarkdownIt.enable 相同,但关闭指定的规则。

MarkdownIt.启用

链式
    • MarkdownIt.enable(list, ignoreInvalid)
    • list
      • 字符串
      • 数组
    • 要启用的规则名称或规则名称列表

    • ignoreInvalid
      • 布尔值
    • 设置为 true 以在找不到规则时忽略错误。

启用列表或规则。它将自动查找包含给定名称规则的相应组件。如果未找到规则且 ignoreInvalid 未设置,则抛出异常。

示例
var md = require('markdown-it')()
            .enable(['sub', 'sup'])
            .disable('smartquotes');

MarkdownIt.解析

内部
    • MarkdownIt.parse(src, env)
      • 数组
    • src
      • 字符串
    • 源字符串

    • env
      • 对象
    • 环境沙箱

解析输入字符串并返回块级令牌列表(特殊令牌类型“inline”将包含行内令牌列表)。在编写自定义渲染器(例如,生成 AST)之前,您不应直接调用此方法。

env 用于在“分布式”规则之间传递数据,并返回渲染器所需的额外元数据,例如引用信息。它也可以用于在特定情况下注入数据。通常,您传递 {} 即可,然后将更新后的对象传递给渲染器。

MarkdownIt.解析行内

内部
    • MarkdownIt.parseInline(src, env)
      • 数组
    • src
      • 字符串
    • 源字符串

    • env
      • 对象
    • 环境沙箱

MarkdownIt.parse 相同,但跳过所有块级规则。它返回只有一个 inline 元素的块级令牌列表,该元素在 children 属性中包含已解析的行内令牌。同时也会更新 env 对象。

MarkdownIt.渲染

    • MarkdownIt.render(src[, env])
      • 字符串
    • src
      • 字符串
    • 源字符串

    • env
      • 对象
    • 环境沙箱

将 markdown 字符串渲染为 HTML。它为您完成所有“魔法” :)。

env 可用于注入额外元数据(默认为 {})。但您很可能不需要它。另请参阅 MarkdownIt.parse 中的注释。

MarkdownIt.渲染行内

    • MarkdownIt.renderInline(src[, env])
      • 字符串
    • src
      • 字符串
    • 源字符串

    • env
      • 对象
    • 环境沙箱

类似于 MarkdownIt.render,但用于单段内容。结果将**不会**被 <p> 标签包裹。

MarkdownIt.设置

链式
    • MarkdownIt.set(options)

设置解析器选项(格式与构造函数中相同)。您可能永远不需要它,但您可以在构造函数调用后更改选项。

示例
var md = require('markdown-it')()
            .set({ html: true, breaks: true })
            .set({ typographer, true });

注意:为了获得最佳性能,请勿动态修改 markdown-it 实例的选项。如果您需要多种配置,最好创建多个实例并分别初始化每个实例。

MarkdownIt.使用

链式
    • MarkdownIt.use(plugin, params)

使用给定参数将指定插件加载到当前解析器实例中。这只是调用 plugin(md, params) 的语法糖。

示例
var iterator = require('markdown-it-for-inline');
var md = require('markdown-it')()
            .use(iterator, 'foo_replace', 'text', function (tokens, idx) {
              tokens[idx].content = tokens[idx].content.replace(/foo/g, 'bar');
            });

MarkdownIt#规范化链接文本

    • MarkdownIt#normalizeLinkText(url)
      • 字符串

用于将链接 URL 解码为人类可读格式的函数

MarkdownIt#

块级解析器的实例。您在编写插件时可能需要它来添加新规则。对于简单的规则控制,请使用 MarkdownIt.disableMarkdownIt.enable

MarkdownIt#核心

核心链执行器的实例。您在编写插件时可能需要它来添加新规则。对于简单的规则控制,请使用 MarkdownIt.disableMarkdownIt.enable

MarkdownIt#辅助函数

    • MarkdownIt#helpers
      • 辅助函数

链接组件解析器函数,对编写插件很有用。详情请参阅此处

MarkdownIt#行内

行内解析器的实例。您在编写插件时可能需要它来添加新规则。对于简单的规则控制,请使用 MarkdownIt.disableMarkdownIt.enable

MarkdownIt#链接化

    • MarkdownIt#linkify
      • LinkifyIt

linkify-it 实例。由链接化规则使用。

MarkdownIt#渲染器

渲染器的实例。使用它来修改输出外观。或者为插件生成的新令牌类型添加渲染规则。

示例
var md = require('markdown-it')();

function myToken(tokens, idx, options, env, self) {
  //...
  return result;
};

md.renderer.rules['my_token'] = myToken

请参阅 Renderer 文档和源代码

MarkdownIt#工具

    • MarkdownIt#utils
      • 工具

各种实用函数,对编写插件很有用。详情请参阅此处

块级解析器

内部

描述

块级分词器。

类方法

实例属性

ParserBlock.新建

    • new ParserBlock()

ParserBlock.解析

    • ParserBlock.parse(str, md, env, outTokens)

处理输入字符串并将块级令牌推入 outTokens

ParserBlock#规则器

规则器实例。保存块级规则的配置。

行内解析器

内部

描述

将段落内容分词。

类方法

ParserInline.新建

    • new ParserInline()

ParserInline.解析

    • ParserInline.parse(str, md, env, outTokens)

处理输入字符串并将行内令牌推入 outTokens

ParserInline#规则器

规则器实例。保存行内规则的配置。

ParserInline#规则器2

规则器实例。第二个规则器用于后处理(例如,在类似强调的规则中)。

渲染器

描述

从解析后的令牌流生成 HTML。每个实例都有独立的规则副本。这些规则可以轻松重写。此外,如果您创建插件并添加新的令牌类型,也可以添加新规则。

构造函数

实例属性

Renderer.新建

    • new Renderer()

创建新的 Renderer 实例并使用默认值填充 Renderer#rules

Renderer.渲染

    • Renderer.render(tokens, options, env)
      • 字符串
    • tokens
      • 数组
    • 要渲染的块级令牌列表

    • options
      • 对象
    • 解析器实例的参数

    • env
      • 对象
    • 来自解析输入的额外数据(例如,引用)

接收令牌流并生成 HTML。您可能永远不需要直接调用此方法。

Renderer.渲染属性

    • Renderer.renderAttrs(token)
      • 字符串

将令牌属性渲染为字符串。

Renderer.渲染行内

    • Renderer.renderInline(tokens, options, env)
      • 字符串
    • tokens
      • 数组
    • 要渲染的块级令牌列表

    • options
      • 对象
    • 解析器实例的参数

    • env
      • 对象
    • 来自解析输入的额外数据(例如,引用)

Renderer.render 相同,但用于 inline 类型的单个令牌。

Renderer.将行内渲染为文本

内部
    • Renderer.renderInlineAsText(tokens, options, env)
      • 字符串
    • tokens
      • 数组
    • 要渲染的块级令牌列表

    • options
      • 对象
    • 解析器实例的参数

    • env
      • 对象
    • 来自解析输入的额外数据(例如,引用)

为图像 alt 属性符合 CommonMark 规范的特殊变通方法。不要尝试使用它!规范要求显示剥离了标记的 alt 内容,而不是简单的转义。

Renderer.渲染令牌

    • Renderer.renderToken(tokens, idx, options)
      • 字符串
    • tokens
      • 数组
    • 令牌列表

    • idx
      • 数字
    • 要渲染的令牌索引

    • options
      • 对象
    • 解析器实例的参数

默认令牌渲染器。可以在 Renderer#rules 中通过自定义函数覆盖。

Renderer#规则

    • Renderer#rules
      • 对象

包含令牌的渲染规则。可以更新和扩展。

示例
var md = require('markdown-it')();

md.renderer.rules.strong_open  = function () { return '<b>'; };
md.renderer.rules.strong_close = function () { return '</b>'; };

var result = md.renderInline(...);

每个规则都作为具有固定签名的独立静态函数被调用

function my_token_render(tokens, idx, options, env, renderer) {
  // ...
  return renderedHTML;
}

请参阅源代码了解更多详细信息和示例。

规则器

描述

辅助类,由 MarkdownIt#coreMarkdownIt#blockMarkdownIt#inline 使用,用于管理函数(规则)序列

  • 按定义的顺序保留规则
  • 为每个规则分配名称
  • 启用/禁用规则
  • 添加/替换规则
  • 允许将规则分配到额外的命名链(在相同)
  • 缓存活动规则列表

在编写插件之前,您不需要直接使用此类。对于简单的规则控制,请使用 MarkdownIt.disableMarkdownIt.enableMarkdownIt.use

构造函数

Ruler.新建

    • new Ruler()

Ruler.在…之后

    • Ruler.after(afterName, ruleName, fn[, options])
    • afterName
      • 字符串
    • 新规则将在此规则之后添加。

    • ruleName
      • 字符串
    • 添加的规则的名称。

    • fn
      • 函数
    • 规则函数。

    • options
      • 对象
    • 规则选项(非强制)。

在给定名称的规则之后向链中添加新规则。另请参阅 Ruler.beforeRuler.push

选项
  • alt - 包含“备用”链名称的数组。
示例
var md = require('markdown-it')();

md.inline.ruler.after('text', 'my_rule', function replace(state) {
  //...
});

Ruler.在…处

    • Ruler.at(name, fn[, options])
    • name
      • 字符串
    • 要替换的规则名称。

    • fn
      • 函数
    • 新规则函数。

    • options
      • 对象
    • 新规则选项(非强制)。

用新函数和选项按名称替换规则。如果未找到名称,则抛出错误。

选项
  • alt - 包含“备用”链名称的数组。
示例

用新规则替换现有排版器替换规则

var md = require('markdown-it')();

md.core.ruler.at('replacements', function replace(state) {
  //...
});

Ruler.在…之前

    • Ruler.before(beforeName, ruleName, fn[, options])
    • beforeName
      • 字符串
    • 新规则将在此规则之前添加。

    • ruleName
      • 字符串
    • 添加的规则的名称。

    • fn
      • 函数
    • 规则函数。

    • options
      • 对象
    • 规则选项(非强制)。

在给定名称的规则之前向链中添加新规则。另请参阅 Ruler.afterRuler.push

选项
  • alt - 包含“备用”链名称的数组。
示例
var md = require('markdown-it')();

md.block.ruler.before('paragraph', 'my_rule', function replace(state) {
  //...
});

Ruler.禁用

    • Ruler.disable(list[, ignoreInvalid])
      • 数组
    • list
      • 字符串
      • 数组
    • 要禁用的规则名称列表。

    • ignoreInvalid
      • 布尔值
    • 设置为 true 以在找不到规则时忽略错误。

禁用给定名称的规则。如果未找到任何规则名称,则抛出错误。错误可以通过第二个参数禁用。

返回找到的规则名称列表(如果未发生异常)。

另请参阅 Ruler.enableRuler.enableOnly

Ruler.启用

    • Ruler.enable(list[, ignoreInvalid])
      • 数组
    • list
      • 字符串
      • 数组
    • 要启用的规则名称列表。

    • ignoreInvalid
      • 布尔值
    • 设置为 true 以在找不到规则时忽略错误。

启用给定名称的规则。如果未找到任何规则名称,则抛出错误。错误可以通过第二个参数禁用。

返回找到的规则名称列表(如果未发生异常)。

另请参阅 Ruler.disableRuler.enableOnly

Ruler.仅启用

    • Ruler.enableOnly(list[, ignoreInvalid])
    • list
      • 字符串
      • 数组
    • 要启用的规则名称列表(白名单)。

    • ignoreInvalid
      • 布尔值
    • 设置为 true 以在找不到规则时忽略错误。

启用给定名称的规则,并禁用其他所有规则。如果未找到任何规则名称,则抛出错误。错误可以通过第二个参数禁用。

另请参阅 Ruler.disableRuler.enable

Ruler.获取规则

    • Ruler.getRules(chainName)
      • 数组

返回给定链名称的活动函数(规则)数组。它分析规则配置,如果缓存不存在则编译缓存并返回结果。

默认链名称为 ''(空字符串)。它不能跳过。这是有意为之,以便保持签名单态以实现高速。

Ruler.推入

    • Ruler.push(ruleName, fn[, options])
    • ruleName
      • 字符串
    • 添加的规则的名称。

    • fn
      • 函数
    • 规则函数。

    • options
      • 对象
    • 规则选项(非强制)。

将新规则推入链的末尾。另请参阅 Ruler.beforeRuler.after

选项
  • alt - 包含“备用”链名称的数组。
示例
var md = require('markdown-it')();

md.core.ruler.push('my_rule', function replace(state) {
  //...
});

令牌

构造函数

Token.新建

    • new Token(type, tag, nesting)

创建新令牌并填充传入的属性。

Token.获取属性

    • Token.attrGet(name)

获取属性 name 的值,如果不存在则为 null。

Token.属性索引

    • Token.attrIndex(name)
      • 数字

按名称搜索属性索引。

Token.连接属性

    • Token.attrJoin(name, value)

通过空格将值连接到现有属性。如果不存在则创建新属性。对于操作令牌类很有用。

Token.推入属性

    • Token.attrPush(attrData)

[ name, value ] 属性添加到列表中。如有必要,初始化属性。

Token.设置属性

    • Token.attrSet(name, value)

name 属性设置为 value。如果存在旧值,则覆盖它。

Token#属性

    • Token#attrs
      • 数组

HTML 属性。格式:[ [ name1, value1 ], [ name2, value2 ] ]

Token#

    • Token#block
      • 布尔值

块级令牌为 true,行内令牌为 false。在渲染器中用于计算换行符

Token#子节点

    • Token#children
      • 数组

子节点数组(行内和图像令牌)

Token#内容

    • Token#content
      • 字符串

在自闭合标签(代码、html、围栏等)的情况下,它包含该标签的内容。

Token#隐藏

    • Token#hidden
      • 布尔值

如果为 true,则在渲染时忽略此元素。用于紧凑列表以隐藏段落。

Token#信息

    • Token#info
      • 字符串

额外信息

  • “围栏”令牌的信息字符串
  • 自动链接 “link_open” 和 “link_close” 令牌的值为 “auto”
  • 有序列表 “list_item_open” 令牌的项目标记的字符串值

Token#级别

    • Token#level
      • 数字

嵌套级别,与 state.level 相同

Token#映射

    • Token#map
      • 数组

源映射信息。格式:[ line_begin, line_end ]

Token#标记

    • Token#markup
      • 字符串

强调的 '*' 或 '_',围栏的围栏字符串等。

Token#元数据

    • Token#meta
      • 对象

插件存储任意数据的地方

Token#嵌套

    • Token#nesting
      • 数字

级别更改({-1, 0, 1} 集合中的数字),其中

  • 1 表示标签正在打开
  • 0 表示标签是自闭合的
  • -1 表示标签正在关闭

Token#标签

    • Token#tag
      • 字符串

HTML 标签名,例如 "p"

Token#类型

    • Token#type
      • 字符串

令牌类型(字符串,例如 "paragraph_open")