From c3cb12e5e2021252dcf108e6d99b2720e0f79e69 Mon Sep 17 00:00:00 2001
From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
Date: Sun, 22 Sep 2024 16:56:21 +0200
Subject: [PATCH] Use stdlib re for Markdown matching
---
novelwriter/core/tokenizer.py | 6 ++----
novelwriter/gui/dochighlight.py | 1 -
novelwriter/text/patterns.py | 20 ++++++++------------
tests/test_text/test_text_patterns.py | 23 ++++++++++++++++-------
4 files changed, 26 insertions(+), 24 deletions(-)
diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py
index b977d962..7bcf594a 100644
--- a/novelwriter/core/tokenizer.py
+++ b/novelwriter/core/tokenizer.py
@@ -1109,11 +1109,9 @@ class Tokenizer(ABC):
# Match Markdown
for regEx, fmts in self._rxMarkdown:
- rxItt = regEx.globalMatch(text, 0)
- while rxItt.hasNext():
- rxMatch = rxItt.next()
+ for match in re.finditer(regEx, text):
temp.extend(
- (rxMatch.capturedStart(n), rxMatch.capturedLength(n), fmt, "")
+ (match.start(n), len(match.group(n)), fmt, "")
for n, fmt in enumerate(fmts) if fmt > 0
)
diff --git a/novelwriter/gui/dochighlight.py b/novelwriter/gui/dochighlight.py
index cb76e76b..5cf14e9a 100644
--- a/novelwriter/gui/dochighlight.py
+++ b/novelwriter/gui/dochighlight.py
@@ -41,7 +41,6 @@ from novelwriter.constants import nwHeaders, nwRegEx, nwUnicode
from novelwriter.core.index import processComment
from novelwriter.enum import nwComment
from novelwriter.text.patterns import REGEX_PATTERNS
-from novelwriter.types import QRegExUnicode
logger = logging.getLogger(__name__)
diff --git a/novelwriter/text/patterns.py b/novelwriter/text/patterns.py
index 4d60222e..06c76b2a 100644
--- a/novelwriter/text/patterns.py
+++ b/novelwriter/text/patterns.py
@@ -23,6 +23,8 @@ along with this program. If not, see .
"""
from __future__ import annotations
+import re
+
from PyQt5.QtCore import QRegularExpression
from novelwriter import CONFIG
@@ -33,25 +35,19 @@ from novelwriter.types import QRegExUnicode
class RegExPatterns:
@property
- def markdownItalic(self) -> QRegularExpression:
+ def markdownItalic(self) -> re.Pattern:
"""Markdown italic style."""
- rxRule = QRegularExpression(nwRegEx.FMT_EI)
- rxRule.setPatternOptions(QRegExUnicode)
- return rxRule
+ return re.compile(nwRegEx.FMT_EI, re.UNICODE)
@property
- def markdownBold(self) -> QRegularExpression:
+ def markdownBold(self) -> re.Pattern:
"""Markdown bold style."""
- rxRule = QRegularExpression(nwRegEx.FMT_EB)
- rxRule.setPatternOptions(QRegExUnicode)
- return rxRule
+ return re.compile(nwRegEx.FMT_EB, re.UNICODE)
@property
- def markdownStrike(self) -> QRegularExpression:
+ def markdownStrike(self) -> re.Pattern:
"""Markdown strikethrough style."""
- rxRule = QRegularExpression(nwRegEx.FMT_ST)
- rxRule.setPatternOptions(QRegExUnicode)
- return rxRule
+ return re.compile(nwRegEx.FMT_ST, re.UNICODE)
@property
def shortcodePlain(self) -> QRegularExpression:
diff --git a/tests/test_text/test_text_patterns.py b/tests/test_text/test_text_patterns.py
index 1b4623fd..b421db52 100644
--- a/tests/test_text/test_text_patterns.py
+++ b/tests/test_text/test_text_patterns.py
@@ -20,6 +20,8 @@ along with this program. If not, see .
"""
from __future__ import annotations
+import re
+
import pytest
from PyQt5.QtCore import QRegularExpression
@@ -32,13 +34,20 @@ from novelwriter.text.patterns import REGEX_PATTERNS
def allMatches(regEx: QRegularExpression, text: str) -> list[list[str]]:
"""Get all matches for a regex."""
result = []
- itt = regEx.globalMatch(text, 0)
- while itt.hasNext():
- match = itt.next()
- result.append([
- (match.captured(n), match.capturedStart(n), match.capturedEnd(n))
- for n in range(match.lastCapturedIndex() + 1)
- ])
+ if isinstance(regEx, QRegularExpression):
+ itt = regEx.globalMatch(text, 0)
+ while itt.hasNext():
+ match = itt.next()
+ result.append([
+ (match.captured(n), match.capturedStart(n), match.capturedEnd(n))
+ for n in range(match.lastCapturedIndex() + 1)
+ ])
+ else:
+ for match in re.finditer(regEx, text):
+ result.append([
+ (match.group(n), match.start(n), match.end(n))
+ for n in range((match.lastindex or -1) + 1)
+ ])
return result