Index: gc_core/py/lang_core/tests_core.py ================================================================== --- gc_core/py/lang_core/tests_core.py +++ gc_core/py/lang_core/tests_core.py @@ -142,20 +142,19 @@ sRes = sRes[:dErr["nStart"]] + "~" * (dErr["nEnd"] - dErr["nStart"]) + sRes[dErr["nEnd"]:] sListErr += " * {sLineId} / {sRuleId} at {nStart}:{nEnd}\n".format(**dErr) lAllSugg.append("|".join(dErr["aSuggestions"])) self._aTestedRules.add(dErr["sRuleId"].rstrip("0123456789")) # test messages - if False: - aGramErrs = gc_engine.parse(purgeMessage(dErr["sMessage"])) - aGramErrs = [ dMsgErr for dMsgErr in sorted(aGramErrs, key=lambda d: d["nStart"]) if self._zRuleEnd.sub("", dMsgErr["sRuleId"]) != self._zRuleEnd.sub("", dErr["sRuleId"]) ] - aSpellErrs = self._oSpellChecker.parseParagraph(re.sub("‹\\w+›", lambda m: " " * len(m.group(0)), dErr["sMessage"])) - if aGramErrs or aSpellErrs or "" in dErr["sMessage"] or "" in dErr["sMessage"]: - print("\n# Error in: <" + dErr["sMessage"] + ">\n " + dErr["sLineId"] + " / " + dErr["sRuleId"]) - for dMsgErr in aGramErrs: - print(" error: {sLineId} / {sRuleId} at {nStart}:{nEnd}".format(**dMsgErr)) - for dMsgErr in aSpellErrs: - print(" spelling mistake: <{sValue}> at {nStart}:{nEnd}".format(**dMsgErr)) + aGramErrs = gc_engine.parse(purgeMessage(dErr["sMessage"])) + aGramErrs = [ dMsgErr for dMsgErr in sorted(aGramErrs, key=lambda d: d["nStart"]) if self._zRuleEnd.sub("", dMsgErr["sRuleId"]) != self._zRuleEnd.sub("", dErr["sRuleId"]) ] + aSpellErrs = self._oSpellChecker.parseParagraph(re.sub("‹[\\w ’-]+›", lambda m: " " * len(m.group(0)), dErr["sMessage"])) + if aGramErrs or aSpellErrs or "" in dErr["sMessage"] or "" in dErr["sMessage"]: + print("\n# Error in: <" + dErr["sMessage"] + ">\n " + dErr["sLineId"] + " / " + dErr["sRuleId"]) + for dMsgErr in aGramErrs: + print(" error: {sLineId} / {sRuleId} at {nStart}:{nEnd}".format(**dMsgErr)) + for dMsgErr in aSpellErrs: + print(" spelling mistake: <{sValue}> at {nStart}:{nEnd}".format(**dMsgErr)) return sRes, sListErr, "|||".join(lAllSugg) def _getExpectedErrors (self, sLine): sRes = " " * len(sLine) for i, m in enumerate(self._zError.finditer(sLine)): @@ -164,12 +163,15 @@ sRes = sRes[:nStart] + "~" * (nEnd - nStart) + sRes[nEnd:-4] return sRes def purgeMessage (sMessage): - sMessage = sMessage.replace("l’ ", "l’").replace("d’ ", "d’").replace("m’ ", "m’").replace("t’ ", "t’").replace("s’ ", "s’").replace("qu’ ", "qu’") - sMessage = sMessage.replace("L’ ", "L’").replace("D’ ", "D’").replace("M’ ", "M’").replace("T’ ", "T’").replace("S’ ", "S’").replace("QU’ ", "QU’") + for sToReplace, sReplacement in [ + ("l’ ", "l’"), ("d’ ", "d’"), ("n’ ", "n’"), ("j’ ", "j’"), ("m’ ", "m’"), ("t’ ", "t’"), ("s’ ", "s’"), ("qu’ ", "qu’"), + ("L’ ", "L’"), ("D’ ", "D’"), ("N’ ", "N’"), ("J’ ", "J’"), ("M’ ", "M’"), ("T’ ", "T’"), ("S’ ", "S’"), ("QU’ ", "QU’") + ]: + sMessage = sMessage.replace(sToReplace, sReplacement) return sMessage def main(): "start function" Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -1702,27 +1702,27 @@ !!! Purge de la phrase !! !!! !!! __tag_mots_entre_guillemets__ - « *WORD » + « [*WORD|*WORD_ELIDED] » <<- space_after(\1, 0, 1) and space_after(\2, 0, 1) /2>> eg1mot - « *WORD *WORD + « [*WORD|*WORD_ELIDED] [*WORD|*WORD_ELIDED] <<- space_after(\1, 0, 1) /2:0>> egxmot - *WORD *WORD » + [*WORD|*WORD_ELIDED] [*WORD|*WORD_ELIDED] » <<- space_after(\2, 0, 1) /1:2>> egxmot - [“|”|"] *WORD [“|”|"] - [‘|'|’|`] *WORD [‘|'|’|`] + [“|”|"] [*WORD|*WORD_ELIDED] [“|”|"] + [‘|'|’|`] [*WORD|*WORD_ELIDED] [‘|'|’|`] <<- space_after(\1, 0, 0) and space_after(\2, 0, 0) /2>> eg1mot - ["|“|”] *WORD *WORD + ["|“|”] [*WORD|*WORD_ELIDED] *[*WORD|*WORD_ELIDED] <<- space_after(\1, 0, 0) /2:0>> egxmot - *WORD *WORD ["|“|”] + [*WORD|*WORD_ELIDED] [*WORD|*WORD_ELIDED] ["|“|”] <<- space_after(\2, 0, 0) /1:2>> egxmot __purge_guillemets__ [«|»|“|”|"|„|`] @@ -3157,10 +3157,14 @@ [|,] ‹ $:Q › est [un|le] participe passé [|,] [“|”|"] $:V [“|”|"] est [une|la] forme verbale [|,] « $:V » est [une|la] forme verbale [|,] [‘|'|’|`] $:V [‘|'|’|`] est [une|la] forme verbale [|,] ‹ $:V › est [une|la] forme verbale + [|,] [“|”|"] *WORD [“|”|"] est [une|la] forme verbale interrogative + [|,] « *WORD » est [une|la] forme verbale interrogative + [|,] [‘|'|’|`] *WORD [‘|'|’|`] est [une|la] forme verbale interrogative + [|,] ‹ *WORD › est [une|la] forme verbale interrogative [|,] [“|”|"] [$:B|*NUM] [“|”|"] est [un|le] nombre [|,] « [$:B|*NUM] » est [un|le] nombre [|,] [‘|'|’|`] [$:B|*NUM] [‘|'|’|`] est [un|le] nombre [|,] ‹ [$:B|*NUM] › est [un|le] nombre [|,] [“|”|"] *PUNC [“|”|"] est [un|le] signe de ponctuation @@ -5343,11 +5347,11 @@ au jour d’ [hui+s|oui|huit] [au-jour-d’hui+s] au-jour d’ [hui+s|oui|huit] <<- /tu/ ->> aujourd’hui - && Soudez. “Aujourd’hui” : agglutination de l’ancienne locution “au jour d’hui”, dont le terme ‹hui› signifiait autrefois “en ce jour”.|https://fr.wiktionary.org/wiki/aujourd%E2%80%99hui + && Soudez. “Aujourd’hui” : agglutination de l’ancienne locution ‹au jour d’hui›, dont le terme ‹hui› signifiait autrefois “en ce jour”.|https://fr.wiktionary.org/wiki/aujourd%E2%80%99hui [basket|volley] ball <<- /tu/ ->> \1-\2 && Il manque un trait d’union. bas [>côté|coté|cotés] @@ -6927,12 +6931,12 @@ [ce|c’] @>être/:V¬:(?:N|A|3[sp]|P|Q|Ov) [ce|c’] [le|l’] @>être/:V¬:(?:N|A|3s|P|Q|Ov) [ce|c’] [ne|n’] ?[le|l’|en]¿ @>être/:V¬:(?:3[sp]|P|Q|Ov) <<- /conj/ --1>> =suggVerb(\-1, ":3s") && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier. - [c’|ç’] @:¬:(?:[123][sp]|Y|P|Ov|X)|>que/ - <<- /conf/ -2>> =suggSimil(\2, ":3s", False) && Incohérence avec « \1 » : « \2 » devrait être un verbe. + [c’|ç’] @:¬:(?:[123][sp]|Y|P|Ov|X)|>(?:que|[bcdfgjklmnpqrstvwxz].*:N.*:m:[si])/ + <<- /conf/ not tag(\1, "eg1mot") -2>> =suggSimil(\2, ":3s", False) && Incohérence avec « \1 » : « \2 » devrait être un verbe. TEST: pour toi qui sais tout, ce ne le {{fus}} pas TEST: ce secret tu, ce {{devais}} être un cauchemar. TEST: Ce peut être un chien ou un chat. TEST: ce ne peut être aussi stupide. @@ -6942,10 +6946,11 @@ TEST: ce ne pourrait être une chose aussi banale. TEST: ce serait une honte d’échouer une fois de plus à un test aussi élémentaire. TEST: ce ne saurait être cet homme… TEST: C’en est trop ! TEST: C’que j’comprends, c’est qu’il y a des limites à ce qu’on peut supporter. +TEST: c’con est trop con __conj_c_en!6__ c’ en *WORD <<- /conj/ morph(\3, ">(?:être|devoir|devenir|pouvoir|vouloir|savoir)/:V", ":3s") @@ -9330,11 +9335,11 @@ <<- /conf/ not \1.isupper() and \2.islower() and not (value(<1, "|pour|") and value(\2, "|faire|")) -1>> se && Confusion : « \2 » est une forme verbale. Exemples : ce bâtiment, se perdre. ce [/-il|/-ils|/-elle|/-elles|/-iel|/-iels|/-on] <<- /conf/ not \1.isupper() and \2.islower() - -1>> se && Confusion : « \2 » est une forme verbale. Exemples : ce bâtiment, se perdre. + -1>> se && Confusion : « \2 » est une forme verbale interrogative. Exemples : ce bâtiment, se perdre. [ce|c’] qui ce passe <<- /conf/ -3>> se && Confusion : « \4 » est une forme verbale. Exemples : ce bâtiment, se perdre. [ne|n’] ce @@ -19532,10 +19537,19 @@ TEST: Nous avons déconné, nous avons été mis à l’{{amande}}. TEST: Ces gens-là ne feront jamais {{amande honorable}}. TEST: achète de la pâte d’{{amende}} TEST: feront-ils {{amande honorable}} + +# ancre / encre +__conf_ancre_encre__ + >faire couler beaucoup d’ >ancre + >faire couler l’ >ancre + <<- /conf/ --1>> encre && Confusion probable. Locution “faire couler beaucoup d’encre”.|https://fr.wiktionary.org/wiki/faire_couler_l%E2%80%99encre + +TEST: cette idylle a fait couler beaucoup d’{{ancre}} ->> encre + # annales / anal-e-s __conf_annales_anales__ >anal [>littéraire|>politique|>ecclésiastique] >anal du [baccalauréat|bac|brevet|concours]