Index: gc_core/py/char_player.py ================================================================== --- gc_core/py/char_player.py +++ gc_core/py/char_player.py @@ -28,12 +28,12 @@ d1to1 = { "1": "li", "2": "z", "3": "e", "4": "aà", - "5": "ge", - "6": "bd", + "5": "sg", + "6": "bdg", "7": "lt", "8": "b", "9": "gbd", "0": "o", @@ -41,11 +41,11 @@ "à": "aàâáäæ", "â": "aàâáäæ", "á": "aàâáäæ", "ä": "aàâáäæ", - "æ": "éa", + "æ": "æéa", "c": "cçskqśŝ", "ç": "cçskqśŝ", "e": "eéèêëœ", @@ -52,41 +52,33 @@ "é": "eéèêëœ", "ê": "eéèêëœ", "è": "eéèêëœ", "ë": "eéèêëœ", - "f": "fv", - - "g": "gjq", - - "i": "iîïylíìÿ", - "î": "iîïylíìÿ", - "ï": "iîïylíìÿ", - "í": "iîïylíìÿ", - "ì": "iîïylíìÿ", + "g": "gj", + + "i": "iîïyíìÿ", + "î": "iîïyíìÿ", + "ï": "iîïyíìÿ", + "í": "iîïyíìÿ", + "ì": "iîïyíìÿ", "j": "jg", "k": "kcq", - "l": "li", - - "n": "nñr", + "n": "nñ", "o": "oôóòöœ", "ô": "oôóòöœ", "ó": "oôóòöœ", "ò": "oôóòöœ", "ö": "oôóòöœ", "œ": "œoôeéèêë", - "p": "pb", - - "q": "ckg", - - "r": "rn", + "q": "qck", "s": "sśŝcç", "ś": "sśŝcç", "ŝ": "sśŝcç", @@ -94,11 +86,11 @@ "û": "uûùüú", "ù": "uûùüú", "ü": "uûùüú", "ú": "uûùüú", - "v": "vwf", + "v": "vw", "w": "wv", "x": "xck", Index: gc_core/py/ibdawg.py ================================================================== --- gc_core/py/ibdawg.py +++ gc_core/py/ibdawg.py @@ -189,17 +189,16 @@ # first, we check for similar words #return self._suggestWithCrushedUselessChars(cp.clearWord(sWord)) aSugg = self._suggest(sWord) if not aSugg: aSugg.update(self._suggest(sWord[1:])) - aSugg.update(self._suggest(sWord[:-1])) - aSugg.update(self._suggest(sWord[1:-1])) if not aSugg: aSugg.update(self._suggestWithCrushedUselessChars(cp.clearWord(sWord))) return aSugg def _suggest (self, sWord, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False): + "returns a set of suggestions for " # recursive function aSugg = set() if not sWord: if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: #show(nDeep, "___" + sNewWord + "___") @@ -228,10 +227,11 @@ #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) elif len(sWord) == 1: #show(nDeep, ":end of word:") # end of word + aSugg.update(self._suggest("", nDeep+1, iAddr, sNewWord, True)) for sRepl in cp.dFinal1.get(sWord, ()): #show(nDeep, sRepl) aSugg.update(self._suggest(sRepl, nDeep+1, iAddr, sNewWord, True)) return aSugg @@ -248,11 +248,11 @@ aTails = set() for nVal, jAddr in self._getArcs(iAddr): if nVal < self.nChar: if int.from_bytes(self.byDic[jAddr:jAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask: aTails.add(sTail + self.dCharVal[nVal]) - if n: + if n and not aTails: aTails.update(self._getTails(jAddr, sTail+self.dCharVal[nVal], n-1)) return aTails def _suggestWithCrushedUselessChars (self, sWord, nDeep=0, iAddr=0, sNewWord="", bAvoidLoop=False): aSugg = set() @@ -270,15 +270,11 @@ def _getSimilarArcsAndCrushedChars (self, cChar, iAddr): "generator: yield similar char of and address of the following node" for nVal, jAddr in self._getArcs(iAddr): if self.dCharVal.get(nVal, None) in cp.aUselessChar: yield (self.dCharVal[nVal], jAddr) - for c in cp.d1to1.get(cChar, [cChar]): - if c in self.dChar: - jAddr = self._lookupArcNode(self.dChar[c], iAddr) - if jAddr: - yield (c, jAddr) + yield from self._getSimilarArcs(cChar, iAddr) def drawPath (self, sWord, iAddr=0): cChar = sWord[0:1] if sWord else " " iPos = -1 n = 0 Index: gc_lang/fr/config.ini ================================================================== --- gc_lang/fr/config.ini +++ gc_lang/fr/config.ini @@ -3,11 +3,11 @@ lang_name = French locales = fr_FR fr_BE fr_CA fr_CH fr_LU fr_MC fr_BF fr_CI fr_SN fr_ML fr_NE fr_TG fr_BJ country_default = FR name = Grammalecte implname = grammalecte -version = 0.5.17.1 +version = 0.5.17.2 author = Olivier R. provider = Dicollecte link = http://grammalecte.net description = Correcteur grammatical pour le français. extras = README_fr.txt Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -77,11 +77,11 @@ OPT/ocr: False False False False False False OPT/conf: True True True True True True OPT/sgpl: True True True True True True OPT/gn: True True True True True True OPT/infi: True True True True True True -OPT/conj: True True False True True True +OPT/conj: True True True True True True OPT/ppas: True True True True True True OPT/imp: True True True True True True OPT/inte: True True True True True True OPT/vmode: True True True True True True OPT/bs: True True True True True True @@ -563,16 +563,25 @@ TEST: ces militant·e·s {{acharné}}. __[i](typo_écriture_épicène_singulier)__ ({w_2}[éuitsrn])(?:[-·–—./]e|[(]e[)]) @@0 - <<- option("typo") and not \0.endswith("·e") ->> \1·e # Écriture épicène. Utilisez les points médians. (Note : écriture journalistique brouillon.) + <<- option("typo") and not \0.endswith("·e") ->> \1·e # Écriture épicène. Utilisez un point médian. (Note : écriture journalistique brouillon.) <<- ~>> \1-e TEST: je suis {{déconsidéré.e}} par ma hiérarchie. TEST: il faut en parler à l’{{auteur(e)}} et à son agent. + +#__[i](typo_écriture_nombre_invariable)__ +# ({w_2})(?:[-·–—./]s|[(]s[)]) @@0 +# <<- option("typo") and not \0.endswith("·s") ->> \1·s # Utilisez un point médian. (Note : écriture journalistique brouillon.) +# <<- ~>> \1-s +# +#TEST: le ou les partis {{appelé(s)}} +#TEST: Appelé·s, levez-vous. + # Majuscules après un point __[s]/maj(majuscule_après_point)__ ({w_2})[.] ([a-zéàèî]\w*) @@0,$ <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1) @@ -582,11 +591,11 @@ TEST: Je suis là. {{viens}}. ->> Viens TEST: Ils sont devenus idiots. {{c}}’est peine perdue. __[s]/maj(majuscule_en_début_phrase)__ ^ *([a-zéèâàô][\w-]+) @@$ - <<- after("\w\w[.] +\w+") -1>> =\1.capitalize() # Majuscule en début de phrase, sauf éventuellement lors d’une énumération. + <<- after("\w\w[.] +\w+") -1>> =\1.capitalize() # Majuscule en début de phrase, sauf éventuellement lors d’une énumération. TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui. ## virgules manquantes @@ -10686,10 +10695,12 @@ TEST: les chattes {{finis}} TEST: les chattes {{manges}} TEST: les chattes {{danse}} TEST: certains hommes {{marchandes}} sans cesse TEST: certaines femmes {{danse}} beaucoup +TEST: Sauf que l’un comme l’autre avaient dû y renoncer. +TEST: L’un comme l’autre devaient y renoncer. __[i]/conj(conj_des_nom1)__ ^ *des +({w_2}) +({w_2}) @@w,$ <<- morph(\1, ":[NAQ].*:[pi]", False) and morphex(\2, ":V", ":(?:[13]p|P|G|Q|A.*:[pi])") and morph(word(1), ":(?:R|D.*:p)|>au ", False, True) >>> Index: gc_lang/fr/xpi/package.json ================================================================== --- gc_lang/fr/xpi/package.json +++ gc_lang/fr/xpi/package.json @@ -1,10 +1,10 @@ { "name": "grammalecte-fr", "title": "Grammalecte [fr]", "id": "French-GC@grammalecte.net", - "version": "0.5.17.1", + "version": "0.5.17.2", "description": "Correcteur grammatical pour le français", "homepage": "http://www.dicollecte.org/grammalecte", "main": "ui.js", "icon": "data/img/icon-48.png", "scripts": {