File indexing completed on 2023-10-01 07:35:55

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2009 Alexander Rieder <alexanderrieder@gmail.com>
0004     SPDX-FileCopyrightText: 2010 Oleksiy Protas <elfy.ua@gmail.com>
0005 */
0006 
0007 #include "rhighlighter.h"
0008 #include "rkeywords.h"
0009 #include "rsession.h"
0010 #include "rvariablemodel.h"
0011 
0012 #include <QTextEdit>
0013 #include <QDebug>
0014 
0015 const QStringList RHighlighter::operators_list=QStringList()
0016    << QLatin1String("(\\+|\\-|\\*{1,2}|/|&lt;=?|&gt;=?|={1,2}|\\!=?|\\|{1,2}|&amp;{1,2}|:{1,3}|\\^|@|\\$|~)")
0017    << QLatin1String("%[^%]*%"); // Taken in r.xml syntax file from KSyntaxHighlighter
0018 
0019 const QStringList RHighlighter::specials_list=QStringList()
0020     << QLatin1String("BUG") << QLatin1String("TODO") << QLatin1String("FIXME") << QLatin1String("NB") << QLatin1String("WARNING") << QLatin1String("ERROR");
0021 
0022 RHighlighter::RHighlighter(QObject* parent, RSession* session) : Cantor::DefaultHighlighter(parent, session)
0023 {
0024     Cantor::DefaultVariableModel* model = session->variableModel();
0025     if (model)
0026     {
0027         RVariableModel* RModel = static_cast<RVariableModel*>(model);
0028         connect(RModel, &RVariableModel::constantsAdded, this, &RHighlighter::addVariables);
0029         connect(RModel, &RVariableModel::constantsRemoved, this, &RHighlighter::removeRules);
0030     }
0031 
0032     addKeywords(RKeywords::instance()->keywords());
0033 
0034     foreach (const QString& s, operators_list)
0035         addRule(QRegularExpression(s), operatorFormat());
0036     foreach (const QString& s, specials_list)
0037         addRule(QRegularExpression(QLatin1String("\\b")+s+QLatin1String("\\b")), commentFormat());
0038 
0039     addRule(QRegularExpression(QStringLiteral("\"[^\"]*\"")), stringFormat());
0040     addRule(QRegularExpression(QStringLiteral("'[^']*'")), stringFormat());
0041 
0042     addRule(QRegularExpression(QStringLiteral("#[^\n]*")), commentFormat());
0043 }
0044 
0045 QStringList RHighlighter::parseBlockTextToWords(const QString& originalText)
0046 {
0047     QString text = originalText;
0048 
0049     static const QString replacer1 = QLatin1String("___CANTOR_R_REPLACER_1___");
0050     static const QString replacer2 = QLatin1String("___CANTOR_R_REPLACER_2___");
0051 
0052     text.replace(QLatin1String("-"), replacer1);
0053     text.replace(QLatin1String("."), replacer2);
0054 
0055     QStringList words = text.split(QRegularExpression(QStringLiteral("\\b")), QString::SkipEmptyParts);
0056 
0057     for (int i = 0; i < words.size(); i++)
0058     {
0059         words[i].replace(replacer1, QLatin1String("-"));
0060         words[i].replace(replacer2, QLatin1String("."));
0061     }
0062 
0063     return words;
0064 }