From b3cb7ae6d152c8ffabc33dc802458cc9445c7c04 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Thu, 13 Oct 2022 13:18:30 +0100 Subject: [PATCH] More improvements in syntax highlighting for comments and strings --- src/calibre/gui2/dialogs/template_dialog.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/dialogs/template_dialog.py b/src/calibre/gui2/dialogs/template_dialog.py index edad234d24..15c8e09ab5 100644 --- a/src/calibre/gui2/dialogs/template_dialog.py +++ b/src/calibre/gui2/dialogs/template_dialog.py @@ -102,13 +102,13 @@ class TemplateHighlighter(QSyntaxHighlighter): a("|".join([r"\b%s\b" % constant for constant in self.CONSTANTS_PYTHON]), "constant") a(r"\bPyQt6\b|\bqt.core\b|\bQt?[A-Z][a-z]\w+\b", "pyqt") a(r"@\w+(\.\w+)?\b", "decorator") - a(r"""('|").*?\1""", "string") - stringRe = r"""((?:"|'){3}).*?\1""" + + stringRe = r'''(["'])(?:(?!\1)[^\\]|\\.)*\1''' a(stringRe, "string") self.stringRe = re.compile(stringRe) + self.checkTripleInStringRe = re.compile(r"""((?:"|'){3}).*?\1""") self.tripleSingleRe = re.compile(r"""'''(?!")""") self.tripleDoubleRe = re.compile(r'''"""(?!')''') - a(r'#[^\n]*', "comment") a( r"\b[+-]?[0-9]+[lL]?\b" r"|\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b" @@ -170,6 +170,10 @@ class TemplateHighlighter(QSyntaxHighlighter): dex = bn * self.BN_FACTOR + pos return self.paren_pos_map.get(dex, None) + def replace_strings_with_dash(self, mo): + found = mo.group(0) + return '-' * len(found) + def highlightBlock(self, text): NORMAL, TRIPLESINGLE, TRIPLEDOUBLE = range(3) @@ -198,9 +202,18 @@ class TemplateHighlighter(QSyntaxHighlighter): else: self.setFormat(i, length, self.Formats[format_]) + # Deal with comments not at the beginning of the line. + if self.for_python and '#' in text: + # Remove any strings from the text before we check for '#'. This way + # we avoid thinking a # inside a string starts a comment. + t = re.sub(self.stringRe, self.replace_strings_with_dash, text) + sharp_pos = t.find('#') + if sharp_pos >= 0: # Do we still have a #? + self.setFormat(sharp_pos, len(text), self.Formats["comment"]) + self.setCurrentBlockState(NORMAL) - if self.for_python and self.stringRe.search(text) is None: + if self.for_python and self.checkTripleInStringRe.search(text) is None: # This is fooled by triple quotes inside single quoted strings for m, state in ( (self.tripleSingleRe.search(text), TRIPLESINGLE),