markdownIt大致流程分析

因为最近再弄markdown在react与vue的渲染,发现其都引用了markdownIt模块。
于是就产生了这篇文章

一,markdownIt模块大致流程

流程

二,分析其执行流程

1,入口函数MarkdownIt.render

  • 数据源从此函数开始颠沛流离的一生

2,实例化Core解析器

3,流经相应解析规则

  • 默认流经,normalize(用于文档标准化)block:把文档解析成对应块级inline:处理解析后块级中的内联文档linkify(用链接节点替换类似链接的文本)replacements(替换相关字符)smartquotes(替换相关字符),六条内置解析规则
  • 其中,linkifyreplacementssmartquotes解析规则,受MarkdownIt.options配置属性所影响,默认不流经这几种解析规则

3.1,流经block解析规则

  • 实例化block解析器
  • 解析器,对其数据源,按照每行(以换行符为基准),对数据源进行拆分并对其关键信息进行记录
  • 此后依次流向解析器下的十一条子规则,并形成token
  • 关于token流,官方解释是:
    Tokens 是一个简单的数组。(AST 是一个对象)
    打开的标签和关闭的标签可以隔离。
    将“内联容器(inline container)”作为一种特殊的 block token 对象。它有嵌套的 tokens,如粗体,斜体,文本等等。

3.2,流经inline解析规则

  • 实例化inline解析器
  • 从上述的tokens中对token.type为inline的token使用解析器下的十五条子规则进行处理

4,流经渲染器

  • 经过长途跋涉后,终于完善token流,此时需要对token流进行包装,使我们能清晰看出来他的内容
  • 渲染器,内置九条渲染规则(围栏、行内代码、代码块、html 块、行内 html、图片、硬换行、软换行、文本)token流依次流经后,最终渲染成html结构
三,关于MarkdownIt实例属性
options配置属性

默认配置

配置路径(基于/lib下的相对路径)
./presets/default(在没有给出预设名称时会启用,(包括)所有可用的规则)
./presets/zero(所有的规则都被禁用)
./presets/commonmark(将解析器配置为严格的 CommonMark模式)
validateLink函数

验证链接parame:url:string,return:boolean

验证规则
/^(vbscript|javascript|file|data): /
/^data:image/(gif|png|jpeg|webp);/
normalizeLink函数

​ 1,markdown-it解析器的URL实用程序。(使用mdurl模块进行url解析)

​ 2,国际化域名编码。(使用punycode模块进行域名编码)

标准化链接parame:url:string,return:string


normalizeLinkText函数

​ 1,markdown-it解析器的URL实用程序。(使用mdurl模块进行url解析)

​ 2,国际化域名编码。(使用punycode模块进行域名编码)

标准化链接parame:url:string,return:string


configure函数

​ 1,MarkdownIt.set函数进行配置属性的合并。(默认配置参考config

​ 2,启用规则

对MarkdownIt进行配置parame:presets: object,return:MarkdownIt


set函数

合并解析器属性parame:options:object,return:MarkdownIt


enable函数
  • list (String|Array) – 要启用的规则名称或规则名称列表。
  • ignoreInvalid (Boolean) – 设为 true 来忽略规则未发现时的错误。

启用规则parame:list:array, ignoreInvalid:boolean,return:MarkdownIt


disable函数
  • list (String|Array) – 要禁用的规则名称或规则名称列表。
  • ignoreInvalid (Boolean) – 设为 true 来忽略规则未发现时的错误。

禁用规则parame:list:array,ignoreInvalid:boolean,return MarkdownIt


use函数

注入插件parame:plugin:function,(arguments?),return:MarkdownIt


parse函数

​ 1,实例化Core类 => StateCore类

​ 2,通过Core.process函数对StateCore实例进行处理

解析文档parame:src:string,env:object,return:array(tokens流)


render函数

​ 1,通过MarkdownIt.parse函数解析文档

​ 2,通过renderer.render函数对解析后的文档进行渲染

渲染文档parame:src:string,env:object,return:string


parseInline函数

​ 1,实例化Core类 => StateCore类

​ 2,修改StateCore.inlineMode为True

​ 3,通过Core.process函数对StateCore实例进行处理

解析内联元素parame:src:string,env:object,return:array(tokens流)


renderInline函数

​ 1,通过MarkdownIt.parse函数解析文档

​ 2,通过renderer.render函数对解析后的文档进行渲染

渲染内联文档parame:src:string,env:object,return:string


helpers解析链接函数集
utils工具函数集
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值