summaryrefslogtreecommitdiff
path: root/src/highlighter.cc
diff options
context:
space:
mode:
authordon bright <hugh.m.bright@gmail.com>2013-01-13 02:07:15 (GMT)
committerdon bright <hugh.m.bright@gmail.com>2013-01-13 02:07:15 (GMT)
commitd61593979199c1c025df07a5a1db879cce165529 (patch)
treed5cdc81471c77e44401fa7f4216740f702f03fd7 /src/highlighter.cc
parent59910af66ae166f2afd9925cbef9c026fe47f6ae (diff)
balance colors, fix bug in numbers, highlight more stuff
Diffstat (limited to 'src/highlighter.cc')
-rw-r--r--src/highlighter.cc66
1 files changed, 43 insertions, 23 deletions
diff --git a/src/highlighter.cc b/src/highlighter.cc
index 2d75b67..58912f3 100644
--- a/src/highlighter.cc
+++ b/src/highlighter.cc
@@ -40,7 +40,7 @@
on large files as well, as they re-highlight everything after each compile.
The vast majority of OpenSCAD files, however, are not 50,000 lines and
- most machines ship with Qt > 4.5
+ most machines have Qt > 4.5
See Also:
@@ -112,11 +112,18 @@
9. action: open any file, and hold down 'f5' key to repeatedly reparse
expected result: no crashing!
+10. action: for i in examples/ex* ; do ./openscad $i ; done
+ expected result: make sure the colors look harmonious
+
+11. action: type random string of [][][][]()()[][90,3904,00,000]
+ expected result: all should be highlighted correctly
+
*/
#include "highlighter.h"
#include <QTextDocument>
#include <QTextCursor>
+#include <QColor>
//#include <iostream>
Highlighter::Highlighter(QTextDocument *parent)
@@ -125,34 +132,41 @@ Highlighter::Highlighter(QTextDocument *parent)
tokentypes["operator"] << "=" << "!" << "&&" << "||" << "+" << "-" << "*" << "/" << "%" << "!" << "#" << ";";
typeformats["operator"].setForeground(Qt::blue);
- tokentypes["keyword"] << "for" << "intersection_for" << "if" << "assign" << "module" << "function";
- typeformats["keyword"].setForeground(Qt::darkGreen);
+ tokentypes["keyword"] << "module" << "function" << "for" << "intersection_for" << "if" << "assign";
+ typeformats["keyword"].setForeground(QColor("Green"));
+ typeformats["keyword"].setToolTip("Keyword");
+
+ tokentypes["transform"] << "scale" << "translate" << "rotate" << "multmatrix" << "color" << "projection" << "hull";
+ typeformats["transform"].setForeground(QColor("Indigo"));
+
+ tokentypes["csgop"] << "union" << "intersection" << "difference" << "render";
+ typeformats["csgop"].setForeground(QColor("DarkGreen"));
tokentypes["prim3d"] << "cube" << "cylinder" << "sphere" << "polyhedron";
- typeformats["prim3d"].setForeground(Qt::darkBlue);
+ typeformats["prim3d"].setForeground(QColor("DarkBlue"));
tokentypes["prim2d"] << "square" << "polygon" << "circle";
- typeformats["prim2d"].setForeground(Qt::blue);
-
- tokentypes["transform"] << "scale" << "translate" << "rotate" << "multmatrix" << "color" << "projection";
- typeformats["transform"].setForeground(Qt::darkGreen);
+ typeformats["prim2d"].setForeground(QColor("MidnightBlue"));
- tokentypes["import"] << "include" << "use" << "import_stl";
+ tokentypes["import"] << "include" << "use" << "import_stl" << "import" << "import_dxf" << "dxf_dim" << "dxf_cross";
typeformats["import"].setForeground(Qt::darkYellow);
tokentypes["special"] << "$children" << "child" << "$fn" << "$fa" << "$fb";
typeformats["special"].setForeground(Qt::darkGreen);
- tokentypes["csgop"] << "union" << "intersection" << "difference" << "render";
- typeformats["csgop"].setForeground(Qt::darkGreen);
-
tokentypes["extrude"] << "linear_extrude" << "rotate_extrude";
typeformats["extrude"].setForeground(Qt::darkGreen);
- tokentypes["bracket"] << "[" << "]";
- typeformats["bracket"].setForeground(Qt::darkGreen);
+ tokentypes["bracket"] << "[" << "]" << "(" << ")";
+ typeformats["bracket"].setForeground(QColor("Green"));
+
+ tokentypes["curlies"] << "{" << "}";
+ typeformats["curlies"].setForeground(QColor(32,32,20));
- // Put all tokens into single QHash, mapped to their format
+ tokentypes["bool"] << "true" << "false";
+ typeformats["bool"].setForeground(QColor("DarkRed"));
+
+ // Put each tokens into single QHash, mapped to it's format
QList<QString>::iterator ki;
QList<QString> toktypes = tokentypes.keys();
for ( ki=toktypes.begin(); ki!=toktypes.end(); ++ki ) {
@@ -161,14 +175,14 @@ Highlighter::Highlighter(QTextDocument *parent)
for ( it = tokentypes[toktype].begin(); it < tokentypes[toktype].end(); ++it) {
QString token = *it;
//std::cout << token.toStdString() << "\n";
- formatMap[ token ] = typeformats [ toktype ];
+ tokenFormats[ token ] = typeformats [ toktype ];
}
}
quoteFormat.setForeground(Qt::darkMagenta);
commentFormat.setForeground(Qt::darkCyan);
errorFormat.setBackground(Qt::red);
- formatMap["number"].setForeground(Qt::red);
+ numberFormat.setForeground(QColor("DarkRed"));
errorState = false;
errorPos = -1;
@@ -243,22 +257,28 @@ void Highlighter::highlightBlock(const QString &text)
QStringList splitHelpers;
QStringList::iterator sh, token;
// splitHelpers - so "[a+b]" is treated as "[ a + b ]" and formatted
- splitHelpers << tokentypes["operator"] << "(" << ")" << "[" << "]" << ",";
+ splitHelpers << tokentypes["operator"] << "(" << ")" << "[" << "]" << "," << ":";
for ( sh = splitHelpers.begin(); sh!=splitHelpers.end(); ++sh ) {
newtext = newtext.replace( *sh, " " + *sh + " ");
}
- //std::cout << "newtext: " << newtext.toStdString() << "\n";
+ //std::cout << "\nnewtext: " << newtext.toStdString() << "\n";
QStringList tokens = newtext.split(QRegExp("\\s"));
int tokindex = 0; // tokindex helps w duplicate tokens in a single block
bool numtest;
for ( token = tokens.begin(); token!=tokens.end(); ++token ){
- tokindex = text.indexOf( *token, tokindex );
- if ( formatMap.contains( *token ) ) {
- setFormat( tokindex, token->size(), formatMap[ *token ]);
+ if ( tokenFormats.contains( *token ) ) {
+ tokindex = text.indexOf( *token, tokindex );
+ setFormat( tokindex, token->size(), tokenFormats[ *token ]);
//std::cout << "found tok '" << (*token).toStdString() << "' at " << tokindex << "\n";
+ tokindex += token->size();
} else {
(*token).toDouble( &numtest );
- if ( numtest ) setFormat( tokindex, token->size(), formatMap["number"] );
+ if ( numtest ) {
+ tokindex = text.indexOf( *token, tokindex );
+ setFormat( tokindex, token->size(), numberFormat );
+ //std::cout << "found num '" << (*token).toStdString() << "' at " << tokindex << "\n";
+ tokindex += token->size();
+ }
}
}
contact: Jan Huwald // Impressum