拆分字符串并在mathml标记中包装子字符串

时间:2012-01-17 15:20:20

标签: javascript arrays split mathml

我有一个字符串,我试图拆分然后用MathML标签包装。目标是为方程式提供MathML(可能是MathJax)渲染输出。我遇到的问题是将MathML标记与不同的子字符串相匹配。

例如:

str = x + 2;
newStr = str.split(''); //returns [x,+,2]

我可以像这样遍历数组:

for (i = 0;i < newStr.length; i++) {
  write('<mn>' + newStr[i] + '</mn>')

但这仅适用于单个MathML标记。如何将每个子字符串映射到标记,用该标记包装(最好用变量引用标记),然后关闭标记(使用多个时发挥作用)元素MathML,如<msup>)。

更新

例如,这就是我想要制作的内容:

输入:x + 2

输出:<mi>x</mi><mo>+</mo><mn>2</mn>

我整天都在和这个问题作斗争。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

MathJaxjqMath这样的库为您执行此操作,处理数字,变量,运算符,嵌套括号,指数,矩阵等.MathJax支持用于复杂格式的LaTeX语法,其中jqMath只实现了更简单的基于unicode的语法。例如,在jqMath中,您可以M.sToMathE('x + 2')创建MathML元素。 (你可以接受它的innerHTML我相信如果你真的想要它的字符串形式。)另见Jqmath - apply after page load。 (完全披露:我写了jqMath。)

答案 1 :(得分:0)

这是一个起点,展示了如何将这种转换转换为MathML。另请注意,它比javascript更加伪代码。

string str = x + 2
newStr = str.split('');

for (i = 0;i < newStr.length; i++)
{
    string value = Operator_AsMathML(newStr[i]);
    if(value == "")
    {
        if(isdigit(newStr[i][0])
            value = Number_AsMathML(newStr[i]);
        else
            value = Variable_AsMathML(newStr[i]);
    }   
    write(value);
}

string Number_AsMathML(string number)
{
    return "<mn>" + number + "</mn>";
}

string Variable_AsMathML(string varname)
{
    return "<mi>" + varname + "</mi>";
}

string Operator_AsMathML(string opname) const
{
    string front = "<mo>";

    switch(opname[0])
    {
        case '+':
            front += "+";
            break;

        case '-':
           front += "&#x2212;"; 
           break;

        case '*':
           front += "&times;";
           break;

        case '/':
           front += "/";
           break;

        case '±':
           front += "&#x00B1;";
           break;

        default:
           return "";
    }

    front += "</mo>";
    return front;
}