V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Daring Fireball: Markdown
CommonMark
MacDown Open Source Markdown Editor
Marked
GitHub Flavored Markdown
phoenixlzx
V2EX  ›  Markdown

Markdown 和 MathJax 共存有什么比较好的办法?

  •  
  •   phoenixlzx · 2015-12-01 18:05:48 +08:00 · 5684 次点击
    这是一个创建于 3281 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近折腾了下对 mathjax 的支持,用 mathjax-node 库。

    由于 markdown 会直接处理一些公式里的符号所以先用 mathjax 处理一遍 markdown 的文本,然后再交给 marked 处理。

    然后发现 mathjax 会把一些代码块里的东西当作公式处理,于是整个代码块没法看了...
    (特别是 nginx 配置或者 perl 语法里会出现此类情况)

    尝试过对一些字符进行 escape 之后丢给 mathjax ,处理完再替换回来交给 marked ,不过明显 coverage 不够,还是会在很多格式下被绕过。

    还有一个思路但是尚未尝试,就是用什么方法可以检测到 mathjax 公式用特殊符号替换掉, marked 处理完之后再替换回来把 html 交给 mathjax 处理。

    各位有什么比较好的方案可以在不损失功能的情况下让二者并存么?

    11 条回复    2016-06-15 11:26:40 +08:00
    sengxian
        1
    sengxian  
       2015-12-01 18:26:33 +08:00
    虽然我也没搞过,但我觉得 farbox.com 处理的还行,不过 \( \( 的行内公式 要变成 \\( \\(
    kingcos
        2
    kingcos  
       2015-12-01 18:36:32 +08:00
    同问。。。之前 Hexo 用的这个插件
    http://catx.me/2014/03/09/hexo-mathjax-plugin/
    seqs
        3
    seqs  
       2015-12-01 18:39:30 +08:00   ❤️ 2
    说下我的方案吧, mathjax 公式外层增加识别串,例如:

    ^^^mathjax

    f(x) = \int_{-\infty}^\infty
    \hat f(\xi)\,e^{2 \pi i \xi x}
    \,d\xi

    ^^^

    marked 处理前先匹配出该串,将该串哈希 ID 替换原字符串,并存放到变量中, marked 解析完毕,再将哈希 ID 替换回原内容并做解析。

    可以参考这里: https://github.com/seqs/tractor/blob/master/app/helpers/markdown.js#L81
    我这里用的 KaTeX
    chengzhoukun
        4
    chengzhoukun  
       2015-12-01 19:39:59 +08:00
    IPython notebook 处理挺好的,不知原理
    dtysky
        5
    dtysky  
       2015-12-01 19:42:57 +08:00 via Android
    我都是直接写 html 然后引用 js 解析。。
    phoenixlzx
        6
    phoenixlzx  
    OP
       2015-12-01 19:49:59 +08:00
    @seqs 赞,这样用 regex 就方便识别了。

    等搞完论文开题报告就去试试看...
    dqh3000
        7
    dqh3000  
       2015-12-01 20:00:54 +08:00
    @seqs

    我也是这么做的

    ```

    converted = converted.replace(/\$\$((?!\$\$)[^\0]){0,1024}\$\$|\$((?!\$)[^\0\r\n]){0,128}\$/g, function (match) {
    var possibleMath = match;
    while (possibleMath[0] == "$") possibleMath = possibleMath.substr(1);
    while (possibleMath[possibleMath.length - 1] == "$") possibleMath = possibleMath.substr(0, possibleMath.length - 1);
    var math = null;
    try {
    math = katex.renderToString(possibleMath);
    } catch (e) {}
    if (math) {
    mathArray.push(math);
    return "[MATH-" + (mathArray.length - 1).toString() + "]";
    }
    return match;
    });

    converted = marked(converted);

    };

    ```

    这种感觉的
    halmstad
        8
    halmstad  
       2015-12-01 20:47:31 +08:00
    凤凰君, mathjax-node 对中文支持有问题
    phoenixlzx
        9
    phoenixlzx  
    OP
       2015-12-01 20:54:20 +08:00
    .... 公式里会有中文嘛?
    phoenixlzx
        10
    phoenixlzx  
    OP
       2015-12-12 21:50:07 +08:00
    于是这问题暂时算是解决了,放在变量里略麻烦,直接替换掉了。

    http://phoenixlzx.github.io/MinoriWiki/page/Test-Page/
    Andnot
        11
    Andnot  
       2016-06-15 11:26:40 +08:00
    @sengxian 我也发现了, Farbox 这么处理的原因是什么呢?
    貌似其他支持 Mathjax 的网站都可以用“\(”和“\[”数学环境。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 02:09 · PVG 10:09 · LAX 18:09 · JFK 21:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.