Krita Source Code Documentation
Loading...
Searching...
No Matches
highlighter.py
Go to the documentation of this file.
1"""
2highlightedtextedit.py
3
4A PyQt custom widget example for Qt Designer.
5
6SPDX-FileCopyrightText: 2006 David Boddie <david@boddie.org.uk>
7SPDX-FileCopyrightText: 2005-2006 Trolltech ASA. All rights reserved.
8
9SPDX-License-Identifier: GPL-2.0-or-later
10"""
11
12try:
13 from PyQt6 import QtCore, QtGui
14except:
15 from PyQt5 import QtCore, QtGui
16
17
18class PythonHighlighter(QtGui.QSyntaxHighlighter):
19
20 keywords = (
21 "and", "del", "for", "is", "raise",
22 "assert", "elif", "from", "lambda", "return",
23 "break", "else", "global", "not", "try",
24 "class", "except", "if", "or", "while",
25 "continue", "exec", "import", "pass", "yield",
26 "def", "finally", "in", "print"
27 )
28
29 def __init__(self, edit):
30 document = edit.document()
31 QtGui.QSyntaxHighlighter.__init__(self, document)
32
33 base_format = QtGui.QTextCharFormat()
34 base_format.setFont(edit.font())
35
36 self.base_format = base_format
37 self.document = document
38
39 self.updateHighlighter(base_format.font())
40
41 def highlightBlock(self, text):
42
43 self.setCurrentBlockState(0)
44
45 if text.trimmed().isEmpty():
46 self.setFormat(0, len(text), self.empty_format)
47 return
48
49 self.setFormat(0, len(text), self.base_format)
50
51 startIndex = 0
52 if self.previousBlockState() != 1:
53 startIndex = self.multiLineStringBegin.indexIn(text)
54
55 if startIndex > -1:
56 self.highlightRules(text, 0, startIndex)
57 else:
58 self.highlightRules(text, 0, len(text))
59
60 while startIndex >= 0:
61
62 endIndex = self.multiLineStringEnd.indexIn(text,
63 startIndex + len(self.multiLineStringBegin.pattern()))
64 if endIndex == -1:
65 self.setCurrentBlockState(1)
66 commentLength = text.length() - startIndex
67 else:
68 commentLength = endIndex - startIndex + \
69 self.multiLineStringEnd.matchedLength()
70 self.highlightRules(text, endIndex, len(text))
71
72 self.setFormat(startIndex, commentLength, self.multiLineStringFormat)
73 startIndex = self.multiLineStringBegin.indexIn(text,
74 startIndex + commentLength)
75
76 def highlightRules(self, text, start, finish):
77
78 for expression, format in self.rules:
79
80 index = expression.indexIn(text, start)
81 while index >= start and index < finish:
82 length = expression.matchedLength()
83 self.setFormat(index, min(length, finish - index), format)
84 index = expression.indexIn(text, index + length)
85
86 def updateFonts(self, font):
87
88 self.base_format.setFont(font)
89 self.empty_format = QtGui.QTextCharFormat(self.base_format)
90 # self.empty_format.setFontPointSize(font.pointSize()/4.0)
91
92 self.keywordFormat = QtGui.QTextCharFormat(self.base_format)
93 self.keywordFormat.setForeground(QtCore.Qt.GlobalColor.darkBlue)
94 self.keywordFormat.setFontWeight(QtGui.QFont.Weight.Bold)
95 self.callableFormat = QtGui.QTextCharFormat(self.base_format)
96 self.callableFormat.setForeground(QtCore.Qt.GlobalColor.darkBlue)
97 self.magicFormat = QtGui.QTextCharFormat(self.base_format)
98 self.magicFormat.setForeground(QtGui.QColor(224, 128, 0))
99 self.qtFormat = QtGui.QTextCharFormat(self.base_format)
100 self.qtFormat.setForeground(QtCore.Qt.GlobalColor.blue)
101 self.qtFormat.setFontWeight(QtGui.QFont.Weight.Bold)
102 self.selfFormat = QtGui.QTextCharFormat(self.base_format)
103 self.selfFormat.setForeground(QtCore.Qt.GlobalColor.red)
104 # self.selfFormat.setFontItalic(True)
105 self.singleLineCommentFormat = QtGui.QTextCharFormat(self.base_format)
106 self.singleLineCommentFormat.setForeground(QtCore.Qt.GlobalColor.darkGreen)
107 self.multiLineStringFormat = QtGui.QTextCharFormat(self.base_format)
108 self.multiLineStringFormat.setBackground(
109 QtGui.QBrush(QtGui.QColor(127, 127, 255)))
110 self.quotationFormat1 = QtGui.QTextCharFormat(self.base_format)
111 self.quotationFormat1.setForeground(QtCore.Qt.GlobalColor.blue)
112 self.quotationFormat2 = QtGui.QTextCharFormat(self.base_format)
113 self.quotationFormat2.setForeground(QtCore.Qt.GlobalColor.blue)
114
115 def updateRules(self):
116
117 self.rules = []
118 self.rules += map(lambda s: (QtCore.QRegularExpression(r"\b" + s + r"\b"),
120
121 self.rules.append((QtCore.QRegularExpression(r"\b[A-Za-z_]+\‍(.*\‍)"), self.callableFormat))
122 self.rules.append((QtCore.QRegularExpression(r"\b__[a-z]+__\b"), self.magicFormat))
123 self.rules.append((QtCore.QRegularExpression(r"\bself\b"), self.selfFormat))
124 self.rules.append((QtCore.QRegularExpression(r"\bQ([A-Z][a-z]*)+\b"), self.qtFormat))
125
126 self.rules.append((QtCore.QRegularExpression(r"#[^\n]*"), self.singleLineCommentFormat))
127
128 self.multiLineStringBegin = QtCore.QRegularExpression(r'\"\"\"')
129 self.multiLineStringEnd = QtCore.QRegularExpression(r'\"\"\"')
130
131 self.rules.append((QtCore.QRegularExpression(r'\"[^\n]*\"'), self.quotationFormat1))
132 self.rules.append((QtCore.QRegularExpression(r"'[^\n]*'"), self.quotationFormat2))
133
134 def updateHighlighter(self, font):
135
136 self.updateFonts(font)
137 self.updateRules()
138 self.setDocument(self.document)
139
140
142
143 keywords = """"
144 break for throw case function try
145 catch if typeof continue in var default instanceof void
146 delete new undefined do return while else switch with
147 finally this """.split() + \
148 ['NaN', 'Infinity', 'undefined', 'print', 'parseInt',
149 'parseFloat', 'isNaN', 'isFinite', 'decodeURI',
150 'decodeURIComponent', 'encodeURI', 'encodeURIComponent',
151 'escape', 'unescape', 'version', 'gc', 'Object',
152 'Function', 'Number', 'Boolean', 'String', 'Date', 'Array',
153 'RegularExpression', 'Error', 'EvalError', 'RangeError', 'ReferenceError',
154 'SyntaxError', 'TypeError', 'URIError', 'eval', 'Math',
155 'Enumeration', 'Variant', 'QObject', 'QMetaObject']
156
157 def __init__(self, edit):
158 PythonHighlighter.__init__(self, edit)
159
160 def updateRules(self):
161
162 self.rulesrules = []
163 self.rulesrules += map(lambda s: (QtCore.QRegularExpression(r"\b" + s + r"\b"),
165
166 self.rulesrules.append((QtCore.QRegularExpression(r"\b[A-Za-z_]+\‍(.*\‍)"), self.callableFormatcallableFormat))
167 # self.rules.append((QtCore.QRegularExpression(r"\b__[a-z]+__\b"), self.magicFormat))
168 self.rulesrules.append((QtCore.QRegularExpression(r"\bthis\b"), self.selfFormatselfFormat))
169 self.rulesrules.append((QtCore.QRegularExpression(r"\bQ([A-Z][a-z]*)+\b"), self.qtFormatqtFormat))
170
171 self.rulesrules.append((QtCore.QRegularExpression(r"//[^\n]*"), self.singleLineCommentFormatsingleLineCommentFormat))
172
173 # XXX quick hack to support QtQml syntax
174 self.multiLineStringBeginmultiLineStringBegin = QtCore.QRegularExpression(r'/\*')
175 self.multiLineStringEndmultiLineStringEnd = QtCore.QRegularExpression(r'\*/')
177 self.rulesrules.append((QtCore.QRegularExpression(r'\"[^\n]*\"'), self.quotationFormat1quotationFormat1))
178 self.rulesrules.append((QtCore.QRegularExpression(r"'[^\n]*'"), self.quotationFormat2quotationFormat2))
highlightRules(self, text, start, finish)