返回顶部
首页 > 资讯 > 精选 >如何使用JavaScript+Node.js写一款markdown解析器
  • 188
分享到

如何使用JavaScript+Node.js写一款markdown解析器

2023-06-29 04:06:42 188人浏览 八月长安
摘要

这篇文章主要介绍了如何使用javascript+node.js写一款markdown解析器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 准备工作首先编写gethtml函

这篇文章主要介绍了如何使用javascript+node.js写一款markdown解析器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

1. 准备工作

首先编写gethtml函数,传入markdown文本字符串,这里使用fs读取markdown文件内容,返回值是转换过后的字符串。

const fs = require('fs');const source = fs.readFileSync('./test.md', 'utf-8');const getHtml = (source) => {    // 处理标题    return source;}const result = getHtml(source);console.log(result);

主要设计正则表达式String.prototype.replace方法,replace接收的第一个参数可以是正则,第二个参数如果是函数那么返回值就是所替换的内容。

2. 处理图片&超链接

图片和超链接的语法很像,![图片](url),[超链接](url),使用正则匹配同时需要排除`。props会获取正则中的$,$1,$2。也就是匹配的字符整体,第一个括号内容,第二个括号内容。比如这里props[0]就是匹配到的完整内容,第四个参数props[3]是[]中的alt,第五个参数props[4]是链接地址。

const imageora = (source) => {    return source.replace(/(`?)(!?)\[(.*)\]\((.+)\)/gi, (...props) => {        switch (props[0].trim()[0]) {            case '!': return `<a href="${props[4]}" rel="external nofollow"  alt="${props[3]}">${props[3]}</a>`;            case '[': return `<img src="${props[4]}" alt="${props[3]}"/>`;            default: return props[0];        }    });}const getHtml = (source) => {    source = imageora(source);    return source;}

3. 处理blockquote

这里使用\x20匹配空格。如果匹配到内容,将文本props[3]放在blockquote标签返回就行了。

const block = (source) => {    return source.replace(/(.*)(`?)\>\x20+(.+)/gi, (...props) => {        switch (props[0].trim()[0]) {            case '>': return `<blockquote>${props[3]}</blockquote>`;            default: return props[0];        }    });}

4. 处理标题

匹配必须以#开头,并且#的数量不能超过6,因为h7是最大的了,没有h7,最后props[2]是#后跟随的文本。

const fORMatTitle = (source) => {    return source.replace(/(.*#+)\x20?(.*)/g, (...props) => {        switch (props[0][0]) {            case '#': if (props[1].length <= 6) {                return `<h${props[1].length}>${props[2].trim()}</h${props[1].length}>`;            };            default: return props[0];        }    })}

5. 处理字体

写的开始复杂了

const formatFont = (source) => {    // 处理 ~ 包裹的文本    source = source.replace(/([`\\]*\~{2})(.*?)\~{2}/g, (...props) => {        switch (props[0].trim()[0]) {            case '~': return `<del>${props[2]}</del>`;;            default: return props[0];        }    });    // 处理 * - 表示的换行    source = source.replace(/([`\\]*)[* -]{3,}\n/g, (...props) => {        switch (props[0].trim()[0]) {            case '*': ;            case '-': return `<hr />`;            default: return props[0];        }    })    // 处理***表示的加粗或者倾斜。    source = source.replace(/([`\\]*\*{1,3})(.*?)(\*{1,3})/g, (...props) => {        switch (props[0].trim()[0]) {            case '*': if (props[1] === props[3]) {                if (props[1].length === 1) {                    return `<em>${props[2]}</em>`;;                } else if (props[1].length === 2) {                    return `<strong>${props[2]}</strong>`;;                } else if (props[1].length === 3) {                    return `<strong><em>${props[2]}</em></strong>`;;                }            };            default: return props[0];        }    });    return source;}

6. 处理代码块

使用正则匹配使用`包裹的代码块,props[1]是开头`的数量,props[5]是结尾`的数量,必须相等才生效。

const pre = (source) => {    source = source.replace(/([\\`]+)(\w+(\n))?([^!`]*?)(`+)/g, (...props) => {        switch (props[0].trim()[0]) {            case '`': if (props[1] === props[5]) {                return `<pre>${props[3] || ''}${props[4]}</pre>`;            };            default: return props[0];        }    });    return source;}

7. 处理列表

这里只是处理了ul无序列表,写的同样很麻烦。主要我的思路是真复杂。而且bug肯定也不少。先匹配-+*加上空格,然后根据这一行前面的空格熟替换为ul。这样每一行都保证被ulli包裹。

第二步判断相邻ul之间相差的个数,如果相等则表示应该是同一个ul的li,替换掉</ul><ul>为空,如果后一个ul大于前一个ul,则表示后面有退格,新生成一个<ul>包裹退格后的li,如果是最后一个ul则补齐前面所有的</ul>。

const list = (source) => {    source = source.replace(/.*?[\x20\t]*([\-\+\*]{1})\x20(.*)/g, (...props) => {        if (/^[\t\x20\-\+\*]/.test(props[0])) {            return props[0].replace(/([\t\x20]*)[\-\+\*]\x20(.*)/g, (...props) => {                const len = props[1].length || '';                return `<ul${len}><li>${props[2]}</li></ul${len}>`;            })        } else {            return props[0];        }    });    const set = new Set();    source = source.replace(/<\/ul(\d*)>(\n<ul(\d*)>)?/g, (...props) => {        set.add(props[1]);        if (props[1] == props[3]) {            return '';        } else if (props[1] < props[3]) {            return '<ul>';        } else {            const arr = [...set];            const end = arr.indexOf(props[1]);            let start = arr.indexOf(props[3]);            if (start > 0) {                return '</ul>'.repeat(end - start);            } else {                return '</ul>'.repeat(end + 1);            }                    }    });    return source.replace(/<(\/?)ul(\d*)>/g, '<$1ul>');}

8. 处理表格

const table = (source) => {    source = source.replace(/\|.*\|\n\|\s*-+\s*\|.*\|\n/g, (...props) => {        let str = '<table><tr>';        const data = props[0].split(/\n/)[0].split('|');        for (let i = 1; i < data.length - 1; i++) {            str += `<th>${data[i].trim()}</th>`        }        str += '<tr></table>';        return str;    });    return formatTd(source);}const formatTd = (source) => {    source = source.replace(/<\/table>\|.*\|\n/g, (...props) => {        let str = '<tr>';        const data = props[0].split('|');        for (let i = 1; i < data.length - 1; i++) {            str += `<td>${data[i].trim()}</td>`        }        str += '<tr></table>';        return str;    });    if (source.includes('</table>|')) {        return formatTd(source);    }    return source;}

9. 调用方法

const getHtml = (source) => {    source = imageora(source);    source = block(source);    source = formatTitle(source);    source = formatFont(source);    source = pre(source);    source = list(source);    source = table(source);    return source;}const result = getHtml(source);console.log(result);

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用JavaScript+node.js写一款markdown解析器”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: 如何使用JavaScript+Node.js写一款markdown解析器

本文链接: https://lsjlt.com/news/322497.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用JavaScript+Node.js写一款markdown解析器
    这篇文章主要介绍了如何使用JavaScript+Node.js写一款markdown解析器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 准备工作首先编写getHtml函...
    99+
    2023-06-29
  • JavaScript+Node.js写一款markdown解析器
    目录1. 准备工作2. 处理图片&超链接3. 处理blockquote4. 处理标题5. 处理字体6. 处理代码块7. 处理列表8. 处理表格9. 调用方法1. 准备工作 首...
    99+
    2024-04-02
  • 如何使用JavaScript与Node.js打造一款聊天App
    这篇文章将为大家详细讲解有关如何使用JavaScript与Node.js打造一款聊天App,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。聊天是我们人与人交流...
    99+
    2024-04-02
  • JavaScript如何实现简单的Markdown语法解析器
    本篇内容主要讲解“JavaScript如何实现简单的Markdown语法解析器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript如何实现简单的Markdown语法解析器”吧!什么...
    99+
    2023-07-05
  • 如何使用JavaScript解析器UglifyJS
    本篇文章给大家分享的是有关如何使用JavaScript解析器UglifyJS,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。我一直在为Jscex...
    99+
    2024-04-02
  • markdown编辑器tui.editor如何使用
    这篇文章主要介绍“markdown编辑器tui.editor如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“markdown编辑器tui.editor如何使用”文章能帮助大家解决问题。安装使用...
    99+
    2023-07-05
  • 如何使用Node.js写一个命令行工具
    这篇文章给大家分享的是有关如何使用Node.js写一个命令行工具的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:操作系统需要为Linux1. 目标在命令行输入自己写的命令...
    99+
    2024-04-02
  • 如何分析Markdown解析器的持久型XSS漏洞
    如何分析Markdown解析器的持久型XSS漏洞,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是MarkdownMarkdown是一种轻量级的标记语言,流行...
    99+
    2023-06-17
  • 如何使用来解析JavaScript
    本篇文章为大家展示了如何使用来解析JavaScript,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Talk因为最近工作上有需要使用解析 JavaScript &n...
    99+
    2024-04-02
  • 如何使用不到200行代码写一款js类库
    小编给大家分享一下如何使用不到200行代码写一款js类库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!类库设计思路API介绍和效...
    99+
    2024-04-02
  • 如何使用js写一个js解释器
    这篇文章主要介绍了如何使用js写一个js解释器,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。先来看一下效果一个最简单的解释器上面有提到,js...
    99+
    2024-04-02
  • 如何使用Go构建一款静态分析工具
    今天小编给大家分享一下如何使用Go构建一款静态分析工具的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。介 绍Owl是一款开源项...
    99+
    2023-07-02
  • 详解如何用JavaScript编写一个单元测试
    目录为什么要进行单元测试?范围界定和编写单元测试保持单元测试简短而简单考虑正面和负面的测试用例分解长而复杂的函数避免网络和数据库连接如何编写单元测试创建一个新项目实现一个类配置和添加...
    99+
    2022-11-13
    JavaScript编写单元测试 JavaScript单元测试
  • 如何使用node.js进行服务器端JavaScript编程
    本篇内容主要讲解“如何使用node.js进行服务器端JavaScript编程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用node.js进行服务器端Ja...
    99+
    2024-04-02
  • 如何在在Vue3中使用markdown 编辑器组件
    目录安装引入组件基础用法保存后的 markdown 或者 html 文本如何渲染在页面上?安装 # 使用 npm npm i @kangc/v-md-editor@next -S...
    99+
    2024-04-02
  • 使用JavaScript编写一个秒表计时器
    本篇文章给大家分享的是有关使用JavaScript编写一个秒表计时器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JavaScript是什么JavaScript是一种直译式的脚...
    99+
    2023-06-07
  • 使用原生javascript编写一个计算器
    使用原生javascript编写一个计算器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布...
    99+
    2023-06-06
  • 使用JavaScript编写一个音乐播放器
    这篇文章主要介绍了使用JavaScript编写一个音乐播放器,此处通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考价值,需要的朋友可以参考下:JavaScript是什么JavaScript是一种直译式的脚本语言,其解释器被...
    99+
    2023-06-06
  • 使用JavaScript编写一个随机点名器
    这篇文章给大家介绍使用JavaScript编写一个随机点名器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的体验。2.可以处理表单...
    99+
    2023-06-06
  • Linux中如何用Node.js写一个命令行工具
    本文小编为大家详细介绍“Linux中如何用Node.js写一个命令行工具”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux中如何用Node.js写一个命令行工具”文章能帮助大家解决疑惑,下面跟着小编...
    99+
    2023-05-25
    linux node.js
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作