From 3e539de6572002f08bb7ee5c09fa3cd0ddf7a4c2 Mon Sep 17 00:00:00 2001 From: un-pogaz <46523284+un-pogaz@users.noreply.github.com> Date: Sun, 30 Apr 2023 09:31:00 +0200 Subject: [PATCH 1/5] fix imbricated bold/italic --- 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 7079ac6185..a5df754d4c 100644 --- a/src/calibre/gui2/markdown_syntax_highlighter.py +++ b/src/calibre/gui2/markdown_syntax_highlighter.py @@ -15,9 +15,9 @@ class MarkdownHighlighter(QSyntaxHighlighter): MARKDOWN_KEYS_REGEX = { 'Bold' : re.compile(r'(?P\*\*)(?P.+)(?P=delim)'), - 'uBold': re.compile('(?P__)(?P[^_]{2,})(?P=delim)'), + 'uBold': re.compile('(?P__)(?P.+)(?P=delim)'), 'Italic': re.compile(r'(?P\*)(?P[^*]{2,})(?P=delim)'), - 'uItalic': re.compile('(?P_)(?P[^_]+)(?P=delim)'), + 'uItalic': re.compile('(?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 2f8a32cb56cd679f386b8ff5a4a41f1da0264175 Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 09:49:52 +0200
Subject: [PATCH 2/5] fix single char italic

---
 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 a5df754d4c..fa92f79d74 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.+)(?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)'),
+        'Italic': re.compile(r'(?P\*)(?P([^*]{2,}|[^*]))(?P=delim)'),
+        'uItalic': re.compile('(?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 5c5f08d709d2409e9b3e3284968209a793d3ad4f Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 09:56:00 +0200
Subject: [PATCH 3/5] reorder highlighting

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

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index fa92f79d74..a6a28adb9b 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -129,16 +129,16 @@ class MarkdownHighlighter(QSyntaxHighlighter):
 
         self.highlightList(text, cursor, bf, strt)
 
+        self.highlightEmphasis(text, cursor, bf, strt)
+
+        self.highlightBold(text, cursor, bf, strt)
+
         self.highlightLink(text, cursor, bf, strt)
 
         self.highlightImage(text, cursor, bf, strt)
 
         self.highlightCodeSpan(text, cursor, bf, strt)
 
-        self.highlightEmphasis(text, cursor, bf, strt)
-
-        self.highlightBold(text, cursor, bf, strt)
-
         self.highlightCodeBlock(text, cursor, bf, strt)
 
     def highlightBlockQuote(self, text, cursor, bf, strt):

From 6793aaae369751163509f58d8c9075c9348d4073 Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 10:16:18 +0200
Subject: [PATCH 4/5] fix link overflow

The actual regex for Link select the caracter before the bracket if not a start of the line
---
 src/calibre/gui2/markdown_syntax_highlighter.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index a6a28adb9b..5e82914bc1 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -211,7 +211,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
     def highlightLink(self, text, cursor, bf, strt):
         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'])
+            start_bracket = mo.group()[0][0] == '['
+            self.setFormat(mo.start()+strt+(0 if start_bracket else 1), mo.end() - mo.start()-strt-(0 if start_bracket else 1), self.MARKDOWN_KWS_FORMAT['Link'])
             found = True
         return found
 

From 918bd44f5d4e2db9e006d0adf069e747252a5636 Mon Sep 17 00:00:00 2001
From: un-pogaz <46523284+un-pogaz@users.noreply.github.com>
Date: Sun, 30 Apr 2023 11:22:51 +0200
Subject: [PATCH 5/5] primitive support of bold-italic

---
 .../gui2/markdown_syntax_highlighter.py       | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/calibre/gui2/markdown_syntax_highlighter.py b/src/calibre/gui2/markdown_syntax_highlighter.py
index 5e82914bc1..d9c5c8f2d1 100644
--- a/src/calibre/gui2/markdown_syntax_highlighter.py
+++ b/src/calibre/gui2/markdown_syntax_highlighter.py
@@ -18,6 +18,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         '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|$)'),
@@ -39,6 +41,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
         'uBold': "bold",
         'Italic': "emphasis",
         'uItalic': "emphasis",
+        'BoldItalic': "boldemphasis",
+        'uBoldItalic': "boldemphasis",
         'Link': "link",
         'Image': "image",
         'HeaderAtx': "header",
@@ -58,6 +62,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
     light_theme =  {
         "bold": {"font-weight":"bold"},
         "emphasis": {"font-style":"italic"},
+        "boldemphasis": {"font-weight":"bold", "font-style":"italic"},
         "link": {"color":light_link_color.name(), "font-weight":"normal", "font-style":"normal"},
         "image": {"color":"#cb4b16", "font-weight":"normal", "font-style":"normal"},
         "header": {"color":"#2aa198", "font-weight":"bold", "font-style":"normal"},
@@ -73,6 +78,7 @@ class MarkdownHighlighter(QSyntaxHighlighter):
     dark_theme =  {
         "bold": {"font-weight":"bold"},
         "emphasis": {"font-style":"italic"},
+        "boldemphasis": {"font-weight":"bold", "font-style":"italic"},
         "link": {"color":dark_link_color.name(), "font-weight":"normal", "font-style":"normal"},
         "image": {"color":"#cb4b16", "font-weight":"normal", "font-style":"normal"},
         "header": {"color":"#2aa198", "font-weight":"bold", "font-style":"normal"},
@@ -133,6 +139,8 @@ class MarkdownHighlighter(QSyntaxHighlighter):
 
         self.highlightBold(text, cursor, bf, strt)
 
+        self.highlightBoldEmphasis(text, cursor, bf, strt)
+
         self.highlightLink(text, cursor, bf, strt)
 
         self.highlightImage(text, cursor, bf, strt)
@@ -256,6 +264,17 @@ class MarkdownHighlighter(QSyntaxHighlighter):
             found = True
         return found
 
+    def highlightBoldEmphasis(self, text, cursor, bf, strt):
+        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'])
+            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'])
+            found = True
+        return found
+
     def highlightCodeBlock(self, text, cursor, bf, strt):
         found = False
         for mo in re.finditer(self.MARKDOWN_KEYS_REGEX['CodeBlock'],text):