разбить строку и обернуть подстроки в теги mathml - PullRequest
1 голос
/ 17 января 2012

У меня есть строка, которую я пытаюсь разделить, а затем обернуть тегами 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 ]

1 голос
/ 17 января 2012

Такие библиотеки, как MathJax и jqMath делают это за вас, обрабатывая числа, переменные, операторы, вложенные скобки, экспоненты, матрицы и т. Д. MathJax поддерживает синтаксис LaTeX для сложного форматирования, гдеjqMath просто реализует более простой синтаксис на основе юникода.Например, в jqMath вы можете сделать M.sToMathE('x + 2'), чтобы создать элемент MathML.(Вы могли бы тогда взять его innerHTML, я полагаю, если вы действительно хотите его в виде строки.) См. Также Jqmath - применять после загрузки страницы .(Полное раскрытие: я написал JQMath.)

0 голосов
/ 26 января 2012

Вот отправная точка, показывающая, как вы можете сделать этот вид преобразования в 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;
}
...