专栏首页宣言(Siam)博客PHP解析Markdown库,parsedown扩展自定义语法

PHP解析Markdown库,parsedown扩展自定义语法

写在前面

在开发系统过程中,有些信息编写储存是使用Markdown通用语法,但由于各个平台的会新增一些独特规范,一般的解析库都是只包含了标准语法,对于自定义语法是不支持解析的(如vuepress文档系统中的::: tip 提示语块)

我们从vuepress迁移文档系统到自己实现的文档系统时,特定标签无法解析,需要扩展解析库的功能,来完成自定义语法。

PHP常见的Markdown解析库是parsedown。这个库非常的轻量,只有一个文件,无需依赖其他扩展。

如何扩展自定义语法

我们可以在库的wiki中找到 https://github.com/erusev/parsedown/wiki/Tutorial:-Create-Extensions

嵌套解析

我们经过上面的教程已经扩展了::: tip的语法

使用如下

::: tip
提示语句
:::

但是如果中间的内容为其他符合md标准的语法,没办法嵌套解析,所以需要继续修改逻辑

旧代码如下

    protected function blockNoticeComplete($Block)
    {
        $text = $Block['element']['text']['text'];
        $Block['element']['text']['text'] = $text;
        return $Block;
    }

改为新代码,需要把$text文字再调用一次解析器 解析成html。但是此时会被自动反转义,在页面上显示如下情况

所以我们需要追踪在哪里决定转义,并取消该标签的自动转义。

php中转义的函数为htmlspecialchars

在这个库里搜索,找到如下方法

protected static function escape($text, $allowQuotes = false)
    {
        return htmlspecialchars($text, $allowQuotes ? ENT_NOQUOTES : ENT_QUOTES, 'UTF-8');
    }

再搜索该方法,决定转义的核心代码逻辑如下

    if (isset($Element['text']))
        {
            $text = $Element['text'];
        }
        // very strongly consider an alternative if you're writing an
        // extension
        elseif (isset($Element['rawHtml']))
        {
            $text = $Element['rawHtml'];
            $allowRawHtmlInSafeMode = isset($Element['allowRawHtmlInSafeMode']) && $Element['allowRawHtmlInSafeMode'];
            $permitRawHtml = !$this->safeMode || $allowRawHtmlInSafeMode;
        }

所以我们修改标签解析逻辑为返回rawHtml

        unset ($Block['element']['text']['text']);
        $Block['element']['text']['rawHtml'] = html_entity_decode((new static)->text($text));
        $Block['element']['text']['allowRawHtmlInSafeMode'] = true;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • VMware Workstation客户端 Centos系统 中文乱码 UTF-8字符无法正常显示

    发生该问题的时间比较长了,之前没有第一时间整理记录。依稀记得是因为系统重装之后,Vmware软件重新安装,然后导入以前的虚拟机配置文件,就出现了中文乱码的问题。

    宣言言言
  • PHP path_info,Thinkphp controller not exists index\php

    url如果以/为结尾 比如index.php/admin/,不会自动访问默认控制器、方法index,而是报错

    宣言言言
  • vue-cli引入vue-router

    同时在导航栏上方会有几个按钮,可以添加新的插件,如果我们之前没有安装过router插件,则会显示该按钮,点击安装即可。

    宣言言言
  • 使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析

    Jerry Wang
  • PC逆向之代码还原技术,第五讲汇编中乘法的代码还原

    在汇编中,乘法指令使用 IMUL 或者 MUL指令. 一般有两种形式 IMUL reg,imm 这种指令格式是 reg * imm的结果 重新放到reg中. ...

    IBinary
  • python3 cookbook

    使用deque(maxlen=N)构造函数会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会被移除掉.在队列两端插入或者删除元素时间复...

    py3study
  • nProtect APPGuard安卓反外挂分析

    1.最近在学习手游保护方面的技术,本文是学习过程中分析某反外挂的一点记录,高手莫要见笑,有不对的地方还请指教,首先简单通过资源目录中文件名做基本了解,

    我是小三
  • 创建SvcHost.exe调用的服务原理与实践

    1. 多个服务共享一个Svchost.exe进程利与弊 windows 系统服务分为独立进程和共享进程两种,在windows NT时只有服务...

    战神伽罗
  • HTML5 SVG+CSS3霓虹灯文字边框动画特效

    AlexTao
  • 微信小程序长按复制文本 selectable 属性

    德顺

扫码关注云+社区

领取腾讯云代金券