【elementui源码解析】如何实现自动渲染md文档-第三篇

news2024/10/5 22:22:32

目录

1.前言

2.webpack.demo.js

3.markdown文档

4.fence.js

1)tokens

2):::

3)```

5.containers.js

1)markdown-it-container

2)md.use()

3)代码逻辑

4)containers小结

6.congfig.js

1)markdown-it-chain

2)slugify

3)markdown-it-anchor

4)代码逻辑

7.总结


1.前言

之前我们看了iconInit.jsbuild-entry.js文件,在build:file命令里还存在node build/bin/i18n.js & node build/bin/version.js这两个命令,在这里我们就不细看了,因为我们主要目的是分析md文档如何自动渲染到页面中的,这两个文件一个是根据模版文件和json配置文件自动生成多语言的主题,另一个是自动生成elementui版本列表。我们接下来主要看webpack.demo.js这个文件,这个文件是webpack打包的配置文件。

图1

2.webpack.demo.js

这个文件里面渲染md文档的主要代码就是这段,自定义了一个md-loader,然后md-loader文件夹里面有几个文件在接下来会一一介绍他们的作用。

图2

3.markdown文档

要看懂这个md-loader文档的代码,还是要对markdown的基本语法有一些了解,在这里可以看下基本语法:Markdown基本语法

其次还有关于markdown-it解析器的api的文档,可以结合着文档和源码来看这些api:markdown-it 中文文档

4.fence.js

首先这个文件覆盖了fence默认的渲染策略。

第3行代码:在很多Markdown解析器中,如markdown-it等,默认的fence渲染策略通常是将代码内容包裹在<pre><code>标签中,并且根据代码块的语言类型(如javascript),添加对应的CSS类来应用语法高亮。elementui对其进行了覆盖。

图3

图4

第6行代码,可能会疑问这个tokens是什么东西,这是markdown-it解析器实现的数据结构,具体可以看下面例子,我在自己的项目里面加了如下的md文档。首先要了解这样一个前提,解析器是会把md文档的内容转义成HTML的。如图6。

图5

图6 

1)tokens

可能会有很多人不清楚tokens是什么,所以我在第7行代码打印了tokens。我截了部分内容如下三张图。比如md文档第一行“## Input 输入框”,在tokens的解析下解析为三个,可以见图7,tag为“h2”,type分别为“heading_open、inline、heading_close”三个,同时对应的nesting的三个值为[-1、0、1],分别代表开标签、内容、闭标签。

                                 图7                                                                              图8

                                图9

我们主要关注图9,type为“fence”,info为“html”这个token。fence.js这个文件就是主要对type为fence的content进行渲染策略的更改。第9行第10行代码就是在判断是否这个fence是否在demo里面。如果是的话就return第12行的代码来渲染代码到文档里。可以见图10理解。

图10

2):::

::: 在此上下文中作为自定义区块的开始和结束标记。当Markdown处理器遇到这样的标签时,它会根据预定义的规则来解析和渲染这部分内容,例如将描述作为提示信息显示,并将跟随的代码片段渲染为可交互的演示组件。至于为什么要加demo这个符号,可能是因为elementui的逻辑处理需要demo这个表示符来帮助匹配代码,如代码中的正则表达式,同时也是为后面的自定义容器做的准备。

3)```

``` 后面加html的原因是为了高亮,在默认的markdown语法中```后面也是可以加一些标识符的,见最后面的图11。至于高亮是怎么实现的,为什么加个slot="highlight"就能高亮,原因是elementui使用了highlight.js这个库,至于具体实现就不深究了。

图11

5.containers.js

1)markdown-it-container

markdown-it-container是一个 markdown-it 的插件,它扩展了markdown-it 的功能,允许用户自定义块级语法容器。这意味着你可以定义自己的Markdown语法(通常是一对特定标签,比如elementui的 ```html```),用于包裹内容,并对这些内容应用自定义的渲染逻辑。

2)md.use()

md.use()方法用于注册插件,以扩展Markdown解析器的功能。这个文件主要注册了三个自定义的块级容器,demo、tip、warning。只有validate函数通过后才能进入render函数渲染。

3)代码逻辑

这里的validate函数就是match含有“demo”的内容。可以同时看上面图9来帮忙理解。然后render函数里就是匹配demo后面的描述内容,比如图9里的“通过 `disabled` 属性指定是否禁用 input 组件”,然后第12行的content就是```html```里的代码块,然后将代码块放到<!--element-demo: ${content}:element-demo-->里,在后面会有用处。

4)containers小结

总的来说。

'demo' 容器:用于演示或代码示例,带有可选的描述性文本。通过正则表达式 ^demo\s*(.*)$ 验证容器开头的标签,并从描述中提取内容。渲染逻辑会在开始标签处创建一个 <demo-block> 元素,并根据需要包含描述内容和代码块。结束标签处则闭合这个 <demo-block>。

'tip' 和 'warning' 容器应该是md自带的渲染格式。可以见图13和图14。

图12

图13

图14

6.congfig.js

图15 

1)markdown-it-chain

markdown-it-chain是是一个为 markdown-it 解析器设计的配置辅助库,它的主要作用在于提供一种更简洁、易读且链式的方法来配置和扩展 markdown-it。

2)slugify

slugify的作用是将给定的字符串转换成一个“slug”格式的字符串。Slug通常用于URLs、文件名等,它由字母、数字、连字符或下划线组成,不包含空格或其他特殊字符,且往往都是小写的。这对于创建友好、安全且搜索引擎优化(SEO)友好的链接非常有用。

在Markdown处理或网站开发中,slugify常常用于生成文章标题的URL友好版本,或者为自动创建的锚点、ID等提供基础。例如,将一篇名为 "基础用法" 的文章标题转换成 slug 可能会变成 ji-chu-yong-fa"。

图16

3)markdown-it-anchor

markdown-it-anchor的主要作用是在生成的HTML文档中自动为每个标题(heading)添加锚点链接。这使得用户可以轻松链接到文档内的特定部分,提升长篇文章或文档的可导航性和可用性。

在12-19行代码中是其具体配置。

  • level:2表示指定从Markdown文档的第2级标题(即两个#号开始的标题)开始添加锚点。这意味着只有## 标题名称及以上的标题会生成锚点。
  • slugify:指定使用从 transliteration 模块导入的 slugify 函数来生成锚点的ID。这意味着标题文本将被转换成URL友好的字符串,适合用作网页链接的一部分。
  • permalink:true表示启用“永久链接”功能,会在每个标题旁边添加一个可点击的小图标或链接,用户点击后可以直接跳转到该标题的链接。
  • permalinkBefore:true表示设置“永久链接”图标或链接出现在标题文本之前。如果设为 false,则链接会出现在标题之后。

图17

4)代码逻辑

第10行就是通过options.html(true).end()启用markdown中直接插入HTML的功能。

第21行就是导入并使用containers.js中定义的三个容器。

第23行就是通过config.toMd()生成配置好的markdown-it实例。

第24行就通过overWriteFenceRule()来覆盖牧人的代码块处理渲染逻辑。

7.总结

我们在下一篇再来总结index.js里做了什么操作,这里是核心代码,所以单独一篇来讲。

总的来说,在fence.js里面覆盖了默认的 fence 渲染策略,在container.js里面定义了自定义容器,最后在config.js里面配置和初始化markdown-it解析器。md-loader里的代码还是要对md文档有一些基础知识才方便看懂,我也是一边看官方使用文档,一边看elementui代码。大家一起学起来吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821718.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拿来做课设哈哈哈-“久坐提醒器”的网页应用

这篇文章将介绍一个名为“久坐提醒器”的网页应用&#xff0c;它通过HTML、CSS和JavaScript三种技术实现。下面是对这三种技术在实现该应用中的作用和代码的详细解析。 HTML&#xff1a;构建网页结构 HTML&#xff08;HyperText Markup Language&#xff09;是网页的基础结构…

使用GPT/文心实现诗词作画

在教育领域中&#xff0c;古诗词一直是培养学生文化素养和审美能力的重要载体。选择合适的古诗词进行学习和欣赏&#xff0c;不仅能够增强他们的语言表达能力&#xff0c;还能促进他们对中国传统文化的理解和热爱。本文将结合AI技术&#xff0c;将古诗词转换为图画。 1、选择适…

《Terminai(终端):革命性的终端工具(下)》

回顾上一篇文章&#xff0c;我们主要探讨了Terminai&#xff08;终端&#xff09;的概念、价值及其与传统终端工具的区别。在本文中&#xff0c;我们将深入探讨Terminai如何通过其独特的交互操作场景和功能&#xff0c;为开发者打造一个革命性的开发环境。 一、创新的G&T交…

有趣的算法题之矩阵的特别乘积

矩阵元素相乘 A[ n, m ] 是一个 n 行 m 列的矩阵&#xff0c;a[ i, j ] 表示 A 的第 i 行 j 列的元素&#xff0c;定义 x[ i , j ] 为 A 的第 i 行和第 j 列除了 a[ i, j ] 之外所有元素(共 n m - 2 个)的乘积&#xff0c;即 x[ i, j ] a[ i, 1 ] * a[ i, 2 ] * ... * a[ i, …

【编译原理】LL(1)分析法:C/C++实现

&#x1f516;墨香寄清辞&#xff1a;空谷幽篁风动&#xff0c;梦中仙鹤月明。 辗转千秋豪情在&#xff0c;乘风翱翔志不移。 目录 1. 编译原理之LL(1)分析法概念 1.1 编译原理 1.2 LL(1)分析法 2. LL(1)分析法 2.1 实验目的 2.2 实验要求 2.3 实验内容 2.3.1 实验解决…

Stable Diffusion【光影文字】:绚丽光影,文字与城市夜景的光影之约

今天我们我们结合城市夜景背景来看一下光影文字的效果&#xff0c;我们先来看一下效果图。 一. 字融城市夜景制作光影文字方法 【第一步】&#xff1a;制作底图这里制作底图使用黑底白字。我们使用美图秀秀制作一个"小梁子"字的底图。 字体&#xff1a;默认字体 图…

LLM 中什么是Prompts?如何使用LangChain 快速实现Prompts 一

LLM 中什么是Prompts&#xff1f;如何使用LangChain 快速实现Prompts 一 Prompt是一种基于自然语言处理的交互方式&#xff0c;它通过机器对自然语言的解析&#xff0c;实现用户与机器之间的沟通。 Prompt主要实现方式是通过建立相应的语料库和语义解析模型&#xff0c;来将自…

对于毕业季拨穗礼上的奇怪举动与表情包,您怎么看?

对于毕业季拨穗礼上的奇怪举动与表情包&#xff0c;您怎么看&#xff1f; 拨穗代表稻穗或麦穗成熟。什么叫拨穗礼&#xff1f;就是把你头上学士帽的流苏从右边换到左边的动作。它象征着你已学有所成,可以展翅高飞了。 又到毕业季&#xff0c;各大高校的校园里弥漫着别离与期待…

评论员稿:逯伟军,年轻人为何为这样的“新中式”买单?

继老钱风、美拉德、Y2K等流行趋势之后&#xff0c;“新中式”毫无争议地荣登当下最为热门的穿搭趋势之列。 不管是出于对传统文化的热爱&#xff0c;还是仅仅被中式美学的设计所吸引&#xff0c;总之从明星到时尚博主&#xff0c;再到普通消费者&#xff0c;新中式风格在社交平…

Talk|新加坡国立大学贾鑫宇:适用于高自由度机器人的运动控制器

本期为TechBeat人工智能社区第600期线上Talk。 北京时间6月13日(周四)20:00&#xff0c;新加坡国立大学博士生—贾鑫宇的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “适用于高自由度机器人的运动控制器”&#xff0c;向大家系统地介绍了如何通…

期货到底难在哪里?

第一难&#xff1a;使用杠杠&#xff0c;杠杠放大的其实是你性格、天赋和技能上的弱点&#xff0c;同时相应缩小你这三个方面的优点&#xff1b;第二难&#xff1a;双向交易。如果只能做多&#xff0c;理论上你每次交易将有50%的概率盈利。现在既能做多又能做空&#xff0c;只剩…

最前端|还在焦虑网页内容无法保存?一文教你轻松给网页拍照

目录 一、需求背景 二、实现策略 三、基础实现 四、功能完善 五、效果演示 六、总结 一、需求背景 网页作为一种关键的信息传递媒介&#xff0c;承载着丰富多样的内容形态&#xff0c;包括但不限于文本、图像、表格及多媒体元素。然而&#xff0c;网页内容的动态性和不稳定…

郑州企业资信评价资质:工程咨询单位专业资信申报材料清单

在郑州企业申请工程咨询单位专业资信评价资质时&#xff0c;需要准备一系列详细的申报材料。以下是根据参考文章中的相关数字和信息&#xff0c;清晰、分点表示和归纳的工程咨询单位专业资信申报材料清单&#xff1a; 一、基础材料 企业法人营业执照&#xff1a;提供企业法人营…

微信小程序投票系统(包含微信小程序端)

&#x1f4f1;微信投票小程序&#xff1a;轻松发起&#xff0c;快速统计 一、引言 在数字化时代&#xff0c;微信作为我们日常生活中不可或缺的社交工具&#xff0c;不仅为我们提供了沟通交流的平台&#xff0c;还衍生出了许多实用的小程序。其中&#xff0c;微信投票小程序凭…

《现代通信原理与技术》--数字信号的最佳接收实验报告

《现代通信原理与技术》 数字信号的最佳接收实验报告 实 验&#xff1a;数字信号的最佳接收实验报告 目录 摘要......................................................................................................3 引言........................................…

嵌入式系统复习(一)

第一章 嵌入式系统的定义、特点 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 特点&#xff1a;嵌入性 专用性 计算机系统 嵌入式系统典型组成…

线代老师大PK,这四位胜出!

说实话&#xff0c;线代真的别乱跟老师 因为每个老师讲课适用的人群不一样&#xff0c;比如都说李永乐老师线代讲的好&#xff0c;但是我去听完发现&#xff0c;李永乐老师的线代讲的虽然好&#xff0c;但是对于零基础或者基础不好的考生来说&#xff0c;真的有点不友好&#…

Python开发者必备:Python多平台消息推送工具

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒🚀 安装📝 使用方法📝 同步发送消息📝 异步发送消息📝 使用配置文件发送消息📝 示例配置文件⚓️ 相关链接 ⚓️📖 介绍 📖 你是否需要一个强大且灵活的工具来实现多平台消息推送?那么你一定不能…

手机直播不用麦克风可以吗?一文看懂无线麦克风哪个好

市面上对于无线麦克风的需求有增无减&#xff0c;原因是直播、短视频行业火爆&#xff0c;许多人都开始加入这一行业&#xff0c;不过对于麦克风这类产品的疑问也越来越多。例如&#xff1a;无线麦克风怎么选&#xff1f;实不实用&#xff1f;手机直播不用麦克风可以吗&#xf…

服务器数据恢复—EMC Isilon存储中被误删的虚拟机数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC Isilon S200集群存储&#xff0c;共三个节点&#xff0c;每节点配置12块SATA硬盘。 服务器存储故障&#xff1a; 工作人员误操作删除虚拟机&#xff0c;虚拟机中数据包括数据库、MP4、AS、TS类型的视频文件等。需要恢复数据的虚拟机通…