from PySide6 import QtCore, QtGui
[docs]
class Highlighter(QtGui.QSyntaxHighlighter):
def __init__(self, parent=None):
super(Highlighter, self).__init__(parent)
keywordFormat = QtGui.QTextCharFormat()
keywordFormat.setForeground(QtGui.QColor('#CB772F'))
keywordPatterns = [
'\\bprint\\b', '\\bFalse\\b', '\\bNone\\b', '\\bTrue\\b', '\\band\\b', '\\bas\\b',
'\\bbreak\\b', '\\bclass\\b', '\\bcontinue\\b', '\\bdef\\b', '\\bdel\\b', '\\belif\\b',
'\\belse\\b', '\\bexcept\\b', '\\bfinally\\b', '\\bassert\\b',
'\\bfor\\b', '\\bfrom\\b', '\\bglobal\\b', '\\bif\\b', '\\bimport\\b', '\\bin\\b',
'\\bis\\b', '\\blambda\\b', '\\bnonlocal\\b', '\\bnot\\b', '\\bor\\b', '\\bpass\\b',
'\\braise\\b', '\\breturn\\b', '\\btry\\b', '\\bwhile\\b', '\\bwith\\b', '\\byield'
]
default = QtGui.QTextCharFormat()
default.setForeground(QtGui.QColor('#A9B7C6'))
self.highlightingRules = [(QtCore.QRegularExpression(".+"), default)]
for pattern in keywordPatterns:
self.highlightingRules.append((QtCore.QRegularExpression(pattern), keywordFormat))
classFormat = QtGui.QTextCharFormat()
classFormat.setFontWeight(QtGui.QFont.Bold)
classFormat.setForeground(QtCore.Qt.darkMagenta)
self.highlightingRules.append((QtCore.QRegularExpression("\\bQ[A-Za-z]+\\b"), classFormat))
singleLineCommentFormat = QtGui.QTextCharFormat()
singleLineCommentFormat.setForeground(QtCore.Qt.red)
self.highlightingRules.append((QtCore.QRegularExpression("//[^\n]*"), singleLineCommentFormat))
self.multiLineCommentFormat = QtGui.QTextCharFormat()
self.multiLineCommentFormat.setForeground(QtCore.Qt.red)
numberFormat = QtGui.QTextCharFormat()
numberFormat.setForeground(QtGui.QColor('#6897BB'))
self.highlightingRules.append((QtCore.QRegularExpression("[0-9]+"), numberFormat))
quotationFormat = QtGui.QTextCharFormat()
quotationFormat.setForeground(QtGui.QColor('#A5C25C'))
self.highlightingRules.append((QtCore.QRegularExpression("\".*\""), quotationFormat))
self.highlightingRules.append((QtCore.QRegularExpression("\'.*\'"), quotationFormat))
self_format = QtGui.QTextCharFormat()
self_format.setForeground(QtGui.QColor('#9876AA'))
self.highlightingRules.append((QtCore.QRegularExpression("\\bself\\b"), self_format))
functionFormat = QtGui.QTextCharFormat()
functionFormat.setFontItalic(True)
functionFormat.setForeground(QtGui.QColor('#FFC66D'))
self.highlightingRules.append((QtCore.QRegularExpression("\\b[A-Za-z0-9_]+(?=\\()"), functionFormat))
self.commentStartExpression = QtCore.QRegularExpression("/\\*")
self.commentEndExpression = QtCore.QRegularExpression("\\*/")
[docs]
def highlightBlock(self, text):
for pattern, format_ in self.highlightingRules:
expression = pattern.match(text)
index = expression.capturedStart() if expression.hasMatch() else -1
while index >= 0:
length = len(expression.captured(0))
self.setFormat(index, length, format_)
expression = pattern.match(text, index + length)
index = expression.capturedStart() if expression.hasMatch() else -1
self.setCurrentBlockState(0)
start_index = 0
if self.previousBlockState() != 1:
match = self.commentStartExpression.match(text)
start_index = match.capturedStart() if match.hasMatch() else -1
while start_index >= 0:
match_end = self.commentEndExpression.match(text, start_index)
end_index = match_end.capturedStart() if match_end.hasMatch() else -1
if end_index == -1:
self.setCurrentBlockState(1)
comment_length = len(text) - start_index
else:
comment_length = end_index - start_index + len(match_end.captured(0))
self.setFormat(start_index, comment_length, self.multiLineCommentFormat)
match = self.commentStartExpression.match(text, start_index + comment_length)
start_index = match.capturedStart() if match.hasMatch() else -1