Markdown 语法和 MathJax 兼容性问题

问题

例如有这样一段文字

$$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

时间: 2024-12-20 12:26:39

Markdown 语法和 MathJax 兼容性问题的相关文章

oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法

问题描述 oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法 大神们,随便给几个例子参照一下啊,oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法 解决方案 差不多这个意思,http://zhidao.baidu.com/link?url=lYFB7BBbSoybi5mTurmVbI88Q5R78nnhHyQUiMAhF3B4iyA1OiPCxY4xsRS7v_v0kBdbtCVvVlPHhfY9Rerx7K 解决方案二: create or repl

Oracle语法和SQL语法的一些区别

一.SQL ISNULL(字段名,替换值) SUBSTRING(字段名,起始位置,截取长度)    GETDATE()    YEAR(GETDATE())        MONTH(GETDATE())          DAY(GETDATE()) SELECT DATEPART(HOUR,GETDATE())        SELECT DATEPART(MINUTE,GETDATE())       SELECT DATEPART(SECOND,GETDATE())       + (连

CSS基础语法和CSS经常用到的知识点总结

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天就发布一下关于CSS布局的入门基础教程 主要讲解CSS基础和CSS基础语法运用和一些常用必备小知识点!希望能帮助哪些站长们和CSS布局初学者! ====开始==== CSS基础语法 CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明. 每条声明由一个属性和一个值组成. 每个属性有一个值.属性和值被冒号分开. 例如:下面这行代码的

MongoDB系列教程(五):mongo语法和mysql语法对比学习_MongoDB

我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与mysql命令对比     关系型数据库一般是由数据库(database).表(table).记录(record)三个层次概念组成.而非关系型数据库mongodb是由数据库(database).集合(collection).文档对象(document)三个层次组成.mongodb对于关系型数据库里的表,没有行和列的关系概念,这体现了模式的自由特点. 语法命

10款流行的Markdown编辑器,总有一款适合你

作为一个开源人,如果你不会使用Markdown语法,那你就OUT了!Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,非常的简单实用. CSDN CODE平台的 帮助文档.项目README文件.文档项目甚至包括ISSUES和项目评论等都是支持Markdown语法的! 以下,我们收集了10个业界最受欢迎的Markdown编辑器,喜欢用Markdown的朋友都来看看吧!(以下排名仅为一家之言,请勿拍砖) 1.MarkdownPad  用户可以通过键盘快捷

ReText安装与使用(Windows下)

      ReText 是一个使用 Markdown 语法和 reStructuredText (reST) 结构的文本编辑器,编辑的内容支持导出到 PDF.ODT 和 HTML 以及纯文本,支持即时预览.网页生成以及 HTML 语法高亮.全屏模式等.       现在很多开源框架的用户文档都使用MakeDown语言编写,比如Redis.网上Google了下,大家都说ReText好用,安装使用后,感觉果然如此,UI做的很精致.ReText是基于Python的,所以必须首先安装PyThon.  

跟我一起写 Makefile

陈皓 概述 -- 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解 HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完 成大型工程的能力. 因为,makefile关系到

跨浏览器的Flexbox:CSS Flexible盒模型3

文章简介:CSS Flexible盒模型3又简称为Flexbox.摒弃我们传统上使用的一些hack和组件,Flexbox给网络的发展带来了很多正能量和兴奋济,让我们一起把复杂的网站布局变得简易和快速. 简介 CSS Flexible盒模型3又简称为Flexbox.摒弃我们传统上使用的一些hack和组件,Flexbox给网络的发展带来了很多正能量和兴奋济,让我们一起把复杂的网站布局变得简易和快速.早前在Flexbox: fast track to layout nirvana?一文中介绍了Flex

主流WEB服务器比较(6)

web|web服务|web服务器|比较|主流 当说到适应动态网页内容这个问题时,我们又使用了模块k化这个名词.Roxen服务器使用了一个服务器端的语言Pike,利用Pike既可以为Roxen开发全新的模块,也可以嵌入到Roxen系统中.Pike是解释性语言,语法和C语言非常相似.因为Pike是在以前写MUD游戏的语言的基础上发展起来的,因而它在安全认证方面非常出色.Pike无论从编程风格还是语法特点上都和C语言很接近,所以一个标准的C语言程序在很短的时间就可以改写成Pike程序.作为一个解释语言