写在前面
在开发系统过程中,有些信息编写储存是使用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;
扫描二维码,分享此文章