def __init__(self, editor): super(Highlighter, self).__init__(editor) # Keywords format keyword_format = QTextCharFormat() keyword_format.setForeground(Qt.darkBlue) keyword_format.setFontWeight(QFont.Bold) # Rules self._rules = [(QRegExp("\\b" + pattern + "\\b"), keyword_format) for pattern in Highlighter.KEYWORDS] # Number format number_format = QTextCharFormat() number_pattern = QRegExp(r"\b([A-Z0-9]+)(?:[ _-](\d+))?\b") number_pattern.setMinimal(True) number_format.setForeground(Qt.darkCyan) self._rules.append((number_pattern, number_format)) # String format string_format = QTextCharFormat() string_pattern = QRegExp("\".*\"|\'.*\'") string_pattern.setMinimal(True) string_format.setForeground(Qt.darkMagenta) self._rules.append((string_pattern, string_format)) # Comment format comment_format = QTextCharFormat() comment_pattern = QRegExp("--[^\n]*") comment_format.setForeground(Qt.darkGreen) self._rules.append((comment_pattern, comment_format)) # Paren self.paren = QRegExp('\(|\)')
def __init__(self, parent=None): super(PythonHighlighter, self).__init__(parent) self.initializeFormats() PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % keyword for keyword in KEYWORDS])), "keyword")) PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % builtin for builtin in BUILTINS])), "builtin")) PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % constant for constant in CONSTANTS])), "constant")) PythonHighlighter.Rules.append((QRegExp( r"\b[+-]?[0-9]+[lL]?\b" r"|\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b" r"|\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"), "number")) PythonHighlighter.Rules.append((QRegExp( r"\bPyQt4\b|\bQt?[A-Z][a-z]\w+\b"), "pyqt")) PythonHighlighter.Rules.append((QRegExp(r"\b@\w+\b"), "decorator")) stringRe = QRegExp(r"""(?:'[^']*'|"[^"]*")""") stringRe.setMinimal(True) PythonHighlighter.Rules.append((stringRe, "string")) self.stringRe = QRegExp(r"""(:?"["]".*"["]"|'''.*''')""") self.stringRe.setMinimal(True) PythonHighlighter.Rules.append((self.stringRe, "string")) self.tripleSingleRe = QRegExp(r"""'''(?!")""") self.tripleDoubleRe = QRegExp(r'''"""(?!')''')
def parse(self, text): """ Parse some text, assuming it is in the form of: word 1414 {grammar} word 1414 {grammar} etc. and returns a list of tupples '(word, strong, grammar)'. """ result = [] r = QRegExp(r'([αβχδεφγηιϕκλμνοπθρστυςωξψζ]*)' + '\s*' + '([\d ]+)' + '\s*' + '\{(.*)\}\s*') r.setMinimal(True) pos = r.indexIn(text) while pos >= 0: # Some verbs have two strong numbers, we keep only the first, # the second one being grammar strong = r.cap(2).strip() if " " in strong: strong = strong.split(" ")[0] result.append((r.cap(1).strip(), strong, r.cap(3).strip())) pos = r.indexIn(text, pos + len(r.cap(0))) return result
class PythonHighlighter(QSyntaxHighlighter): Rules = [] Formats = {} #loadConfig() def __init__(self, parent=None): super(PythonHighlighter, self).__init__(parent) self.initializeFormats() PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % keyword for keyword in KEYWORDS])), "keyword")) PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % builtin for builtin in BUILTINS])), "builtin")) PythonHighlighter.Rules.append((QRegExp( "|".join([r"\b%s\b" % constant for constant in CONSTANTS])), "constant")) PythonHighlighter.Rules.append((QRegExp( r"\b[+-]?[0-9]+[lL]?\b" r"|\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b" r"|\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"), "number")) PythonHighlighter.Rules.append((QRegExp( r"\bPyQt4\b|\bQt?[A-Z][a-z]\w+\b"), "pyqt")) PythonHighlighter.Rules.append((QRegExp(r"\b@\w+\b"), "decorator")) stringRe = QRegExp(r"""(?:'[^']*'|"[^"]*")""") stringRe.setMinimal(True) PythonHighlighter.Rules.append((stringRe, "string")) self.stringRe = QRegExp(r"""(:?"["]".*"["]"|'''.*''')""") self.stringRe.setMinimal(True) PythonHighlighter.Rules.append((self.stringRe, "string")) self.tripleSingleRe = QRegExp(r"""'''(?!")""") self.tripleDoubleRe = QRegExp(r'''"""(?!')''') @staticmethod def initializeFormats(): baseFormat = QTextCharFormat() baseFormat.setFontFamily(Config["fontfamily"]) baseFormat.setFontPointSize(Config["fontsize"]) for name in ("normal", "keyword", "builtin", "constant", "decorator", "comment", "string", "number", "error", "pyqt"): format = QTextCharFormat(baseFormat) format.setForeground( QColor(Config["%sfontcolor" % name])) if Config["%sfontbold" % name]: format.setFontWeight(QFont.Bold) format.setFontItalic(Config["%sfontitalic" % name]) PythonHighlighter.Formats[name] = format def highlightBlock(self, text): NORMAL, TRIPLESINGLE, TRIPLEDOUBLE, ERROR = range(4) textLength = text.length() prevState = self.previousBlockState() self.setFormat(0, textLength, PythonHighlighter.Formats["normal"]) if text.startsWith("Traceback") or text.startsWith("Error: "): self.setCurrentBlockState(ERROR) self.setFormat(0, textLength, PythonHighlighter.Formats["error"]) return if (prevState == ERROR and not (text.startsWith(sys.ps1) or text.startsWith("#"))): self.setCurrentBlockState(ERROR) self.setFormat(0, textLength, PythonHighlighter.Formats["error"]) return for regex, format in PythonHighlighter.Rules: i = regex.indexIn(text) while i >= 0: length = regex.matchedLength() self.setFormat(i, length, PythonHighlighter.Formats[format]) i = regex.indexIn(text, i + length) # Slow but good quality highlighting for comments. For more # speed, comment this out and add the following to __init__: # PythonHighlighter.Rules.append((QRegExp(r"#.*"), "comment")) if text.isEmpty(): pass elif text[0] == "#": self.setFormat(0, text.length(), PythonHighlighter.Formats["comment"]) else: stack = [] for i, c in enumerate(text): if c in ('"', "'"): if stack and stack[-1] == c: stack.pop() else: stack.append(c) elif c == "#" and len(stack) == 0: self.setFormat(i, text.length(), PythonHighlighter.Formats["comment"]) break self.setCurrentBlockState(NORMAL) if text.indexOf(self.stringRe) != -1: return # This is fooled by triple quotes inside single quoted strings for i, state in ((text.indexOf(self.tripleSingleRe), TRIPLESINGLE), (text.indexOf(self.tripleDoubleRe), TRIPLEDOUBLE)): if self.previousBlockState() == state: if i == -1: i = text.length() self.setCurrentBlockState(state) self.setFormat(0, i + 3, PythonHighlighter.Formats["string"]) elif i > -1: self.setCurrentBlockState(state) self.setFormat(i, text.length(), PythonHighlighter.Formats["string"]) def rehighlight(self): QApplication.setOverrideCursor(QCursor( Qt.WaitCursor)) QSyntaxHighlighter.rehighlight(self) QApplication.restoreOverrideCursor()