前几天,一位大牛 (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。
我看了这篇文章很有启发;想问一下function generic这段要加在哪里?没有找到这个函数,还有想问一下,大大有没有研究,这个js查找匹配要修改的字符串的函数是哪个?
还有 我想删掉svg的部分 作用不是很大 毕竟支持的浏览器少 但是貌似删完以后整个js都不走了