修改 ASCIIMathML.js 适应 Discuz! 6.0

2

Comments

前几天,一位大牛 (Mathself) 提议给论坛安装上一个数学插件,并且告诉我参看奥数之家论坛。我经过研究发现,就是一个叫做 ASCIIMathML.js 的文件在起作用,这个文件将类 LaTeX 的公式转换为 MathML。Firefox 提供原声的 MathML 支持,而 IE8 以下的版本需要 MathPlayer 插件支持,Opera 自 9.5 起提供原生的 MathML 支持。

经过研究,首先发现,ASCIIMathML.js 默认不提供 Opera 的支持,对 ASCIIMathML.js先做了点小修改:

75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
function AMisMathMLavailable() {
  if (navigator.appName.slice(0,8)=="Netscape") 
    if (navigator.appVersion.slice(0,1)>="5") return null;
    else return AMnoMathMLNote();
  else if (window.opera)
    return null;
  else if (navigator.appName.slice(0,9)=="Microsoft")
    try {
        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
        return null;
    } catch (e) {
        return AMnoMathMLNote();
    }
  else return AMnoMathMLNote();
}

不过话说 Opera 对 MathML 的支持实在有限……感觉看起来很囧的说……

把这个弄到服务器以后,我就钻空子注册了一个带公式的用户名。结果 Doggy 瞬间出台规定禁止……我说还不如从代码上禁用……又经过一番研究,发觉只要改 ASCIIMathML.js 的代码就可以了,下面是研究成果:首先是修改 onLoad 直接调用的 generic:

903
904
905
906
function generic()
{
  translate(true);
};

那个 true 表示仅转换需要的地方。

然后是修改处理的地方:

861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
function AMprocessNode(n, linebreaks, spanclassAM) {
  var frag,st;
  if (spanclassAM!=null) {
    frag = document.getElementsByTagName("div")
    for (var i=0;i<frag.length;i++)
      if (frag[i].className == "t_msgfont")
        AMprocessNodeR(frag[i],linebreaks);
  } else {
    try {
      st = n.innerHTML;
    } catch(err) {}
    if (st==null || 
        st.indexOf(AMdelimiter1)!=-1 || st.indexOf(AMdelimiter2)!=-1) 
      AMprocessNodeR(n,linebreaks);
  }
  if (isIE) { //needed to match size and font of formula to surrounding text
    frag = document.getElementsByTagName('math');
    for (var i=0;i<frag.length;i++) frag[i].update()
  }
}

为什么这样改呢……因为在 Discuz! 里面帖子内容都是在 div 标签里……而且这些标签有一个共同特征,那就是有 t_msgfont 这个 class!于是这样改完,就可以仅仅在帖子内容中使用 MathML 了!

我是根据很早以前的 1.4.7 版本改的……虽然据说有很新的版本……2.x 什么的……不想管了……
如果不想自己改的话,直接从这里下载改好的文件:ASCIIMathML.js

2 Responses to “修改 ASCIIMathML.js 适应 Discuz! 6.0”

  1. chao Says:
    2011年3月30日 00:25 回复

    我看了这篇文章很有启发;想问一下function generic这段要加在哪里?没有找到这个函数,还有想问一下,大大有没有研究,这个js查找匹配要修改的字符串的函数是哪个?

  2. chao Says:
    2011年3月30日 10:53 回复

    还有 我想删掉svg的部分 作用不是很大 毕竟支持的浏览器少 但是貌似删完以后整个js都不走了

Leave a Reply