Index: gc_lang/fr/modules-js/gce_suggestions.js ================================================================== --- gc_lang/fr/modules-js/gce_suggestions.js +++ gc_lang/fr/modules-js/gce_suggestions.js @@ -669,14 +669,14 @@ return "_"; } const _dNormalizedCharsForInclusiveWriting = new Map([ - ['(', '_'], [')', '_'], - ['.', '_'], ['·', '_'], ['•', '_'], - ['–', '_'], ['—', '_'], - ['/', '_'] + ['(', '·'], [')', '·'], + ['.', '·'], ['·', '·'], ['•', '·'], + ['–', '·'], ['—', '·'], + ['/', '·'] ]); function normalizeInclusiveWriting (sToken) { let sRes = ""; for (let c of sToken) { @@ -684,7 +684,8 @@ sRes += _dNormalizedCharsForInclusiveWriting.get(c); } else { sRes += c; } } + sRes = sRes.replace("èr·", "er·").replace("ÈR·", "ER·"); return sRes; } Index: gc_lang/fr/modules/gce_suggestions.py ================================================================== --- gc_lang/fr/modules/gce_suggestions.py +++ gc_lang/fr/modules/gce_suggestions.py @@ -527,15 +527,15 @@ _xNormalizedCharsForInclusiveWriting = str.maketrans({ - '(': '_', ')': '_', - '.': '_', '·': '_', '•': '_', - '–': '_', '—': '_', - '/': '_' + '(': '·', ')': '·', + '.': '·', '·': '·', '•': '·', + '–': '·', '—': '·', + '/': '·' }) def normalizeInclusiveWriting (sToken): "typography: replace word separators used in inclusive writing by underscore (_)" - return sToken.translate(_xNormalizedCharsForInclusiveWriting) + return sToken.translate(_xNormalizedCharsForInclusiveWriting).replace("èr·", "er·").replace("ÈR·", "ER·") Index: gc_lang/fr/perf_memo.txt ================================================================== --- gc_lang/fr/perf_memo.txt +++ gc_lang/fr/perf_memo.txt @@ -33,5 +33,6 @@ 1.12.2 2020.09.09 13:34 1.50568 0.374504 0.233108 0.0798712 0.0804466 0.0769674 0.171519 0.0945132 0.0165344 0.0019474 1.12.2 2020.09.09 13:35 1.41094 0.359093 0.236443 0.06968 0.0734418 0.0738087 0.169371 0.0946279 0.0167106 0.0019773 1.12.2 2020.09.11 19:16 1.35297 0.330545 0.221731 0.0666998 0.0692539 0.0701707 0.160564 0.0891676 0.015807 0.0045998 1.12.2 2020.09.30 14:50 1.37531 0.330381 0.226012 0.0668063 0.0690574 0.0694727 0.160282 0.0929373 0.0176629 0.0019713 1.12.2 2020.09.30 17:01 1.37168 0.329009 0.248127 0.0670758 0.0701238 0.0910568 0.170556 0.093876 0.0168925 0.0020051 +1.12.2 2020.10.01 11:18 1.36493 0.34176 0.24473 0.0691607 0.0720002 0.0903613 0.170067 0.0934571 0.0174357 0.0019585 Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -562,17 +562,17 @@ [a-zA-Z][.][a-zA-Z][.](?:[a-zA-Z][.])* <<- not re.search("(?i)^(?:i\\.e\\.|s\\.[tv]\\.p\\.|e\\.g\\.|a\\.k\\.a\\.|c\\.q\\.f\\.d\\.|b\\.a\\.|n\\.b\\.)$", \0) >>> <<- \0.__len__() == 4 ->> =\0.replace(".", "").upper() + "|" + \0[0:2] + " " + \0[2:4] && Sigle. Il est recommandé d’ôter les points pour les sigles. (S’il s’agit d’un prénom et d’un nom, mettez un espace.)|https://fr.wikipedia.org/wiki/Sigle#Typographie <<- __else__ ->> =\0.replace(".", "").upper() && Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie - <<- \0 != "b.a." ~>> =\0.replace(".", "_") + <<- \0 != "b.a." ~>> =\0.replace(".", "-") __[s>(p_sigle3)__ J[.]-[A-Z][.] <<- ~>> =\0.replace(".", "").replace("-","") # Mr et MM __[s>(p_M_point)__ - (M[.]) (?:[A-ZÉÈÎ]\w*|l[e'’]) @@0 <<- ~1>> Mr + (M[.]) (?:[A-ZÉÈÎ]\w*|l[ae'’]) @@0 <<- ~1>> Mr __[s>(p_MM_point)__ MM[.] <<- ~>> "MM " __[s>(p_Mr_Mgr_Mme_point)__ M(?:r|gr|me) [A-ZÉ]([.])(?=\W+[a-zéèêâîïû]) @@$ <<- ~1>> * @@ -584,11 +584,11 @@ ([A-ZÉÈÂÎ][\w-]+)[  ][A-ZÉÈÂ]([.]) @@0,$ <<- morph(\1, ":M[12]") and after("^\\W+[a-zéèêîïâ]") ~2>> _ # Patronymes composés avec Le/La/Les __[s](p_patronyme_composé_avec_le_la_les)__ - [A-ZÉÈÂÎ][\w-]+[-–—]L(?:es?|a) [A-ZÉÈÂÎ][\w-]+ <<- ~>> =\0.replace(" ", "_") + [A-ZÉÈÂÎ][\w-]+[-–—]L(?:es?|a) [A-ZÉÈÂÎ][\w-]+ <<- ~>> =\0.replace(" ", "-") # IP __[s](p_adresse_IP)__ \d+[.:]\d+[.:]\d+[.:]\d+ <<- ~>> * @@ -789,22 +789,24 @@ <<- option("eepi") ->> tous et toutes|toutes et tous && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- ~>> =normalizeInclusiveWriting(\0) TEST: {{tou.tes}} sont là. ->> tous et toutes|toutes et tous +TEST: {{tou·tes}} sont là. ->> tous et toutes|toutes et tous __[i](eepi_écriture_épicène_ceux_celles)__ c[./·•⋅–—-]?eux?[./·•⋅–—-]elles <<- option("eepi") ->> ceux et celles|celles et ceux && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- ~>> =normalizeInclusiveWriting(\0) TEST: avec {{ceux.elles}} qui viendront ->> ceux et celles|celles et ceux +TEST: {{c·eux·elles}} ->> ceux et celles|celles et ceux -__[u](eepi_écriture_épicène_pluriel_eur_divers)__ +__[i](eepi_écriture_épicène_pluriel_eur_divers)__ ({w_2})eurs?[.(/·•⋅–—-][tdp]?(rice|euse|se|[oe]resse)[.)/·•⋅–—-]?s @@0,** <<- option("eepi") and \2 != "se" ->> \1eurs et \1\2s|\1\2s et \1eurs && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- option("eepi") and \2 == "se" ->> \1eurs et \1euses|\1euses et \1eurs && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. @@ -812,55 +814,57 @@ TEST: travaillons avec les {{instituteur.trice.s}} ->> instituteurs et institutrices|institutrices et instituteurs TEST: La communauté des {{développeur·se·s}} open source ->> développeurs et développeuses|développeuses et développeurs -__[u](eepi_écriture_épicène_pluriel_eux_euses)__ +__[i](eepi_écriture_épicène_pluriel_eux_euses)__ ({w_2})eux[.(/·•⋅–—-](?:[tdsi]?euse|se)[.)/·•⋅–—-]?s @@0 <<- option("eepi") ->> \1eux et \1euses|\1euses et \1eux && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- ~>> =normalizeInclusiveWriting(\0) TEST: {{nombreux·ses}} sont les profs qui s’indignent de cette situation. ->> nombreux et nombreuses|nombreuses et nombreux -__[u](eepi_écriture_épicène_pluriel_if_ive)__ +__[i](eepi_écriture_épicène_pluriel_if_ive)__ ({w_2})ifs?[.(/·•⋅–—-][std]?i?ve[.)/·•⋅–—-]?s @@0 <<- option("eepi") ->> \1ifs et \1ives|\1ives et \1ifs && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- ~>> =normalizeInclusiveWriting(\0) TEST: {{inclusif.ive.s}} ->> inclusifs et inclusives|inclusives et inclusifs TEST: {{offensif.ve.s}} ->> offensifs et offensives|offensives et offensifs -__[u](eepi_écriture_épicène_pluriel_er_ère)__ - ({w_2})[eè]rs?[.(/·•⋅–—-]i?è?re[.)/·•⋅–—-]?s @@0 - <<- option("eepi") and not re.search("[rR]·[eE]·[sS]$", \0) ->> \1ers et \1ères|\1ères et \1ers|\1er·e·s +__[i](eepi_écriture_épicène_pluriel_er_ère)__ + ({w_2})[eè]rs?[.(/·•⋅–—-](?:i?è?re|e)[.)/·•⋅–—-]?s @@0 + <<- option("eepi") and not re.search("[eE][rR]·[eE]·[sS]$", \0) ->> \1er·e·s|\1ers et \1ères|\1ères et \1ers && Écriture épicène dystypographique et imprononçable. À des fins de lisibilité, il est préférable d’éviter l’abus de graphies épicènes trop complexes. <<- ~>> =normalizeInclusiveWriting(\0) -TEST: les {{conseiller.ière.s}} ->> conseillers et conseillères|conseillères et conseillers|conseiller·e·s -#TEST: les {{artificièr.e.s}} ->> artificiers et artificières|artificières et artificiers +TEST: les {{conseiller.ière.s}} ->> conseiller·e·s|conseillers et conseillères|conseillères et conseillers +TEST: les {{artificièr.e.s}} ->> artificier·e·s|artificiers et artificières|artificières et artificiers +TEST: les {{artificièr·e·s}} ->> artificier·e·s|artificiers et artificières|artificières et artificiers +TEST: les artificier·e·s -__[u](eepi_écriture_épicène_pluriel_aux_ales)__ +__[i](eepi_écriture_épicène_pluriel_aux_ales)__ ({w_2})aux[.(/·•⋅–—-][tnmcpbd]?a?le[.)/·•⋅–—-]?s @@0 <<- option("eepi") ->> \1al·e·s|\1aux et \1ales|\1ales et \1aux && Écriture épicène dystypographique et imprononçable. Pour ce cas, il peut être intéressant de faire comme si le pluriel masculin était régulier, ce qui rend l’ensemble prononçable… <<- ~>> =normalizeInclusiveWriting(\0) TEST: {{locaux·ales}} ->> local·e·s|locaux et locales|locales et locaux -TEST: LOCAL·E·S -TEST: amical·e·s +TEST: NOUS SOMMES LOCAL·E·S +TEST: nous sommes amical·e·s -__[u](eepi_écriture_épicène_pluriel_e)__ - ({w_1}[éuitsrnldf])[-·–—.•⋅(/]([ntlf]?e)[-·–—.•⋅)/]?s @@0,** +__[i](eepi_écriture_épicène_pluriel_e)__ + ({w_1}[éuitsnldf])[-·–—.•⋅(/]([ntlf]?e)[-·–—.•⋅)/]?s @@0,** <<- not (\0.endswith(".Les") or \0.endswith(".Tes")) >>> <<- ~>> =normalizeInclusiveWriting(\0) - <<- option("eepi") and not \0.endswith("les") and not \0.endswith("LES") and not re.search("(?i)·[ntlf]?e·s$", \0) >>> + <<- option("eepi") and not \0.endswith("les") and not \0.endswith("LES") and not re.search("·[ntlfNTLF]?[eE]·[sS]$", \0) >>> <<- \1.endswith("s") or \1.endswith("S") ->> \1·\2·s|\1 et \1\2s|\1\2s et \1 && Écriture épicène. Utilisez les points médians ou écrivez en toutes lettres. <<- __else__ ->> \1·\2·s|\1s et \1\2s|\1\2s et \1s && Écriture épicène. Utilisez les points médians ou écrivez en toutes lettres. TEST: nous sommes {{déconsidéré-e-s}}. TEST: serons-nous toujours {{perdu.e.s}}. @@ -874,13 +878,16 @@ TEST: chez les {{immortel.le.s}} TEST: Nous sommes {{tombé.es}} par hasard TEST: Nous avons été {{révolté.es}} de cette novlangue politique TEST: Pour survivre, nous sommes {{devenu.es}} des archéologues. TEST: {{enthousiasmé.es}} par un tri collectif de noix -TEST: IMMORTEL·LE·S -TEST: Berlinois·e·s -TEST: Iranien·ne·s +TEST: LES IMMORTEL·LE·S +TEST: les mortel·le·s +TEST: des Berlinois·e·s +TEST: les Iranien·ne·s +TEST: les chef·fe·s +TEST: nos descendant·e·s __[i](eepi_écriture_épicène_singulier)__ ({w_1}[éuitsrnldf])([-·–—.•⋅/][ntl]?e|[(][ntl]?e[)]) @@0,$ <<- not (\0.endswith(".Le") or \0.endswith(".Ne") or \0.endswith(".De")) @@ -893,13 +900,13 @@ TEST: il faut en parler à l’{{auteur(e)}} et à son agent. ->> auteur·e TEST: le ou la {{patron/ne}} ->> patron·ne TEST: Totalement {{con(ne)}} ->> con·ne TEST: un ou une {{intellectuel.le}} ->> intellectuel·le TEST: {{un/e}} immortel·le ->> un·e|un ou une|une ou un -TEST: INTELLECTUEL·LE -TEST: électricien·ne -TEST: Épuisé·e +TEST: UN OU UNE INTELLECTUEL·LE +TEST: un ou une électricien·ne +TEST: femme ou homme épuisé·e TEST: un·e idiot·e __[i](typo_écriture_invariable)__ ({w_3})([-·–—.•⋅/]s|[(]s[)]) @@0,$ @@ -908,11 +915,10 @@ ->> \1·s && Écriture invariable. Utilisez un point médian. TEST: la ou les {{fille(s)}} ->> fille·s TEST: le ou les patron·s TEST: combien de rad/s - !! !! !!!! Majuscules manquantes !! @@ -1471,13 +1477,13 @@ TEST: __ocr__ {{[e}} chien a faim __[i]/conf(conf_1e_1a_1es)__ [1[\]][ea]s? - <<- \0.endswith("e") and (morph(word(1), ":(?:N.*:[me]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> le && Erreur de frappe ? - <<- \0.endswith("a") and (morph(word(1), ":(?:N.*:[fe]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> la && Erreur de frappe ? - <<- \0.endswith("es") and (morph(word(1), ":(?:N.*:[pi]|V)", ":G") or morph(word(-1), ">ne/")) ->> les && Erreur de frappe ? + <<- \0.endswith("e") and (morph(word(1), ":(?:[NA].*:[me]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> le && Erreur de frappe ? + <<- \0.endswith("a") and (morph(word(1), ":(?:[NA].*:[fe]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> la && Erreur de frappe ? + <<- \0.endswith("es") and (morph(word(1), ":(?:[NA].*:[pi]|V)", ":G") or morph(word(-1), ">ne/")) ->> les && Erreur de frappe ? TEST: {{1e}} marginal ->> le TEST: {{1a}} venue des problèmes ->> la TEST: {{1es}} enfants sont au lit ->> les TEST: Je… ne {{1e}}… crois pas… @@ -1602,20 +1608,10 @@ TEST: année {{2O11}} ->> 2011 TEST: {{3O}} (chiffre avec un O). ->> 30 -!!!! Écritures épicènes invariables !! - -__[i](d_eepi_écriture_épicène_pluriel)__ - ({w_1}[éuitsrn])_(?:[nt]|)e_s @@0 - <<- morph(\1, ":[NAQ]", ":G") =>> define(\1, ":N:A:Q:e:p") - -__[i](d_eepi_écriture_épicène_singulier)__ - ({w_2}[éuitsrn])_e @@0 - <<- morph(\1, ":[NAQ]") =>> define(\1, ":N:A:Q:e:s") - !!!! Purge des références aux notes !! # les références aux notes __(p_exposants)__ @@ -2389,10 +2385,53 @@ ~^[A-ZÀÂÉÈÊÎÔ]. Airways <<- ~>> ␣ <<- =>> define(\2, ":MP:e:i") + +__écritures_épicènes_invariables__ + [tous|tou] · tes + [tous|tou] · te · s + <<- ~>> ␣ + + c · [eu|eux] · [elles|celles] + [ceu|ceux] · [elles|celles] + <<- ~>> ␣ + + *WORD · e · s + *WORD · [ce|rice|drice|price|trice] · s + *WORD · [fe|ffe] · s + *WORD · [le|ale|bale|cale|dale|male|nale|pale|tale] · s + *WORD · [ne|ane|ène|ine|nne|enne] · s + *WORD · [ire|ière|ère|re] · s + *WORD · [se|euse|ieuse|deuse|peuse|teuse] · s + *WORD · [eresse|oresse] · s + *WORD · [ve|ive|dive|sive|tive] · s + *WORD · [te|ate|ète|ite|tte] · s + *WORD · es + *WORD · [ces|rices|drices|prices|trices] + *WORD · [fes|ffes] + *WORD · [les|ales|bales|cales|dales|males|nales|pales|tales] + *WORD · [nes|anes|ènes|ines|nnes|ennes] + *WORD · [res|ires|ières|ères] + *WORD · [ses|euses|ieuses|deuses|peuses|teuses] + *WORD · [eresses|oresses] + *WORD · [ves|ives|dives|sives|tives] + *WORD · [tes|ates|ètes|ites|ttes] + <<- ~>> ␣ + <<- morph(\1, ":[NAQ]", ":G") =>> define(\1, ":N:A:Q:e:p") + + *WORD · [e|fe|le|ne|se|te] + <<- not value(>1, "|·|") >>> + <<- ~>> ␣ + <<- morph(\1, ":[NAQ]", ":G") =>> define(\1, ":N:A:Q:e:s") + + *WORD · s + <<- not value(<1, "|·|") >>> + <<- ~>> ␣ + <<- morph(\1, ":[NAQ]", ":G") =>> define(\1, ":N:A:Q:e:p") + __immunités__ il y a il n’ y a <<- !-1>> Index: graphspell-js/spellchecker.js ================================================================== --- graphspell-js/spellchecker.js +++ graphspell-js/spellchecker.js @@ -228,11 +228,10 @@ // IBDAWG functions isValidToken (sToken) { // checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked) - sToken = sToken.gl_trim("_"); if (this.oMainDic.isValidToken(sToken)) { return true; } if (this.bCommunityDic && this.oCommunityDic.isValidToken(sToken)) { return true; @@ -271,11 +270,10 @@ return false; } getMorph (sWord) { // retrieves morphologies list, different casing allowed - sWord = sWord.gl_trim("_"); if (this.bStorage && this._dMorphologies.has(sWord)) { return this._dMorphologies.get(sWord); } let lMorph = this.oMainDic.getMorph(sWord); if (this.bCommunityDic) { @@ -292,11 +290,10 @@ return lMorph; } getLemma (sWord) { // retrieves lemmas - sWord = sWord.gl_trim("_"); if (this.bStorage) { if (!this._dLemmas.has(sWord)) { this.getMorph(sWord); } return this._dLemmas.get(sWord); @@ -304,11 +301,10 @@ return Array.from(new Set(this.getMorph(sWord).map((sMorph) => { return sMorph.slice(1, sMorph.indexOf("/")); }))); } * suggest (sWord, nSuggLimit=10) { // generator: returns 1, 2 or 3 lists of suggestions - sWord = sWord.gl_trim("_"); if (this.lexicographer) { if (this.lexicographer.dSugg.has(sWord)) { yield this.lexicographer.dSugg.get(sWord).split("|"); } else if (sWord.gl_isTitle() && this.lexicographer.dSugg.has(sWord.toLowerCase())) { let lRes = this.lexicographer.dSugg.get(sWord.toLowerCase()).split("|"); Index: graphspell-js/tokenizer.js ================================================================== --- graphspell-js/tokenizer.js +++ graphspell-js/tokenizer.js @@ -23,11 +23,11 @@ [/^\[\/?[a-zA-Z]+\]/, 'PSEUDOHTML'], [/^&\w+;(?:\w+;|)/, 'HTMLENTITY'], [/^\d\d?[h:]\d\d(?:[m:]\d\ds?|)\b/, 'HOUR'], [/^\d+(?:[.,]\d+|)/, 'NUM'], [/^[&%‰€$+±=*/<>⩾⩽#|×¥£§¢¬÷@-]/, 'SIGN'], - [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ_]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ_]+)*/, 'WORD'], + [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ]+)*/, 'WORD'], [/^\S/, 'OTHER'] ], "fr": [ [/^[   \t]+/, 'SPACE'], @@ -43,11 +43,11 @@ [/^(?:l|d|n|m|t|s|j|c|ç|lorsqu|puisqu|jusqu|quoiqu|qu|presqu|quelqu)['’ʼ‘‛´`′‵՚ꞌꞋ]/i, 'WORD_ELIDED'], [/^\d\d?[h:]\d\d(?:[m:]\d\ds?|)\b/, 'HOUR'], [/^\d+(?:ers?\b|res?\b|è[rm]es?\b|i[èe][mr]es?\b|de?s?\b|nde?s?\b|ès?\b|es?\b|ᵉʳˢ?|ʳᵉˢ?|ᵈᵉ?ˢ?|ⁿᵈᵉ?ˢ?|ᵉˢ?)/, 'WORD_ORDINAL'], [/^\d+(?:[.,]\d+|)/, 'NUM'], [/^[&%‰€$+±=*/<>⩾⩽#|×¥£§¢¬÷@-]/, 'SIGN'], - [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ_]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ_]+)*/, 'WORD'], + [/^[a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ]+(?:[’'`-][a-zA-Zà-öÀ-Ö0-9ø-ÿØ-ßĀ-ʯff-stᴀ-ᶿ\u0300-\u036fᵉʳˢⁿᵈ]+)*/, 'WORD'], [/^\S/, 'OTHER'], ] }; Index: graphspell/spellchecker.py ================================================================== --- graphspell/spellchecker.py +++ graphspell/spellchecker.py @@ -211,11 +211,10 @@ # IBDAWG functions def isValidToken (self, sToken): "checks if sToken is valid (if there is hyphens in sToken, sToken is split, each part is checked)" - sToken = sToken.strip("_") if self.oMainDic.isValidToken(sToken): return True if self.bCommunityDic and self.oCommunityDic.isValidToken(sToken): return True if self.bPersonalDic and self.oPersonalDic.isValidToken(sToken): @@ -242,11 +241,10 @@ return True return False def getMorph (self, sWord): "retrieves morphologies list, different casing allowed" - sWord = sWord.strip("_") if self.bStorage and sWord in self._dMorphologies: return self._dMorphologies[sWord] lMorph = self.oMainDic.getMorph(sWord) if self.bCommunityDic: lMorph.extend(self.oCommunityDic.getMorph(sWord)) @@ -257,20 +255,18 @@ self._dLemmas[sWord] = { s[1:s.find("/")] for s in lMorph } return lMorph def getLemma (self, sWord): "retrieves lemmas" - sWord = sWord.strip("_") if self.bStorage: if sWord not in self._dLemmas: self.getMorph(sWord) return self._dLemmas[sWord] return { s[1:s.find("/")] for s in self.getMorph(sWord) } def suggest (self, sWord, nSuggLimit=10): "generator: returns 1, 2 or 3 lists of suggestions" - sWord = sWord.strip("_") if self.lexicographer: if sWord in self.lexicographer.dSugg: yield self.lexicographer.dSugg[sWord].split("|") elif sWord.istitle() and sWord.lower() in self.lexicographer.dSugg: lRes = self.lexicographer.dSugg[sWord.lower()].split("|") Index: graphspell/tokenizer.py ================================================================== --- graphspell/tokenizer.py +++ graphspell/tokenizer.py @@ -19,11 +19,11 @@ r'(?P<\w+.*?>|)', r'(?P\[/?\w+\])', r'(?P\d\d?[h:]\d\d(?:[m:]\d\ds?|)\b)', r'(?P\d+(?:[.,]\d+))', r'(?P[&%‰€$+±=*/<>⩾⩽#|×¥£§¢¬÷@-])', - r"(?P[\w\u0300-\u036f]+(?:[’'`-][\w\u0300-\u036f]+)*)", # with combining diacritics + r"(?P(?:(?!_)[\w\u0300-\u036f])+(?:[’'`-](?:(?!_)[\w\u0300-\u036f])+)*)", # with combining diacritics r"(?P\S)" ), "fr": ( r'(?P/(?:bin|boot|dev|etc|home|lib|mnt|opt|root|sbin|tmp|usr|var|Bureau|Documents|Images|Musique|Public|Téléchargements|Vidéos)(?:/[\w.()-]+)*)', @@ -37,11 +37,11 @@ r"(?P(?:l|d|n|m|t|s|j|c|ç|lorsqu|puisqu|jusqu|quoiqu|qu|presqu|quelqu)['’ʼ‘‛´`′‵՚ꞌꞋ])", r'(?P\d+(?:ers?|res?|è[rm]es?|i[èe][mr]es?|de?s?|nde?s?|ès?|es?|ᵉʳˢ?|ʳᵉˢ?|ᵈᵉ?ˢ?|ⁿᵈᵉ?ˢ?|ᵉˢ?)\b)', r'(?P\d\d?[h:]\d\d(?:[m:]\d\ds?|)\b)', r'(?P\d+(?:[.,]\d+|))', r'(?P[&%‰€$+±=*/<>⩾⩽#|×¥£¢§¬÷@-])', - r"(?P[\w\u0300-\u036f]+(?:[’'`-][\w\u0300-\u036f]+)*)", # with combining diacritics + r"(?P(?:(?!_)[\w\u0300-\u036f])+(?:[’'`-](?:(?!_)[\w\u0300-\u036f])+)*)", # with combining diacritics r"(?P\S)" ) }