ikeq/hexo-filter-mathjax-ssr

代码块内的数学公式被解释为数学公式

Opened this issue · 5 comments

代码块内的数学公式被错误地解释为数学公式
版本: hexo-filter-mathjax-ssr@0.1.1

markdown:

```
$$
\alpha = 1
$$
```

`$\alpha=1$`

显示结果:

image

ikeq commented

因为代码块里匹配到了 blockMath,不太好处理,只能通过标记区分开,代码块里不要使用 blockMath 的符号。另外如果只是为了演示数学公式,并不需要带上块级符号啊。

我是这样配的:

mathjax:
  inlineQuote: '@'
  blockQuote: ['```tex', '```']

演示就用别的符号,或者不带符号,因为 ```tex 本身就与代码块冲突(甩锅)。

我遇到的主要问题是

markdown:

......放置在`$GOPATH/pkg/$GOOS_$GOARCH`中(以Mac为例就是`$GOPATH/pkg/darwin_amd64`)。

结果 "$GOPATH/pkg/$" 被解释成了数学公式

ikeq commented

这是预期行为,因为就是直接字符串匹配的,所以最好避开这些特殊符号,特别是 inlineMath...
我看大家通常喜欢用 \(\)?

ikeq commented

如果能有一份数学公式中用到的所有类型的符号的统计,那匹配还可以更好,但似乎不好找。

我设计了一个正则表达式可以处理这个问题:
用于测试的markdown字符串:

This is an inline math: $\frac{1}{2}$, 
 A math block: 
 $$ 
 \frac{1}{2} \\
\text{a dollor symbol inside math block:} $ 
 $$ 
 Math block inside inline code: `hello world $\frac{1}{2}$`. 
 Math block inside code block: 
 ``` 
 $$ 
 \frac{1}{2} 
 $$ 
 ``` 

正则表达式替换的代码:

var reg = /(`([^\\\``\n]|(\\.))+([^\\\``\n]*(\\.)?)*`)|((```)([^\\\``]|(\\.)|(`[^\\\``])|(``[^\\\``]))+([^\\\``]*((\\.)|(`[^\\\``])|(``[^\\\``]))?)*(```))|(\$([^\\\$\n]|(\\.))+([^\\\$\n]*(\\.)?)*\$)|(\$\$([^\\\$]|(\\.)|(\$[^\\\$]))+([^\\\$]*((\\.)|(\$[^\\\$]))?)*\$\$)/g;

// str 就是上文的markdown测试数据
str.replace(reg, function(word){
    if (/^`[^`][^]*/.test(word)) {
        return "<inline-code>";  // 识别出这是个行内代码块,解释数学公式时不需要改动,因此只要return word;就可以了。
    } else if (/^```[^]*/.test(word)) {
        return "<code block>";  // 识别出这是个代码块。
    } else if (/^\$[^\$][^]*/.test(word)) {
        return "<inline-math>";  // 行内数学公式。
    } else {
        return "<math-block>";  // 数学公式块。
    }
});

结果:

This is an inline math: <inline-math>, 
 A math block: 
 <math-block> 
 Math block inside inline code: <inline-code>. 
 Math block inside code block: 
 <code block> 

希望您可以加到这个插件中,我对js并不熟,还是不pull request了。