diff --git a/tools/lammps-gui/highlighter.cpp b/tools/lammps-gui/highlighter.cpp index bd88c60a86..d31c8dfc91 100644 --- a/tools/lammps-gui/highlighter.cpp +++ b/tools/lammps-gui/highlighter.cpp @@ -17,54 +17,179 @@ Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent) { HighlightingRule rule; - keywordFormat.setForeground(Qt::darkBlue); - keywordFormat.setFontWeight(QFont::Bold); - const QString keywordPatterns[] = { - QStringLiteral("\\bchar\\b"), QStringLiteral("\\bclass\\b"), - QStringLiteral("\\bconst\\b"), QStringLiteral("\\bdouble\\b"), - QStringLiteral("\\benum\\b"), QStringLiteral("\\bexplicit\\b"), - QStringLiteral("\\bfriend\\b"), QStringLiteral("\\binline\\b"), - QStringLiteral("\\bint\\b"), QStringLiteral("\\blong\\b"), - QStringLiteral("\\bnamespace\\b"), QStringLiteral("\\boperator\\b"), - QStringLiteral("\\bprivate\\b"), QStringLiteral("\\bprotected\\b"), - QStringLiteral("\\bpublic\\b"), QStringLiteral("\\bshort\\b"), - QStringLiteral("\\bsignals\\b"), QStringLiteral("\\bsigned\\b"), - QStringLiteral("\\bslots\\b"), QStringLiteral("\\bstatic\\b"), - QStringLiteral("\\bstruct\\b"), QStringLiteral("\\btemplate\\b"), - QStringLiteral("\\btypedef\\b"), QStringLiteral("\\btypename\\b"), - QStringLiteral("\\bunion\\b"), QStringLiteral("\\bunsigned\\b"), - QStringLiteral("\\bvirtual\\b"), QStringLiteral("\\bvoid\\b"), - QStringLiteral("\\bvolatile\\b"), QStringLiteral("\\bbool\\b")}; - for (const QString &pattern : keywordPatterns) { + outputFormat.setForeground(Qt::darkYellow); + readFormat.setForeground(Qt::magenta); + latticeFormat.setForeground(Qt::darkGreen); + particleFormat.setForeground(Qt::darkRed); + setupFormat.setForeground(Qt::darkCyan); + runFormat.setForeground(Qt::green); + runFormat.setFontWeight(QFont::Bold); + defineFormat.setForeground(Qt::darkMagenta); + defineFormat.setFontWeight(QFont::Bold); + + numberFormat.setForeground(Qt::blue); + commentFormat.setForeground(Qt::red); + stringFormat.setForeground(Qt::cyan); + stringFormat.setFontWeight(QFont::Normal); + + const QString output_keywords[] = { + QStringLiteral("^\\s*log\\W"), QStringLiteral("^\\s*write_data\\W"), + QStringLiteral("^\\s*write_dump\\W"), QStringLiteral("^\\s*write_coeff\\W"), + QStringLiteral("^\\s*info\\W"), QStringLiteral("^\\s*shell\\W"), + QStringLiteral("^\\s*write_restart\\W"), QStringLiteral("^\\s*restart\\W"), + QStringLiteral("^\\s*dump\\W"), QStringLiteral("^\\s*undump\\W"), + QStringLiteral("^\\s*thermo\\W"), QStringLiteral("^\\s*thermo_modify\\W"), + QStringLiteral("^\\s*thermo_style\\W"), QStringLiteral("^\\s*print\\W"), + QStringLiteral("^\\s*timer\\W")}; + for (const QString &pattern : output_keywords) { rule.pattern = QRegularExpression(pattern); - rule.format = keywordFormat; + rule.format = outputFormat; highlightingRules.append(rule); } - classFormat.setFontWeight(QFont::Bold); - classFormat.setForeground(Qt::darkMagenta); - rule.pattern = QRegularExpression(QStringLiteral("\\bQ[A-Za-z]+\\b")); - rule.format = classFormat; + + const QString read_keywords[] = { + QStringLiteral("^\\s*include\\W"), QStringLiteral("^\\s*read_restart\\W"), + QStringLiteral("^\\s*read_data\\W"), QStringLiteral("^\\s*read_dump\\W"), + QStringLiteral("^\\s*molecule\\W")}; + for (const QString &pattern : read_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = readFormat; + highlightingRules.append(rule); + } + + const QString lattice_keywords[] = { + QStringLiteral("^\\s*boundary\\W"), QStringLiteral("^\\s*units\\W"), + QStringLiteral("^\\s*atom_style\\W"), QStringLiteral("^\\s*lattice\\W"), + QStringLiteral("^\\s*region\\W"), QStringLiteral("^\\s*create_box\\W"), + QStringLiteral("^\\s*create_atoms\\W"), QStringLiteral("^\\s*dielectric\\W"), + QStringLiteral("^\\s*delete_atoms\\W"), QStringLiteral("^\\s*displace_atoms\\W"), + QStringLiteral("^\\s*change_box\\W"), QStringLiteral("^\\s*dimension\\W"), + QStringLiteral("^\\s*replicate\\W")}; + for (const QString &pattern : lattice_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = latticeFormat; + highlightingRules.append(rule); + } + + const QString particle_keywords[] = { + QStringLiteral("^\\s*pair_coeff\\W"), QStringLiteral("^\\s*pair_style\\W"), + QStringLiteral("^\\s*pair_modify\\W"), QStringLiteral("^\\s*pair_write\\W"), + QStringLiteral("^\\s*mass\\W"), QStringLiteral("^\\s*velocity\\W"), + QStringLiteral("^\\s*angle_coeff\\W"), QStringLiteral("^\\s*angle_style\\W"), + QStringLiteral("^\\s*angle_write\\W"), QStringLiteral("^\\s*atom_modify\\W"), + QStringLiteral("^\\s*atom_style\\W"), QStringLiteral("^\\s*bond_coeff\\W"), + QStringLiteral("^\\s*bond_style\\W"), QStringLiteral("^\\s*bond_write\\W"), + QStringLiteral("^\\s*create_bonds\\W"), QStringLiteral("^\\s*delete_bonds\\W"), + QStringLiteral("^\\s*kspace_style\\W"), QStringLiteral("^\\s*kspace_modify\\W"), + QStringLiteral("^\\s*dihedral_style\\W"), QStringLiteral("^\\s*dihedral_coeff\\W"), + QStringLiteral("^\\s*dihedral_write\\W"), QStringLiteral("^\\s*improper_style\\W"), + QStringLiteral("^\\s*improper_coeff\\W"), QStringLiteral("^\\s*labelmap\\W")}; + for (const QString &pattern : particle_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = particleFormat; + highlightingRules.append(rule); + } + + const QString setup_keywords[] = {QStringLiteral("^\\s*min_style\\W"), + QStringLiteral("^\\s*min_modify\\W"), + QStringLiteral("^\\s*fix_modify\\W"), + QStringLiteral("^\\s*run_style\\W"), + QStringLiteral("^\\s*timestep\\W"), + QStringLiteral("^\\s*neighbor\\W"), + QStringLiteral("^\\s*neigh_modify\\W"), + QStringLiteral("^\\s*fix\\W"), + QStringLiteral("^\\s*unfix\\W"), + QStringLiteral("^\\s*suffix\\W"), + QStringLiteral("^\\s*special_bonds\\W"), + QStringLiteral("^\\s*balance\\W"), + QStringLiteral("^\\s*box\\W"), + QStringLiteral("^\\s*clear\\W"), + QStringLiteral("^\\s*comm_modify\\W"), + QStringLiteral("^\\s*comm_style\\W"), + QStringLiteral("^\\s*newton\\W"), + QStringLiteral("^\\s*package\\W"), + QStringLiteral("^\\s*processors\\W"), + QStringLiteral("^\\s*reset_atoms\\W"), + QStringLiteral("^\\s*dump_modify\\W"), + QStringLiteral("^\\s*reset_ids\\W"), + QStringLiteral("^\\s*reset_timestep\\W"), + QStringLiteral("^\\s*label\\W"), + QStringLiteral("^\\s*jump\\W"), + QStringLiteral("^\\s*next\\W"), + QStringLiteral("^\\s*loop\\W") + + }; + for (const QString &pattern : setup_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = setupFormat; + highlightingRules.append(rule); + } + + const QString run_keywords[] = {QStringLiteral("^\\s*minimize\\W"), + QStringLiteral("^\\s*minimize/kk\\W"), + QStringLiteral("^\\s*run\\W"), + QStringLiteral("^\\s*rerun\\W"), + QStringLiteral("^\\s*tad\\W"), + QStringLiteral("^\\s*neb\\W"), + QStringLiteral("^\\s*neb/spin\\W"), + QStringLiteral("^\\s*prd\\W"), + QStringLiteral("^\\s*quit\\W"), + QStringLiteral("^\\s*server\\W"), + QStringLiteral("^\\s*temper/npt\\W"), + QStringLiteral("^\\s*temper/grem\\W"), + QStringLiteral("^\\s*temper\\W"), + QStringLiteral("^\\s*message\\W"), + QStringLiteral("^\\s*hyper\\W"), + QStringLiteral("^\\s*dynamical_matrix\\W"), + QStringLiteral("^\\s*dynamical_matrix/kk\\W"), + QStringLiteral("^\\s*third_order\\W"), + QStringLiteral("^\\s*third_order/kk\\W"), + QStringLiteral("^\\s*fitpod\\W"), + QStringLiteral("^\\s*if\\W"), + QStringLiteral("^\\s*then\\W"), + QStringLiteral("^\\s*elif\\W"), + QStringLiteral("^\\s*else\\W")}; + for (const QString &pattern : run_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = runFormat; + highlightingRules.append(rule); + } + + const QString define_keywords[] = { + QStringLiteral("^\\s*variable\\W"), QStringLiteral("^\\s*group\\W"), + QStringLiteral("^\\s*compute\\W"), QStringLiteral("^\\s*python\\W"), + QStringLiteral("^\\s*set\\W"), QStringLiteral("^\\s*uncompute\\W"), + QStringLiteral("^\\s*kim_query\\W"), QStringLiteral("^\\s*kim\\W"), + QStringLiteral("^\\s*group2ndx\\W"), QStringLiteral("^\\s*ndx2group\\W"), + QStringLiteral("^\\s*INF\\W"), QStringLiteral("^\\s*EDGE\\W"), + QStringLiteral("^\\s*NULL\\W"), QStringLiteral("^\\s*&\\W"), + QStringLiteral("^\\s*mdi\\W")}; + for (const QString &pattern : define_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = defineFormat; + highlightingRules.append(rule); + } + + const QString number_keywords[] = { + QStringLiteral("(^|\\s+)[0-9]+"), // integer + QStringLiteral("(^|\\s+)[0-9]+\\.[0-9]*[edED]?[-+]?[0-9]*"), // floating point 1 + QStringLiteral("(^|\\s+)[0-9]*\\.[0-9]+[edED]?[-+]?[0-9]*"), // floating point 2 + }; + for (const QString &pattern : number_keywords) { + rule.pattern = QRegularExpression(pattern); + rule.format = numberFormat; + highlightingRules.append(rule); + } + + // comments, must come before strings but after other keywords. + rule.pattern = QRegularExpression("#.*"); + rule.format = commentFormat; highlightingRules.append(rule); - quotationFormat.setForeground(Qt::darkGreen); - rule.pattern = QRegularExpression(QStringLiteral("\".*\"")); - rule.format = quotationFormat; + // strings, must come last so it overwrites other formatting + rule.pattern = QRegularExpression("(\".*\"|'.*')"); + rule.format = stringFormat; highlightingRules.append(rule); - - functionFormat.setFontItalic(true); - functionFormat.setForeground(Qt::blue); - rule.pattern = QRegularExpression(QStringLiteral("\\b[A-Za-z0-9_]+(?=\\()")); - rule.format = functionFormat; - highlightingRules.append(rule); - singleLineCommentFormat.setForeground(Qt::red); - rule.pattern = QRegularExpression(QStringLiteral("//[^\n]*")); - rule.format = singleLineCommentFormat; - highlightingRules.append(rule); - - multiLineCommentFormat.setForeground(Qt::red); - - commentStartExpression = QRegularExpression(QStringLiteral("/\\*")); - commentEndExpression = QRegularExpression(QStringLiteral("\\*/")); } void Highlighter::highlightBlock(const QString &text) @@ -76,22 +201,6 @@ void Highlighter::highlightBlock(const QString &text) setFormat(match.capturedStart(), match.capturedLength(), rule.format); } } - setCurrentBlockState(0); - int startIndex = 0; - if (previousBlockState() != 1) startIndex = text.indexOf(commentStartExpression); - while (startIndex >= 0) { - QRegularExpressionMatch match = commentEndExpression.match(text, startIndex); - int endIndex = match.capturedStart(); - int commentLength = 0; - if (endIndex == -1) { - setCurrentBlockState(1); - commentLength = text.length() - startIndex; - } else { - commentLength = endIndex - startIndex + match.capturedLength(); - } - setFormat(startIndex, commentLength, multiLineCommentFormat); - startIndex = text.indexOf(commentStartExpression, startIndex + commentLength); - } } // Local Variables: // c-basic-offset: 4 diff --git a/tools/lammps-gui/highlighter.h b/tools/lammps-gui/highlighter.h index d3dc60bb5b..234333924e 100644 --- a/tools/lammps-gui/highlighter.h +++ b/tools/lammps-gui/highlighter.h @@ -14,12 +14,11 @@ #ifndef HIGHLIGHTER_H #define HIGHLIGHTER_H -#include #include +#include #include -class Highlighter : public QSyntaxHighlighter -{ +class Highlighter : public QSyntaxHighlighter { Q_OBJECT public: @@ -29,22 +28,23 @@ protected: void highlightBlock(const QString &text) override; private: - struct HighlightingRule - { + struct HighlightingRule { QRegularExpression pattern; QTextCharFormat format; }; QVector highlightingRules; - QRegularExpression commentStartExpression; - QRegularExpression commentEndExpression; + QTextCharFormat outputFormat; + QTextCharFormat readFormat; + QTextCharFormat latticeFormat; + QTextCharFormat particleFormat; + QTextCharFormat setupFormat; + QTextCharFormat runFormat; + QTextCharFormat defineFormat; - QTextCharFormat keywordFormat; - QTextCharFormat classFormat; - QTextCharFormat singleLineCommentFormat; - QTextCharFormat multiLineCommentFormat; - QTextCharFormat quotationFormat; - QTextCharFormat functionFormat; + QTextCharFormat numberFormat; + QTextCharFormat stringFormat; + QTextCharFormat commentFormat; }; #endif // Local Variables: