HyperDown 扩展开发 Markdown 语法支持 MathJax

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: 公式里面的`*`和`_`都可能被 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 = &#39;<p>&#39;.implode(&quot;\n&quot;, $lines).&#39;</p>&#39;;
    return $str;
}

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

预览

https://yq.aliyun.com/articles/277312

目录
相关文章
|
8月前
|
JSON 人工智能 前端开发
用markdown语法制作一个好看的网址导航页面(markdown-web-nav)
这是一篇关于创建网址导航页面的工具分享文章。作者介绍了从手动编写HTML代码到开发可视化工具 *markdown-web-nav* 的历程,旨在简化网址管理与导航页面生成的过程。该工具支持新增、编辑和删除网址数据,通过导入/导出JSON文件、实时预览Markdown效果以及一键复制等功能,让用户轻松制作美观的网站导航页面。文章还提供了详细的操作步骤及常见问题解答,如还原数据、获取网站图标链接等,适合不同技术水平的用户使用。
404 28
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
642 0
【LaTex、markdown】常用语法写出漂亮的blog
【9月更文挑战第9天】本文介绍了使用LaTeX和Markdown编写美观博客的方法。LaTeX方面,需定义文档类型、设置标题与作者,并利用特定命令处理文本格式、列表、数学公式、图片和超链接。Markdown则通过井号表示标题级别,使用星号或下划线标记文本,简化列表和公式的编写,并以直观方式插入图片和链接。两者均可通过合理布局提升博客的可读性和视觉效果。
357 8
Markdown使用HTML语法实现复杂表格
Markdown使用HTML语法实现复杂表格
501 1
|
资源调度
机器人学 markdown数学公式常用语法
本文提供了Markdown中数学公式的常用语法,包括行内公式、行间公式、基本运算、矩阵、微积分、大小比较、开根号、表格、角标、头顶标、空格、括号、特殊字符、分式、文字、希腊字母以及分类括号的详细使用方法和示例。
583 1
|
自然语言处理 开发者 Python
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的 HTML 内容。Markdown 的语法简洁明了、学习容易,而且功能比纯文本更强。
Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的 HTML 内容。Markdown 的语法简洁明了、学习容易,而且功能比纯文本更强。
|
JavaScript
vue 加载展示md文件(markdown语法 .md后缀的文件)
vue 加载展示md文件(markdown语法 .md后缀的文件)
1672 0
揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!
揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!
|
9月前
|
前端开发 Docker 容器
写作利器,一款极简的Markdown 编辑器
WeChat Markdown Editor 是一款高度简洁的微信 Markdown 编辑器:支持 Markdown 语法、色盘取色、多图上传、一键下载文档、自定义 CSS 样式、一键重置等特性。
456 70
写作利器,一款极简的Markdown 编辑器
|
Ubuntu Linux 测试技术
Linux系统之部署轻量级Markdown文本编辑器
【10月更文挑战第6天】Linux系统之部署轻量级Markdown文本编辑器
591 1
Linux系统之部署轻量级Markdown文本编辑器