Grammalecte  Check-in [521f9f5963]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | comdic
Files: files | file ages | folders
SHA3-256:521f9f59635eaf0c8c9446971ab0aeaddb4a16c8045f38fe45adebc6d709753f
User & Date: olr 2019-02-05 18:40:01
Context
2019-02-09
14:07
[fx] dictionaries manager: update check-in: a646054ced user: olr tags: comdic, fx
2019-02-05
18:40
merge trunk check-in: 521f9f5963 user: olr tags: comdic
18:17
[graphspell] remove split suggestions when start differs check-in: d32a1cd66e user: olr tags: graphspell, trunk
17:03
[fx] lexicon editor: save dictionary online (draft) check-in: 13b87972a8 user: olr tags: comdic, fx
Changes

Changes to gc_lang/fr/rules.grx.

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
..
67
68
69
70
71
72
73

74
75
76
77
78
79
80
...
117
118
119
120
121
122
123

124
125
126
127
128
129
130
...
153
154
155
156
157
158
159

160
161
162
163
164
165
166
...
199
200
201
202
203
204
205

206
207
208
209
210
211
212
...
707
708
709
710
711
712
713
714
715
716
717















718
719
720
721
722
723
724
....
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
....
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
....
6497
6498
6499
6500
6501
6502
6503

6504
6505
6506
6507
6508
6509
6510
....
6991
6992
6993
6994
6995
6996
6997
6998
6999
7000
7001
7002
7003
7004
7005
....
7236
7237
7238
7239
7240
7241
7242

7243
7244
7245
7246
7247
7248
7249
....
8288
8289
8290
8291
8292
8293
8294
































8295
8296
8297
8298
8299
8300
8301
....
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
....
8676
8677
8678
8679
8680
8681
8682

8683
8684
8685
8686
8687
8688
8689
.....
11279
11280
11281
11282
11283
11284
11285




11286
11287
11288
11289
11290
11291
11292
.....
11309
11310
11311
11312
11313
11314
11315

11316
11317
11318
11319
11320
11321
11322
.....
11581
11582
11583
11584
11585
11586
11587
11588
11589
11590
11591
11592
11593
11594
11595
.....
11599
11600
11601
11602
11603
11604
11605


11606
11607
11608
11609
11610
11611
11612
.....
13086
13087
13088
13089
13090
13091
13092
13093
13094
13095
13096
13097
13098
13099
13100
.....
13275
13276
13277
13278
13279
13280
13281
13282
13283
13284
13285
13286
13287
13288
13289
13290
13291
13292
13293
13294
13295
13296
13297
13298
13299
13300
13301
13302
13303
13304
13305
13306
13307
13308
13309
13310
.....
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
17736
17737
17738
17739
17740
17741
17742
17743
17744
17745
17746
17747
17748
17749
17750
17751
17752
17753
17754















17755
17756
17757
17758
17759
17760
17761
.....
19706
19707
19708
19709
19710
19711
19712
19713
19714
19715
19716
19717
19718
19719
19720
19721

!!
!!
!! Options                                                                                        !!
!!
!!

OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf chim, ocr mapos, liga
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
OPTGROUP/misc: date mc
OPTGROUP/debug: idrule

# Names of options is used in dictionaries keys: dOptPython, dOptJavaScript, etc.
................................................................................
OPT/esp:            True        True        True        False       False       False
OPT/tab:            False       True        False       False       False       False
OPT/nbsp:           True        True        True        False       False       False
OPT/tu:             True        True        True        True        True        True
OPT/maj:            True        True        True        True        True        True
OPT/num:            True        True        True        True        True        True
OPT/virg:           True        True        True        True        True        True

OPT/unit:           True        True        True        False       False       False
OPT/nf:             True        True        True        True        True        True
OPT/liga:           False       False       False       False       False       False
OPT/mapos:          False       False       False       False       False       False
OPT/chim:           False       False       False       False       False       False
OPT/ocr:            False       False       False       False       False       False
OPT/conf:           True        True        True        True        True        True
................................................................................
OPTCOLOR/esp:       orange      orange
OPTCOLOR/tab:       orange      orange
OPTCOLOR/nbsp:      orange      orange
OPTCOLOR/tu:        orange      orange
OPTCOLOR/maj:       orange      orange
OPTCOLOR/num:       orange      orange
OPTCOLOR/virg:      orange      orange

OPTCOLOR/unit:      orange      orange
OPTCOLOR/nf:        orange      orange
OPTCOLOR/liga:      orange      orange
OPTCOLOR/mapos:     orange      orange
OPTCOLOR/chim:      orange      orange
OPTCOLOR/ocr:       violet      violet
OPTCOLOR/conf:      violet      violet
................................................................................
OPTLABEL/typo:      Signes typographiques
OPTLABEL/apos:      Apostrophe typographique|Correction des apostrophes droites. Automatisme possible dans le menu Outils > Options d’autocorrection > Options linguistiques > Guillemets simples > Remplacer (à cocher)
OPTLABEL/esp:       Espaces surnuméraires|Signale les espaces inutiles entre les mots, en début et en fin de ligne.
OPTLABEL/tab:       Tabulations surnuméraires|Signale les tabulations inutiles en début et en fin de ligne.
OPTLABEL/nbsp:      Espaces insécables|Vérifie les espaces insécables avec les ponctuations « ! ? : ; » (à désactiver si vous utilisez une police Graphite)
OPTLABEL/maj:       Majuscules|Vérifie l’utilisation des majuscules et des minuscules (par exemple, « la raison d’État », « les Européens »).
OPTLABEL/virg:      Virgules|Virgules manquantes avant “mais”, “car” et “etc.”.

OPTLABEL/tu:        Traits d’union|Cherche les traits d’union manquants ou inutiles.
OPTLABEL/num:       Nombres|Espaces insécables sur les grands nombres (> 10 000). Vérifie la présence de « O » au lieu de « 0 ».
OPTLABEL/unit:      Espaces insécables avant unités de mesure
OPTLABEL/nf:        Normes françaises
OPTLABEL/liga:      Signaler ligatures typographiques|Ligatures de fi, fl, ff, ffi, ffl, ft, st.
OPTLABEL/mapos:     Apostrophe manquante après lettres isolées [!]|Apostrophe manquante après les lettres l d s n c j m t ç. Cette option sert surtout à repérer les défauts de numérisation des textes et est déconseillée pour les textes scientifiques.
OPTLABEL/chim:      Chimie [!]|Typographie des composés chimiques (H₂O, CO₂, etc.).
................................................................................
OPTLABEL/typo:      Typographical glyphs
OPTLABEL/apos:      Typographical apostrophe|Detects typewriter apostrophes. You may get automatically typographical apostrophes in Tools > Autocorrect options > Localized options > Single quote > Replace (checkbox).
OPTLABEL/esp:       Useless spaces|Checks spaces within words and at the beginning and the end of lines.
OPTLABEL/tab:       Useless tabulations|Checks tabulations at the beginning and the end of lines.
OPTLABEL/nbsp:      Non-breakable spaces|Checks the use of non-breakable spaces with the following punctuation marks: « ! ? : ; » (deactivate it if you use a Graphite font).
OPTLABEL/maj:       Capitals|Checks the use of uppercase and lowercase letters (i.e. « la raison d’État », « les Européens »).
OPTLABEL/virg:      Commas|Missing commas before “mais”, “car” and “etc.”.

OPTLABEL/tu:        Hyphens|Checks missing or useless hyphens.
OPTLABEL/num:       Numbers|Large numbers and « O » instead of « 0 ».
OPTLABEL/unit:      Non-breaking spaces before units of measurement
OPTLABEL/nf:        French standards
OPTLABEL/liga:      Report typographical ligatures|Ligatures of fi, fl, ff, ffi, ffl, ft, st.
OPTLABEL/mapos:     Missing apostrophes after single letters [!]|Missing apostrophes after l d s n c j m t ç. This option is mostly useful to detect defects of digitized texts and is not recommended for scientific texts.
OPTLABEL/chim:      Chemistry [!]|Typography for molecules (H₂O, CO₂, etc.)
................................................................................
    -2>> =\2.capitalize()                                                                           # Après un point, une majuscule est généralement requise.

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.

TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.

















!!
!!
!!!! Virgules                                                                                     !!
!!
!!

................................................................................

!!
!!
!!!! Tournures de langage                                                                         !!
!!
!!

__faire_plaisir__
    >faire plaisirs
        <<- /sgpl/ -2>> plaisir                                                                     # Faire plaisir : dans cette locution, “plaisir” doit être au singulier.
        <<- ~2>> *

TEST: Ça me fait {{plaisirs}}.


# ayants droit
__sgpl_ayants_droit__
    [les|des|ces|ses|nos|vos|leurs] ayant [droit|droits]
        <<- /gn/ -2:3>> ayants droit                                        # Au singulier : « un ayant droit ». Au pluriel : « des ayants droit ».

TEST: Comment lutter contre la cupidité des {{ayant droits}}
# Note: À supprimer? Graphie qui tend vers la soudure et le pluriel régulier (ayant-droit(s))


# Mon, ton, son : euphonie
__gn_mon_ton_son_euphonie__
    [ma|ta|sa]  @>[aâeéèêiîoôuûyœæ].+:[NAQ].*:f¬:[eGW]
        <<- /gn/ -1>> =\1.replace("a", "on")                                # Même si « \2 » est féminin, on utilise « mon/ton/son » pour faire la liaison.|http://fr.wikipedia.org/wiki/Euphonie

................................................................................
    des [un|une|le|la|l’|les|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leur|leurs|ce|cet|cette|ces] @:[NA]
        <<- /conf/ not value(<1, "|un|une|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] [à|a] présent
        <<- /conf/ not morph(<1, ":D.*:p") -1>> dès                                                 # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    des ~\d{2,5}  [<end>|,]
    des ~\d{2,5}  @:¬:[NA].*:[ip]|>(?:à|et|ou)/
        <<- /conf/ not value(<1, "|%|") and not morph(<1, ">(?:pourcent|cent|barre|seuil)/") -1>> dès     # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] *NUM [ans|heures]
    [dés|des] @:B [ans|heures]
    [dés|des] [un|une] [an|heure]
        <<- /conf/ not morph(<1, ":R|>(?:approcher|anniversaire|cap|occasion|programme|terme|classe|autour|celui|ceux|celle|celles)/") and not value(>1, "|de|du|des|d’|")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s
................................................................................
TEST: sous la barre des 500
TEST: En plus des 400 à 500 euros mensuels que touche une personne
TEST: les moins de 20 ans peuvent ne pas connaître le premier album du groupe
TEST: au lieu des 20 heures réglementaires.
TEST: celle des 20 ans.
TEST: sous le seuil des 10 %
TEST: notre revue des 24 et 25 décembre



# diagnostic / diagnotique // pronostic / pronostique
__conf_diagnostic_pronostique__
    [ce|un|du|mon|notre|votre|quel] diagnostique
        <<- /conf/ -2>> diagnostic                                                  # Confusion. Le nom s’écrit avec un “c”.

................................................................................
        <<- /conf/ ->> =\1[:-2]+"là"                                # Écrivez “là” et non “la”.

    [celle|celles|celui|ceux] la
        <<- /conf/ ->> \1-là                                        # Écrivez “là” et non “la”.

    /-là
        <<- /conf/ morph(\1, ":V", ":[NA]", 0, -3)
        -1>> =\1[:-2]+"-la|" + \1[:-2]+" là"                        # Confusion. Pour un COD, utilisez “la”. Ou, si ce “là” signifie “ici”, ne mettez pas de trait d’union.

    /-la
        <<- /conf/ morph(\1, ":[NA]", ":[123][sp]", 0, -3)
        -1>> =\1[:-2]+"là"                                          # Confusion : “\1” n’est pas un verbe.

    [ne|me|te|se] là
        <<- /conf/ -2>> la                                          # Confusion : “là” signifie “ici”.|http://fr.wiktionary.org/wiki/l%C3%A0
................................................................................
TEST: {{Ont}} lui avait donné du temps
TEST: {{Ont}} leur {{prendra}} tout
TEST: Qu’importe, {{ont}} leur {{prend}} tout
TEST: Qui {{on}} {{tant}} de malheurs !
TEST: {{peut-ont}} y arriver avec si peu de moyens ?
TEST: {{peut ont}} y arriver ?
TEST: comme ce que l’{{ont}} {{voit}} dans le lien entre polygynie et guerre.

TEST: les politiques de l’offre ont échoué.
TEST: qui on blâme, ce soir ?
TEST: qui n’ont somme toute que le désir de vivre paisiblement
TEST: ces textes, quoi qu’on en pense, ont force de loi.
TEST: s’ils n’ont ne serait-ce qu’un peu de jugeotte, on ne les reverra plus.


................................................................................

TEST: ce {{vieux}} homme
TEST: c’est un {{vieux}} imbécile.
TEST: Le {{vieux}} homme était parti.                         ->> vieil




































# vu de ses yeux vu
__sgpl_vu_de_ses_yeux_vu__
    [vu|vue|vus|vues]  de  [mes|tes|ses|nos|vos|leurs]  yeux  [vu|vue|vus|vues]
        <<- /sgpl/ \1.lower() != \-1.lower() --1>> \1                                               # Accord avec “\1”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4532

    [vu|vue|vus|vues]  ,  de  [mes|tes|ses|nos|vos|leurs]  yeux  [vu|vue|vus|vues]  [,|<end>]
................................................................................
    de          tout  @:N.*:[fp]¬:(?:A|W|G|M|Y|[me]:[is]|3s)
        <<- /gn/ -3>> =suggMasSing(\3, True)                                                        # Accord avec “tout” : “\3” devrait être au masculin singulier.

    tout  @:N.*:[fp]¬:(?:A|W|G|M|Y|[me]:[is]|3s)
        <<- /gn/ morph(<1, ":R", ":D.*:p") -2>> =suggMasSing(\2, True)                              # Accord avec “tout” : “\2” devrait être au masculin singulier.

__toute_nom__
    [<start>|,] toute  @:[NA].*:[mp]¬:(?:W|G|M|[fe]:[is])
    de          toute  @:[NA].*:[mp]¬:(?:W|G|M|Y|[fe]:[is])
        <<- /gn/ -3>> =suggFemSing(\3, True)                                                        # Accord avec “toute” : “\3” devrait être au féminin singulie

    toute  @:[NA].*:[mp]¬:(?:W|G|M|Y|[fe]:[is])
        <<- /gn/ morph(<1, ":R") -2>> =suggFemSing(\2, True)                                        # Accord avec “toute” : “\2” devrait être au féminin singulier.

__tous_nom__
    [<start>|,] tous  @:[NA].*:[fs]¬:(?:W|G|M|[me]:[ip]|3p)
    de          tous  @:[NA].*:[fs]¬:(?:W|G|M|Y|[me]:[ip]|3[sp])
        <<- /gn/ -3>> =suggMasPlur(\3, True)                                                        # Accord avec “tous” : “\3” devrait être au masculin pluriel.

    tous  @:[NA].*:[fs]¬:(?:W|G|M|Y|3[sp]|[me]:[ip])
        <<- /gn/ morph(<1, ":R") -2>> =suggMasPlur(\2, True)                                        # Accord avec “tous” : “\2” devrait être au masculin pluriel.

__toutes_nom__
    [<start>|,] toutes  @:[NA].*:[ms]¬:(?:W|G|M|[fe]:[ip])
    de          toutes  @:[NA].*:[ms]¬:(?:W|G|M|Y|[fe]:[ip])
        <<- /gn/ -3>> =suggFemPlur(\3, True)                                                        # Accord avec “toutes” : “\3” devrait être au féminin pluriel.

    toutes  @:[NA].*:[ms]¬:(?:W|G|M|Y|[fe]:[ip])
        <<- /gn/ morph(<1, ":R") -2>> =suggFemPlur(\2, True)                                        # Accord avec “toutes” : “\2” devrait être au féminin pluriel.

TEST: Tout {{hommes}}
TEST: De tous {{âge}} !
TEST: avec toutes {{femme}}                                     ->> femmes
TEST: sur toutes {{armure}}                                     ->> armures
TEST: Toute {{époux}} doit faire preuve de bienveillance
................................................................................
TEST: Tout les sépare.
TEST: les tout débuts du mouvement ouvrier
TEST: vos tout débuts furent difficiles
TEST: aux tout débuts, il y eut bien des erreurs
TEST: comment les inégalités sociales impactent la santé des tout petits
TEST: l’existence d’un enseignement supérieur public, peu onéreux et ouvert à tous est d’une importance cruciale.
TEST: la survie de tous est plus importante que les profits de quelques-uns




!!
!!
!!!! Adverbes de négation                                                                         !!
!!
................................................................................
    >mettre a l’ [écart|épreuve]
    >percer a jour
    >prendre a la légère
    >saigner a blanc
    >tenir a distance
    >venir a point
        <<- /conf/ -2>> à               # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.





    >laisser pour [comte|comtes|>conte]
        <<- /conf/ -3>> compte          # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte

    [>mourir|>paraître|>paraitre|>rester|>sembler] >jeûne
        <<- /conf/ -2>> jeune           # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

................................................................................
TEST: il faut se tenir {{a}} distance de ces gens-là.
TEST: cette expérience ne va pas tarder à tourner {{cours}}.
TEST: il faut rendre {{comte}} de la sitation désastreuse dans laquelle nous sommes tombés.
TEST: il faut tenir {{comtes}} des aléas de la météo.
TEST: Elle est restée {{jeûne}}.
TEST: Mourir {{jeûne}} ne lui faisait pas peur.
TEST: Elles semblent {{jeûnes}}.



# Autres tests contre les faux positifs
TEST: pourquoi faire compliqué quand on peut faire simple
TEST: Pour ceux et celles qui étaient présents à la cérémonie
TEST: les pires vilénies suite au mauvais vote du peuple
TEST: La numéro 1 mondiale
................................................................................

    *WORD  la  *WORD
        <<- /gn/ morph(\2, ":D") >>>
        <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)")
            or ( morph(\3, ":[NA].*:m", ":[fe]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":(?:Rv|C)") and morph(\3, ":Y")) )
        -2>> le                                                                             # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p")
            or ( morph(\3, ":[NA].*:p", ":[si]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -3>> =suggFemSing(\3)                                                               # Accord de nombre erroné : « \3 » devrait être au singulier.

    <start>  la  *WORD
        <<- /gn/ morph(\3, ":[NA].*:m", ":[efPGWY]") -2>> le                                # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p", ":[siGW]") -3>> =suggFemSing(\3)       # Accord de nombre erroné : « \3 » devrait être au singulier.
................................................................................
TEST: {{La}} mustang est un cheval sauvage.                   ->> Le
TEST: {{La}} tableau.                                         ->> Le
TEST: dans la {{parties}}                                     ->> partie
TEST: de {{la}} vin                                           ->> le
TEST: {{la}} {{véhicule}}
TEST: {{La}} {{pris}}
TEST: la force de la {{formes}} parfaite




__gn_la_2m__
    la  *WORD  *WORD
        <<- /gn/ morph(\1, ":D") and not value(<1, "|et|ou|de|") and not \3.startswith("seul") >>>
        <<- /gn/ morph(\2, ":[NA].*:[fe]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:m", "*") and not apposition(\2, \3)
        -3>> =suggFemSing(\3, True)                                                         # Accord de genre erroné : « \1 \2 » est féminin, « \3 » est masculin.
................................................................................
__sgpl_leur_dévolu__
    >jeter leurs dévolus
        <<- /sgpl/ -2:3>> leur dévolu                   # Jeter son dévolu, leur dévolu : au singulier.

TEST: Ces gens qui jettent {{leurs dévolus}} sur n’importe qui, c’est d’une indécence.



# escalier
__sgpl_cage_d_escalier__
    >cage d’ escaliers
        <<- /sgpl/ -3>> escalier                                # Usuellement, pas de “s” à escalier.

TEST: Elle est passée par la cage d’{{escaliers}}

................................................................................
__sgpl_sentir_bon__
    >sentir bons
        <<- /sgpl/ -2>> bon                                         # Dans la locution “sentir bon”, “bon” est un adverbe, donc invariable.

TEST: Ces fleurs sentent {{bons}}.
TEST: Ça sent bon.


# termes
__sgpl_en_termes_de__
    en terme [de|d’]
        <<- /sgpl/ -2>> termes                                      # Dans la locution “en termes de”, mettez “terme” au pluriel.

TEST: en {{terme}} de communication, c’est une véritable catastrophe


# tous / tout / toutes
__sgpl_tous_azimuts__
    tout [azimut|azimuts]
        <<- /sgpl/ ->> tous azimuts                                 # « Tous azimuts » signifie « dans toutes les directions ».

__sgpl_une_bonne_fois_pour_toutes__
    une fois pour (toute)
    une bonne fois pour (toute)
        <<- /sgpl/ -1>> toutes                                      # Mettez “toute” au pluriel. Sous-entendu : une fois pour toutes les autres fois.

TEST: ils lancent des attaques {{tout azimut}}.
TEST: une bonne fois pour {{toute}}


# vacances
__sgpl_bonnes_vacances__
    bonne vacance
        <<- /sgpl/ not morph(<1, ":D.*:f:s") ->> bonnes vacances    # Les vacances. Au pluriel.

__sgpl_en_vacances__
................................................................................
TEST: Invite les plus intelligents…
TEST: Prenez les 5 ou 6 revues les plus connues.
TEST: Allez les chercher.
TEST: Soyez les plus gentils qu’on puisse imaginer.


__imp_union_le_la_leur__
    *WORD  [le|la|leur|en]
        <<- /imp/ space_after(\1, 1, 1)
            and morph(\1, ":E", ":[GM]|>(?:venir|aller|partir)") and morph(>1, ":|<end>|>,", ":(?:N|A|Q|Y|MP|H|T)|>(?:pour|plus|moins|mieux|peu|plupart|trop|très|une?)/") and morph(<1, ":Cc|<start>|>,")
        ->> \1-\2                                       # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

    ,  *WORD  [le|la|leur|en]
        <<- /imp/ space_after(\1, 1, 1) and morph(\2, ":V(?:1.*:Ip.*:2s|[23].*:Ip.*:3s)", ":[GM]|>(?:venir|aller|partir)")
            and morph(>1, ":|<end>|>,", ":(?:N|A|Y|B|3[sp]|>(?:pour|plus|moins|mieux|peu|trop|très|en|y))")
        -2:3>> =suggVerbTense(\2, ":E", ":2s")+"-"+\3   # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

TEST: {{Prends le}} avec toi.
TEST: {{Dites leur}} que nous sommes là.
TEST: {{restons en}} là.
TEST: j’en ai plus qu’assez, {{apprend le}}.
TEST: un sujet si extrêmement politique et polémique lui a donné un accès
TEST: Les États d’ores et déjà très affaiblis le seraient encore plus
TEST: « C’est ainsi », résume la cyptologue (erreur orthographique délibérée sur “cyptologue” pour empêcher certains faux positifs)
TEST: Notez le peu de cas qui en est fait en général dans les médias
TEST: deux fois par an, souligne le Dr Assouline
TEST: Pesons le pour et le contre.
TEST: Va la demander au concierge.
TEST: Allons le questionner encore une fois.
TEST: Sois le pire des salopards.

















__imp_laisser_le_la_les_infi__
    >laisser  [le|la|les]  *WORD
        <<- /imp/ space_after(\1, 1, 1) and morph(\1, ":E") and morph(\3, ":(?:Y|X|Oo)", ":[NAB]")
        -1:2>> \1-\2                                    # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

TEST: {{Laisse les}} entrer…
................................................................................

TEST: {{Paul,}} {{vient}} voir ce qui se passe.                         ->> Paul|||viens
TEST: Maria, avance devant toi.


__conj_det_nom_sing_virgule__
    <start>  [un|le|la|l’|ce|cet|cette|mon|ton|son|ma|ta|sa]  @:[NA]  ,  @:3s¬:[NAGEM]
        <<- /conj/ space_after(\3, 0, 0) and space_after(\4, 1, 10) -3:4>> \3   # Soit la virgule est superflue (on ne sépare pas le verbe du sujet), soit “\4” devrait être à l’impératif.
        <<- /conj/ __also__ -5>> =suggVerbTense(\5, ":E", ":2s")                # Soit la virgule après “\2 \3” est superflue (on ne sépare pas le verbe du sujet), soit “\4” devrait être à l’impératif.

TEST: l’{{homme,}} {{devient}} difficile.                               ->> homme|||deviens
TEST: ce matin, viens me voir.
TEST: l’Angola, Cuba et l’Afrique du Sud signent à New York, sous l’égide des Soviétiques et des Américains, un accord aboutissant au retrait des troupes cubaines d’Angola.


__conj_det_nom_plur_virgule__







|







 







>







 







>







 







>







 







>







 







|



>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







<
<
<
<

<


<
<
<
<

<
<







 







|
|







 







>







 







|







 







>







 







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







|
|


|



|
|


|







|







 







>







 







>
>
>
>







 







>







 







|







 







>
>







 







<







 







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







 







|




|






<











>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







|
|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
..
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
...
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
...
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
...
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
...
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
....
4391
4392
4393
4394
4395
4396
4397




4398

4399
4400




4401


4402
4403
4404
4405
4406
4407
4408
....
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
....
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
....
7000
7001
7002
7003
7004
7005
7006
7007
7008
7009
7010
7011
7012
7013
7014
....
7245
7246
7247
7248
7249
7250
7251
7252
7253
7254
7255
7256
7257
7258
7259
....
8298
8299
8300
8301
8302
8303
8304
8305
8306
8307
8308
8309
8310
8311
8312
8313
8314
8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329
8330
8331
8332
8333
8334
8335
8336
8337
8338
8339
8340
8341
8342
8343
....
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
....
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8732
.....
11322
11323
11324
11325
11326
11327
11328
11329
11330
11331
11332
11333
11334
11335
11336
11337
11338
11339
.....
11356
11357
11358
11359
11360
11361
11362
11363
11364
11365
11366
11367
11368
11369
11370
.....
11629
11630
11631
11632
11633
11634
11635
11636
11637
11638
11639
11640
11641
11642
11643
.....
11647
11648
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11659
11660
11661
11662
.....
13136
13137
13138
13139
13140
13141
13142

13143
13144
13145
13146
13147
13148
13149
.....
13324
13325
13326
13327
13328
13329
13330






















13331
13332
13333
13334
13335
13336
13337
.....
17751
17752
17753
17754
17755
17756
17757
17758
17759
17760
17761
17762
17763
17764
17765
17766
17767
17768
17769

17770
17771
17772
17773
17774
17775
17776
17777
17778
17779
17780
17781
17782
17783
17784
17785
17786
17787
17788
17789
17790
17791
17792
17793
17794
17795
17796
17797
17798
17799
17800
17801
17802
.....
19747
19748
19749
19750
19751
19752
19753
19754
19755
19756
19757
19758
19759
19760
19761
19762

!!
!!
!! Options                                                                                        !!
!!
!!

OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf poncfin, ocr chim, liga mapos
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
OPTGROUP/misc: date mc
OPTGROUP/debug: idrule

# Names of options is used in dictionaries keys: dOptPython, dOptJavaScript, etc.
................................................................................
OPT/esp:            True        True        True        False       False       False
OPT/tab:            False       True        False       False       False       False
OPT/nbsp:           True        True        True        False       False       False
OPT/tu:             True        True        True        True        True        True
OPT/maj:            True        True        True        True        True        True
OPT/num:            True        True        True        True        True        True
OPT/virg:           True        True        True        True        True        True
OPT/poncfin:        False       False       False       False       False       False
OPT/unit:           True        True        True        False       False       False
OPT/nf:             True        True        True        True        True        True
OPT/liga:           False       False       False       False       False       False
OPT/mapos:          False       False       False       False       False       False
OPT/chim:           False       False       False       False       False       False
OPT/ocr:            False       False       False       False       False       False
OPT/conf:           True        True        True        True        True        True
................................................................................
OPTCOLOR/esp:       orange      orange
OPTCOLOR/tab:       orange      orange
OPTCOLOR/nbsp:      orange      orange
OPTCOLOR/tu:        orange      orange
OPTCOLOR/maj:       orange      orange
OPTCOLOR/num:       orange      orange
OPTCOLOR/virg:      orange      orange
OPTCOLOR/poncfin:   orange      orange
OPTCOLOR/unit:      orange      orange
OPTCOLOR/nf:        orange      orange
OPTCOLOR/liga:      orange      orange
OPTCOLOR/mapos:     orange      orange
OPTCOLOR/chim:      orange      orange
OPTCOLOR/ocr:       violet      violet
OPTCOLOR/conf:      violet      violet
................................................................................
OPTLABEL/typo:      Signes typographiques
OPTLABEL/apos:      Apostrophe typographique|Correction des apostrophes droites. Automatisme possible dans le menu Outils > Options d’autocorrection > Options linguistiques > Guillemets simples > Remplacer (à cocher)
OPTLABEL/esp:       Espaces surnuméraires|Signale les espaces inutiles entre les mots, en début et en fin de ligne.
OPTLABEL/tab:       Tabulations surnuméraires|Signale les tabulations inutiles en début et en fin de ligne.
OPTLABEL/nbsp:      Espaces insécables|Vérifie les espaces insécables avec les ponctuations « ! ? : ; » (à désactiver si vous utilisez une police Graphite)
OPTLABEL/maj:       Majuscules|Vérifie l’utilisation des majuscules et des minuscules (par exemple, « la raison d’État », « les Européens »).
OPTLABEL/virg:      Virgules|Virgules manquantes avant “mais”, “car” et “etc.”.
OPTLABEL/poncfin:   Ponctuation finale [!]|Vérifie s’il manque une ponctuation finale au paragraphe (seulement pour les paragraphes constitués de plusieurs phrases).
OPTLABEL/tu:        Traits d’union|Cherche les traits d’union manquants ou inutiles.
OPTLABEL/num:       Nombres|Espaces insécables sur les grands nombres (> 10 000). Vérifie la présence de « O » au lieu de « 0 ».
OPTLABEL/unit:      Espaces insécables avant unités de mesure
OPTLABEL/nf:        Normes françaises
OPTLABEL/liga:      Signaler ligatures typographiques|Ligatures de fi, fl, ff, ffi, ffl, ft, st.
OPTLABEL/mapos:     Apostrophe manquante après lettres isolées [!]|Apostrophe manquante après les lettres l d s n c j m t ç. Cette option sert surtout à repérer les défauts de numérisation des textes et est déconseillée pour les textes scientifiques.
OPTLABEL/chim:      Chimie [!]|Typographie des composés chimiques (H₂O, CO₂, etc.).
................................................................................
OPTLABEL/typo:      Typographical glyphs
OPTLABEL/apos:      Typographical apostrophe|Detects typewriter apostrophes. You may get automatically typographical apostrophes in Tools > Autocorrect options > Localized options > Single quote > Replace (checkbox).
OPTLABEL/esp:       Useless spaces|Checks spaces within words and at the beginning and the end of lines.
OPTLABEL/tab:       Useless tabulations|Checks tabulations at the beginning and the end of lines.
OPTLABEL/nbsp:      Non-breakable spaces|Checks the use of non-breakable spaces with the following punctuation marks: « ! ? : ; » (deactivate it if you use a Graphite font).
OPTLABEL/maj:       Capitals|Checks the use of uppercase and lowercase letters (i.e. « la raison d’État », « les Européens »).
OPTLABEL/virg:      Commas|Missing commas before “mais”, “car” and “etc.”.
OPTLABEL/poncfin:   Ending punctuation [!]|Checks if an ending punctuation is missing on paragraphs (only for multi-sentences paragraphs).
OPTLABEL/tu:        Hyphens|Checks missing or useless hyphens.
OPTLABEL/num:       Numbers|Large numbers and « O » instead of « 0 ».
OPTLABEL/unit:      Non-breaking spaces before units of measurement
OPTLABEL/nf:        French standards
OPTLABEL/liga:      Report typographical ligatures|Ligatures of fi, fl, ff, ffi, ffl, ft, st.
OPTLABEL/mapos:     Missing apostrophes after single letters [!]|Missing apostrophes after l d s n c j m t ç. This option is mostly useful to detect defects of digitized texts and is not recommended for scientific texts.
OPTLABEL/chim:      Chemistry [!]|Typography for molecules (H₂O, CO₂, etc.)
................................................................................
    -2>> =\2.capitalize()                                                                           # Après un point, une majuscule est généralement requise.

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.

TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.


!!
!!
!!!! Ponctuation de fin de paragraphe                                                             !!
!!
!!

__[i>/poncfin__
    ({w_1}) *$  @@0
    <<- before("\\w+(?:[.]|[   ][!?]) +([A-ZÉÈÎ]\w+|[ÀÔ])") -1>> \1.|\1 !|\1 ?                      # Il semble manquer une ponctuation finale (s’il s’agit d’un titre, le point final n’est pas requis).

TEST: __poncfin__ Vraiment. Quel {{ennui}}
TEST: Internet : le nouvel eldorado
TEST: OMC-FMI : Les nouveaux maîtres du monde


!!
!!
!!!! Virgules                                                                                     !!
!!
!!

................................................................................

!!
!!
!!!! Tournures de langage                                                                         !!
!!
!!


















# Mon, ton, son : euphonie
__gn_mon_ton_son_euphonie__
    [ma|ta|sa]  @>[aâeéèêiîoôuûyœæ].+:[NAQ].*:f¬:[eGW]
        <<- /gn/ -1>> =\1.replace("a", "on")                                # Même si « \2 » est féminin, on utilise « mon/ton/son » pour faire la liaison.|http://fr.wikipedia.org/wiki/Euphonie

................................................................................
    des [un|une|le|la|l’|les|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|leur|leurs|ce|cet|cette|ces] @:[NA]
        <<- /conf/ not value(<1, "|un|une|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] [à|a] présent
        <<- /conf/ not morph(<1, ":D.*:p") -1>> dès                                                 # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    des ~^\d{2,5}$  [<end>|,]
    des ~^\d{2,5}$  @:¬:[NA].*:[ip]|>(?:à|et|ou)/
        <<- /conf/ not value(<1, "|%|") and not morph(<1, ">(?:pourcent|cent|barre|seuil)/") -1>> dès     # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] *NUM [ans|heures]
    [dés|des] @:B [ans|heures]
    [dés|des] [un|une] [an|heure]
        <<- /conf/ not morph(<1, ":R|>(?:approcher|anniversaire|cap|occasion|programme|terme|classe|autour|celui|ceux|celle|celles)/") and not value(>1, "|de|du|des|d’|")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s
................................................................................
TEST: sous la barre des 500
TEST: En plus des 400 à 500 euros mensuels que touche une personne
TEST: les moins de 20 ans peuvent ne pas connaître le premier album du groupe
TEST: au lieu des 20 heures réglementaires.
TEST: celle des 20 ans.
TEST: sous le seuil des 10 %
TEST: notre revue des 24 et 25 décembre
TEST: J’ai des X230.


# diagnostic / diagnotique // pronostic / pronostique
__conf_diagnostic_pronostique__
    [ce|un|du|mon|notre|votre|quel] diagnostique
        <<- /conf/ -2>> diagnostic                                                  # Confusion. Le nom s’écrit avec un “c”.

................................................................................
        <<- /conf/ ->> =\1[:-2]+"là"                                # Écrivez “là” et non “la”.

    [celle|celles|celui|ceux] la
        <<- /conf/ ->> \1-là                                        # Écrivez “là” et non “la”.

    /-là
        <<- /conf/ morph(\1, ":V", ":[NA]", 0, -3)
        -1>> =\1[:-3]+"-la|" + \1[:-3]+" là"                        # Confusion. Pour un COD, utilisez “la”. Ou, si ce “là” signifie “ici”, ne mettez pas de trait d’union.

    /-la
        <<- /conf/ morph(\1, ":[NA]", ":[123][sp]", 0, -3)
        -1>> =\1[:-2]+"là"                                          # Confusion : “\1” n’est pas un verbe.

    [ne|me|te|se] là
        <<- /conf/ -2>> la                                          # Confusion : “là” signifie “ici”.|http://fr.wiktionary.org/wiki/l%C3%A0
................................................................................
TEST: {{Ont}} lui avait donné du temps
TEST: {{Ont}} leur {{prendra}} tout
TEST: Qu’importe, {{ont}} leur {{prend}} tout
TEST: Qui {{on}} {{tant}} de malheurs !
TEST: {{peut-ont}} y arriver avec si peu de moyens ?
TEST: {{peut ont}} y arriver ?
TEST: comme ce que l’{{ont}} {{voit}} dans le lien entre polygynie et guerre.
TEST: Tout à fait, {{ont}} peut même dire qu’à l’adolescence, ce sont les problèmes de l’enfance qui ressortent.
TEST: les politiques de l’offre ont échoué.
TEST: qui on blâme, ce soir ?
TEST: qui n’ont somme toute que le désir de vivre paisiblement
TEST: ces textes, quoi qu’on en pense, ont force de loi.
TEST: s’ils n’ont ne serait-ce qu’un peu de jugeotte, on ne les reverra plus.


................................................................................

TEST: ce {{vieux}} homme
TEST: c’est un {{vieux}} imbécile.
TEST: Le {{vieux}} homme était parti.                         ->> vieil




# ayants droit
__sgpl_ayants_droit__
    [les|des|ces|ses|nos|vos|leurs] ayant [droit|droits]
        <<- /sgpl/ -2:3>> ayants droit                              # Au singulier : “un ayant droit”. Au pluriel : “des ayants droit”.

TEST: Comment lutter contre la cupidité des {{ayant droits}}
# Note: À supprimer? Graphie qui tend vers la soudure et le pluriel régulier (ayant-droit(s))


# termes
__sgpl_en_termes_de__
    en terme [de|d’]
        <<- /sgpl/ -2>> termes                                      # Dans la locution “en termes de”, mettez “terme” au pluriel.

TEST: en {{terme}} de communication, c’est une véritable catastrophe


# tous / tout / toutes
__sgpl_tous_azimuts__
    tout [azimut|azimuts]
        <<- /sgpl/ ->> tous azimuts                                 # « Tous azimuts » signifie « dans toutes les directions ».

__sgpl_une_bonne_fois_pour_toutes__
    une fois pour (toute)
    une bonne fois pour (toute)
        <<- /sgpl/ -1>> toutes                                      # Mettez “toute” au pluriel. Sous-entendu : une fois pour toutes les autres fois.

TEST: ils lancent des attaques {{tout azimut}}.
TEST: une bonne fois pour {{toute}}
TEST: ce sera réglé une fois pour {{toute}} quand il sera capturé.


# vu de ses yeux vu
__sgpl_vu_de_ses_yeux_vu__
    [vu|vue|vus|vues]  de  [mes|tes|ses|nos|vos|leurs]  yeux  [vu|vue|vus|vues]
        <<- /sgpl/ \1.lower() != \-1.lower() --1>> \1                                               # Accord avec “\1”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4532

    [vu|vue|vus|vues]  ,  de  [mes|tes|ses|nos|vos|leurs]  yeux  [vu|vue|vus|vues]  [,|<end>]
................................................................................
    de          tout  @:N.*:[fp]¬:(?:A|W|G|M|Y|[me]:[is]|3s)
        <<- /gn/ -3>> =suggMasSing(\3, True)                                                        # Accord avec “tout” : “\3” devrait être au masculin singulier.

    tout  @:N.*:[fp]¬:(?:A|W|G|M|Y|[me]:[is]|3s)
        <<- /gn/ morph(<1, ":R", ":D.*:p") -2>> =suggMasSing(\2, True)                              # Accord avec “tout” : “\2” devrait être au masculin singulier.

__toute_nom__
    [<start>|,] toute  @:[NA].*:[mp]¬:(?:W|P|G|M|[fe]:[is])
    de          toute  @:[NA].*:[mp]¬:(?:W|P|G|M|Y|[fe]:[is])
        <<- /gn/ -3>> =suggFemSing(\3, True)                                                        # Accord avec “toute” : “\3” devrait être au féminin singulie

    toute  @:[NA].*:[mp]¬:(?:W|G|M|Y|P|[fe]:[is])
        <<- /gn/ morph(<1, ":R") -2>> =suggFemSing(\2, True)                                        # Accord avec “toute” : “\2” devrait être au féminin singulier.

__tous_nom__
    [<start>|,] tous  @:[NA].*:[fs]¬:(?:W|P|G|M|[me]:[ip]|3p)
    de          tous  @:[NA].*:[fs]¬:(?:W|P|G|M|Y|[me]:[ip]|3[sp])
        <<- /gn/ -3>> =suggMasPlur(\3, True)                                                        # Accord avec “tous” : “\3” devrait être au masculin pluriel.

    tous  @:[NA].*:[fs]¬:(?:W|G|M|Y|P|3[sp]|[me]:[ip])
        <<- /gn/ morph(<1, ":R") -2>> =suggMasPlur(\2, True)                                        # Accord avec “tous” : “\2” devrait être au masculin pluriel.

__toutes_nom__
    [<start>|,] toutes  @:[NA].*:[ms]¬:(?:W|G|M|[fe]:[ip])
    de          toutes  @:[NA].*:[ms]¬:(?:W|G|M|Y|[fe]:[ip])
        <<- /gn/ -3>> =suggFemPlur(\3, True)                                                        # Accord avec “toutes” : “\3” devrait être au féminin pluriel.

    toutes  @:[NA].*:[ms]¬:(?:W|G|M|Y|P|[fe]:[ip])
        <<- /gn/ morph(<1, ":R") -2>> =suggFemPlur(\2, True)                                        # Accord avec “toutes” : “\2” devrait être au féminin pluriel.

TEST: Tout {{hommes}}
TEST: De tous {{âge}} !
TEST: avec toutes {{femme}}                                     ->> femmes
TEST: sur toutes {{armure}}                                     ->> armures
TEST: Toute {{époux}} doit faire preuve de bienveillance
................................................................................
TEST: Tout les sépare.
TEST: les tout débuts du mouvement ouvrier
TEST: vos tout débuts furent difficiles
TEST: aux tout débuts, il y eut bien des erreurs
TEST: comment les inégalités sociales impactent la santé des tout petits
TEST: l’existence d’un enseignement supérieur public, peu onéreux et ouvert à tous est d’une importance cruciale.
TEST: la survie de tous est plus importante que les profits de quelques-uns
TEST: tous ayant souffert du supplice de séjourner derrière les barreaux



!!
!!
!!!! Adverbes de négation                                                                         !!
!!
................................................................................
    >mettre a l’ [écart|épreuve]
    >percer a jour
    >prendre a la légère
    >saigner a blanc
    >tenir a distance
    >venir a point
        <<- /conf/ -2>> à               # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.

    >faire plaisirs
        <<- /sgpl/ -2>> plaisir                                                                     # Faire plaisir : dans cette locution, “plaisir” doit être au singulier.
        <<- ~2>> *

    >laisser pour [comte|comtes|>conte]
        <<- /conf/ -3>> compte          # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte

    [>mourir|>paraître|>paraitre|>rester|>sembler] >jeûne
        <<- /conf/ -2>> jeune           # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

................................................................................
TEST: il faut se tenir {{a}} distance de ces gens-là.
TEST: cette expérience ne va pas tarder à tourner {{cours}}.
TEST: il faut rendre {{comte}} de la sitation désastreuse dans laquelle nous sommes tombés.
TEST: il faut tenir {{comtes}} des aléas de la météo.
TEST: Elle est restée {{jeûne}}.
TEST: Mourir {{jeûne}} ne lui faisait pas peur.
TEST: Elles semblent {{jeûnes}}.
TEST: Ça me fait {{plaisirs}}.


# Autres tests contre les faux positifs
TEST: pourquoi faire compliqué quand on peut faire simple
TEST: Pour ceux et celles qui étaient présents à la cérémonie
TEST: les pires vilénies suite au mauvais vote du peuple
TEST: La numéro 1 mondiale
................................................................................

    *WORD  la  *WORD
        <<- /gn/ morph(\2, ":D") >>>
        <<- /gn/ morph(\3, ":[NA].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)")
            or ( morph(\3, ":[NA].*:m", ":[fe]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":(?:Rv|C)") and morph(\3, ":Y")) )
        -2>> le                                                                             # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p", "*")
            or ( morph(\3, ":[NA].*:p", ":[si]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -3>> =suggFemSing(\3)                                                               # Accord de nombre erroné : « \3 » devrait être au singulier.

    <start>  la  *WORD
        <<- /gn/ morph(\3, ":[NA].*:m", ":[efPGWY]") -2>> le                                # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NA].*:p", ":[siGW]") -3>> =suggFemSing(\3)       # Accord de nombre erroné : « \3 » devrait être au singulier.
................................................................................
TEST: {{La}} mustang est un cheval sauvage.                   ->> Le
TEST: {{La}} tableau.                                         ->> Le
TEST: dans la {{parties}}                                     ->> partie
TEST: de {{la}} vin                                           ->> le
TEST: {{la}} {{véhicule}}
TEST: {{La}} {{pris}}
TEST: la force de la {{formes}} parfaite
TEST: à ne plus se laisser faire la fois d’après
TEST: il pense à la fois où nous avons eu cet accident idiot.


__gn_la_2m__
    la  *WORD  *WORD
        <<- /gn/ morph(\1, ":D") and not value(<1, "|et|ou|de|") and not \3.startswith("seul") >>>
        <<- /gn/ morph(\2, ":[NA].*:[fe]", ":(?:B|G|V0)") and morph(\3, ":[NA].*:m", "*") and not apposition(\2, \3)
        -3>> =suggFemSing(\3, True)                                                         # Accord de genre erroné : « \1 \2 » est féminin, « \3 » est masculin.
................................................................................
__sgpl_leur_dévolu__
    >jeter leurs dévolus
        <<- /sgpl/ -2:3>> leur dévolu                   # Jeter son dévolu, leur dévolu : au singulier.

TEST: Ces gens qui jettent {{leurs dévolus}} sur n’importe qui, c’est d’une indécence.



# escalier
__sgpl_cage_d_escalier__
    >cage d’ escaliers
        <<- /sgpl/ -3>> escalier                                # Usuellement, pas de “s” à escalier.

TEST: Elle est passée par la cage d’{{escaliers}}

................................................................................
__sgpl_sentir_bon__
    >sentir bons
        <<- /sgpl/ -2>> bon                                         # Dans la locution “sentir bon”, “bon” est un adverbe, donc invariable.

TEST: Ces fleurs sentent {{bons}}.
TEST: Ça sent bon.
























# vacances
__sgpl_bonnes_vacances__
    bonne vacance
        <<- /sgpl/ not morph(<1, ":D.*:f:s") ->> bonnes vacances    # Les vacances. Au pluriel.

__sgpl_en_vacances__
................................................................................
TEST: Invite les plus intelligents…
TEST: Prenez les 5 ou 6 revues les plus connues.
TEST: Allez les chercher.
TEST: Soyez les plus gentils qu’on puisse imaginer.


__imp_union_le_la_leur__
    *WORD  [le|la|leur]
        <<- /imp/ space_after(\1, 1, 1)
            and morph(\1, ":E", ":[GM]|>(?:venir|aller|partir)") and morph(>1, ":|<end>|>,", ":(?:N|A|Q|Y|MP|H|T)|>(?:pour|plus|moins|mieux|peu|plupart|trop|très|une?)/") and morph(<1, ":Cc|<start>|>,")
        ->> \1-\2                                       # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

    ,  *WORD  [le|la|leur]
        <<- /imp/ space_after(\1, 1, 1) and morph(\2, ":V(?:1.*:Ip.*:2s|[23].*:Ip.*:3s)", ":[GM]|>(?:venir|aller|partir)")
            and morph(>1, ":|<end>|>,", ":(?:N|A|Y|B|3[sp]|>(?:pour|plus|moins|mieux|peu|trop|très|en|y))")
        -2:3>> =suggVerbTense(\2, ":E", ":2s")+"-"+\3   # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

TEST: {{Prends le}} avec toi.
TEST: {{Dites leur}} que nous sommes là.

TEST: j’en ai plus qu’assez, {{apprend le}}.
TEST: un sujet si extrêmement politique et polémique lui a donné un accès
TEST: Les États d’ores et déjà très affaiblis le seraient encore plus
TEST: « C’est ainsi », résume la cyptologue (erreur orthographique délibérée sur “cyptologue” pour empêcher certains faux positifs)
TEST: Notez le peu de cas qui en est fait en général dans les médias
TEST: deux fois par an, souligne le Dr Assouline
TEST: Pesons le pour et le contre.
TEST: Va la demander au concierge.
TEST: Allons le questionner encore une fois.
TEST: Sois le pire des salopards.


__imp_union_le_la_leur__
    *WORD  en
        <<- /imp/ space_after(\1, 1, 1)
            and morph(\1, ":E", ":[GM]|>(?:venir|aller|partir)") and morph(>1, ":|<end>|>,", ":(?:N|A|Q|Y|MP|H|T|D)|>(?:pour|plus|moins|mieux|peu|plupart|trop|très|une?)/") and morph(<1, ":Cc|<start>|>,")
        ->> \1-\2                                       # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

    ,  *WORD  en
        <<- /imp/ space_after(\1, 1, 1) and morph(\2, ":V(?:1.*:Ip.*:2s|[23].*:Ip.*:3s)", ":[GM]|>(?:venir|aller|partir)")
            and morph(>1, ":|<end>|>,", ":(?:N|A|Y|B|3[sp]|D|>(?:pour|plus|moins|mieux|peu|trop|très|en|y))")
        -2:3>> =suggVerbTense(\2, ":E", ":2s")+"-"+\3   # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

TEST: {{restons en}} là.
TEST: Intercède en ma faveur


__imp_laisser_le_la_les_infi__
    >laisser  [le|la|les]  *WORD
        <<- /imp/ space_after(\1, 1, 1) and morph(\1, ":E") and morph(\3, ":(?:Y|X|Oo)", ":[NAB]")
        -1:2>> \1-\2                                    # S’il s’agit d’un impératif, mettez un trait d’union.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=4206

TEST: {{Laisse les}} entrer…
................................................................................

TEST: {{Paul,}} {{vient}} voir ce qui se passe.                         ->> Paul|||viens
TEST: Maria, avance devant toi.


__conj_det_nom_sing_virgule__
    <start>  [un|le|la|l’|ce|cet|cette|mon|ton|son|ma|ta|sa]  @:[NA]  ,  @:3s¬:[NAGEM]
        <<- /conj/ space_after(\3, 0, 0) and space_after(\4, 1, 10) -3:4>> \3   # Soit la virgule est superflue (on ne sépare pas le verbe du sujet), soit “\5” devrait être à l’impératif.
        <<- /conj/ __also__ -5>> =suggVerbTense(\5, ":E", ":2s")                # Soit la virgule après “\2 \3” est superflue (on ne sépare pas le verbe du sujet), soit “\5” devrait être à l’impératif.

TEST: l’{{homme,}} {{devient}} difficile.                               ->> homme|||deviens
TEST: ce matin, viens me voir.
TEST: l’Angola, Cuba et l’Afrique du Sud signent à New York, sous l’égide des Soviétiques et des Américains, un accord aboutissant au retrait des troupes cubaines d’Angola.


__conj_det_nom_plur_virgule__

Changes to graphspell-js/ibdawg.js.

362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
            if (sRemain == "") {
                oSuggResult.addSugg(sNewWord);
                for (let sTail of this._getTails(iAddr)) {
                    oSuggResult.addSugg(sNewWord+sTail);
                }
                return;
            }
            else if (this.isValid(sRemain)) {
                oSuggResult.addSugg(sNewWord+" "+sRemain);
            }
        }
        if (nDist > oSuggResult.nDistLimit) {
            return;
        }








|







362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
            if (sRemain == "") {
                oSuggResult.addSugg(sNewWord);
                for (let sTail of this._getTails(iAddr)) {
                    oSuggResult.addSugg(sNewWord+sTail);
                }
                return;
            }
            else if (this.isValid(sRemain) && oSuggResult.sWord.startsWith(sNewWord)) {
                oSuggResult.addSugg(sNewWord+" "+sRemain);
            }
        }
        if (nDist > oSuggResult.nDistLimit) {
            return;
        }

Changes to graphspell/ibdawg.py.

325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
        #logging.info((nDeep * "  ") + sNewWord + ":" + sRemain)
        if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
            if not sRemain:
                oSuggResult.addSugg(sNewWord, nDeep)
                for sTail in self._getTails(iAddr):
                    oSuggResult.addSugg(sNewWord+sTail, nDeep)
                return
            elif self.isValid(sRemain):
                oSuggResult.addSugg(sNewWord+" "+sRemain)
        if nDist > oSuggResult.nDistLimit:
            return
        cCurrent = sRemain[0:1]
        for cChar, jAddr in self._getCharArcs(iAddr):
            if cChar in cp.d1to1.get(cCurrent, cCurrent):
                self._suggest(oSuggResult, sRemain[1:], nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, jAddr, sNewWord+cChar)







|







325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
        #logging.info((nDeep * "  ") + sNewWord + ":" + sRemain)
        if int.from_bytes(self.byDic[iAddr:iAddr+self.nBytesArc], byteorder='big') & self._finalNodeMask:
            if not sRemain:
                oSuggResult.addSugg(sNewWord, nDeep)
                for sTail in self._getTails(iAddr):
                    oSuggResult.addSugg(sNewWord+sTail, nDeep)
                return
            elif self.isValid(sRemain) and oSuggResult.sWord.startswith(sNewWord):
                oSuggResult.addSugg(sNewWord+" "+sRemain)
        if nDist > oSuggResult.nDistLimit:
            return
        cCurrent = sRemain[0:1]
        for cChar, jAddr in self._getCharArcs(iAddr):
            if cChar in cp.d1to1.get(cCurrent, cCurrent):
                self._suggest(oSuggResult, sRemain[1:], nMaxSwitch, nMaxDel, nMaxHardRepl, nMaxJump, nDist, nDeep+1, jAddr, sNewWord+cChar)