Add parsing for terms in comments

This commit is contained in:
Veronica Berglyd Olsen
2024-04-07 18:06:21 +02:00
parent a7cf236ba5
commit 08b17daec9
5 changed files with 62 additions and 34 deletions
+11 -5
View File
@@ -336,7 +336,7 @@ class NWIndex:
elif line.startswith("%"):
if cTitle != TT_NONE:
cStyle, cText, _ = processComment(line)
cStyle, cMod, cText, _, _ = processComment(line)
if cStyle in (nwComment.SYNOPSIS, nwComment.SHORT):
self._itemIndex.setHeadingSynopsis(tHandle, cTitle, cText)
@@ -1303,17 +1303,23 @@ class IndexHeading:
# =============================================================================================== #
CLASSIFIERS = {
"short": nwComment.SHORT,
"synopsis": nwComment.SYNOPSIS,
"summary": nwComment.SUMMARY,
"short": nwComment.SHORT,
"note": nwComment.NOTE,
}
TERMS = ["note"]
def processComment(text: str) -> tuple[nwComment, str, int]:
def processComment(text: str) -> tuple[nwComment, str, str, int, int]:
"""Extract comment style and text. Should only be called on text
starting with a %.
"""
check = text[1:].lstrip()
classifier, _, content = check.partition(":")
classifier, _, term = classifier.partition(".")
if content and (clean := classifier.strip().lower()) in CLASSIFIERS:
return CLASSIFIERS[clean], content.strip(), text.find(":") + 1
return nwComment.PLAIN, check, 0
term = "ERR" if term and clean not in TERMS else term.strip().lower()
return CLASSIFIERS[clean], term, content.strip(), text.find(".") + 1, text.find(":") + 1
return nwComment.PLAIN, "", check, 0, 0
+1 -1
View File
@@ -533,7 +533,7 @@ class Tokenizer(ABC):
if aLine.startswith("%~"):
continue
cStyle, cText, _ = processComment(aLine)
cStyle, cMod, cText, _, _ = processComment(aLine)
if cStyle == nwComment.SYNOPSIS:
self._tokens.append((
self.T_SYNOPSIS, nHead, cText, [], sAlign
+3 -1
View File
@@ -66,7 +66,9 @@ class nwComment(Enum):
PLAIN = 0
SYNOPSIS = 1
SHORT = 2
SUMMARY = 2
SHORT = 3
NOTE = 4
# END Enum nwComment
+19 -8
View File
@@ -276,6 +276,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
if self._tHandle is None or not text:
return
xOff = 0
if text.startswith("@"): # Keywords and commands
self.setCurrentBlockState(BLOCK_META)
index = SHARED.project.index
@@ -333,12 +334,20 @@ class GuiDocHighlighter(QSyntaxHighlighter):
elif text.startswith("%"): # Comments
self.setCurrentBlockState(BLOCK_TEXT)
cStyle, _, cPos = processComment(text)
if cStyle == nwComment.PLAIN:
self.setFormat(0, len(text), self._hStyles["hidden"])
cStyle, cMod, _, cDot, cPos = processComment(text)
cLen = len(text) - cPos
xOff = cPos
if cMod == "ERR":
self.setFormat(0, cPos, self._hStyles["codeinval"])
elif cStyle == nwComment.PLAIN:
self.setFormat(0, cLen, self._hStyles["hidden"])
elif cMod:
self.setFormat(0, cDot, self._hStyles["modifier"])
self.setFormat(cDot, cPos - cDot, self._hStyles["optional"])
self.setFormat(cPos, cLen, self._hStyles["hidden"])
else:
self.setFormat(0, cPos, self._hStyles["modifier"])
self.setFormat(cPos, len(text), self._hStyles["hidden"])
self.setFormat(cPos, cLen, self._hStyles["hidden"])
else: # Text Paragraph
@@ -377,7 +386,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
self.setCurrentBlockUserData(data)
if self._spellCheck:
for xPos, xLen in data.spellCheck(text):
for xPos, xLen in data.spellCheck(text, xOff):
for x in range(xPos, xPos+xLen):
spFmt = self.format(x)
spFmt.merge(self._spellErr)
@@ -435,17 +444,19 @@ class TextBlockData(QTextBlockUserData):
"""Return spell error data from last check."""
return self._spellErrors
def spellCheck(self, text: str) -> list[tuple[int, int]]:
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.
"""
self._spellErrors = []
rxSpell = SPELLRX.globalMatch(text.replace("_", " "), 0)
rxSpell = SPELLRX.globalMatch(text[offset:].replace("_", " "), 0)
while rxSpell.hasNext():
rxMatch = rxSpell.next()
if not SHARED.spelling.checkWord(rxMatch.captured(0)):
if not rxMatch.captured(0).isnumeric() and not rxMatch.captured(0).isupper():
self._spellErrors.append((rxMatch.capturedStart(0), rxMatch.capturedLength(0)))
self._spellErrors.append(
(rxMatch.capturedStart(0) + offset, rxMatch.capturedLength(0))
)
return self._spellErrors
# END Class TextBlockData