Markdown 语法和 MathJax 兼容性问题

简介: 问题 例如有这样一段文字 $$net_{h1} = w_1 i_1 + w_2 i_2 + b_1 * 1$$ 公式里面的*和_都可能被 markdown 语法解析。导致最后公式无法正常解析。

问题

例如有这样一段文字

$$net_{h1} = w_1 * i_1 + w_2 * i_2 + b_1 * 1$$

公式里面的*_都可能被 markdown 语法解析。导致最后公式无法正常解析。

解决方案

我使用的是 https://github.com/SegmentFault/HyperDown 解析器,下面对其进行一些扩展改造

单行解析处理

HyperDown 中对单行里面的代码片段的解析思路是:
把匹配到的代码碎片使用的是先用一个数组$this->_holders来存放,最后其他内容解析完毕之后再替换回来。
因此我对公式行内的解析也同样的方式,在其parseInline里面增加一个匹配规则

$text = preg_replace_callback(
    "/(\\\${1,2})(.+)\\1/",
    function ($matches) use ($self) {
        // 表达式中间的字符应该都是单字节
        if (strlen($matches[2]) > mb_strlen($matches[2])) {
            return $matches[1] . $matches[2] . $matches[1];
        }
        return  $matches[1] . $self->makeHolder($matches[2]) . $matches[1];
    },
    $text
);

多行的解析

参考 HyperDown 中对代码块的解析规则,我们可以把$$作为开始匹配符和结束匹配服,知道公式占的行是多少,然后对这个块的代码做自定义的处理。
首先,在parseBlock里增加公式块的匹配。

// 对 TeX 或 LaTeX 公式块的支持
if ($this->_mathJax) {
    if (preg_match("/^(\s*)\\$\\$([^\\$]*)$/i", $line, $matches)) {
        if ($this->isBlock('mathJax')) {
            $this->setBlock($key)->endBlock();
        } else {
            $this->startBlock('mathJax', $key);
        }

        continue;
    } else if ($this->isBlock('mathJax')) {
        $this->setBlock($key);
        continue;
    }
}

然后是对应的解析规则

private function parseMathJax(array $lines){
    $str = '<p>'.implode("\n", $lines).'</p>';
    return $str;
}

就这么简单,解决了。最后地址:https://github.com/zhoumengkang/HyperDown

原文地址:https://mengkang.net/1087.html

目录
相关文章
|
2月前
markdown常用语法--花括号(超详细)
markdown常用语法--花括号(超详细)
|
7月前
|
程序员 Windows
markdown的基本语法
markdown的基本语法
54 0
|
2月前
|
IDE 数据可视化 数据挖掘
Jupyter Notebook使用教程——从Anaconda环境构建到Markdown、LaTex语法介绍
Jupyter Notebook使用教程——从Anaconda环境构建到Markdown、LaTex语法介绍
71 2
|
2月前
Markdown的基本语法(一)
Markdown的基本语法(一)
|
3月前
|
开发者
阿里云开发者社区Markdown语法
【2月更文挑战第1篇】
174 0
阿里云开发者社区Markdown语法
|
4月前
|
前端开发 API
MarkDown基础语法
MarkDown基础语法
86 0
|
5月前
|
Dart Shell pouch
markdown中快速插入Emoji表情包语法速查表!!!
markdown中快速插入Emoji表情包语法速查表!!!
|
6月前
|
程序员
markdown模式的一些语法
markdown模式的一些语法
30 0
|
6月前
Markdown语法和表情
Markdown语法和表情
49 0
|
6月前
MarkDown 常用语法
## 一、标题 最为常用的格式,只需要在文本前面加上 `#` 即可,同理、你还可以增加二级标题、三级标题、四级标题、五级标题和六级标题,总共六级,只需要增加 `#` 即可,标题字号相应降低 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ###### 注:1)# 和[标题]之间需保留一个字符的空格,这是最标准的MarkDown写法;2)只有一级到六级标题(最多六级)。 ## 二、首行缩进、换行、空行、对齐方式 ##### 首行缩进 在 Markdown 中,`&emsp;`或`&#8195;` // 全角
55 1
MarkDown 常用语法