Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
JSHighlighter Class Reference

#include <jsedit.h>

Inheritance diagram for JSHighlighter:
Collaboration diagram for JSHighlighter:

Classes

struct  HighlightingRule
 

Public Member Functions

 JSHighlighter (QTextDocument *parent=0)
 
void setColor (JSEdit::ColorComponent component, const QColor &color)
 
void mark (const QString &str, Qt::CaseSensitivity caseSensitivity)
 
QStringList keywords () const
 
void setKeywords (const QStringList &keywords)
 
void SetRule (QString kind, QString pattern, QTextCharFormat format)
 
 JSHighlighter (QTextDocument *parent=0)
 

Public Attributes

QVector< HighlightingRule > highlightingRules
 

Protected Member Functions

void highlightBlock (const QString &text)
 

Private Attributes

QSet< QString > m_keywords
 
QSet< QString > m_knownIds
 
QHash< JSEdit::ColorComponent, QColor > m_colors
 
QString m_markString
 
Qt::CaseSensitivity m_markCaseSensitivity
 

Detailed Description

Definition at line 121 of file jsedit.h.

Constructor & Destructor Documentation

◆ JSHighlighter() [1/2]

JSHighlighter::JSHighlighter ( QTextDocument *  parent = 0)

Definition at line 33 of file jsedit.cpp.

34  : QSyntaxHighlighter(parent)
35  , m_markCaseSensitivity(Qt::CaseInsensitive)
36 {
37  // default color scheme
38  m_colors[JSEdit::Normal] = QColor("#000000");
39  m_colors[JSEdit::Comment] = QColor("#808080");
40  m_colors[JSEdit::Number] = QColor("#008000");
41  m_colors[JSEdit::String] = QColor("#800000");
42  m_colors[JSEdit::Operator] = QColor("#808000");
43  m_colors[JSEdit::Identifier] = QColor("#000020");
44  m_colors[JSEdit::Keyword] = QColor("#000080");
45  m_colors[JSEdit::BuiltIn] = QColor("#008080");
46  m_colors[JSEdit::Marker] = QColor("#ffff00");
47 
48  // https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words
49  m_keywords << "break";
50  m_keywords << "case";
51  m_keywords << "catch";
52  m_keywords << "continue";
53  m_keywords << "default";
54  m_keywords << "delete";
55  m_keywords << "do";
56  m_keywords << "else";
57  m_keywords << "finally";
58  m_keywords << "for";
59  m_keywords << "function";
60  m_keywords << "if";
61  m_keywords << "in";
62  m_keywords << "instanceof";
63  m_keywords << "new";
64  m_keywords << "return";
65  m_keywords << "switch";
66  m_keywords << "this";
67  m_keywords << "throw";
68  m_keywords << "try";
69  m_keywords << "typeof";
70  m_keywords << "var";
71  m_keywords << "void";
72  m_keywords << "while";
73  m_keywords << "with";
74 
75  m_keywords << "true";
76  m_keywords << "false";
77  m_keywords << "null";
78 
79  // built-in and other popular objects + properties
80  m_knownIds << "Object";
81  m_knownIds << "prototype";
82  m_knownIds << "create";
83  m_knownIds << "defineProperty";
84  m_knownIds << "defineProperties";
85  m_knownIds << "getOwnPropertyDescriptor";
86  m_knownIds << "keys";
87  m_knownIds << "getOwnPropertyNames";
88  m_knownIds << "constructor";
89  m_knownIds << "__parent__";
90  m_knownIds << "__proto__";
91  m_knownIds << "__defineGetter__";
92  m_knownIds << "__defineSetter__";
93  m_knownIds << "eval";
94  m_knownIds << "hasOwnProperty";
95  m_knownIds << "isPrototypeOf";
96  m_knownIds << "__lookupGetter__";
97  m_knownIds << "__lookupSetter__";
98  m_knownIds << "__noSuchMethod__";
99  m_knownIds << "propertyIsEnumerable";
100  m_knownIds << "toSource";
101  m_knownIds << "toLocaleString";
102  m_knownIds << "toString";
103  m_knownIds << "unwatch";
104  m_knownIds << "valueOf";
105  m_knownIds << "watch";
106 
107  m_knownIds << "Function";
108  m_knownIds << "arguments";
109  m_knownIds << "arity";
110  m_knownIds << "caller";
111  m_knownIds << "constructor";
112  m_knownIds << "length";
113  m_knownIds << "name";
114  m_knownIds << "apply";
115  m_knownIds << "bind";
116  m_knownIds << "call";
117 
118  m_knownIds << "String";
119  m_knownIds << "fromCharCode";
120  m_knownIds << "length";
121  m_knownIds << "charAt";
122  m_knownIds << "charCodeAt";
123  m_knownIds << "concat";
124  m_knownIds << "indexOf";
125  m_knownIds << "lastIndexOf";
126  m_knownIds << "localCompare";
127  m_knownIds << "match";
128  m_knownIds << "quote";
129  m_knownIds << "replace";
130  m_knownIds << "search";
131  m_knownIds << "slice";
132  m_knownIds << "split";
133  m_knownIds << "substr";
134  m_knownIds << "substring";
135  m_knownIds << "toLocaleLowerCase";
136  m_knownIds << "toLocaleUpperCase";
137  m_knownIds << "toLowerCase";
138  m_knownIds << "toUpperCase";
139  m_knownIds << "trim";
140  m_knownIds << "trimLeft";
141  m_knownIds << "trimRight";
142 
143  m_knownIds << "Array";
144  m_knownIds << "isArray";
145  m_knownIds << "index";
146  m_knownIds << "input";
147  m_knownIds << "pop";
148  m_knownIds << "push";
149  m_knownIds << "reverse";
150  m_knownIds << "shift";
151  m_knownIds << "sort";
152  m_knownIds << "splice";
153  m_knownIds << "unshift";
154  m_knownIds << "concat";
155  m_knownIds << "join";
156  m_knownIds << "filter";
157  m_knownIds << "forEach";
158  m_knownIds << "every";
159  m_knownIds << "map";
160  m_knownIds << "some";
161  m_knownIds << "reduce";
162  m_knownIds << "reduceRight";
163 
164  m_knownIds << "RegExp";
165  m_knownIds << "global";
166  m_knownIds << "ignoreCase";
167  m_knownIds << "lastIndex";
168  m_knownIds << "multiline";
169  m_knownIds << "source";
170  m_knownIds << "exec";
171  m_knownIds << "test";
172 
173  m_knownIds << "JSON";
174  m_knownIds << "parse";
175  m_knownIds << "stringify";
176 
177  m_knownIds << "decodeURI";
178  m_knownIds << "decodeURIComponent";
179  m_knownIds << "encodeURI";
180  m_knownIds << "encodeURIComponent";
181  m_knownIds << "eval";
182  m_knownIds << "isFinite";
183  m_knownIds << "isNaN";
184  m_knownIds << "parseFloat";
185  m_knownIds << "parseInt";
186  m_knownIds << "Infinity";
187  m_knownIds << "NaN";
188  m_knownIds << "undefined";
189 
190  m_knownIds << "Math";
191  m_knownIds << "E";
192  m_knownIds << "LN2";
193  m_knownIds << "LN10";
194  m_knownIds << "LOG2E";
195  m_knownIds << "LOG10E";
196  m_knownIds << "PI";
197  m_knownIds << "SQRT1_2";
198  m_knownIds << "SQRT2";
199  m_knownIds << "abs";
200  m_knownIds << "acos";
201  m_knownIds << "asin";
202  m_knownIds << "atan";
203  m_knownIds << "atan2";
204  m_knownIds << "ceil";
205  m_knownIds << "cos";
206  m_knownIds << "exp";
207  m_knownIds << "floor";
208  m_knownIds << "log";
209  m_knownIds << "max";
210  m_knownIds << "min";
211  m_knownIds << "pow";
212  m_knownIds << "random";
213  m_knownIds << "round";
214  m_knownIds << "sin";
215  m_knownIds << "sqrt";
216  m_knownIds << "tan";
217 
218  m_knownIds << "document";
219  m_knownIds << "window";
220  m_knownIds << "navigator";
221  m_knownIds << "userAgent";
222 }

References JSEdit::BuiltIn, JSEdit::Comment, JSEdit::Identifier, JSEdit::Keyword, m_colors, m_keywords, m_knownIds, JSEdit::Marker, JSEdit::Normal, JSEdit::Number, JSEdit::Operator, and JSEdit::String.

◆ JSHighlighter() [2/2]

JSHighlighter::JSHighlighter ( QTextDocument *  parent = 0)
inline

Definition at line 34 of file JSHighlighter.h.

34  : QSyntaxHighlighter(parent)
35  {
36  QTextCharFormat keywordFormat;
37  keywordFormat.setForeground(Qt::black);
38  keywordFormat.setFontWeight(QFont::Bold);
39  QStringList keywordPatterns;
40  keywordPatterns << "\\bvar\\b" << "\\bArray\\b" << "\\bfunction\\b"
41  << "\\breturn\\b" << "\\barguments\\b" << "\\bif\\b"
42  << "\\belse\\b" << "\\bfor\\b" << "\\bswitch\\b"
43  << "\\bcase\\b" << "\\bbreak\\b" << "\\bwhile\\b";
44  int i = 0;
45  foreach (const QString &pattern, keywordPatterns) {
46  SetRule(QString("00_KeyWord_%1").arg(i),pattern,keywordFormat);
47  ++i;
48  }
49  // Values
50  QTextCharFormat valueFormat, classFormat;
51  valueFormat.setForeground(Qt::blue);
52  SetRule("03_Values","\\btrue\\b|\\bfalse\\b|\\b[0-9]+\\b",valueFormat);
53  QTextCharFormat functionFormat;
54  //functionFormat.setFontItalic(false);
55  functionFormat.setForeground(Qt::darkBlue);
56  SetRule("04_Functions","\\b[A-Za-z0-9_]+(?=\\()",functionFormat);
57  // Qt Classes
58  classFormat.setFontWeight(QFont::Bold);
59  classFormat.setForeground(Qt::darkMagenta);
60  SetRule("06_QtClasses","\\bQ[A-Z]+[A-Za-z]+\\b",classFormat);
61  // Quotation
62  QTextCharFormat quotationFormat;
63  quotationFormat.setForeground(Qt::blue);
64  SetRule("z1_Quotations","\"[^\"]*\"",quotationFormat);
65  // Single Line Comments
66  QTextCharFormat singleLineCommentFormat;
67  singleLineCommentFormat.setForeground(Qt::darkGreen);
68  SetRule("z2_SingleLineComments","//[^\n]*",singleLineCommentFormat);
69  }

References SetRule().

Here is the call graph for this function:

Member Function Documentation

◆ highlightBlock()

void JSHighlighter::highlightBlock ( const QString &  text)
protected

Definition at line 230 of file jsedit.cpp.

231 {
232  // parsing state
233  enum {
234  Start = 0,
235  Number = 1,
236  Identifier = 2,
237  String = 3,
238  Comment = 4,
239  Regex = 5
240  };
241 
242  QList<int> bracketPositions;
243 
244  int blockState = previousBlockState();
245  int bracketLevel = blockState >> 4;
246  int state = blockState & 15;
247  if (blockState < 0) {
248  bracketLevel = 0;
249  state = Start;
250  }
251 
252  int start = 0;
253  int i = 0;
254  while (i <= text.length()) {
255  QChar ch = (i < text.length()) ? text.at(i) : QChar();
256  QChar next = (i < text.length() - 1) ? text.at(i + 1) : QChar();
257 
258  switch (state) {
259 
260  case Start:
261  start = i;
262  if (ch.isSpace()) {
263  ++i;
264  } else if (ch.isDigit()) {
265  ++i;
266  state = Number;
267  } else if (ch.isLetter() || ch == '_') {
268  ++i;
269  state = Identifier;
270  } else if (ch == '\'' || ch == '\"') {
271  ++i;
272  state = String;
273  } else if (ch == '/' && next == '*') {
274  ++i;
275  ++i;
276  state = Comment;
277  } else if (ch == '/' && next == '/') {
278  i = text.length();
279  setFormat(start, text.length(), m_colors[JSEdit::Comment]);
280  } else if (ch == '/' && next != '*') {
281  ++i;
282  state = Regex;
283  } else {
284  if (!QString("(){}[]").contains(ch))
285  setFormat(start, 1, m_colors[JSEdit::Operator]);
286  if (ch =='{' || ch == '}') {
287  bracketPositions += i;
288  if (ch == '{')
289  bracketLevel++;
290  else
291  bracketLevel--;
292  }
293  ++i;
294  state = Start;
295  }
296  break;
297 
298  case Number:
299  if (ch.isSpace() || !ch.isDigit()) {
300  setFormat(start, i - start, m_colors[JSEdit::Number]);
301  state = Start;
302  } else {
303  ++i;
304  }
305  break;
306 
307  case Identifier:
308  if (ch.isSpace() || !(ch.isDigit() || ch.isLetter() || ch == '_')) {
309  QString token = text.mid(start, i - start).trimmed();
310  if (m_keywords.contains(token))
311  setFormat(start, i - start, m_colors[JSEdit::Keyword]);
312  else if (m_knownIds.contains(token))
313  setFormat(start, i - start, m_colors[JSEdit::BuiltIn]);
314  state = Start;
315  } else {
316  ++i;
317  }
318  break;
319 
320  case String:
321  if (ch == text.at(start)) {
322  QChar prev = (i > 0) ? text.at(i - 1) : QChar();
323  if (prev != '\\') {
324  ++i;
325  setFormat(start, i - start, m_colors[JSEdit::String]);
326  state = Start;
327  } else {
328  ++i;
329  }
330  } else {
331  ++i;
332  }
333  break;
334 
335  case Comment:
336  if (ch == '*' && next == '/') {
337  ++i;
338  ++i;
339  setFormat(start, i - start, m_colors[JSEdit::Comment]);
340  state = Start;
341  } else {
342  ++i;
343  }
344  break;
345 
346  case Regex:
347  if (ch == '/') {
348  QChar prev = (i > 0) ? text.at(i - 1) : QChar();
349  if (prev != '\\') {
350  ++i;
351  setFormat(start, i - start, m_colors[JSEdit::String]);
352  state = Start;
353  } else {
354  ++i;
355  }
356  } else {
357  ++i;
358  }
359  break;
360 
361  default:
362  state = Start;
363  break;
364  }
365  }
366 
367  if (state == Comment)
368  setFormat(start, text.length(), m_colors[JSEdit::Comment]);
369  else
370  state = Start;
371 
372  if (!m_markString.isEmpty()) {
373  int pos = 0;
374  int len = m_markString.length();
375  QTextCharFormat markerFormat;
376  markerFormat.setBackground(m_colors[JSEdit::Marker]);
377  markerFormat.setForeground(m_colors[JSEdit::Normal]);
378  for (;;) {
379  pos = text.indexOf(m_markString, pos, m_markCaseSensitivity);
380  if (pos < 0)
381  break;
382  setFormat(pos, len, markerFormat);
383  ++pos;
384  }
385  }
386 
387  if (!bracketPositions.isEmpty()) {
388  JSBlockData *blockData = reinterpret_cast<JSBlockData*>(currentBlock().userData());
389  if (!blockData) {
390  blockData = new JSBlockData;
391  currentBlock().setUserData(blockData);
392  }
393  blockData->bracketPositions = bracketPositions;
394  }
395 
396  blockState = (state & 15) | (bracketLevel << 4);
397  setCurrentBlockState(blockState);
398 }

References JSBlockData::bracketPositions, JSEdit::BuiltIn, JSEdit::Comment, JSEdit::Keyword, m_colors, m_keywords, m_knownIds, m_markCaseSensitivity, m_markString, JSEdit::Marker, JSEdit::Normal, JSEdit::Number, JSEdit::Operator, and JSEdit::String.

◆ keywords()

QStringList JSHighlighter::keywords ( ) const

Definition at line 407 of file jsedit.cpp.

408 {
409  return m_keywords.toList();
410 }

References m_keywords.

Referenced by setKeywords().

Here is the caller graph for this function:

◆ mark()

void JSHighlighter::mark ( const QString &  str,
Qt::CaseSensitivity  caseSensitivity 
)

Definition at line 400 of file jsedit.cpp.

401 {
402  m_markString = str;
403  m_markCaseSensitivity = caseSensitivity;
404  rehighlight();
405 }

References m_markCaseSensitivity, and m_markString.

◆ setColor()

void JSHighlighter::setColor ( JSEdit::ColorComponent  component,
const QColor &  color 
)

Definition at line 224 of file jsedit.cpp.

225 {
226  m_colors[component] = color;
227  rehighlight();
228 }

References m_colors.

◆ setKeywords()

void JSHighlighter::setKeywords ( const QStringList &  keywords)

Definition at line 412 of file jsedit.cpp.

413 {
414  m_keywords = QSet<QString>::fromList(keywords);
415  rehighlight();
416 }

References keywords(), and m_keywords.

Here is the call graph for this function:

◆ SetRule()

void JSHighlighter::SetRule ( QString  kind,
QString  pattern,
QTextCharFormat  format 
)
inline

Definition at line 26 of file JSHighlighter.h.

27  {
28  HighlightingRule rule;
29  rule.pattern = QRegExp(pattern);
30  rule.format = format;
31  highlightingRules.append(rule);
32  }

References JSHighlighter::HighlightingRule::format, highlightingRules, and JSHighlighter::HighlightingRule::pattern.

Referenced by JSHighlighter().

Here is the caller graph for this function:

Member Data Documentation

◆ highlightingRules

QVector<HighlightingRule> JSHighlighter::highlightingRules

Definition at line 24 of file JSHighlighter.h.

Referenced by SetRule().

◆ m_colors

QHash<JSEdit::ColorComponent, QColor> JSHighlighter::m_colors
private

Definition at line 137 of file jsedit.h.

Referenced by highlightBlock(), JSHighlighter(), and setColor().

◆ m_keywords

QSet<QString> JSHighlighter::m_keywords
private

Definition at line 135 of file jsedit.h.

Referenced by highlightBlock(), JSHighlighter(), keywords(), and setKeywords().

◆ m_knownIds

QSet<QString> JSHighlighter::m_knownIds
private

Definition at line 136 of file jsedit.h.

Referenced by highlightBlock(), and JSHighlighter().

◆ m_markCaseSensitivity

Qt::CaseSensitivity JSHighlighter::m_markCaseSensitivity
private

Definition at line 139 of file jsedit.h.

Referenced by highlightBlock(), and mark().

◆ m_markString

QString JSHighlighter::m_markString
private

Definition at line 138 of file jsedit.h.

Referenced by highlightBlock(), and mark().


The documentation for this class was generated from the following files:
JSHighlighter::m_markString
QString m_markString
Definition: jsedit.h:138
JSEdit::String
@ String
Definition: jsedit.h:65
JSBlockData
Definition: jsedit.h:42
JSEdit::BuiltIn
@ BuiltIn
Definition: jsedit.h:69
JSHighlighter::m_markCaseSensitivity
Qt::CaseSensitivity m_markCaseSensitivity
Definition: jsedit.h:139
JSHighlighter::keywords
QStringList keywords() const
Definition: jsedit.cpp:407
JSEdit::Operator
@ Operator
Definition: jsedit.h:66
JSEdit::Number
@ Number
Definition: jsedit.h:64
JSHighlighter::SetRule
void SetRule(QString kind, QString pattern, QTextCharFormat format)
Definition: JSHighlighter.h:26
JSEdit::Marker
@ Marker
Definition: jsedit.h:73
JSHighlighter::m_knownIds
QSet< QString > m_knownIds
Definition: jsedit.h:136
JSHighlighter::m_keywords
QSet< QString > m_keywords
Definition: jsedit.h:135
JSEdit::Identifier
@ Identifier
Definition: jsedit.h:67
JSHighlighter::highlightingRules
QVector< HighlightingRule > highlightingRules
Definition: JSHighlighter.h:24
JSHighlighter::m_colors
QHash< JSEdit::ColorComponent, QColor > m_colors
Definition: jsedit.h:137
JSEdit::Keyword
@ Keyword
Definition: jsedit.h:68
JSEdit::Normal
@ Normal
Definition: jsedit.h:62
JSBlockData::bracketPositions
QList< int > bracketPositions
Definition: jsedit.h:45
JSEdit::Comment
@ Comment
Definition: jsedit.h:63