@@ -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