Source code for cgl.ui.widgets.text

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