markedjs使用杂记markdown扩展语法

请移步到我的Blog,获得更好的阅读体验!本文的链接请点这里起因我的博客系统的文章是直接使用gitbook保存的markdown文档,后端使用marked.js来解析markdown文档。 因为gitbook比较优秀,markdown进行了语法扩展,拿gitbook写文章也就更爽了。但是,这样问题就出现了,marked.js无法解析gitbook扩展的语法,所以我们就需要手动去解析这些扩展的markdown语法。 marked.js如何扩展语法?想要扩展语法,也就需要深入了解marked.js的工作机制。 marked.js的工作机制: 创建Lexer(词法解析器)实例: const lexer = new marked.Lexer()lexer将markdown字符串解析成tokens(tokens是官方文档的叫法,按照我的理解应该是markdown节点(node)): const tokens = lexer.lex(md)接下来创建Parser(解析器)实例: const parser = new marked.Parser()调用parser.parse()来解析tokens,生成html字符串: const html = parser.parse(tokens)到这里,marked.js的工作机制就完了。 那么,我们需要修改的部分也就很清晰了,我们需要修改lexer的生成tokens函数、parser的解析函数以及渲染函数。 如何修改Lexer生成token的函数?我看了marked.js的源码发现,lexer生成token的函数是一个名为token的函数,这个函数的代码是这样的: marked.Lexer.prototype.token = function (src, top) { src = src.replace(/^ +$/gm, ''); var next, // ...; while (src) { // newline if (cap = this.rules.newline.exec(src)) { src = src.substring(cap[0].length); if (cap[0].length > 1) { this.tokens.push({ type: 'space' }); } } // ... } //...}也就是,lexer用while循环来使用正则表达式进行判断是否符合语法,如果符合就push到tokens,然后切割字符串进行下次循环。我们就如法炮制一条正则表达式和循环中的代码块: ...

July 15, 2019 · 10 min · jiezi