APP下载

ASCIIMathML结构分析与应用

2018-01-16杜宁

科技视界 2018年28期

【摘 要】遵循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.