Index: gc_lang/fr/data/phonet_simil.txt ================================================================== --- gc_lang/fr/data/phonet_simil.txt +++ gc_lang/fr/data/phonet_simil.txt @@ -117,10 +117,11 @@ cachet cachets cacher cadi cadis kadi kadis caddie caddies caddy caddys cadran cadrans cadrant caftan caftans cafetan cafetans caftant cahot cahots chaos +caméra caméras camera cameras cane canes canne cannes Cannes cantique cantiques quantique quantiques cap caps cape capes car cars carre carres carrent quart quarts caret carets carré carrés carrais carrait carraient carrez Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -387,11 +387,15 @@ # URL __(p_URL)__ https?://[\w./?&!%=+*"'@$#-]+ <<- ~>> * __> =\1.capitalize() + ((?:{w_1}[.])*)({w_2})([.](?:com|net|org|info|fr|ca|be|ch|i[ot]|co[.]uk|tk|es|jp|zh|ru|us|nl|xyz)) @@0,**,$ + <<- ~1>> * + <<- ~2>> =\2.capitalize() + <<- =>> define(\2, [":MP:e:i"]) + <<- ~3>> * # Numéro de chapitre __(p_chapitre)__ ^\d+[.][\d.-]* <<- ~>> * @@ -735,27 +739,29 @@ !! __/typo(typo_espace_manquant_après1)__ ({w1})[,:]({w_1}) @@0,$ <<- not \1.isdigit() -2>> " \2" # Il manque un espace. __/typo(typo_espace_manquant_après2)__ - [?!;%‰‱˚»}]({w_1}) @@$ <<- -1>> " \1" # Il manque un espace. + [?!;%‰‱˚»}]({w_1}) @@$ <<- -1>> " \1" # Il manque un espace. __ 1 and not \1.isdigit() and spell(\1)) or after("^’") -1>> " \1" # Il manque un espace. + <<- (\1.__len__() > 1 and not \1.isdigit() and spell(\1)) or after("^’") -1>> " \1" # Il manque un espace. TEST: J’en ai marre,{{ça}} suffit. TEST: elle est délirante.{{Devine}} ce qu’elle a dit. TEST: Voilà,{{il}} manque un espace. ->> " il" -TEST: Dernier essai.{{Voilà}}. ->> " Voilà" +TEST: Dernier essai.{{Voilà}}, c’est ça. ->> " Voilà" TEST: muni de lunettes protectrices et.{{d}}’un casque. TEST: espace:{{manquant}} ->> " manquant" TEST: espace{{;}}{{manquant}} TEST: espace ;{{manquant}} ->> " manquant" TEST: espace{{?}}{{manquant}} TEST: espace{{!}}{{manquant}} TEST: espace.{{Manquant}} ->> " Manquant" TEST: qui ont refuse.{{de}} se sauver ->> " de" +TEST: pic.twitter.com/PICNAME + !! !! !!!! Points !! @@ -1648,10 +1654,11 @@ TEST: ce sont des {{lève tard}}. ### Tri 1 __[i]/tu(tu_à_tout_va)__ [àa] tout vas? <<- ->> à tout-va # Il manque un trait d’union. +__[i]/tu(à_la_va_vite)__ [àa] la vas? vite <<- ->> à la va-vite # Il manque un trait d’union. __[i]/tu(tu_aller_retour)__ allers? retours? <<- ->> =\0.replace(" ", "-") # Il manque un trait d’union. __[i]/tu(tu_arc_en_ciel)__ arcs? en ciel <<- ->> =\0.replace(" ", "-") # Il manque les traits d’union. __[i]/tu(tu_après_demain)__ après demain <<- ->> après-demain # Il manque un trait d’union. __[i]/tu(tu_au_préposition)__ au (delà|dehors|desso?us|devant) @@$ <<- ->> au-\1 # Il manque un trait d’union. __[i]/tu(tu_avant_hier)__ avant hier <<- ->> avant-hier # Il manque un trait d’union. @@ -1698,10 +1705,11 @@ __[i]/tu(tu_vice_président_roi)__ vice (présidente?s?|rois?) @@$ <<- ->> vice-\1 # Il manque un trait d’union. __[i]/tu(tu_vis_à_vis)__ vis [àa] vis <<- ->> vis-à-vis # Il manque les traits d’union. __[i]/tu(tu_week_end)__ week (ends?) @@$ <<- ->> week-\1 # Il manque un trait d’union. TEST: Ils font des tests {{à tout va}} +TEST: on a fait {{à la va vite}}… TEST: marre de faire des {{allers retours}} TEST: {{le}} {{bouche à oreille}} TEST: à ce {{moment là}} ->> moment-là TEST: une {{plus value}} ->> plus-value TEST: Il est {{en-dessous}} de tout. ->> en dessous @@ -3113,14 +3121,15 @@ #### Articles et prépositions + verbes __[i]/conf(conf_à_le_la_les_leur)__ à l(?:es? +|eurs? +|a +|’)({w_3}) @@$ - <<- morphex(\1, ":", ":[GNAWMBY]") -1>> =suggSimil(\1, ":[NA]", True) # Incohérence : après “à”, on devrait trouver un groupe nominal. + <<- morphex(\1, ":", ":[GNAWMBYŴ]") -1>> =suggSimil(\1, ":[NA]", True) # Incohérence : après “à”, on devrait trouver un groupe nominal. TEST: à leur {{profile}} TEST: une référence à l’astuce de base qui permet d’outrepasser ses droits. +TEST: Le mari répète à l’envi qu’il a découvert la France à travers les mots de sa femme. __[s]/conf(conf_en_mts_verbe)__ ([eE]n ([mtsn])(?:e |’))({w_1}) @@0,*,$ <<- morphex(\3, ":[123][sp]", ":[PY]") and not \0.endswith("n’importe") >>> @@ -3476,11 +3485,11 @@ <<- __else__ -2>> _ # Incohérence : “\1” est une préposition. “\2” est un verbe conjugué. __[i]/conf(conf_a_à_locutions1)__ (a) (?:nouveau|présent|(?:bonne distance|bord|cause|contre-courant|côté|court|défaut|droite|gauche|l’(?:arrière|autre bout|écart|égard|extérieur|aune|avant|encontre|ins(?:u|tar)|intérieur|opposé)|la (?:portée|suite)|partir|portée|propos|rebours) d(?:es?|u)) @@0 <<- -1>> à # Confusion. Utilisez la préposition “à”. __[s]/conf(conf_a_à_locutions2)__ - (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de nombreuses reprises|des kilomètres à la ronde|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) @@0 + (a) (?:califourchon|contre(?:cœur|temps)|côté d(?:e|’\w[\w-]+)|demi-mot|nouveau|présent|rebrousse-poil|regret|travers|tout-va|l’(?:heure (?:actuelle|qu il est)|accoutumée|amiable|avance|aven(?:ir|ant)|air libre|aveuglette|emporte-pièce|évidence|exclusion de toute autre chose|improviste|inverse|ordre du jour|œil nu|en croire|un(?:animité| (?:d’entre eux|des leurs)|e (?:d’entre elles|des leurs)))|la (?:bonne franquette|con|dér(?:ive|obée)|diable|fois|limite du supportable|lumière de tout ce(?:ci|la)|mords-moi-le-nœud|papa|petite semaine|pointe du progrès|queue leu leu|rescousse|sauvette|surprise générale|va[ -]vite|virgule près|volée)|partir (?:de (?:demain|là|maintenant|rien)|d’(?:aujourd’hui|hier|ici))|au(?:cun prix|trui|tre chose)|bas co[ûu]t|bâ(?:bord|tons rompus)|beaucoup près|belles dents|bien (?:des égards|y (?:penser|réfléchir|songer))|bon (?:compte|escient|droit)|bout (?:de (?:bras|souffle|forces?)|portant|touchant)|bras (?:ouverts|le corps)|brève échéance|but non lucratif|cause d(?:e (?:ça|[mt]oi|lui|[nv]ous)|’e(?:lles?|ux))|ce (?:compte-là|moment-là|titre)|cet (?:égard|instant(?: précis|))|cette (?:époque(?: de l’année|)|heure de la (?:journée|nuit))|chaque (?:fois|instant)|chaudes larmes|cœur (?:joie|ouvert|perdu)|ciel ouvert|contre-cœur|corps perdu|cou(?:p sûr|per le souffle|rt terme|rte (?:échéance|portée))|couilles rabattues|de nombreuses reprises|des kilomètres à la ronde|dose homéopathique|double (?:titre|tranchant)|durée limitée|en (?:juger par (?:[mts]on|[nv]otre|leur) expérience|perdre (?:haleine|la tête))|faible (?:allure|revenu)|feu et à sang|flanc de (?:colline|montagne)|fleur de peau|géométrie variable|grand(?:-peine|e échelle)|haut risque|hue et à dia|huis clos|intervalles (?:ir|)réguliers|juste (?:raison|titre)|long terme|longue(?: échéance| portée|ur (?:de (?:temps|journée))|d’année)|loyer modéré|main (?:armée|droite|gauche|levée)|maint(?:s égards|es reprises)|marche forcée|merveille|mi-(?:course|distance|temps)|mi(?:di|nuit)(?: pile|)|moindres frais|moyen(?: terme|ne échéance)|mots couverts|ne (?:jamais|pas|rien|guère)|n’en (?:pas douter|point douter|plus finir)|outrance|parler franc|part (?:entière|ça|ce(?:la|ci))|partir de là|part(?:ir de rien|s égales)|pas de (?:géant|loup|tortue|velours)|personne en danger|perte de vue|petit(?: feu|e (?:dose|échelle))|peu (?:de choses? |)près|pieds joints|pile ou face|plat(?: ventre|e couture)|plein(?: (?:régime|temps|nez)|s poumons)|plus (?:forte raison|d’un titre)|point nommé|portée de main|première vue|prix (?:cassé|modique)s?|proprement parler|qui (?:mieux mieux|que ce soit|de droit)|quelque distance|quelques exceptions près|ras bords?|rude épreuve|tel point|temps (?:plein|partiel|complet)|tête reposée|tire[ -]d’aile|titre (?:conservatoire|d’exemple|indicatif|informatif|grâcieux|personnel|posthume)|tombeau ouvert|tort (?:ou à raison|et à travers)|tour de (?:bras|rôle)|tous (?:crins|points de vue)|tout(?: (?:âge|bout de champ|crin|instant|jamais|le (?:moins|monde)|moment|point de vue|prix|un chacun)|e (?:allure|bride|épreuve|force|heure|vitesse|volée))|toutes (?:fins utiles|jambes)|tribord|tu et à toi|un moment donné|usage interne|visage découvert|vive allure|voix (?:haute|basse)|vol d’oiseau|vrai dire|vue d’œil|y (?:regarder de plus près|réfléchir)) @@0 <<- not before(r"(?i)[ln]’$|(?> à # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0 __[s]/conf(conf_a_à_locutions3)__ (a) (?:confesse|mi(?:di|nuit)|r(?:allonge|eculons|enverse|isque)|tâtons|vélo|la (?:manque|ramasse|re(?:dresse|nverse))) @@0 <<- not before(r"(?i)(?:\bque? |[ln]’$|(?> davantage # Confusion possible : “davantage” signifie “plus” ; un “avantage” signifie “faveur”, “bénéfice”, “profit”… __[i]/conf(conf_davantage1)__ ({w1}) (d’avantages?) @@0,$ - <<- morphex(\1, ":V", ":Q|>(?:profiter|bénéficier)/") and not morph(word(1), ">(?:financi[eè]re?|pécuni(?:er|aire))s?/", False, False) + <<- morphex(\1, ":V", ":Q|>(?:profiter|bénéficier|nombre)/") and not morph(word(1), ">(?:financi[eè]re?|pécuni(?:er|aire)|sociaux)s?/", False, False) -2>> davantage # Confusion probable : “davantage” signifie “plus” ; un “avantage” signifie “faveur”, “bénéfice”, “profit”… __[i]/conf(conf_davantage2)__ ({w_1})-(?:je|tu|ils?|elles?|[nv]ous|on) +(d’avantages?) @@0,$ - <<- not morph(\1, ">(?:profiter|bénéficier)/", False) and not morph(word(1), ">(?:financi[eè]re?|pécuni(?:er|aire))s?/", False, False) + <<- not morph(\1, ">(?:profiter|bénéficier)/", False) and not morph(word(1), ">(?:financi[eè]re?|pécuni(?:er|aire)|sociaux)s?/", False, False) -2>> davantage # Confusion probable : “davantage” signifie “plus” ; un “avantage” signifie “faveur”, “bénéfice”, “profit”… __[i>/conf(conf_davantage3)__ (d’avantages?) d(?:e +|’) @@0 <<- -1>> davantage # Confusion possible : “davantage” signifie “plus” ; un “avantage” signifie “faveur”, “bénéfice”, “profit”… @@ -3854,10 +3864,11 @@ TEST: {{d’avantage}} de monde de jour en jour TEST: Viens-tu {{d’avantage}} à la maison TEST: {{d’avantage}} de monde viendra TEST: ils sont {{d’avantages}} perdus que les autres. TEST: tout ce qu’il apporte d’avantages pécuniaires. +TEST: un certain nombre d’avantages sociaux. # différend / différent __[i]/conf(conf_différent)__ différends? @@ -4283,12 +4294,14 @@ __[i]/conf(conf_qu_elle_verbe)__ (quelles?) +({w_1}) @@0,$ <<- \2.islower() and (morphex(\2, ":V|>(?:ne?|me?|te?|se?|[nv]ous|l(?:e|a|es|ui|leur|)|en|y)/", ":[NA].*:[fe]|>(?:plus|moins)") or \2 == "t" or \2 == "s") and not (morph(\2, ">(?:pouvoir|devoir|en)/", False) and morph(word(1), ":V0e", False)) >>> - <<- \1.endswith("e") and not morph(\2, ":V0e", False) -1>> qu’elle # Confusion. Le sujet “elle” doit être séparée de la conjonction “que”. 1 - <<- __else__ and \1.endswith("s") and not morph(\2, ":V0e", False) -1>> qu’elles # Confusion. Le sujet “elles” doit être séparée de la conjonction “que”. 2 + <<- \1.endswith("e") and not morph(\2, ":V0e", False) and not (morph(\2, ":V0a", False) and after("^ +été ")) + -1>> qu’elle # Confusion. Le sujet “elle” doit être séparée de la conjonction “que”. 1 + <<- __else__ and \1.endswith("s") and not morph(\2, ":V0e", False) and not (morph(\2, ":V0a", False) and after("^ +été ")) + -1>> qu’elles # Confusion. Le sujet “elles” doit être séparée de la conjonction “que”. 2 <<- __else__ and morph(\2, ":V0e", False) and morphex(word(1), ":[QA]", ":G", False) >>> <<- \1.endswith("e") -1>> qu’elle # Confusion. Le sujet “elle” doit être séparée de la conjonction “que”. 3 <<- __else__ and \1.endswith("s") -1>> qu’elles # Confusion. Le sujet “elles” doit être séparée de la conjonction “que”. 4 TEST: Je sais {{quelle}} est partie. @@ -4308,10 +4321,11 @@ TEST: Quelles sont leurs principales études ? TEST: Quelles en sont les conséquences ? TEST: Quelle plus belle complicité que… TEST: Quelle peut être la date de clôture d’un exercice ? TEST: Quelle doit être la date du mariage ? +TEST: Quelles ont été les annonces faites ? # savoir / ignorer __[i]/conf(être_pas_sans_savoir)__ ({etre}) pas sans (ignor(?:e[rz]|ée?s?|ai[st])) @@0,$ @@ -4974,11 +4988,11 @@ __[i](p_du_moins)__ du moins <<- ~>> _ __[i](p_du_qqch)__ du (?:[xXvViI]+[eᵉ] siècle|bout des lèvres|début à la fin|fond du cœur|jour au lendemain|haut en bas|même (?:acabit|tonneau)|moins,? pas|(?:nord|sud) au (?:nord|sud)|tout au tout) <<- ~>> * __[i](p_demain)__ (?:après-|avant |)demain(?: matin| soir| après-midi|) <<- ~>> * __[i](p_don_Juan)__ (don) Juan @@0 <<- ~1>> * __[i](p_du_même_ordre_coup)__ du même (?:ordre|coup) <<- ~>> * -__[i](p_en_nombre_années)__ en \d\d+(?: ans| années|) <<- ~>> * +__[i](p_en_nombre_années)__ en \d\d+(?: ans| années| mois| semaines| jours| heures| minutes| secondes|) <<- ~>> * __[i](p_en_cours)__ en cours(?! d[e’]) <<- ~>> * __[i](p_en_pronom)__ en (?:[mt]oi|eux|elles?) <<- ~>> * __[i](p_en_qqch1)__ en (?:aparté|apparence|arrière|avance|avant|cachette|ceci|cela|clair|commun|conséquence|continu|contrepartie|définitive|détail|direct|douce|effet|émoi|filigrane|général|goguette|hâte|majorité|outre|pâmoison|parallèle|partie|particulier|permanence|personne|pratique|prime|privé|principe|priorité|public|réalité|retour|revanche|rien|rogne|route|secret|silence|somme|suspens|théorie|trompe-l’œil|vain|vérité|ville|vitesse) <<- ~>> * __[i](p_en_qqch2)__ en (?:aucun(?: cas|e (?:circonstance|façon|manière))|bon(?: état|ne (?:compagnie|et due forme|posture|santé(?: physique| mentale|)|voie))|bout de course|cas d(?:e (?:besoin|doute)|’urgence)|chacune? d(?:e [nv]ous|’(?:eux|elles))|chair et en os|chute libre|comparution immédiate|connaissance de cause|coupe réglée|cours de route|d’autres (?:circonstances|termes|temps)|de telles circonstances|début d(?:e (?:journée|matinée|soirée)|’après-midi)|définitive|dehors de (?:tout|)(?:ça|cela|ceci)|dents de scie|dernier (?:lieu|recours|ressort)|désespoir de cause|détention provisoire|direction d(?:u (?:nord|sud)(?:-est|-ouest|)|e l’(?:est|ouest))|état (?:de (?:choc(?: circulatoire|)|marche)|d’ébriété(?: avancée|))|excellent état|file indienne|fin d(?:e (?:compte|journée|matinée|soirée)|’après-midi)|forte (?:baisse|hausse)|gage de bonne foi|garde à vue(?: prolongée|)|grand(?: nombre|e (?:difficulté|majorité|partie|pompe))|haut lieu|l’occurrence|lieu sûr|ligne de (?:compte|mire)|mains propres|mauvais(?: état|e (?:posture|santé))|même temps|milieu d(?:e (?:journée|matinée|soirée)|’après-midi)|nombre (?:plus que |)suffisant|partant de zéro|plein(?: air| cœur| jour|e (?:gueule|figure|forme|poire|nuit|tronche))|perte de vitesse|peu de temps|piteux état|point d(?:e mire|’orgue)|position de (?:force|faiblesse)|premi(?:er lieu|ère (?:instance|ligne))|pure perte|quantité (?:plus que |)suffisante|quelque sorte|queue de peloton|rangs serrés|rase campagne|règle générale|roue libre|sens inverse|si peu de temps|sous-main|tête à tête|temps (?:et en heure|normal|opportun|ordinaire|utile|voulu)|termes choisis|toile de fond|tous (?:les cas|sens)|tout (?:bien tout honneur|cas|genre|lieu|et pour tout|état de cause|premier lieu|sens|temps)|toute(?: (?:bonne foi|circonstance|connaissance de cause|confiance|discrétion|franchise|hâte|impartialité|impunité|innocence|légalité|liberté|logique|sécurité|simplicité)|s circonstances)|un (?:clin d’œil|rien de temps)|une autre occasion|vase clos|voie de développement|y réfléchissant bien) <<- ~>> * __[i](p_en_mois_dernier)__ en (?:janvier|février|mars|avril|mai|jui(?:n|llet)|ao[ûu]t|septembre|octobre|novembre|décembre) dernier <<- ~>> * @@ -5111,10 +5125,11 @@ __[i](p_urbi_et_orbi)__ urbi et orbi <<- ~>> * __[i](p_v_divers)__ v(?:aille que vaille|entre à terre|ers nulle part) <<- ~>> * TEST: ils vont et viennent, toujours {{cotes a cotes}}… TEST: Nous irons {{tours à tours}} chercher du bois. +TEST: Ma thèse en 180 secondes. # je / tu / il / elles / nous / vous / ils / elles __[i](p_je_vous_en_prie)__ je (?:t’en|vous en) (?:prie|supplie) <<- ~>> * __[i](p_nous_vous_en_prions)__ nous (?:t’en|vous en) (?:prions|supplions) <<- ~>> * @@ -5210,10 +5225,11 @@ cuillères? +(([àa]) (?:café|soupe)) @@$,w <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. <<- ~1>> * __[i](p_délai_de)__ délais? (d’attente|de (?:carence|connexion|prescription|préavis|rétraction|rigueur)) @@$ <<- ~1>> * __[i](p_demande_d_asile)__ demandes? (d’asile) @@$ <<- ~1>> * +__[i](p_descente_aux)__ descentes? (aux (?:enfers|flambeaux)) @@$ <<- ~1>> * __[i](p_diner_aux_chandelles)__ d[îi]ners? (aux chandelles) @@$ <<- ~1>> * __[i](p_digne_de)__ dignes? (de (?:confiance|foi|ce nom)) @@$ <<- ~1>> * __[i](p_droit)__ (droit) (?:au but|dans les yeux) @@0 <<- ~1>> * __[i](p_droit_comme_un_i)__ droite?s? (comme un i) @@$ <<- ~1>> * __[i](p_eau_de)__ eaux? (de (?:bouleau|bleuet|chaux|coco|javel|jouvence|mer|noix de coco|parfum|pluie|seltz|source|vie)) @@$ <<- ~1>> * @@ -5322,21 +5338,27 @@ soues? (([àa]) cochons?) @@$,w <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. <<- ~1>> * __[u](p_système)__ systèmes? (d’exploitation|D) @@$ <<- ~1>> * __[i](p_taille)__ taille (\d+) @@$ <<- ~1>> * +__[i](p_talons_aiguilles)__ talons? (aiguilles?) @@$ <<- ~1>> * __[i](p_taux_de_qqch)__ taux (d’(?:abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure)|de (?:change|cholest[ée]rol|glycémie|fécondité|participation|testostérone|TVA)) @@$ <<- ~1>> * __[i](p_tête_de_déterré)__ têtes? (de déterrée?s?) @@$ <<- ~1>> * __[i](p_tout_un_chacun)__ (tout un) chacun @@0 <<- ~1>> * __[i](p_tour_de_passe_passe)__ tours? (de passe-passe) @@$ <<- ~1>> * -__[i](p_trou_à_rat)__ trous? (([àa]) rats?) @@$,w +__[i](p_trou_à_rat)__ + trous? (([àa]) rats?) @@$,w <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. <<- ~1>> * __[i](loc_tueur_à_gages)__ tueu(?:r|se)s? (([àa]) gages) @@$,w <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. <<- ~1>> * +__[i](loc_vache_à_lait)__ + vaches? (([àa]) lait) @@$,w + <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. + <<- ~1>> * __[i](p_vecteur)__ vecteurs? (accélérations?|positions?|rotations?|vitesses?) @@$ <<- ~1>> * __[i](loc_vente_à_domicile)__ ventes? (([àa]) domicile) @@$,w <<- \2 == "a" -2>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. <<- ~1>> * @@ -5383,13 +5405,17 @@ TEST: Ventes {{a}} domicile insatisfaisantes TEST: Ce n’est que du vernis {{a}} ongles. TEST: le vol {{a}} l’étalage est un fléau. TEST: Il nous faut une {{voix}} de recours. TEST: c’est une putain d’usine {{a}} gaz. +TEST: ce produit est notre vache {{a}} lait TEST: un champ de canne à sucre TEST: La batterie se recharge automatiquement grâce au moteur essence. TEST: c’est un moteur diésel. +TEST: cette descente aux enfers interminable. +TEST: c’est une vache à lait +TEST: Ses talons aiguille étaient à la denière mode. # simplification des nombres __> dix @@ -5506,14 +5532,14 @@ <<- morph(\1, ":[MT]", False) and morph(word(-1), ":Cs", False, True) and not before(r"\b(?:plus|moins|aussi) .* que +$") ~>> =rewriteSubject(\1,\2) # après être, après avoir __[i](p_être_qqch)__ - ({etre}) +(à jamais|un jour|sous peu|du moins|avant tout|de passage|frère et sœur|mari et femme|père et mère|papa et maman|monnaie courante|pieds (?:et poings liés|nus)|partie (?:intégrante|prenante)) @@0,$ + ({etre}) +(à jamais|un jour|sous peu|du moins|avant tout|de passage|frère et sœur|mari et femme|père et mère|papa et maman|mission impossible|monnaie courante|pieds (?:et poings liés|nus)|partie (?:intégrante|prenante)) @@0,$ <<- morph(\1, ":V0e", False) ~2>> * __[i](p_être_pronom_qqch)__ - ([ésf]\w+)-(?:ils|[nv]ous|elles) +(frère et sœur|mari et femme|père et mère|papa et maman|bon marché|meilleur marché) @@0,$ + ([ésf]\w+)-(?:ils|[nv]ous|elles) +(frère et sœur|mari et femme|père et mère|papa et maman|bon marché|meilleur marché|mission impossible) @@0,$ <<- morph(\1, ":V0e", False) ~2>> * __[i](p_qqch_on_ne_peut_plus_que)__ ({w1}) +(on ne peut (?:pas |)(?:plus|moins)|plus que) +({w2}) @@0,w,$ <<- morph(\1, ":(?:V0e|N)", False) and morph(\3, ":[AQ]", False) ~2>> * __[i](p_avoir_être_loc_adv1)__ @@ -5703,13 +5729,13 @@ __[i](p_faire_qqch)__ (f[aiîeo]\w*) +(tous(?: deux| trois|) +|)(allusion|amende honorable|assaut|bande à part|bonne figure|chaud|confiance|compliqué|copain[- ]copain|de (?:[mts]on|leur|[nv]otre) mieux|dé(?:bat|faut)|demi-tour|envie|fausse route|figure|froid|front commun|gr(?:ise mine|and (?:bruit|cas))|h(?:alte|onte)|illusion|long feu|ma(?:chine|rche) arrière|main basse|mouche|office|p(?:art(?:ie(?: intégrante|)|)|eur|laisir|rofil bas)|rage|salle comble|scandale|sens|signe|table rase|volte-face|ce que bon (?:me|te|lui|leur|nous|vous) semble) @@0,*,$ <<- morph(\1, ">faire/", False) ~2>> * <<- __also__ ~3>> * __[i](loc_laisser_pour_compte)__ - (laiss\w+) +(pour (co[mnp]tes?)) @@0,$,$ + (laiss\w+) +(pour (co[mn]p?tes?)) @@0,$,$ <<- morph(\1, ">laisser/", False) >>> - <<- \2 != "compte" -3>> compte # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte + <<- \3 != "compte" -3>> compte # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte <<- ~2>> * __[i](loc_mettre_à_qqch)__ (m(?:et|[iî][mst])\w*) +(([àa]) (?:bas|jour|niveau|plat|l’(?:écart|épreuve)|terre)) @@0,$,w <<- morph(\1, ">mettre/", False) >>> <<- \3 == "a" -3>> à # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”. @@ -5861,10 +5887,12 @@ TEST: ces immeubles qui les ont le plus marqués TEST: quel potentiel électoral réel pour les souverainistes pur sucre ? TEST: Cette scène que décrit ici Yannick est représentative. TEST: attentifs aux spécificités socioculturelles de chaque peuple, constituées dans la longue durée autour d’une langue et de traditions TEST: Il était à l’époque chargé de maintenir en état ces machines. +TEST: Les laissés pour compte ignorés de tous. +TEST: Ces épreuves sont mission impossible. # # //////////////////////////////////////// RÈGLES DE CONTRÔLE //////////////////////////////////////// @@ -7763,14 +7791,15 @@ # c’est / s’est __[i]/conf(conf_c_est_était)__ (s’)(est|était) +({w_3}) @@0,2,$ - <<- morphex(\3, ":[AM]", ":[QG]") -1>> c’ # Confusion probable. Si vous voulez dire, « ceci \2 », utilisez « c’ ». + <<- morphex(\3, ":[AM]", ":[QGW]") -1>> c’ # Confusion probable. Si vous voulez dire, « ceci \2 », utilisez « c’ ». TEST: {{s’}}est vraiment merdique. TEST: s’est par exemple illustré au combat. +TEST: il ne s’est pas juste montré # cane / canne (from LanguageTool) __[i]/conf(conf_canne_à_de)__ (canes?) (?:à (?:sucre|pêche|selfie)|de (?:bambou|bois|combat|compagnon|compagnonnage|défense|golf|marche|Noël|ramonage)|d’aveugles?) @@0 Index: gc_lang/fr/webext/content_scripts/init.js ================================================================== --- gc_lang/fr/webext/content_scripts/init.js +++ gc_lang/fr/webext/content_scripts/init.js @@ -77,11 +77,11 @@ _createMenus: function (dOptions) { if (dOptions.hasOwnProperty("ui_options")) { dOptions = dOptions.ui_options; if (dOptions.textarea) { for (let xNode of document.getElementsByTagName("textarea")) { - if (xNode.style.display !== "none" && xNode.style.visibility !== "hidden") { + if (xNode.style.display !== "none" && xNode.style.visibility !== "hidden" && xNode.getAttribute("spellcheck") !== "false") { this.lMenu.push(new GrammalecteMenu(this.nMenu, xNode)); this.nMenu += 1; } } } Index: gc_lang/fr/webext/content_scripts/panel_gc.css ================================================================== --- gc_lang/fr/webext/content_scripts/panel_gc.css +++ gc_lang/fr/webext/content_scripts/panel_gc.css @@ -95,11 +95,17 @@ /*box-shadow: 0px 0px 0px 4px hsla(210, 0%, 50%, 0.4);*/ } div#grammalecte_tooltip_message_block { margin: 0; - padding: 5px 10px 10px 10px; + padding: 5px 10px 5px 10px; + background-color: hsl(210, 50%, 30%); + color: hsl(210, 50%, 96%); +} +div#grammalecte_tooltip_actions { + margin: 0; + padding: 7px 10px 5px 10px; background-color: hsl(210, 50%, 30%); color: hsl(210, 50%, 96%); } div#grammalecte_tooltip_rule_id { display: none; @@ -134,11 +140,11 @@ div#grammalecte_tooltip_ignore:hover { background-color: hsl(30, 30%, 50%); color: hsla(0, 0%, 100%, 1); text-shadow: 0 0 3px hsl(30, 30%, 60%); } -div#grammalecte_tooltip_url { +div#grammalecte_tooltip_url, div#grammalecte_tooltip_db_search { display: inline-block; margin-left: 10px; padding: 1px 5px; background-color: hsl(210, 50%, 50%); color: hsla(210, 0%, 96%, 1); @@ -146,15 +152,16 @@ cursor: pointer; font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif; font-size: 12px; text-decoration: none; } -div#grammalecte_tooltip_url:hover { +div#grammalecte_tooltip_url:hover, div#grammalecte_tooltip_db_search:hover { background-color: hsl(210, 50%, 60%); color: hsla(0, 0%, 100%, 1); text-shadow: 0 0 3px hsl(210, 30%, 60%); } + div#grammalecte_tooltip_sugg_title { padding: 0 10px; background-color: hsl(210, 10%, 90%); color: hsl(210, 50%, 30%); font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif; Index: gc_lang/fr/webext/content_scripts/panel_gc.js ================================================================== --- gc_lang/fr/webext/content_scripts/panel_gc.js +++ gc_lang/fr/webext/content_scripts/panel_gc.js @@ -16,11 +16,11 @@ xElem.parentNode.parentNode.style.display = "none"; } else if (xElem.id.startsWith("grammalecte_err") && xElem.className !== "grammalecte_error_corrected" && xElem.className !== "grammalecte_error_ignored") { oGrammalecte.oGCPanel.oTooltip.show(xElem.id); - } else if (xElem.id === "grammalecte_tooltip_url") { + } else if (xElem.id === "grammalecte_tooltip_url" || xElem.id === "grammalecte_tooltip_db_search") { oGrammalecte.oGCPanel.openURL(xElem.dataset.url); } else { oGrammalecte.oGCPanel.oTooltip.hide(); } } else { @@ -284,27 +284,33 @@ class GrammalecteTooltip { constructor (xContentNode) { this.sErrorId = null; + this.bDebug = false; this.xTooltip = oGrammalecte.createNode("div", {id: "grammalecte_tooltip"}); this.xTooltipArrow = oGrammalecte.createNode("img", { id: "grammalecte_tooltip_arrow", src: " data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwAAADsABataJCQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAAnSURBVChTY/j//z8cq/kW/wdhZDEMSXRFWCVhGKwAmwQyHngFxf8B5fOGYfeFpYoAAAAASUVORK5CYII=", alt: "^", }); - this.xTooltipSuggBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_block"}); + // message let xMessageBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message_block"}); xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_rule_id"})); xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message", textContent: "Erreur."})); - let xActions = xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_actions"})); + this.xTooltip.appendChild(xMessageBlock); + // suggestions + this.xTooltip.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"})); + this.xTooltipSuggBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_block"}); + this.xTooltip.appendChild(this.xTooltipSuggBlock); + // actions + let xActions = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_actions"}); xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_ignore", textContent: "Ignorer"})); xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_url", textContent: "Voulez-vous en savoir plus ?…"}, {url: ""})); - xMessageBlock.appendChild(xActions); - this.xTooltip.appendChild(xMessageBlock); - this.xTooltip.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"})); - this.xTooltip.appendChild(this.xTooltipSuggBlock); + xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_db_search", textContent: " ››› base de données"}, {url: ""})); + this.xTooltip.appendChild(xActions); + // add tooltip to the page xContentNode.appendChild(this.xTooltip); xContentNode.appendChild(this.xTooltipArrow); } show (sNodeErrorId) { // err @@ -318,16 +324,20 @@ this.xTooltipArrow.style.left = (xNodeErr.offsetLeft + Math.floor((nUsefulErrorWidth / 2)) - 4) + "px"; // 4 is half the width of the arrow. this.xTooltip.style.top = (xNodeErr.offsetTop + 20) + "px"; this.xTooltip.style.left = (xNodeErr.offsetLeft > nTooltipLeftLimit) ? nTooltipLeftLimit + "px" : xNodeErr.offsetLeft + "px"; if (xNodeErr.dataset.error_type === "grammar") { // grammar error + document.getElementById("grammalecte_tooltip_db_search").style.display = "none"; if (xNodeErr.dataset.gc_message.includes(" ##")) { + this.bDebug = true; + // display rule id let n = xNodeErr.dataset.gc_message.indexOf(" ##"); document.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message.slice(0, n); document.getElementById("grammalecte_tooltip_rule_id").textContent = "Règle : " + xNodeErr.dataset.gc_message.slice(n+2); document.getElementById("grammalecte_tooltip_rule_id").style.display = "block"; } else { + this.bDebug = false; document.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message; document.getElementById("grammalecte_tooltip_rule_id").style.display = "none"; } if (xNodeErr.dataset.gc_url != "") { document.getElementById("grammalecte_tooltip_url").dataset.url = xNodeErr.dataset.gc_url; @@ -351,13 +361,19 @@ } if (xNodeErr.dataset.error_type === "spelling") { // spelling mistake document.getElementById("grammalecte_tooltip_message").textContent = "Mot inconnu du dictionnaire."; document.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id; + document.getElementById("grammalecte_tooltip_rule_id").style.display = "none"; document.getElementById("grammalecte_tooltip_url").dataset.url = ""; document.getElementById("grammalecte_tooltip_url").style.display = "none"; - document.getElementById("grammalecte_tooltip_rule_id").style.display = "none"; + if (this.bDebug) { + document.getElementById("grammalecte_tooltip_db_search").style.display = "inline"; + document.getElementById("grammalecte_tooltip_db_search").dataset.url = "https://www.dicollecte.org/dictionary.php?prj=fr&lemma="+xNodeErr.textContent; + } else { + document.getElementById("grammalecte_tooltip_db_search").style.display = "none"; + } this.clearSuggestionBlock(); this.xTooltipSuggBlock.textContent = "Recherche de graphies possibles…"; xGrammalectePort.postMessage({ sCommand: "getSpellSuggestions", dParam: {sWord: xNodeErr.textContent}, Index: gc_lang/fr/webext/panel/main.css ================================================================== --- gc_lang/fr/webext/panel/main.css +++ gc_lang/fr/webext/panel/main.css @@ -117,14 +117,18 @@ text-align: center; cursor: pointer; color: hsl(210, 10%, 50%); font-size: 20px; } +.invisible { + opacity: .05; +} #menu .select_block:hover { - background-color: hsl(210, 10%, 92%); + background-color: hsl(210, 20%, 92%); color: hsl(210, 80%, 50%); text-shadow: 0px 0px 1px hsl(210, 100%, 70%); + opacity: 1; } .select_label { font-size: 12px; font-variant-caps: small-caps; } Index: gc_lang/fr/webext/panel/main.html ================================================================== --- gc_lang/fr/webext/panel/main.html +++ gc_lang/fr/webext/panel/main.html @@ -34,11 +34,11 @@

Informations

-
+ Index: graphspell-js/char_player.js ================================================================== --- graphspell-js/char_player.js +++ graphspell-js/char_player.js @@ -30,17 +30,16 @@ ]), simplifyWord: function (sWord) { // word simplication before calculating distance between words sWord = sWord.toLowerCase(); + sWord = [...sWord].map(c => this._xTransCharsForSimplification.gl_get(c, c)).join(''); let sNewWord = ""; let i = 1; for (let c of sWord) { - let cNew = this._xTransCharsForSimplification.gl_get(c, c); - let cNext = sWord.slice(i, i+1) - if (cNew != this._xTransCharsForSimplification.gl_get(cNext, cNext)) { - sNewWord += cNew; + if (c == 'e' || c != sWord.slice(i, i+1)) { // exception for to avoid confusion between crée / créai + sNewWord += c; } i++; } return sNewWord.replace(/eau/g, "o").replace(/au/g, "o").replace(/ai/g, "e").replace(/ei/g, "e").replace(/ph/g, "f"); }, Index: graphspell/char_player.py ================================================================== --- graphspell/char_player.py +++ graphspell/char_player.py @@ -27,11 +27,11 @@ def simplifyWord (sWord): "word simplication before calculating distance between words" sWord = sWord.lower().translate(_xTransCharsForSimplification) sNewWord = "" for i, c in enumerate(sWord, 1): - if c != sWord[i:i+1]: + if c == 'e' or c != sWord[i:i+1]: # exception for to avoid confusion between crée / créai sNewWord += c return sNewWord.replace("eau", "o").replace("au", "o").replace("ai", "e").replace("ei", "e").replace("ph", "f") aVowel = set("aáàâäāeéèêëēiíìîïīoóòôöōuúùûüūyýỳŷÿȳœæAÁÀÂÄĀEÉÈÊËĒIÍÌÎÏĪOÓÒÔÖŌUÚÙÛÜŪYÝỲŶŸȲŒÆ")