From 9b7216b4ff7bc6dc96c2eacd93bde92f4aca36bf Mon Sep 17 00:00:00 2001 From: un-pogaz <46523284+un-pogaz@users.noreply.github.com> Date: Sun, 30 Apr 2023 14:00:18 +0200 Subject: [PATCH 1/9] fix overflow --- src/calibre/gui2/markdown_syntax_highlighter.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py index b458619646..a3c29383da 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.+)(?P=delim)'), - 'uBold': re.compile('(?P__)(?P.+)(?P=delim)'), - 'Italic': re.compile(r'(?P\*)(?P([^*]{2,}|[^*]))(?P=delim)'), - 'uItalic': re.compile('(?P_)(?P([^_]{2,}|[^_]))(?P=delim)'), - 'BoldItalic': re.compile(r'(?P\*\*\*)(?P([^*]{2,}|[^*]))(?P=delim)'), - 'uBoldItalic': re.compile(r'(?P___)(?P([^_]{2,}|[^_]))(?P=delim)'), + 'Bold' : re.compile(r'(?P\*\*)(?P.+?)(?P=delim)'), + 'uBold': re.compile('(?P__)(?P.+?)(?P=delim)'), + 'Italic': re.compile(r'(?P\*)(?P([^*]{2,}?|[^*]))(?P=delim)'), + 'uItalic': re.compile('(?P_)(?P([^_]{2,}?|[^_]))(?P=delim)'), + 'BoldItalic': re.compile(r'(?P\*\*\*)(?P([^*]{2,}?|[^*]))(?P=delim)'), + 'uBoldItalic': re.compile(r'(?P___)(?P([^_]{2,}?|[^_]))(?P=delim)'), 'Link': re.compile(r'(?u)(^|(?P
[^!]))\[.*?\]:?[ ''\t'r']*\(?[^)]+\)?'),
         'Image': re.compile(r'(?u)!\[.*?\]\(.+?\)'),
         'HeaderAtx': re.compile(r'(?u)^\#{1,6}(.*?)\#*(''\n|$)'),

From c67cdd02bc54d8004c1bc06a8b6968008959aceb Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 14:28:59 +0200
Subject: [PATCH 2/9] improve Link, Image, LinkRef

---
 src/calibre/gui2/markdown_syntax_highlighter.py | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index a3c29383da..b131c8ddf4 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -20,8 +20,9 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         'uItalic': re.compile('(?P_)(?P([^_]{2,}?|[^_]))(?P=delim)'),
         'BoldItalic': re.compile(r'(?P\*\*\*)(?P([^*]{2,}?|[^*]))(?P=delim)'),
         'uBoldItalic': re.compile(r'(?P___)(?P([^_]{2,}?|[^_]))(?P=delim)'),
-        'Link': re.compile(r'(?u)(^|(?P
[^!]))\[.*?\]:?[ ''\t'r']*\(?[^)]+\)?'),
-        'Image': re.compile(r'(?u)!\[.*?\]\(.+?\)'),
+        'Link': re.compile(r'(?u)(?
Date: Sun, 30 Apr 2023 17:14:15 +0200
Subject: [PATCH 3/9] regex tweak

---
 .../gui2/markdown_syntax_highlighter.py       | 24 +++++++++----------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index b131c8ddf4..9e7faa2ca0 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -14,14 +14,14 @@ from calibre.gui2.palette import dark_link_color, light_link_color
 class MarkdownHighlighter(QSyntaxHighlighter):
 
     MARKDOWN_KEYS_REGEX = {
-        'Bold' : re.compile(r'(?P\*\*)(?P.+?)(?P=delim)'),
-        'uBold': re.compile('(?P__)(?P.+?)(?P=delim)'),
-        'Italic': re.compile(r'(?P\*)(?P([^*]{2,}?|[^*]))(?P=delim)'),
-        'uItalic': re.compile('(?P_)(?P([^_]{2,}?|[^_]))(?P=delim)'),
-        'BoldItalic': re.compile(r'(?P\*\*\*)(?P([^*]{2,}?|[^*]))(?P=delim)'),
-        'uBoldItalic': re.compile(r'(?P___)(?P([^_]{2,}?|[^_]))(?P=delim)'),
-        'Link': re.compile(r'(?u)(?\*\*)(?P.+?)(?P=delim)'),
+        'uBold': re.compile(r'(?__)(?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)'),
+        'Link': re.compile(r'(?u)(?+\s*'),
-        'BlockQuoteCount': re.compile('^[ \t]*>[ \t]?'),
-        'CodeSpan': re.compile('(?P`+).+?(?P=delim)'),
+        'BlockQuote': re.compile(r'(?u)^([ ]{0,3}>)+\s*'),
+        'BlockQuoteCount': re.compile(r'^[ ]{0,3}>[ \t]?'),
+        'CodeSpan': re.compile(r'(?`+).+?(?P=delim)'),
         'HeaderLine': re.compile(r'(?u)^(-|=)+\s*$'),
         'HR': re.compile(r'(?u)^(\s*(\*|-|_)\s*){3,}$'),
-        'Html': re.compile('<.+?>')
+        'Html': re.compile(r'<.+?(?')
     }
 
     key_theme_maps = {

From 5afea801330b326ab01e009e181b597780c92636 Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 19:20:52 +0200
Subject: [PATCH 4/9] improve Header and CodeBlock

---
 .../gui2/markdown_syntax_highlighter.py       | 27 +++++++------------
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index 9e7faa2ca0..75ec01ae4c 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -23,14 +23,12 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         'Link': re.compile(r'(?u)(?)+\s*'),
-        'BlockQuoteCount': re.compile(r'^[ ]{0,3}>[ \t]?'),
+        'BlockQuote': re.compile(r'(?u)^[ ]{0,3}>+[ \t]?'),
         'CodeSpan': re.compile(r'(?`+).+?(?P=delim)'),
         'HeaderLine': re.compile(r'(?u)^(-|=)+\s*$'),
         'HR': re.compile(r'(?u)^(\s*(\*|-|_)\s*){3,}$'),
@@ -47,7 +45,6 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         'Link': "link",
         'Image': "image",
         'LinkRef': "link",
-        'HeaderAtx': "header",
         'Header': "header",
         'HeaderLine': "header",
         'CodeBlock': "codeblock",
@@ -55,7 +52,6 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         'UnorderedListStar': "unorderedlist",
         'OrderedList': "orderedlist",
         'BlockQuote': "blockquote",
-        'BlockQuoteCount': "blockquote",
         'CodeSpan': "codespan",
         'HR': "line",
         'Html': "html",
@@ -132,7 +128,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         if self.highlightHorizontalLine(text, cursor, bf, strt):
             return
 
-        if self.highlightAtxHeader(text, cursor, bf, strt):
+        if self.highlightHeader(text, cursor, bf, strt):
             return
 
         self.highlightList(text, cursor, bf, strt)
@@ -156,11 +152,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         mo = re.search(self.MARKDOWN_KEYS_REGEX['BlockQuote'],text)
         if mo:
             self.setFormat(mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['BlockQuote'])
-            unquote = re.sub(self.MARKDOWN_KEYS_REGEX['BlockQuoteCount'],'',text)
-            spcs = re.match(self.MARKDOWN_KEYS_REGEX['BlockQuoteCount'],text)
-            spcslen = 0
-            if spcs:
-                spcslen = len(spcs.group(0))
+            spcslen = mo.end()
+            unquote = text[spcslen:]
             self.highlightMarkdown(unquote,spcslen)
             found = True
         return found
@@ -180,7 +173,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
             prevCursor = QTextCursor(prevBlock)
             prev = prevBlock.text()
             prevAscii = str(prev.replace('\u2029','\n'))
-            if prevAscii.strip():
+            if strt == 0 and prevAscii.strip():
                 #print "Its a header"
                 prevCursor.select(QTextCursor.SelectionType.LineUnderCursor)
                 #prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
@@ -197,13 +190,13 @@ class MarkdownHighlighter(QSyntaxHighlighter):
             found = True
         return found
 
-    def highlightAtxHeader(self, text, cursor, bf, strt):
+    def highlightHeader(self, text, cursor, bf, strt):
         found = False
-        for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['HeaderAtx'],text):
+        for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Header'],text):
             #bf.setBackground(QBrush(QColor(7,54,65)))
             #cursor.movePosition(QTextCursor.End)
             #cursor.mergeBlockFormat(bf)
-            self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HeaderAtx'])
+            self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Header'])
             found = True
         return found
 
@@ -284,7 +277,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['CodeBlock'],text):
             stripped = text.lstrip()
-            if stripped[0] not in ('*','-','+','>'):
+            if stripped[0] not in ('*','-','+','>') and not re.match('\d+\.', stripped):
                 self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['CodeBlock'])
                 found = True
         return found

From 596321564a5b29195181dc8860bb9c8fb8b2487b Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Mon, 1 May 2023 07:04:47 +0200
Subject: [PATCH 5/9] recursive BlockQuote

---
 .../gui2/markdown_syntax_highlighter.py       | 98 ++++++++++---------
 1 file changed, 50 insertions(+), 48 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index 75ec01ae4c..73ddf7cea7 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -110,62 +110,64 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         self.rehighlight()
 
     def highlightBlock(self, text):
-        self.highlightMarkdown(text,0)
+        self.offset = 0
+        self.highlightMarkdown(text)
         self.highlightHtml(text)
 
-    def highlightMarkdown(self, text, strt):
+    def highlightMarkdown(self, text):
         cursor = QTextCursor(self.document())
         bf = cursor.blockFormat()
 
-        #Block quotes can contain all elements so process it first
-        self.highlightBlockQuote(text, cursor, bf, strt)
+        #Block quotes can contain all elements so process it first, internaly process recusively and return
+        if self.highlightBlockQuote(text, cursor, bf):
+            return
 
         #If empty line no need to check for below elements just return
-        if self.highlightEmptyLine(text, cursor, bf, strt):
+        if self.highlightEmptyLine(text, cursor, bf):
             return
 
         #If horizontal line, look at pevious line to see if its a header, process and return
-        if self.highlightHorizontalLine(text, cursor, bf, strt):
+        if self.highlightHorizontalLine(text, cursor, bf):
             return
 
-        if self.highlightHeader(text, cursor, bf, strt):
+        if self.highlightHeader(text, cursor, bf):
             return
 
-        self.highlightList(text, cursor, bf, strt)
+        self.highlightList(text, cursor, bf)
 
-        self.highlightEmphasis(text, cursor, bf, strt)
+        self.highlightEmphasis(text, cursor, bf)
 
-        self.highlightBold(text, cursor, bf, strt)
+        self.highlightBold(text, cursor, bf)
 
-        self.highlightBoldEmphasis(text, cursor, bf, strt)
+        self.highlightBoldEmphasis(text, cursor, bf)
 
-        self.highlightLink(text, cursor, bf, strt)
+        self.highlightLink(text, cursor, bf)
 
-        self.highlightImage(text, cursor, bf, strt)
+        self.highlightImage(text, cursor, bf)
 
-        self.highlightCodeSpan(text, cursor, bf, strt)
+        self.highlightCodeSpan(text, cursor, bf)
 
-        self.highlightCodeBlock(text, cursor, bf, strt)
+        self.highlightCodeBlock(text, cursor, bf)
 
-    def highlightBlockQuote(self, text, cursor, bf, strt):
+    def highlightBlockQuote(self, text, cursor, bf):
         found = False
         mo = re.search(self.MARKDOWN_KEYS_REGEX['BlockQuote'],text)
         if mo:
-            self.setFormat(mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['BlockQuote'])
-            spcslen = mo.end()
-            unquote = text[spcslen:]
-            self.highlightMarkdown(unquote,spcslen)
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['BlockQuote'])
+            self.offset += mo.end()
+            unquote = text[mo.end():]
+            self.highlightMarkdown(unquote)
             found = True
         return found
 
-    def highlightEmptyLine(self, text, cursor, bf, strt):
+    def highlightEmptyLine(self, text, cursor, bf):
         textAscii = str(text.replace('\u2029','\n'))
         if textAscii.strip():
             return False
         else:
             return True
 
-    def highlightHorizontalLine(self, text, cursor, bf, strt):
+    def highlightHorizontalLine(self, text, cursor, bf):
         found = False
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['HeaderLine'],text):
@@ -173,7 +175,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
             prevCursor = QTextCursor(prevBlock)
             prev = prevBlock.text()
             prevAscii = str(prev.replace('\u2029','\n'))
-            if strt == 0 and prevAscii.strip():
+            if self.offset == 0 and prevAscii.strip():
                 #print "Its a header"
                 prevCursor.select(QTextCursor.SelectionType.LineUnderCursor)
                 #prevCursor.setCharFormat(self.MARKDOWN_KWS_FORMAT['Header'])
@@ -182,72 +184,72 @@ class MarkdownHighlighter(QSyntaxHighlighter):
                 formatRange.length = prevCursor.block().length()
                 formatRange.start = 0
                 prevCursor.block().layout().setFormats([formatRange])
-                self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HeaderLine'])
+                self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HeaderLine'])
                 return True
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['HR'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['HR'])
             found = True
         return found
 
-    def highlightHeader(self, text, cursor, bf, strt):
+    def highlightHeader(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Header'],text):
             #bf.setBackground(QBrush(QColor(7,54,65)))
             #cursor.movePosition(QTextCursor.End)
             #cursor.mergeBlockFormat(bf)
-            self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Header'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Header'])
             found = True
         return found
 
-    def highlightList(self, text, cursor, bf, strt):
+    def highlightList(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['UnorderedList'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['UnorderedList'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['UnorderedList'])
             found = True
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['OrderedList'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['OrderedList'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['OrderedList'])
             found = True
         return found
 
-    def highlightLink(self, text, cursor, bf, strt):
+    def highlightLink(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Link'],text):
-            self.setFormat(mo.start() + strt, mo.end() - mo.start() - strt, self.MARKDOWN_KWS_FORMAT['Link'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Link'])
             found = True
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['LinkRef'],text):
-            self.setFormat(mo.start() + strt, mo.end() - mo.start() - strt, self.MARKDOWN_KWS_FORMAT['LinkRef'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['LinkRef'])
             found = True
         return found
 
-    def highlightImage(self, text, cursor, bf, strt):
+    def highlightImage(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Image'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['Image'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Image'])
             found = True
         return found
 
-    def highlightCodeSpan(self, text, cursor, bf, strt):
+    def highlightCodeSpan(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['CodeSpan'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['CodeSpan'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['CodeSpan'])
             found = True
         return found
 
-    def highlightBold(self, text, cursor, bf, strt):
+    def highlightBold(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Bold'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['Bold'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Bold'])
             found = True
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uBold'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['uBold'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['uBold'])
             found = True
         return found
 
-    def highlightEmphasis(self, text, cursor, bf, strt):
+    def highlightEmphasis(self, text, cursor, bf):
         found = False
         unlist = re.sub(self.MARKDOWN_KEYS_REGEX['UnorderedListStar'],'',text)
         spcs = re.match(self.MARKDOWN_KEYS_REGEX['UnorderedListStar'],text)
@@ -255,30 +257,30 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         if spcs:
             spcslen = len(spcs.group(0))
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['Italic'],unlist):
-            self.setFormat(mo.start()+strt+spcslen, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['Italic'])
+            self.setFormat(self.offset+ mo.start()+spcslen, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['Italic'])
             found = True
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uItalic'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['uItalic'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['uItalic'])
             found = True
         return found
 
-    def highlightBoldEmphasis(self, text, cursor, bf, strt):
+    def highlightBoldEmphasis(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['BoldItalic'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['BoldItalic'])
+            self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['BoldItalic'])
             found = True
 
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['uBoldItalic'],text):
-            self.setFormat(mo.start()+strt, mo.end() - mo.start()-strt, self.MARKDOWN_KWS_FORMAT['uBoldItalic'])
+            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, strt):
+    def highlightCodeBlock(self, text, cursor, bf):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['CodeBlock'],text):
             stripped = text.lstrip()
             if stripped[0] not in ('*','-','+','>') and not re.match('\d+\.', stripped):
-                self.setFormat(mo.start()+strt, mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['CodeBlock'])
+                self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['CodeBlock'])
                 found = True
         return found
 

From 991313a701b3e6242575b9fcf7d338d69c2e601d Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Mon, 1 May 2023 07:37:38 +0200
Subject: [PATCH 6/9] fiw overflow italic

---
 src/calibre/gui2/markdown_syntax_highlighter.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index 73ddf7cea7..a2cecda996 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -16,8 +16,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
     MARKDOWN_KEYS_REGEX = {
         'Bold' : re.compile(r'(?\*\*)(?P.+?)(?P=delim)'),
         'uBold': re.compile(r'(?__)(?P.+?)(?P=delim)'),
-        'Italic': re.compile(r'(?\*)(?P([^*]{2,}?|[^*]))(?P=delim)'),
-        'uItalic': re.compile(r'(?_)(?P([^_]{2,}?|[^_]))(?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)'),
         'Link': re.compile(r'(?u)(?
Date: Mon, 1 May 2023 11:04:55 +0200
Subject: [PATCH 7/9] 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):

From b35fc9861b51225fd608a75fdbc595f7f6cd087e Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Mon, 1 May 2023 13:02:41 +0200
Subject: [PATCH 8/9] ...

---
 src/calibre/gui2/markdown_syntax_highlighter.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index c4e6a862ca..ba512410b5 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -66,7 +66,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         "header": {"color":"#2aa198", "font-weight":"bold", "font-style":"normal"},
         "unorderedlist": {"color":"red", "font-weight":"normal", "font-style":"normal"},
         "orderedlist": {"color":"red", "font-weight":"normal", "font-style":"normal"},
-        "blockquote": {"color":"red", "font-weight":"normal", "font-style":"normal"},
+        "blockquote": {"color":"red", "font-weight":"bold", "font-style":"normal"},
         "codespan": {"color":"#ff5800", "font-weight":"normal", "font-style":"normal"},
         "codeblock": {"color":"#ff5800", "font-weight":"normal", "font-style":"normal"},
         "line": {"color":"#2aa198", "font-weight":"normal", "font-style":"normal"},
@@ -82,7 +82,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         "header": {"color":"#2aa198", "font-weight":"bold", "font-style":"normal"},
         "unorderedlist": {"color":"yellow", "font-weight":"normal", "font-style":"normal"},
         "orderedlist": {"color":"yellow", "font-weight":"normal", "font-style":"normal"},
-        "blockquote": {"color":"yellow", "font-weight":"normal", "font-style":"normal"},
+        "blockquote": {"color":"yellow", "font-weight":"bold", "font-style":"normal"},
         "codespan": {"color":"#90ee90", "font-weight":"normal", "font-style":"normal"},
         "codeblock": {"color":"#ff9900", "font-weight":"normal", "font-style":"normal"},
         "line": {"color":"#2aa198", "font-weight":"normal", "font-style":"normal"},

From 50ee2874a5c5da4a652e10218489314d2846615b Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Mon, 1 May 2023 20:37:52 +0200
Subject: [PATCH 9/9] ...

---
 src/calibre/gui2/markdown_syntax_highlighter.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index ba512410b5..adb280a7e4 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -290,7 +290,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['CodeBlock'],text):
             stripped = text.lstrip()
-            if stripped[0] not in ('*','-','+','>') and not re.match('\d+\.', stripped):
+            if stripped[0] not in ('*','-','+','>') and not re.match(r'\d+\.', stripped):
                 self.setFormat(self.offset+ mo.start(), mo.end() - mo.start(), self.MARKDOWN_KWS_FORMAT['CodeBlock'])
                 found = True
         return found