@@ -165,14 +165,12 @@
oSentence.update(s)
bSentenceChange = False
for sGraphName, sLineId in lRuleGroup:
if bDebug:
print("\n>>>> GRAPH:", sGraphName, sLineId)
- bParagraphChange, errs = oSentence.parse(dAllGraph[sGraphName], dPriority, sCountry, dOptions, bShowRuleId, bDebug, bContext)
- dErrs.update(errs)
- if bParagraphChange:
- s = oSentence.rewrite(bDebug)
+ bParagraphChange, s = oSentence.parse(dAllGraph[sGraphName], dPriority, sCountry, dOptions, bShowRuleId, bDebug, bContext)
+ dErrs.update(oSentence.dError)
elif not sOption or dOptions.get(sOption, False):
# regex rules
for zRegex, bUppercase, sLineId, sRuleId, nPriority, lActions in lRuleGroup:
if sRuleId not in _aIgnoredRules:
for m in zRegex.finditer(s):
@@ -576,12 +574,10 @@
return True
-
-
#### TOKEN SENTENCE CHECKER
class TokenSentence:
def __init__ (self, sSentence, sSentence0, nOffset):
@@ -589,10 +585,11 @@
self.sSentence0 = sSentence0
self.nOffsetWithinParagraph = nOffset
self.lToken = list(_oTokenizer.genTokens(sSentence, True))
self.dTokenPos = { dToken["nStart"]: dToken for dToken in self.lToken }
self.dTags = {}
+ self.dError = {}
self.createError = self._createWriterError if _bWriterError else self._createDictError
def update (self, sSentence):
self.sSentence = sSentence
self.lToken = list(_oTokenizer.genTokens(sSentence, True))
@@ -689,15 +686,15 @@
print(" MATCH: *" + sMeta)
yield dGraph[dNode[""][sMeta]]
def parse (self, dGraph, dPriority, sCountry="${country_default}", dOptions=None, bShowRuleId=False, bDebug=False, bContext=False):
- dErr = {}
+ self.dError = {}
dPriority = {} # Key = position; value = priority
dOpt = _dOptions if not dOptions else dOptions
lPointer = []
- bChange = False
+ bTagAndRewrite = False
for dToken in self.lToken:
if bDebug:
print("TOKEN:", dToken["sValue"])
# check arcs for each existing pointer
lNextPointer = []
@@ -711,19 +708,21 @@
# check if there is rules to check for each pointer
for dPointer in lPointer:
#if bDebug:
# print("+", dPointer)
if "" in dPointer["dNode"]:
- bHasChanged, errs = self._executeActions(dGraph, dPointer["dNode"][""], dPointer["iToken"]-1, dToken["i"], dPriority, dOpt, sCountry, bShowRuleId, bDebug, bContext)
- dErr.update(errs)
- if bHasChanged:
- bChange = True
- return (bChange, dErr)
+ bChange, dErr = self._executeActions(dGraph, dPointer["dNode"][""], dPointer["iToken"]-1, dToken["i"], dPriority, dOpt, sCountry, bShowRuleId, bDebug, bContext)
+ self.dError.update(dErr)
+ if bChange:
+ bTagAndRewrite = True
+ if bTagAndRewrite:
+ self.rewrite(bDebug)
+ return (bTagAndRewrite, self.sSentence)
def _executeActions (self, dGraph, dNode, nTokenOffset, nLastToken, dPriority, dOptions, sCountry, bShowRuleId, bDebug, bContext):
"execute actions found in the DARG"
- dErrs = {}
+ dError = {}
bChange = False
for sLineId, nextNodeKey in dNode.items():
bCondMemo = None
for sRuleId in dGraph[nextNodeKey]:
try:
@@ -740,18 +739,19 @@
bCondMemo = not sFuncCond or globals()[sFuncCond](self.lToken, nTokenOffset, nLastToken, sCountry, bCondMemo, self.dTags, self.sSentence, self.sSentence0)
if bCondMemo:
if cActionType == "-":
# grammar error
nTokenErrorStart = nTokenOffset + eAct[0]
- nTokenErrorEnd = (nTokenOffset + eAct[1]) if eAct[1] else nLastToken
- nErrorStart = self.nOffsetWithinParagraph + self.lToken[nTokenErrorStart]["nStart"]
- nErrorEnd = self.nOffsetWithinParagraph + self.lToken[nTokenErrorEnd]["nEnd"]
- if nErrorStart not in dErrs or eAct[2] > dPriority.get(nErrorStart, -1):
- dErrs[nErrorStart] = self.createError(sWhat, nTokenOffset, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, True, eAct[3], eAct[4], bShowRuleId, "notype", bContext)
- dPriority[nErrorStart] = eAct[2]
- if bDebug:
- print("-", sRuleId, dErrs[nErrorStart])
+ if "bImmune" not in self.lToken[nTokenErrorStart]:
+ nTokenErrorEnd = (nTokenOffset + eAct[1]) if eAct[1] else nLastToken
+ nErrorStart = self.nOffsetWithinParagraph + self.lToken[nTokenErrorStart]["nStart"]
+ nErrorEnd = self.nOffsetWithinParagraph + self.lToken[nTokenErrorEnd]["nEnd"]
+ if nErrorStart not in dError or eAct[2] > dPriority.get(nErrorStart, -1):
+ dError[nErrorStart] = self.createError(sWhat, nTokenOffset, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, True, eAct[3], eAct[4], bShowRuleId, "notype", bContext)
+ dPriority[nErrorStart] = eAct[2]
+ if bDebug:
+ print("-", sRuleId, dError[nErrorStart])
elif cActionType == "~":
# text processor
nEndToken = (nTokenOffset + eAct[1]) if eAct[1] else nLastToken
self._tagAndPrepareTokenForRewriting(sWhat, nTokenOffset + eAct[0], nEndToken, bDebug)
if bDebug:
@@ -782,11 +782,11 @@
if bDebug:
print(">!", sRuleId)
break
except Exception as e:
raise Exception(str(e), sLineId, sRuleId, self.sSentence)
- return bChange, dErrs
+ return bChange, dError
def _createWriterError (self, sSugg, nTokenOffset, iFirstToken, nStart, nEnd, sLineId, sRuleId, bUppercase, sMsg, sURL, bShowRuleId, sOption, bContext):
"error for Writer (LO/OO)"
xErr = SingleProofreadingError()
#xErr = uno.createUnoStruct( "com.sun.star.linguistic2.SingleProofreadingError" )
@@ -881,10 +881,17 @@
if nTokenRewriteEnd - nTokenRewriteStart == 0:
self.lToken[nTokenRewriteStart]["bToRemove"] = True
else:
for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
self.lToken[i]["bToRemove"] = True
+ elif sWhat == "!":
+ # immunity
+ if nTokenRewriteEnd - nTokenRewriteStart == 0:
+ self.lToken[nTokenRewriteStart]["bImmune"] = True
+ else:
+ for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
+ self.lToken[i]["bImmune"] = True
else:
if sWhat.startswith("="):
sWhat = globals()[sWhat[1:]](self.lToken)
bUppercase = bUppercase and self.lToken[nTokenRewriteStart]["sValue"][0:1].isupper()
if nTokenRewriteEnd - nTokenRewriteStart == 0:
@@ -904,10 +911,14 @@
def rewrite (self, bDebug=False):
"rewrite the sentence, modify tokens, purge the token list"
lNewToken = []
for i, dToken in enumerate(self.lToken):
+ if "bImmune" in dToken:
+ nErrorStart = self.nOffsetWithinParagraph + dToken["nStart"]
+ if nErrorStart in self.dError:
+ del self.dError[nErrorStart]
if "bToRemove" in dToken:
# remove useless token
self.sSentence = self.sSentence[:dToken["nStart"]] + " " * (dToken["nEnd"] - dToken["nStart"]) + self.sSentence[dToken["nEnd"]:]
if bDebug:
print("removed:", dToken["sValue"])
@@ -925,11 +936,10 @@
del dToken["sNewValue"]
if bDebug:
print(self.sSentence)
self.lToken.clear()
self.lToken = lNewToken
- return self.sSentence
#### Analyse tokens