From d4213a02127ec1477507f1411d0daf46856f7aae Mon Sep 17 00:00:00 2001 From: un-pogaz <46523284+un-pogaz@users.noreply.github.com> Date: Mon, 1 May 2023 11:04:55 +0200 Subject: [PATCH] rework highlightBoldEmphasis better support for imbricated --- .../gui2/markdown_syntax_highlighter.py | 82 +++++++++++-------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py index a2cecda996..c4e6a862ca 100644 --- a/src/calibre/gui2/markdown_syntax_highlighter.py +++ b/src/calibre/gui2/markdown_syntax_highlighter.py @@ -14,12 +14,12 @@ from calibre.gui2.palette import dark_link_color, light_link_color class MarkdownHighlighter(QSyntaxHighlighter): MARKDOWN_KEYS_REGEX = { - 'Bold' : re.compile(r'(?\*\*)(?P.+?)(?P=delim)'), + 'Bold': re.compile(r'(?\*\*)(?P.+?)(?P=delim)'), + 'Italic': re.compile(r'(?\*)(?!\*)(?P([^\*]{2,}?|[^\*]))(?\*\*\*)(?P([^\*]{2,}?|[^\*]))(?__)(?P.+?)(?P=delim)'), - 'Italic': re.compile(r'(?\*)(?P([^*]{2,}?|[^*]))(?P=delim)'), - 'uItalic': re.compile(r'(?_)(?P([^_]{2,}?|[^_]))(?P=delim)'), - 'BoldItalic': re.compile(r'(?\*\*\*)(?P([^*]{2,}?|[^*]))(?P=delim)'), - 'uBoldItalic': re.compile(r'(?___)(?P([^_]{2,}?|[^_]))(?P=delim)'), + 'uItalic': re.compile(r'(?_)(?!_)(?P([^_]{2,}?|[^_]))(?___)(?P([^_]{2,}?|[^_]))(? return, do not process extra Bold/Italic - for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Italic'],unlist): - self.setFormat(self.offset+ mo.start()+spcslen, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Italic']) + sub_txt = text[match.start()+extra_offset : match.end()-extra_offset] + sub_offset = offset + extra_offset + mo.start() + self._highlightBoldEmphasis(sub_txt, cursor, bf, sub_offset, bold, emphasis) + + for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Italic'],text): + recusive(mo, 1, bold, True) found = True for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uItalic'],text): - self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['uItalic']) + recusive(mo, 1, bold, True) + found = True + + for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Bold'],text): + recusive(mo, 2, True, emphasis) + found = True + for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uBold'],text): + recusive(mo, 2, True, emphasis) found = True - return found - def highlightBoldEmphasis(self, text, cursor, bf): - found = False for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['BoldItalic'],text): - self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['BoldItalic']) + apply(mo, True, True) + found = True + for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uBoldItalic'],text): + apply(mo, True, True) found = True - for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uBoldItalic'],text): - self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['uBoldItalic']) - found = True return found def highlightCodeBlock(self, text, cursor, bf):