File indexing completed on 2024-04-28 03:40:44

0001 /*************************************************************************************
0002  *  Copyright (C) 2008 by Aleix Pol <aleixpol@kde.org>                               *
0003  *                                                                                   *
0004  *  This program is free software; you can redistribute it and/or                    *
0005  *  modify it under the terms of the GNU General Public License                      *
0006  *  as published by the Free Software Foundation; either version 2                   *
0007  *  of the License, or (at your option) any later version.                           *
0008  *                                                                                   *
0009  *  This program is distributed in the hope that it will be useful,                  *
0010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of                   *
0011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                    *
0012  *  GNU General Public License for more details.                                     *
0013  *                                                                                   *
0014  *  You should have received a copy of the GNU General Public License                *
0015  *  along with this program; if not, write to the Free Software                      *
0016  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA   *
0017  *************************************************************************************/
0018 
0019 #include "mathmlpresentationlexer.h"
0020 #include "expressionparser.h"
0021 
0022 #include <QDebug>
0023 #include <QStringList>
0024 #include <QCoreApplication>
0025 
0026 MathMLPresentationLexer::MathMLPresentationLexer(const QString &source)
0027     : AbstractLexer(source), m_xml(source)
0028 {
0029     m_tokenTags[QStringLiteral("mfrac")]=TOKEN(ExpressionTable::tDiv, 0, QStringLiteral("divide"));
0030     m_tokenTags[QStringLiteral("msup")]=TOKEN(ExpressionTable::tPow, 0, QStringLiteral("power"));
0031     m_tokenTags[QStringLiteral("msqrt")]=TOKEN(ExpressionTable::tPow, 0, QStringLiteral("root"));
0032 }
0033 
0034 void MathMLPresentationLexer::getToken()
0035 {
0036     while(!m_xml.atEnd()) {
0037         QXmlStreamReader::TokenType t=m_xml.readNext(); 
0038         QString e=m_xml.name().toString();
0039         switch(t)
0040         {
0041             case QXmlStreamReader::Invalid:
0042                 m_err = m_xml.errorString();
0043                 break;
0044             case QXmlStreamReader::StartDocument:
0045                 break;
0046             case QXmlStreamReader::EndDocument:
0047                 break;
0048             case QXmlStreamReader::StartElement:
0049                 m_tags.push(e);
0050                 if(m_tokenTags.contains(e)) {
0051                     TOKEN t=m_tokenTags[e];
0052                     if(t.type>=0) {
0053                         m_tokens.append(TOKEN(ExpressionTable::tId, 0, t.val));
0054                     }
0055                     
0056                     m_tokens.append(TOKEN(ExpressionTable::tLpr, 0));
0057                 }
0058                 break;
0059             case QXmlStreamReader::EndElement:
0060                 if(m_tokenTags.contains(e)) {
0061                     if(m_tokens.last().type==ExpressionTable::tComa)
0062                         m_tokens.takeLast();
0063                     
0064                     if(e==QLatin1String("msqrt")) {
0065                         m_tokens.append(TOKEN(ExpressionTable::tComa, 0));
0066                         m_tokens.append(TOKEN(ExpressionTable::tVal, 0, QStringLiteral("<cn>2</cn>")));
0067                     }
0068                     m_tokens.append(TOKEN(ExpressionTable::tRpr, 0));
0069                 }
0070                 
0071                 m_tags.pop();
0072                 if(!m_tags.isEmpty() && m_tokenTags.contains(m_tags.top()) && e!=QLatin1String("mo")) {
0073                     m_tokens.append(TOKEN(ExpressionTable::tComa, 0));
0074                 }
0075                 break;
0076             default:
0077                 if(m_tags.top()==QLatin1String("mn")) {
0078                     TOKEN ret(ExpressionTable::tVal, 0, QStringLiteral("<cn>%1</cn>").arg(m_xml.text().toString()));
0079                     m_tokens.append(ret);
0080                 } else if(m_tags.top()==QLatin1String("mi")) {
0081                     TOKEN ret(ExpressionTable::tId, 0, m_xml.text().toString());
0082                     m_tokens.append(ret);
0083                 } else if(m_tags.top()==QLatin1String("mo")) {
0084                     if(!m_tokens.isEmpty() && m_tokens.last().type==ExpressionTable::tComa)
0085                         m_tokens.takeLast();
0086                     
0087                     int t;
0088                     QString op=m_xml.text().toString().trimmed();
0089                     if(op.length()==1 && m_operators.contains(op[0]))
0090                         t = m_operators[op[0]];
0091                     else if(op.length()==2 && m_longOperators.contains(op))
0092                         t = m_longOperators[op];
0093                     else {
0094                         m_err= QCoreApplication::translate("Error message", "Unknown token '%1'").arg(op);
0095                         break;
0096                     }
0097                     m_tokens.append(TOKEN(t, 0));
0098                 } else {
0099                     QString text = m_xml.text().toString().trimmed();
0100                     if(text==QLatin1String("if") || text==QLatin1String("otherwise")) {
0101                         m_tokens.append(TOKEN(ExpressionTable::tQm, 0, m_xml.text().toString()));
0102                     } else
0103                         qDebug() << "dunno" << text;
0104                 }
0105                 break;
0106         }
0107     }
0108     
0109 //     printQueue(m_tokens);
0110     
0111     if (m_xml.error())
0112         m_err = m_xml.errorString();
0113     
0114     m_tokens.append(TOKEN(ExpressionTable::EOF_SYMBOL, 0));
0115 }