

【摘 要】遵循W3C互聯網數學信息交換標準的開源腳本ASCIIMathML.js與MathPlayer插件共同實現了網頁公式從表義(Content)到呈現(Presentation)的轉換。分析ASCIIMathML.js的數據結構、框架結構及其運行機制,對于網頁公式的處理以及軟件的二次開發應用,具有一定的參考價值。
【關鍵詞】網頁公式;ASCIIMathML;MathML;MathPlayer
中圖分類號: TP391 文獻標識碼: A 文章編號: 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 導言
開源ASCIIMathML.js[1]腳本,兼容LaTex語法,與Design Science公司的網頁公式插件MathPlayer[2]合璧,實現了網頁公式從表義(Content)到呈現(Presentation)的轉換。文[3]對ASCIIMathML的語義符號、解析形式進行了探討,本文旨在分析ASCIIMathML的結構及其運行機制,嘗試在此基礎上的初步應用。
1 ASCIIMathML的數據結構分析
ASCIIMathML的基本數據單元(以ASCIIMathML.js2.10為例),是一種結構體,以input字段為keyword,形成有序線性表。語法如表1:
例1:{input:"->",tag:"mo",output:"\u2192",tex:"rightarrow",ttype:CONST},
此例中,表義字符串“->” 形象代表unicode字符\u2192(即→),對應的LaTeX表義字符為“rightarrow”。該表義串被動態創建為mo對象,結構類型為CONST。
例2:{input:"\\cos",tag:"mi",output:"cos",ttype:UNARY,func:true},
此例中,func:true表示此乃數學函數,被處理為正體顯示。
例3:{input:"\\frac",tag:"mfrac",output:"/",ttype:BINARY},
此例中,tag:mfrac為分式結構,以BINARY對應的結構方式構建此對象。
2 ASCIIMathML程序框架分析
在ASCIIMathML.js腳本中,包含ASCIIMathML、 LaTeXMathML和ASCIIsvg三部分。其中ASCIIMathML為基本處理(已棄用),LaTeXMathM是對LaTeX作兼容性擴展后形成,ASCIIsvg實現網頁圖形功能。下面簡析網頁公式主體LaTeXMathM的框架和運行機制。
2.1 LaTeXMathML的基本程序極其功能
LaTeXMathML框架由若干功能程序和輔助程序的構成,其主要作用是解析公式表義字符串,創建對應的math對象,然后由MathPlayer插件將這些math對象顯示在頁面上。
值得一提的是LMgetSymbol函數,它按input字段索引并返回表義字符在ASCIIMathML數據單元表中對應的數據單元對象。
2.2 LaTeXMathML運行機制示意圖
LaTeXMathML以HTML文檔最頂層的body對象為入口,遞歸遍歷document對象的所有DOM結點。由結點的nodeValue屬性獲取文本串,再判斷、解析表義串,創建math對象。
其中,遍歷由主控函數processNodeR以遞歸方式完成,解析公式文本串并創建math對象體系則由LMparseExpr,LMparseIexpr,LMparseSexpr等函數完成。
3 ASCIIMathML結構應用示例
以下是ASCIIMathML.js結構與運行程序框架結構的基礎上,一些應用示例。
3.1 補充特殊的字符
ASCIIMathML提供了∴(unicode為2234)的簡捷輸入(冒號+點號)。現補充∵(unicode為2235)的簡捷輸入(點號+冒號),可按照表1語法,在AMsymbols[]內添加數據單元對象:
{input:".:", tag:"mo", output:"\u2235", tex:"because", ttype:CONST},
3.2 增添顏色處理
很多時候需要渲染公式中的部分內容的顏色,達到強調、引人注目之效果。以增添紅色為例,可在AMsymbols[]內添加數據單元對象:
{input:"mcRed",tag:"mstyle",atname:"color",atval:"red",tex:null,ttype:UNARY},
仿此增加特定顏色,可滿足大多數個性化顏色需求。若需制訂一普適性的顏色方案,比如IE預定義顏色表,則可在LMgetSymbol函數中優先識別,在該函數開頭增加代碼:
s=/^mc[A-Z][a-z]+/.exec(st);//st為函數的傳入參數,為結點的公式串
if(s)return{input:s,tag:"mstyle",atname:"color",atval:s.slice(2),ttype:UNARY}
此處,規定顏色語法為:mc+顏色單詞(首字母大寫),比如mcRed,mcGreen等。
3.3 簡捷輸入矩陣、方程組、行列式等
矩陣、方程組、行列式等是常見的公式類,ASCIIMathML.js的表義語法參見文[3]。顯然,這類表義語法的輸入極為不便。可定義如下的簡便、實用的表義語法:
這需要在獲取DOM對象的nodeValue時,攔截公式字符串的處理,將表3的語法首先轉換為ASCIIMathML.js默認語法。為此,在processNodeR函數中增加如下處理代碼:
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);});
實際應用中,還應作功能性的完善。比如,定界符尤其是{}的嵌套問題,矩陣(行列式、方程組)語法串識別性問題等。
4 結語
分析ASCIIMathML.js的數據結構、運行框架結構,在此基礎上實現各種特定目標,可避免重復開發,節約時間成本、開發成本,借他山之石,達實用之功。
【參考文獻】
[1]http://www.dessci.com/en/products/mathplayer/.
[2]http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js.
[3]杜寧.ASCIIMathML網頁公式解析結果分析[J].科技資訊2015(25):2-3.