一个结构清晰的,易于维护的,现代的PHP Markdown解析器

Related tags

HyperDown
Overview

为何要写这样一个解析器

Markdown已经面世许多年了,国内外许多大大小小的网站都在用它,但是它的解析器却依然混乱不堪。SegmentFault 是中国较大规模使用 Markdown 语法的网站,我们一直在使用一些开源类库,包括但不限于

  1. php-markdown
  2. CommonMark for PHP
  3. Parsedown

他们都有或多或少的毛病,有的性能较差,有的代码比较业余,更多的情况是由于Markdown本身解析比较复杂,因此我们几乎无法去维护另外一个人写的代码。基于这个原因,我为 SegmentFault 专门编写了这么一个Markdown解析器。

使用方法

与常规的解析类库没有任何区别

$parser = new HyperDown\Parser;
$html = $parser->makeHtml($text);

当前支持的语法

  • 标题
  • 列表(可递归)
  • 引用(可递归)
  • 缩进风格的代码块
  • Github风格的代码块
  • 各种行内文字加粗,斜体等效果
  • 链接,图片
  • 自动链接
  • 段内折行
  • 脚标
  • 分隔符
  • 表格
  • 图片和链接支持互相套用

浏览器中使用请参阅 HyperDown.js

Issues
  • 希望四个 ```` 包裹 markdown 源码时,markdown 源码以代码段形式展示 ,不做转义

    希望四个 ```` 包裹 markdown 源码时,markdown 源码以代码段形式展示 ,不做转义

    SF 社区用户反馈,github、stackoverflow 都实现了,比如想实现下面这样的 markdown 代码展示:

    ```
    hell world
    ```
    
    opened by fenbox 7
  • I 开头的英文句子会被解析成 ol/li

    I 开头的英文句子会被解析成 ol/li

    举例: I was 将会被解析成

    <ol><li>was</li></ol>
    

    据我了解没有任何一个 Markdown 格式规定了这样的 list 格式?所以这是一个 bug?

    opened by shiny 3
  • 图片链接解析 BUG

    图片链接解析 BUG

    [ ![pic.jpg](http://pic.jpg) ]( http://url.com ) 这种链接的解析会存在问题,无法解析出图片标签。

    opened by lizheming 3
  • 非行首元素解析存在问题

    非行首元素解析存在问题

    **粗体** 这种解析两边必须存在空格,如果写成这样

    大家好**我是粗体**
    

    是不会被解析的。

    opened by lizheming 2
  • 【优化】PHP 5.3 适配,并整理相关代码的过长代码行

    【优化】PHP 5.3 适配,并整理相关代码的过长代码行

    4个月前,我在开发 EasyWiki 时需要在 PHP 5.3(官方仍支持的最旧版本)运行,就自行修改了源代码。

    而且,我觉得大多数 中小网站的服务端环境 都升级很慢,兼容老语法还是很有价值的,就把这个修改版分享出来~

    希望 SegmentFault 的大牛们能采纳!

    opened by TechQuery 2
  • 如何保留$$ ... $$之间的代码?

    如何保留$$ ... $$之间的代码?

    如何保留$$ ... $$之间的代码,另外也保留latex ....之间的代码块,使其不要解析成传统code?

    opened by xaero7 2
  • table有问题?

    table有问题?

    | Left-Aligned  | Center Aligned  | Right Aligned |
    | :------------ |:---------------:| -----:|
    | col 3 is      | some wordy text | $1600 |
    | col 2 is      | centered        |   $12 |
    | zebra stripes | are neat        |    $1 |
    
    | Item      | Value |
    | --------- | -----:|
    | Computer  | $1600 |
    | Phone     |   $12 |
    | Pipe      |    $1 |
    

    找的demo,发现错误

    | Left-Aligned | Center Aligned | Right Aligned | | :-- | :-: | --: | | col 3 is | some wordy text | $1600 | | col 2 is | centered | $12 | | zebra stripes | are neat | $1 |

    | Item | Value | | --- | --: | | Computer | $1600 | | Phone | $12 | | Pipe | $1 |

    opened by hellobbq 2
  • 能不能release一下呀,composer唯独这个包安装经常失败,还要git clone操作

    能不能release一下呀,composer唯独这个包安装经常失败,还要git clone操作

    这个不用费什么功夫吧,希望跟进一下!

    opened by xiaochong0302 1
  • 内容包含链接会报错

    内容包含链接会报错

    我在laravel8框架中引用 传入的文章内容如果包含http的链接就会报一个Undefined offset: 4错误 在Parser文件代码的545行

    opened by Depp-shi 0
  • 有个bug,关于textarea标签

    有个bug,关于textarea标签

    我写一个textarea标签内有一段html代码(虽然不应该用textarea展示代码),发现里面的代码会被加上

    opened by krishuang08 1
  • 还在维护吗

    还在维护吗

    最近没更新了?

    opened by krishuang08 0
  • 请问怎么居中和右对齐,谢谢。

    请问怎么居中和右对齐,谢谢。

    <p align='right'>xxxx</p>被解析成<p><p align='right'>xxxx</p></p>,且转义过。有没有其他方法实现内容右对齐或居中?

    opened by ycmbcd 0
  • 列表解析问题很多

    列表解析问题很多

    一旦列表中使用了 ``` 代码段,则列表无法结束,比如下面这段,“这是列表外的内容。”始终显示在列表内。

    • ⽆序列表:

      使⽤星号(*)、加号(+)或是减号(-),在后面再加一个空白作为列表标记:

      * 红色
      * 绿色
      * 蓝色
      

      列表结尾

    这是列表外的内容。


    如果列表中使用了缩进形式的代码段则列表会提前结束:

    • ⽆序列表:

      使⽤星号(*)、加号(+)或是减号(-),在后面再加一个空白作为列表标记:

      * 红色
      * 绿色
      * 蓝色
      

      列表结尾

    这是列表外内容。


    用空行分开的列表项,会连载一起:

    • aaa
    • bbb

    • aaa

    • bbb

    显示一样

    opened by han-jingyu 0
  • 代码好不严谨啊,https:/xxx.com 竟然能被解析成超链接。。。

    代码好不严谨啊,https:/xxx.com 竟然能被解析成超链接。。。

    这也显得太没经验了。。。

    opened by imfantuan 0
  • 是否能增加白名单 tag 功能?

    是否能增加白名单 tag 功能?

    开启了 html 标签白名单以后,如果用户插入一段这样的代码

    <i onclick="alert(233)">XSS</i>
    

    还是可以成功触发 onclick 事件 是否能加入一个白名单的功能,比如指定了只能加入 style、class 这些 tag 谢谢。

    opened by kasuganosoras 0
  • 建议增加行内LaTeX解析

    建议增加行内LaTeX解析

    建议增加行内LaTeX解析,解决行内公式显示 谢谢

    opened by yw981 5
  • h2 标签id 不能加上中文,导致提取目录后,没法跳转

    h2 标签id 不能加上中文,导致提取目录后,没法跳转

    h2 标签id 不能加上中文,导致提取目录后,没法跳转

    opened by wsdo 0
  • 加粗的一个bug

    加粗的一个bug

    这是前台js预览的效果: image 这是页面渲染出来的效果: image 文章链接 希望作者修复一下,这个库还是蛮不错的

    opened by pigLoveRabbit520 0
Owner
SegmentFault 思否
SegmentFault 思否