Fix spell checker issue
This commit is contained in:
@@ -428,9 +428,9 @@ class GuiDocHighlighter(QSyntaxHighlighter):
|
|||||||
data = TextBlockData()
|
data = TextBlockData()
|
||||||
self.setCurrentBlockUserData(data)
|
self.setCurrentBlockUserData(data)
|
||||||
|
|
||||||
data.extractMetaData(text, xOff)
|
data.processText(text, xOff)
|
||||||
if self._spellCheck:
|
if self._spellCheck:
|
||||||
for xPos, xEnd in data.spellCheck(text, xOff):
|
for xPos, xEnd in data.spellCheck():
|
||||||
for x in range(xPos, xEnd):
|
for x in range(xPos, xEnd):
|
||||||
cFmt = self.format(x)
|
cFmt = self.format(x)
|
||||||
cFmt.merge(self._spellErr)
|
cFmt.merge(self._spellErr)
|
||||||
@@ -479,10 +479,12 @@ class GuiDocHighlighter(QSyntaxHighlighter):
|
|||||||
|
|
||||||
class TextBlockData(QTextBlockUserData):
|
class TextBlockData(QTextBlockUserData):
|
||||||
|
|
||||||
__slots__ = ("_spellErrors")
|
__slots__ = ("_text", "_offset", "_metaData", "_spellErrors")
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
self._text = ""
|
||||||
|
self._offset = 0
|
||||||
self._metaData: list[tuple[int, int, str, str]] = []
|
self._metaData: list[tuple[int, int, str, str]] = []
|
||||||
self._spellErrors: list[tuple[int, int,]] = []
|
self._spellErrors: list[tuple[int, int,]] = []
|
||||||
return
|
return
|
||||||
@@ -497,23 +499,9 @@ class TextBlockData(QTextBlockUserData):
|
|||||||
"""Return spell error data from last check."""
|
"""Return spell error data from last check."""
|
||||||
return self._spellErrors
|
return self._spellErrors
|
||||||
|
|
||||||
def extractMetaData(self, text: str, offset: int) -> None:
|
def processText(self, text: str, offset: int) -> None:
|
||||||
"""Extract meta data from the text."""
|
"""Extract meta data from the text."""
|
||||||
self._metaData = []
|
self._metaData = []
|
||||||
if "http" in text:
|
|
||||||
# Strip URLs
|
|
||||||
for res in RX_URL.finditer(text, offset):
|
|
||||||
if (s := res.start(0)) >= 0 and (e := res.end(0)) >= 0:
|
|
||||||
pad = " "*(e - s)
|
|
||||||
text = f"{text[:s]}{pad}{text[e:]}"
|
|
||||||
self._metaData.append((s, e, res.group(0), "url"))
|
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
def spellCheck(self, text: str, offset: int) -> list[tuple[int, int]]:
|
|
||||||
"""Run the spell checker and cache the result, and return the
|
|
||||||
list of spell check errors.
|
|
||||||
"""
|
|
||||||
if "[" in text:
|
if "[" in text:
|
||||||
# Strip shortcodes
|
# Strip shortcodes
|
||||||
for regEx in [RX_FMT_SC, RX_FMT_SV]:
|
for regEx in [RX_FMT_SC, RX_FMT_SV]:
|
||||||
@@ -522,9 +510,25 @@ class TextBlockData(QTextBlockUserData):
|
|||||||
pad = " "*(e - s)
|
pad = " "*(e - s)
|
||||||
text = f"{text[:s]}{pad}{text[e:]}"
|
text = f"{text[:s]}{pad}{text[e:]}"
|
||||||
|
|
||||||
|
if "http" in text:
|
||||||
|
# Strip URLs
|
||||||
|
for res in RX_URL.finditer(text, offset):
|
||||||
|
if (s := res.start(0)) >= 0 and (e := res.end(0)) >= 0:
|
||||||
|
pad = " "*(e - s)
|
||||||
|
text = f"{text[:s]}{pad}{text[e:]}"
|
||||||
|
self._metaData.append((s, e, res.group(0), "url"))
|
||||||
|
|
||||||
|
self._text = text
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def spellCheck(self) -> list[tuple[int, int]]:
|
||||||
|
"""Run the spell checker and cache the result, and return the
|
||||||
|
list of spell check errors.
|
||||||
|
"""
|
||||||
self._spellErrors = []
|
self._spellErrors = []
|
||||||
checker = SHARED.spelling
|
checker = SHARED.spelling
|
||||||
for res in RX_WORDS.finditer(text.replace("_", " "), offset):
|
for res in RX_WORDS.finditer(self._text.replace("_", " "), self._offset):
|
||||||
if (
|
if (
|
||||||
(word := res.group(0))
|
(word := res.group(0))
|
||||||
and not (word.isnumeric() or word.isupper() or checker.checkWord(word))
|
and not (word.isnumeric() or word.isupper() or checker.checkWord(word))
|
||||||
|
|||||||
Reference in New Issue
Block a user