写一个 markdown 解析器,用什么方式比较好呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
SpiritLingPub
V2EX    Javascript

写一个 markdown 解析器,用什么方式比较好呢?

  •  
  •   SpiritLingPub 2020-06-16 14:41:56 +08:00 3335 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 正则表达式匹配处理
    2. 使用栈的方式处理。一层一层解析
    3. ......欢迎补充
    7 条回复    2020-06-17 22:00:01 +08:00
    wednesdayco
        1
    wednesdayco  
       2020-06-16 15:00:11 +08:00
    基本上就是正则了……
    leishi1313
        2
    leishi1313  
       2020-06-16 15:14:29 +08:00 via Android
    正。。正则写 parser ?学点函数式,你会发现写 parser 爽一笔
    imdong
        3
    imdong  
       2020-06-16 15:39:01 +08:00   1
    前几天还真就尝试用正则表达式去写这玩意...

    https://regex101.com/r/3pnVNg/1/
    zarte
        4
    zarte  
       2020-06-16 16:44:37 +08:00
    不是已经有现成的了么
    Death
        5
    Death  
       2020-06-16 16:59:28 +08:00
    @leishi1313
    他这不是 recursive descent parser 的思路吗?
    正则来做 lexing 也没啥问题吧
    ruyu
        6
    ruyu  
       2020-06-17 10:38:11 +08:00
    正则解析语法太难受了, 用 [PEG]( https://bford.info/packrat/) 吧.
    chengluyu
        7
    chengluyu  
       2020-06-17 22:00:01 +08:00
    Markdown 的问题是语法风格十分松散,且方言众多。有很多行为在不同的实现上效果不一,例如下面几个问题:

    1. 列表里可以定义标题吗?
    2. 引言中定义的引用有效吗?
    3. 用“*”开头的无序列表中插入以“*”组成的分割线,该生成一条分割线还是一个无序列表项?

    所以,如果你是自己脑补语法,并且没有一个规范的测试集的,写起来会很痛苦,你会发现总有一些编辑器和你的实现的行为不一致。

    现在常用的 Markdown 规范是 CommonMark [1],其提供了测试集,很多 Markdown 解析器实现都是基于此标准,楼主可以参考一下。

    至于如何实现,用正则表达式问题也不大。无论怎么做,都要注意考虑安全问题和 corner case 。John Gruber 在 2004 年发文宣传 markdown 的时候附带了一个自己用 Perl 写的 markdown 到 HTML 的转译器,因为他没有考虑到 XSS 等问题被人所诟病 [2]。 另一个知名的 Javascript 实现 marked,没有处理好嵌套列表,可以被特定输入触发栈溢出错误 [3]。

    [1]: https://spec.commonmark.org/
    [2]: https://news.ycombinator.com/item?id=4700383
    [3]: https://github.com/markedjs/marked/issues/1471
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2096 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 16:11 PVG 00:11 LAX 08:11 JFK 11:11
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86