【摘 要】遵循W3C互聯(lián)網(wǎng)數(shù)學(xué)信息交換標(biāo)準(zhǔn)的開(kāi)源腳本ASCIIMathML.js與MathPlayer插件共同實(shí)現(xiàn)了網(wǎng)頁(yè)公式從表義(Content)到呈現(xiàn)(Presentation)的轉(zhuǎn)換。分析ASCIIMathML.js的數(shù)據(jù)結(jié)構(gòu)、框架結(jié)構(gòu)及其運(yùn)行機(jī)制,對(duì)于網(wǎng)頁(yè)公式的處理以及軟件的二次開(kāi)發(fā)應(yīng)用,具有一定的參考價(jià)值。
【關(guān)鍵詞】網(wǎng)頁(yè)公式;ASCIIMathML;MathML;MathPlayer
中圖分類號(hào): TP391 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 2095-2457(2018)28-0071-002
DOI:10.19694/j.cnki.issn2095-2457.2018.28.031
【Abstract】The open source script ASCIIMathML.js, which follows the W3C Internet Mathematical Information Exchange Standard, together with the MathPlayer plug-in, implements the conversion of Web formulas from Content to Presentation. The analysis on the data structure, the frame structure and the operation mechanism of ASCIIMathML.js has certain value for the processing of Web formula and for the secondary development and application of software.
【Key words】Web formula; ASCIIMathML; MathML; MathPlayer
0 導(dǎo)言
開(kāi)源ASCIIMathML.js[1]腳本,兼容LaTex語(yǔ)法,與Design Science公司的網(wǎng)頁(yè)公式插件MathPlayer[2]合璧,實(shí)現(xiàn)了網(wǎng)頁(yè)公式從表義(Content)到呈現(xiàn)(Presentation)的轉(zhuǎn)換。文[3]對(duì)ASCIIMathML的語(yǔ)義符號(hào)、解析形式進(jìn)行了探討,本文旨在分析ASCIIMathML的結(jié)構(gòu)及其運(yùn)行機(jī)制,嘗試在此基礎(chǔ)上的初步應(yīng)用。
1 ASCIIMathML的數(shù)據(jù)結(jié)構(gòu)分析
ASCIIMathML的基本數(shù)據(jù)單元(以ASCIIMathML.js2.10為例),是一種結(jié)構(gòu)體,以input字段為keyword,形成有序線性表。語(yǔ)法如表1:
例1:{input:"->",tag:"mo",output:"\u2192",tex:"rightarrow",ttype:CONST},
此例中,表義字符串“->” 形象代表unicode字符\u2192(即→),對(duì)應(yīng)的LaTeX表義字符為“rightarrow”。該表義串被動(dòng)態(tài)創(chuàng)建為mo對(duì)象,結(jié)構(gòu)類型為CONST。
例2:{input:"\\cos",tag:"mi",output:"cos",ttype:UNARY,func:true},
此例中,func:true表示此乃數(shù)學(xué)函數(shù),被處理為正體顯示。
例3:{input:"\\frac",tag:"mfrac",output:"/",ttype:BINARY},
此例中,tag:mfrac為分式結(jié)構(gòu),以BINARY對(duì)應(yīng)的結(jié)構(gòu)方式構(gòu)建此對(duì)象。
2 ASCIIMathML程序框架分析
在ASCIIMathML.js腳本中,包含ASCIIMathML、 LaTeXMathML和ASCIIsvg三部分。其中ASCIIMathML為基本處理(已棄用),LaTeXMathM是對(duì)LaTeX作兼容性擴(kuò)展后形成,ASCIIsvg實(shí)現(xiàn)網(wǎng)頁(yè)圖形功能。下面簡(jiǎn)析網(wǎng)頁(yè)公式主體LaTeXMathM的框架和運(yùn)行機(jī)制。
2.1 LaTeXMathML的基本程序極其功能
LaTeXMathML框架由若干功能程序和輔助程序的構(gòu)成,其主要作用是解析公式表義字符串,創(chuàng)建對(duì)應(yīng)的math對(duì)象,然后由MathPlayer插件將這些math對(duì)象顯示在頁(yè)面上。
值得一提的是LMgetSymbol函數(shù),它按input字段索引并返回表義字符在ASCIIMathML數(shù)據(jù)單元表中對(duì)應(yīng)的數(shù)據(jù)單元對(duì)象。
2.2 LaTeXMathML運(yùn)行機(jī)制示意圖
LaTeXMathML以HTML文檔最頂層的body對(duì)象為入口,遞歸遍歷document對(duì)象的所有DOM結(jié)點(diǎn)。由結(jié)點(diǎn)的nodeValue屬性獲取文本串,再判斷、解析表義串,創(chuàng)建math對(duì)象。
其中,遍歷由主控函數(shù)processNodeR以遞歸方式完成,解析公式文本串并創(chuàng)建math對(duì)象體系則由LMparseExpr,LMparseIexpr,LMparseSexpr等函數(shù)完成。
3 ASCIIMathML結(jié)構(gòu)應(yīng)用示例
以下是ASCIIMathML.js結(jié)構(gòu)與運(yùn)行程序框架結(jié)構(gòu)的基礎(chǔ)上,一些應(yīng)用示例。
3.1 補(bǔ)充特殊的字符
ASCIIMathML提供了∴(unicode為2234)的簡(jiǎn)捷輸入(冒號(hào)+點(diǎn)號(hào))?,F(xiàn)補(bǔ)充∵(unicode為2235)的簡(jiǎn)捷輸入(點(diǎn)號(hào)+冒號(hào)),可按照表1語(yǔ)法,在AMsymbols[]內(nèi)添加數(shù)據(jù)單元對(duì)象:
{input:".:", tag:"mo", output:"\u2235", tex:"because", ttype:CONST},
3.2 增添顏色處理
很多時(shí)候需要渲染公式中的部分內(nèi)容的顏色,達(dá)到強(qiáng)調(diào)、引人注目之效果。以增添紅色為例,可在AMsymbols[]內(nèi)添加數(shù)據(jù)單元對(duì)象:
{input:"mcRed",tag:"mstyle",atname:"color",atval:"red",tex:null,ttype:UNARY},
仿此增加特定顏色,可滿足大多數(shù)個(gè)性化顏色需求。若需制訂一普適性的顏色方案,比如IE預(yù)定義顏色表,則可在LMgetSymbol函數(shù)中優(yōu)先識(shí)別,在該函數(shù)開(kāi)頭增加代碼:
s=/^mc[A-Z][a-z]+/.exec(st);//st為函數(shù)的傳入?yún)?shù),為結(jié)點(diǎn)的公式串
if(s)return{input:s,tag:"mstyle",atname:"color",atval:s.slice(2),ttype:UNARY}
此處,規(guī)定顏色語(yǔ)法為:mc+顏色單詞(首字母大寫(xiě)),比如mcRed,mcGreen等。
3.3 簡(jiǎn)捷輸入矩陣、方程組、行列式等
矩陣、方程組、行列式等是常見(jiàn)的公式類,ASCIIMathML.js的表義語(yǔ)法參見(jiàn)文[3]。顯然,這類表義語(yǔ)法的輸入極為不便??啥x如下的簡(jiǎn)便、實(shí)用的表義語(yǔ)法:
這需要在獲取DOM對(duì)象的nodeValue時(shí),攔截公式字符串的處理,將表3的語(yǔ)法首先轉(zhuǎn)換為ASCIIMathML.js默認(rèn)語(yǔ)法。為此,在processNodeR函數(shù)中增加如下處理代碼:
st= st.replace(/[\[\{\(\|]({.+?})[\|\)\}\]]/g,
function (s,t){var b=s.slice(0,1),e=s.slice(-1),p=b=="{" ? "l":"c";
return "\\left"+ (b=="{" ? "\\{":b)+ "\\begin{array}{"+ p + "}"+
t.replace(/&/g,"\\\\").replace(/;/g,"}&{")+
"\\end{array}\\right"+ (e=="}" ? ".":e);});
實(shí)際應(yīng)用中,還應(yīng)作功能性的完善。比如,定界符尤其是{}的嵌套問(wèn)題,矩陣(行列式、方程組)語(yǔ)法串識(shí)別性問(wèn)題等。
4 結(jié)語(yǔ)
分析ASCIIMathML.js的數(shù)據(jù)結(jié)構(gòu)、運(yùn)行框架結(jié)構(gòu),在此基礎(chǔ)上實(shí)現(xiàn)各種特定目標(biāo),可避免重復(fù)開(kāi)發(fā),節(jié)約時(shí)間成本、開(kāi)發(fā)成本,借他山之石,達(dá)實(shí)用之功。
【參考文獻(xiàn)】
[1]http://www.dessci.com/en/products/mathplayer/.
[2]http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js.
[3]杜寧.ASCIIMathML網(wǎng)頁(yè)公式解析結(jié)果分析[J].科技資訊2015(25):2-3.