From b0cefc0f3b758a73ec7e30677f9f603400d9dc22 Mon Sep 17 00:00:00 2001 From: don bright Date: Tue, 8 Jan 2013 21:15:14 -0600 Subject: merge, by hand, Christopher Olah's syntax highlighter code diff --git a/src/highlighter.cc b/src/highlighter.cc index ca4b4cf..6e51ecc 100644 --- a/src/highlighter.cc +++ b/src/highlighter.cc @@ -24,16 +24,103 @@ * */ +// Syntax Highlight code by Chris Olah + #include "highlighter.h" #include "parsersettings.h" // extern int parser_error_pos; -Highlighter::Highlighter(QTextDocument *parent) +Highlighter::Highlighter(QTextDocument *parent, mode_e mode) : QSyntaxHighlighter(parent) { + this->mode = mode; + operators << "!" << "&&" << "||" << "+" << "-" << "*" << "/" << "%" << "!" << "#" << ";"; + KeyWords << "for" << "intersection_for" << "if" << "assign" + << "module" << "function" + << "$children" << "child" << "$fn" << "$fa" << "$fb" // Lump special variables in here + << "union" << "intersection" << "difference" << "render"; //Lump CSG in here + Primitives3D << "cube" << "cylinder" << "sphere" << "polyhedron"; + Primitives2D << "square" << "polygon" << "circle"; + Transforms << "scale" << "translate" << "rotate" << "multmatrix" << "color" + << "linear_extrude" << "rotate_extrude"; // Lump extrudes in here. + Imports << "include" << "use" << "import_stl"; + + //this->OperatorStyle.setForeground + KeyWordStyle.setForeground(Qt::darkGreen); + TransformStyle.setForeground(Qt::darkGreen); + PrimitiveStyle3D.setForeground(Qt::darkBlue); + PrimitiveStyle2D.setForeground(Qt::blue); + ImportStyle.setForeground(Qt::darkYellow); + QuoteStyle.setForeground(Qt::darkMagenta); + CommentStyle.setForeground(Qt::darkCyan); + ErrorStyle.setForeground(Qt::red); } void Highlighter::highlightBlock(const QString &text) { + if ( mode == NORMAL_MODE) { + state_e state = (state_e) previousBlockState(); + //Key words and Primitives + QStringList::iterator it; + + for (it = KeyWords.begin(); it != KeyWords.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),KeyWordStyle); + } + } + for (it = Primitives3D.begin(); it != Primitives3D.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),PrimitiveStyle3D); + } + } + for (it = Primitives2D.begin(); it != Primitives2D.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),PrimitiveStyle2D); + } + } + for (it = Transforms.begin(); it != Transforms.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),TransformStyle); + } + } + for (it = Imports.begin(); it != Imports.end(); ++it){ + for (int i = 0; i < text.count(*it); ++i){ + setFormat(text.indexOf(*it),it->size(),ImportStyle); + } + } + + // Quoting and Comments. + for (int n = 0; n < text.size(); ++n){ + if (state == NORMAL){ + if (text[n] == '"'){ + state = QUOTE; + setFormat(n,1,QuoteStyle); + } else if (text[n] == '/'){ + if (text[n+1] == '/'){ + setFormat(n,text.size(),CommentStyle); + break; + } else if (text[n+1] == '*'){ + setFormat(n++,2,CommentStyle); + state = COMMENT; + } + } + } else if (state == QUOTE){ + setFormat(n,1,QuoteStyle); + if (text[n] == '"' && text[n-1] != '\\') + state = NORMAL; + } else if (state == COMMENT){ + setFormat(n,1,CommentStyle); + if (text[n] == '*' && text[n+1] == '/'){ + setFormat(++n,1,CommentStyle); + state = NORMAL; + } + } + } + + } // not ErrorMode (syntax highlighting) + + + // Errors + else if (mode == ERROR_MODE) { int n = previousBlockState(); if (n < 0) n = 0; @@ -49,5 +136,6 @@ void Highlighter::highlightBlock(const QString &text) setFormat(parser_error_pos - n, 1, style); #endif } + } // if errormode } diff --git a/src/highlighter.h b/src/highlighter.h index 2eead6d..a6e2dc3 100644 --- a/src/highlighter.h +++ b/src/highlighter.h @@ -6,7 +6,26 @@ class Highlighter : public QSyntaxHighlighter { public: - Highlighter(QTextDocument *parent); + enum state_e {NORMAL=-1,QUOTE,COMMENT}; + enum mode_e {NORMAL_MODE, ERROR_MODE}; + mode_e mode; + + QStringList operators; + QStringList KeyWords; + QStringList Primitives3D; + QStringList Primitives2D; + QStringList Transforms; + QStringList Imports; + QTextCharFormat ErrorStyle; + QTextCharFormat OperatorStyle; + QTextCharFormat CommentStyle; + QTextCharFormat QuoteStyle; + QTextCharFormat KeyWordStyle; + QTextCharFormat PrimitiveStyle3D; + QTextCharFormat PrimitiveStyle2D; + QTextCharFormat TransformStyle; + QTextCharFormat ImportStyle; + Highlighter(QTextDocument *parent, mode_e mode); void highlightBlock(const QString &text); }; diff --git a/src/mainwin.cc b/src/mainwin.cc index 72254a3..af4a532 100644 --- a/src/mainwin.cc +++ b/src/mainwin.cc @@ -180,7 +180,7 @@ MainWindow::MainWindow(const QString &filename) fps = 0; fsteps = 1; - highlighter = NULL; + highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE); editor->setTabStopWidth(30); editor->setLineWrapping(true); // Not designable @@ -1036,18 +1036,22 @@ bool MainWindow::compileTopLevelDocument(bool reload) QFileInfo(this->fileName).absolutePath().toLocal8Bit(), false); - // Error highlighting - delete this->highlighter; - this->highlighter = NULL; + // Syntax & Error highlighting if (!this->root_module) { - this->highlighter = new Highlighter(editor->document()); + if (highlighter->mode==Highlighter::NORMAL_MODE) { + delete this->highlighter; + highlighter = new Highlighter(editor->document(), Highlighter::ERROR_MODE); + } if (!animate_panel->isVisible()) { QTextCursor cursor = editor->textCursor(); cursor.setPosition(parser_error_pos); editor->setTextCursor(cursor); } + } else if (highlighter->mode==Highlighter::ERROR_MODE) { + delete this->highlighter; + this->highlighter = new Highlighter(editor->document(), Highlighter::NORMAL_MODE); } } -- cgit v0.10.1