Grammalecte  Check-in [10b5745d47]

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

Overview
Comment:[fr] ajustements: expressions régulières pour Python et JS
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr | rg
Files: files | file ages | folders
SHA3-256:10b5745d472344532ec02d00656e76fc56add601a35ded7ba67f65563a95dc93
User & Date: olr 2018-09-16 19:27:54
Context
2018-09-17
09:00
[graphspell] tokenizer: add chars to \w replacement (JS still sucks) check-in: c185b3fc04 user: olr tags: graphspell, rg
2018-09-16
19:27
[fr] ajustements: expressions régulières pour Python et JS check-in: 10b5745d47 user: olr tags: fr, rg
19:27
[build] parameter names harmonisation check-in: 2e5ccfe8ea user: olr tags: build, rg
Changes

Changes to gc_lang/fr/rules.grx.

425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
...
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
...
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
...
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
...
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
....
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
....
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
....
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
....
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
....
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
....
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
....
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
....
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
....
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
....
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
....
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
....
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
....
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
....
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
....
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
....
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
....
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
....
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
....
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
....
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
....
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
....
6705
6706
6707
6708
6709
6710
6711

6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
....
7049
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
....
7261
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
....
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
....
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
.....
10010
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
.....
10948
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
.....
11728
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
.....
13139
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
.....
13544
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
.....
13706
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
.....
13887
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
.....
14855
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
.....
15008
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
.....
15079
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
.....
16366
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
.....
16467
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
    versions? ([0-9]+(?:[.][0-9]+[a-z]?)*) @@$ <<- ~1>> *

# sigles
__<s>(p_sigle1)__
    ([A-Z][.][A-Z][.](?:[A-Z][.])*) +[A-ZÉÀÂÊÎÈÔ]  @@0  <<- ~1>> =\1.replace(".", "")+"."
__[s>(p_sigle2)__
    [a-zA-Z][.][a-zA-Z][.](?:[a-zA-Z][.])*
    <<- not re.search(r"(?i)^(?:i\.e\.|s\.[tv]\.p\.|e\.g\.|a\.k\.a\.|c\.q\.f\.d\.|b\.a\.|n\.b\.)$", \0) >>>
    <<- \0.__len__() == 4 ->> =\0.replace(".", "").upper() + "|" + \0[0:2] + " " + \0[2:4]
    # Sigle. Il est recommandé d’ôter les points pour les sigles. (S’il s’agit d’un prénom et d’un nom, mettez un espace.)|https://fr.wikipedia.org/wiki/Sigle#Typographie
    <<- __else__ ->> =\0.replace(".", "").upper()                                                   # Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie
    <<- \0 != "b.a." ~>> =\0.replace(".", "_")
__[s>(p_sigle3)__
    J[.]-[A-Z][.] <<- ~>> =\0.replace(".", "").replace("-","")

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

# Patronyme réduit à une seule lettre
__[s](p_prénom_lettre_point_patronyme)__
    ([A-ZÉÈÂÎ][\w-]+)[  ][A-ZÉÈÂ]([.])[  ]([A-ZÉÈÂ][\w-]+) @@0,$,$
    <<- morph(\1, ":M[12]") and (morph(\3, ":(?:M[12]|V)") or not spell(\3)) ~2>> *
__[s>(p_prénom_lettre_point)__
    ([A-ZÉÈÂÎ][\w-]+)[  ][A-ZÉÈÂ]([.]) @@0,$
    <<- morph(\1, ":M[12]") and after("^\W+[a-zéèêîïâ]") ~2>> _

# Patronymes composés avec Le/La/Les
__[s](p_patronyme_composé_avec_le_la_les)__
    [A-ZÉÈÂÎ][\w-]+[-–—]L(?:es?|a) [A-ZÉÈÂÎ][\w-]+ <<- ~>> =\0.replace(" ", "_")

# IP
__[s](p_adresse_IP)__
................................................................................
    -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                                                                                     !!
................................................................................

TEST: ceci, cela{{, …}}                                                   ->> …
TEST: Les chiens, les chats{{.,}} les poules.                             ->> ,|.


# Fin de paragraphe
#__<i>/typo__  ({w_2}) *$   @@0
#    <<- before("[a-zéàùèê][.] ") and not before(r"^(?:\d|\w[.])")
#    -1>> \1.|\1…|\1 !|\1 ?|\1 :|\1 ;|\1,                                               # Il manque une ponctuation finale.


!!
!!
!!!! Espaces manquants                                                                            !!
!!
................................................................................
!!
!!!! Guillemets typographiques                                                                    !!
!!
!!

__<s>/typo(typo_guillemets_typographiques_doubles_ouvrants)__
    "(?=\w)
    <<- not before(r"[a-zA-Zéïîùàâäôö]$") ->> « |“                                                  # Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_doubles_fermants)__
    [\w.?!…,](")(?!\w)  @@*
    <<- -1>> " »|”"                                                                                 # Guillemets typographiques fermants.

TEST: {{"}}Le grand homme.”                                                 ->> « |“
TEST: “Le grand homme.{{"}}                                                 ->> " »|”"

................................................................................
!!
!!!! Cohérence des guillemets                                                                     !!
!!
!!

__<s>/typo(typo_cohérence_guillemets_chevrons_ouvrants)__
    («)[^»“]+?(”)  @@0,$
    <<- not before(r"\w$") -1>> “                                                                   # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after(r"^\w") -2>> " »"                                                                 # Guillemet fermant différent du guillemet ouvrant («).
__<s>/typo(typo_cohérence_guillemets_chevrons_fermants)__
    (“)[^”«]+?(»)  @@0,$
    <<- not before(r"\w$") -1>> "« "                                                                # Guillemet ouvrant différent du guillemet fermant (»).
    <<- not after(r"^\w") -2>> ”                                                                    # Guillemet fermant différent du guillemet ouvrant (“).

TEST: C’est {{«}}stupide{{”}}.
TEST: Quel {{“}}emmerdeur{{»}}, ce gars-là.


__<s>/typo(typo_cohérence_guillemets_doubles_ouvrants)__
    (“)[^”’“«]+?(’)(?!\w)  @@0,$
    <<- not before(r"\w$") -1>> "‘"                                                                 # Guillemet ouvrant différent du guillemet fermant (’).
    <<- -2>> ”                                                                                      # Guillemet fermant différent du guillemet ouvrant (“).
__<s>/typo(typo_cohérence_guillemets_doubles_fermants)__
    (‘)[^’“«]+?(”)  @@0,$
    <<- not before(r"\w$") -1>> "“"                                                                 # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after(r"^\w") -2>> ’                                                                    # Guillemet fermant différent du guillemet ouvrant (‘).

TEST: Tu sais, {{‘}}ton ami{{”}} est venu.
TEST: Oui, je vois, mais c’est quand même un {{“}}salopard{{’}}.


__[i]/typo(typo_guillemets_doubles_ouvrants_non_fermés)__
    (“)\w[^”"»]+$  @@0
................................................................................

TEST: C’était mon affaire{{”}}.
TEST: C’est {{“}}compliqué.


__[i]/typo(typo_guillemet_simple_ouvrant_non_fermé)__
    (‘)\w\w[^’']+$  @@0
    <<- before(r" $") or isStart() -1>> _                                                           # Guillemet fermant introuvable dans la suite du paragraphe.
__[i]/typo(typo_guillemet_simple_fermant_non_ouvert)__
    ^[^‘']+\w\w(’)  @@$
    <<- after("^ ") or isEnd() -1>> _                                                               # Guillemet ouvrant introuvable dans ce paragraphe.

TEST: ce {{‘}}test ne finira jamais.
TEST: ces actions ne représentent rien{{’}} pour moi.

................................................................................
!!

__[s]/num(num_grand_nombre_soudé)__
    \d\d\d\d+
    <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *$") >>>
    <<- \0.__len__() > 4 ->> =formatNumber(\0)                                                      # Formatage des grands nombres.
    <<- __else__
        and after("^(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])")
        or after(r"^[   ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\w’'])")
    ->> =formatNumber(\0)                                                                           # Formatage des grands nombres.

__[s]/num(num_nombre_quatre_chiffres)__
    (?<!,)(\d\d\d\d)[  ]([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,$
    <<- morph(\2, ";S", ":[VCR]") or mbUnit(\2) -1>> =formatNumber(\1)                              # Formatage des grands nombres

TEST: {{12345}}                                 ->> 12 345
................................................................................
!!
!!
!!!! Dates                                                                                        !!
!!
!!
__[i]/date(date_nombres)__
    (?<!\d[ /.-])(\d\d?)[ /.-](\d\d?)[ /.-](\d\d\d+)(?![ /.-]\d)  @@0,w,$
    <<- not checkDate(\1, \2, \3) and not before(r"(?i)\bversions? +$") ->> _                       # Cette date est invalide.
    <<- ~>> =\0.replace(".", "-").replace(" ", "-").replace("\/", "-")

TEST: le {{29 02 2011}}
TEST: le {{40-02-2011}}
TEST: le {{32.03.2018}}
TEST: le {{81/01/2012}}
TEST: 12-12-2012
................................................................................
TEST: __ocr__ {{II}} pleut tout le temps.
TEST: __ocr__ En l’an {{2OO1}}, tout commença.


## Casse
__[s]/ocr(ocr_casse1)__
    [A-ZÉÈÂÊÎÔ]{w_1}
    <<- \0.istitle() and before(r"(?i)\w") >>>
    <<- morph(\0, ":G", ":M") ->> =\0.lower()                                                       # Erreur de numérisation ? Casse improbable.
    <<- __else__ and morph(\0, ":[123][sp]", ":[MNA]|>Est/") ->> =\0.lower()                        # Erreur de numérisation ? Casse improbable.

TEST: __ocr__ votre ami la regarde, {{Vous}} ne l’avez pas achetée
TEST: __ocr__ pour accommoder son regard, {{La}} lourde forme demeure
TEST: __ocr__ parler de Nicole, {{Le}} sommeil ne vient pas.
TEST: __ocr__ a fait de toi, Charles, {{Tu}} étais beau quand
................................................................................
TEST: __ocr__ Part-{{On}} demain ?
TEST: __ocr__ À ce compte-{{Ci}}, on n’en viendra jamais à bout.
TEST: __ocr__ Quelques-{{Uns}} sont incapables d’y parvenir.


__[s>/ocr(ocr_casse3)__
    [LDNMTSCÇ]’
    <<- before(r"(?i)\w") ->> =\0.lower()                                                           # Erreur de numérisation ? Casse douteuse.

TEST: __ocr__ regarde dans l’obscurité de {{L’}}entrepôt


## Lettres isolées
# Note: l’option “mapos” cherche les apostrophes manquantes après les lettres l, d, n, m, t, s, j, c, ç
__[s]/ocr(ocr_lettres_isolées)!2__
    \w(?!’)
    <<- not re.search("[0-9aàAÀyYdlnmtsjcçDLNMTSJCÇ_]", \0) and not before(r"\d[   ]+$") and not (\0.isupper() and after0(r"^\."))
    ->> _           # Lettre isolée : erreur de numérisation ?

TEST: __ocr__ des verres luisent sur {{i}} le bureau blanc.
TEST: __ocr__ la voix, {{e}} est celle de…
TEST: __ocr__ ressemble {{h}} une fenêtre de serre.
TEST: __ocr__ Ça a duré 3 h.
TEST: __ocr__ c’est alors que je suis fort.
................................................................................

# l’ / j’ / Y / I
__ocr_lj1__
    ~^Y’[aâeéèêëiîïoôuyh]
        <<- ->> ="l’"+\1[2:] + "|L’"+\1[2:] + "|j’"+\1[2:] + "|J’"+\1[2:]                           # Erreur de numérisation ?

    Y  ~^[aâeéèêëiîïoôuyh]
        <<- before(r"\w") and not morph(\2, ":Y") ->> l’\2|L’\2|j’\2|J’\2                           # Erreur de numérisation ?

    ~^[Ii]’[aâeéèêëiîïoôuyh]
        <<- ->> ="l’"+\1[2:] + "|L’"+\1[2:] + "|j’"+\1[2:] + "|J’"+\1[2:]                           # Erreur de numérisation ?

    [I|i|1]  ~^[aâeéèêëiîïoôuy]
        <<- ->> l’\2|L’\2|j’\2|J’\2                                                                 # Erreur de numérisation ?

................................................................................
TEST: __ocr__ {{Y’arrive}} demain.
TEST: __ocr__ {{I’arrive}} demain.


# l’ / V / P
__ocr_l__
    ~^V.
        <<- \1.istitle() and before(r"\w") and morph(\1, ":", ":M") >>>
        <<- spell(\1[1:]) ->> ="v"+\1[1:] + "|l’"+\1[1:]                                            # Erreur de numérisation ?
        <<- __else__ ->> ="v"+\1[1:]                                                                # Erreur de numérisation ?

    ~^P[aâeéêèiîïoôuy]
        <<- before(r"\w") and morph(\1, ":", ":M") and spell(\1) ->> ="l’"+\1[1:] + "|p"+\1[1:]     # Erreur de numérisation ?

TEST: __ocr__ beaucoup de {{Vélos}} à Versailles.
TEST: __ocr__ avec {{Vagile}} méthode de notre amie Virginie, tout est possible.
TEST: __ocr__ Viens demain.
TEST: __ocr__ Ce jour où Valérie eut sa licence de droit.
TEST: __ocr__ Il scrute Pierre, {{Pair}} maussade.
TEST: __ocr__ Une grosse vague arrivait et {{Peau}} remplit.
................................................................................

TEST: __ocr__ mais {{taudis}} qu’elle œuvrait à leur salut, les nuages s’amoncelaient.


# l’est / Test
__ocr_l_est__
    Test
        <<- before(r"\w") ->> l’est                                                                 # Erreur de numérisation ?

TEST: __ocr__ ça {{Test}} à leurs yeux.


# tête / tète
__ocr_tête__
    tète
................................................................................
TEST: le {{31 avril}}
TEST: le {{30 février}}
TEST: {{29 février 2011}}


__date_journée_jour_mois_année__
    ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche])  ?,¿  ?le¿  (~^\d\d?$) - (~^\d\d?$) - (~^\d{2,5}$)
        <<- /date/ not after(r"^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDay(\1, \2, \3, \4)
        -1>> =getDay(\2, \3, \4)                                                                            # Le jour de la date suivante est incorrect.

    ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche])  ?,¿  ?le¿  (~^\d\d?$)  ([janvier|février|mars|avril|mai|juin|juillet|aout|août|septembre|octobre|novembre|décembre])  (~^\d{2,5}$)
        <<- /date/ not after(r"^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDayWithString(\1, \2, \3, \4)
        -1>> =getDayWithString(\2, \3, \4)                                                          # Le jour de la date suivante est incorrect.

TEST: {{samedi}}, le 10-06-2014                                           ->> mardi
TEST: {{mercredi}}, le 10 juin 2014                                       ->> mardi
TEST: {{lundi}}, 18 août 1912                                             ->> dimanche
TEST: {{jeudi}} 17 aout 1912                                              ->> samedi
TEST: lundi, 18 août 1912 avant Jésus-Christ (date imaginaire)
................................................................................
TEST: les méfaits de la {{vidéoprotection}}


#__[i]/bs__  (tomb\w+) dans les pommes <<- ->> \1 dans les pâmes                                    # « Tomber dans les pâmes » est l’ancienne tournure.

__bs_malgré_que__
    malgré que
        <<- /bs/ not after(r" en (?:a|aie|aies|ait|eut|eût|aura|aurait|avait)\b")
        ->> bien que|quoique                                                                        # “Malgré que” est une tournure populaire. Utilisez “bien que” ou “quoique”.

    malgré qu’
        <<- /bs/ not after(r" en (?:a|aie|aies|ait|eut|eût|aura|aurait|avait)\b")
        ->> bien qu’|quoiqu’                                                                        # “Malgré que” est une tournure populaire. Utilisez “bien que” ou “quoique”.

TEST: {{Malgré que}} je sois fou.


#([mts]e|[nv]ous) (rappel\w+) (de) <<- word(1) != "ne" and not morph(word(1), ":V")
#   -3>> _                                                     # Expression impropre. « Se rappeler quelque chose » ou « Se souvenir de quelque chose ».
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   (~ai$)
    [le|la|l’|les]              [lui|leur|en|y]         (~ai$)
    [lui|leur]                  en                      (~ai$)
        <<- /conj/ not value(>1, "|je|") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp])") and not tag_before(\1, "1s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    ~ai$
        <<- /conj/ not value(>1, "|je|") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp]|N|A|Q)") and not (\1.istitle() and before0(r"\w")) and not tag_before(\1, "1s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.


__conj_xxxas_xxxes__sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~[ae]s$)
        <<- /conj/ morph(\1, ":2s", ":(?:G|W|M|J|3[sp])")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   (~[ae]s$)
    [le|la|l’|les]              [lui|leur|en|y]         (~[ae]s$)
    [lui|leur]                  en                      (~[ae]s$)
        <<- /conj/ not value(>1, "|tu|") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    ~[ae]s$
        <<- /conj/ not value(>1, "|tu|") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|N|A|Q|1p)") and not (\1.istitle() and before0(r"\w")) and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.


__conj_xxxxxs_sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~[iudnrtpcï]s$)
        <<- /conj/ morph(\1, ":[12]s", ":(?:G|W|M|J|3[sp]|2p|1p)")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.
................................................................................
    [le|la|l’|les]              [lui|leur|en|y]         (~[iudnrtpcï]s$)
    [lui|leur]                  en                      (~[iudnrtpcï]s$)
        <<- /conj/ not value(>1, "|je|tu|") and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    étais
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0(r"\w")) and not morph(<1, ":[DA].*:p")
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    ~[iudnrtpcï]s$
        <<- /conj/ not value(>1, "|je|tu|") and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p|V0e|N|A|Q)") and not (\1.istitle() and before0(r"\w"))
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.


__conj_peux_veux_vaux_équivaux_prévaux_sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  ([peux|veux|vaux|équivaux|prévaux])
        <<- /conj/ -1>> =suggVerb(\1, ":3s")                                                        # Incohérence. Le sujet de cette forme verbale est introuvable.
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   ([peux|veux|vaux|équivaux|prévaux])
    [le|la|l’|les]              [lui|leur|en|y]         ([peux|veux|vaux|équivaux|prévaux])
    [lui|leur]                  en                      ([peux|veux|vaux|équivaux|prévaux])
        <<- /conj/ not value(>1, "|je|tu|") and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    vaux
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0(r"\w")) and not tag_before(\1, "1s") and not tag_before(\1, "2s")
            and not morph(<1, ":(?:R|D.*:p)")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    [peux|veux|équivaux|prévaux]
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0(r"\w")) and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.


TEST: Caroline, quand l’heure viendra, {{décideras}} de la conduite à tenir.
TEST: ceux-là, dans tous les cas de figure et dans tous les coups ratés, {{comprenais}} mal pourquoi on leur en voulait.
TEST: Lui, quand il y pensait, en {{arrivai}} à chaque fois à la même conclusion.
TEST: Elle, ici et dans tous les cas de figure, {{veux}} toujours en faire plus.
................................................................................
TEST: ces gens qui vont par monts et par vaux.
TEST: pour ne justement pas donner l’impression de s’être trompé.


## Incohérences avec formes verbales 1pl et 2pl sans sujet
__conj_xxxons_sans_sujet!3__
    @:1p¬:[EGMNAJ]
        <<- /conj/ not value(>1, "|nous|") and not (\1.istitle() and before0(r"\w")) and not tag_before(\1, "1p")
        -1>> =suggVerb(\1, ":3p")     # Ceci est un verbe à la 1ʳᵉ personne du pluriel. Sujet (“nous” ou équivalent) introuvable.

__conj_xxxez_sans_sujet!3__
    @:2p¬:[EGMNAJ]
        <<- /conj/ not value(>1, "|vous|") and not (\1.istitle() and before0(r"\w")) and not tag_before(\2, "2p")
        -1>> =suggVerb(\1, ":3p")     # Ceci est un verbe à la 2ᵉ personne du pluriel. Sujet (“vous” ou équivalent) introuvable.

TEST: les hommes et les femmes, qui sans un bruit, sans une parole amère, {{continuerons}} leur tâche n’en seront pas plus récompensés.
TEST: il était dit que cette femme et son frère {{promènerez}} leur chien à cette heure de la journée.
TEST: cet homme et cette femme {{pouvez}} y parvenir avec de la persévérance
TEST: Comme on lui disait que vous-même aviez déjà consulté le notaire
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
................................................................................
        -2>> =suggSimil(\2, ":[NA]:.:[si]", True)                                                   # Incohérence avec « \1 » : « \2 » est un verbe.

    [<start>|,]  [ton|son|audit]  @:(?:Y|[123][sp])¬:[NAQ]
        <<- /conf/ \3.islower()
        -3>> =suggSimil(\3, ":[NA]:[me]:[si]", True)                                                # Incohérence avec « \2 » : « \3 » est un verbe.

    un  @:(?:Y|[123][sp])¬:[GNA]
        <<- /conf/ not value(<1, "|dont|l’|d’|sauf|") and not before(r"(?i)\bun à +$")
        -2>> =suggSimil(\2, ":[NAQ]:[me]:[si]", True)                                               # Incohérence avec “\1” : “\2” est une forme verbale conjuguée.

TEST: un {{maintient}} difficile.
TEST: quelqu’un arrive.
TEST: cet {{plaît}} est infectée.
TEST: {{ce}} {{rappelle}} n’en finit pas.
TEST: mon {{rackette}} n’a pas porté les fruits espérés.
................................................................................


__conf_à_a_infinitif__
    a  @:Y¬:G
    a  [ne|n’|me|m’|te|t’|se|s’|en|y|lui|nous|vous]  @:Y
    a  [n’|m’|t’|s’|l’|les|lui|nous|vous|leur] [en|y] @:Y
    a  [le|la|l’|les|leur]  @:Y¬:N
        <<- /conf/ not value(<1, "|il|elle|on|n’|m’|t’|") and not before(r"(?i)\bqu[e’] |n’(?:en|y) +$")
        -1>> à                                                      # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0

TEST: scrupuleux {{a}} n’en toucher qu’une part infime.
TEST: Ne pas hésiter {{a}} {{demander}} des conseils.
TEST: Sébastien {{a}} {{demander}} des conseils.


................................................................................
    a vive allure
    a voix [haute|basse]
    a vol d’ oiseau
    a vrai dire
    a vue d’ œil
    a y [réfléchir|songer|penser]
    a y regarder de plus près
        <<- /conf/ not before(r"(?i)[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$")
        -1>> à              # Confusion probable : “a” est une forme conjugée de “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    a [mon|ton|son|notre|votre|leur] [cœur|corps] défendant
    a [mon|ton|son|notre|votre|leur] grand désarroi
    a [mon|ton|son|notre|votre|leur] [avis|côté|détriment|encontre|égard|insu|sujet|tour]
    a [ma|ta|sa|notre|votre|leur] grande [surprise|tristesse]
    a [ma|ta|sa|notre|votre|leur] [connaissance|disposition|guise|portée]
    a [mes|tes|ses|nos|vos|leurs] [dépens|côtés]
    a [mes|tes|ses|nos|vos|leurs] risques et périls
        <<- /conf/ not before(r"(?i)(?:\bqu[e’] |[ln]’$|(?<!-)\b(?:il|elle|on|y|n’en) +$)")
        -1>> à              # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0

TEST: Puisqu’on nous méprise, autant y aller {{a}} reculons.
TEST: Les parties {{a}} nouveau divisées ne se réuniront pas avant longtemps.
TEST: ils viennent nous attaquer {{a}} tout bout de champ
TEST: On s’y fait, d’une manière ou d’une autre, {{a}} notre corps défendant.
TEST: on fait ça {{a}} la va-vite.
................................................................................
    sa  @:G¬>(?:tr(?:ès|op)|peu|bien|plus|moins|toute|presque)/|:[NAQ].*:f
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa [n’|m’|t’|s’|j’|l’|d’|qu’|lorsqu’|puisqu’|quoiqu’]
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    çà
        <<- /conf/ not before(r"\b(?:[oO]h|[aA]h) +$") and not after("^ +et là")
        ->> ça                                          # Confusion : « çà » ne s’emploie plus guère que dans l’expression « çà et là ».

    ça et là
        <<- /conf/ not morph(<1, ":R") ->> çà et là     # Confusion : « ça » équivaut à « cela ». Dans l’expression « çà et là », « çà » équivaut à « ici ».

    sa  <end>
        <<- /conf/ -1>> ça                              # Confusion probable : “sa” est un déterminant féminin singulier. Pour l’équivalent de “cela” ou “ceci”, écrivez :
................................................................................
    [peux|peut] [importent|importe]
        <<- /conf/ morph(<1, ":C|<start>") -1>> peu                         # Confusion : « \1 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    [très|trop|de|quelque|pour|à] [peux|peut]
        <<- /conf/ -2>> peu                                                 # Confusion : « \2 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    un  [peux|peut]
        <<- /conf/ not before("(?i)(?:(?:quelqu|l|d)’|sauf +)") -2>> peu    # Confusion : « \2 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    [il|on] ?[ne|n’]¿ peu
        <<- /conf/ --1>> peut                                               # Confusion : « peu » signifie « pas beaucoup ».

    [je|tu] ?[ne|n’]¿ peu
        <<- /conf/ --1>> peux                                               # Confusion : « peu » signifie « pas beaucoup ».

................................................................................
    depuis [>prêt|>pré]
        <<- /conf/ --1>> près                                               # Confusion probable. Être prêt(e) à faire quelque chose. Être près de quelque chose. Le pré est un champ d’herbes.

    très [>prêt|>pré]
        <<- /conf/ -2>> près                                                # Confusion probable. Être prêt(e) à faire quelque chose. Être près de quelque chose. Le pré est un champ d’herbes.

    près à @:Y|>(?:tout|les?|la)/

        <<- /conf/ not before(r"(?i)\b(?:peu|de|au plus) $") -1>> prêt|p    # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] [toi|vous|lui|elle|eux|elles|@:M]
        <<- /conf/ not before(r"(?i)\b(obten|obt[iî])") -1>> près           # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] la [lui|leur|@:Y]
        <<- /conf/ \3.islower() -1>> près                                   # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] [le|l’|les|me|m’|te|t’|se|s’|ne|n’|en|y|@:Y]
        <<- /conf/ \3.islower() -1>> près                                   # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

................................................................................
    [qui|que|comment|pourquoi|lorsque|quand] son [,|@:[DR]]
        <<- /conf/ -2>> sont    # Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

    [<start>|,] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son     # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ morph(<1, ":V", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[nmts]e)/") and not before(r"(?i)\bce qu[e’] |[mts]’en +$")
        -1>> son                # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    [à|chez|dès|par] sont
    [avec|contre|devant|derrière|pour|sans|sur] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son     # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    en sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ not before(r"(?i)\b(?:ce qu[e’] |ils|elles|leur|lui|nous|vous|[mtsl]’)$")
        -2>> son                # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

TEST: ne leur {{son}} pas odieux.
TEST: Ces chiens me {{son}} odieux.
TEST: {{sont}} {{pain}}
TEST: en {{sont}} {{absence}}
TEST: qui {{son}} ces gens ?
................................................................................
# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before(r"(?i)\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire

................................................................................
    entre [moi|toi|lui|elle|nous|vous|eux|elles] et [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- ~>> *

    haut et fort
        <<- not morph(<1, ":D") ~>> *

    hélas
        <<- not morph(<1, ":(?:X|Oo)") and not before(r"(?i)\bt(?:u|oi qui)[ ,]") ~>> *

    nécessité fait loi
        <<- not morph(<1, ":D.*:f:[si]") ~>> *

    nombre [de|des]
        <<- morph(<1, ":(?:R|C[sc])") ~1>> *

................................................................................
    [la|cette]  [baronne|docteur|docteure|députée|duchesse|ministre|sœur|princesse|présidente|professeure|reine|sénatrice]  @:M[12]
        <<- ~3>> *

    [Mr|Mlle|Mme|Mgr|miss]  ~^[A-ZÉÈÊ]
        <<- ~2>> *

    @:Cs  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M") and not before(r"\b(?:plus|moins|aussi) .* que +$")
        ~2:4>> =rewriteSubject(\2,\4) + "||"

    <start>  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M")
        ~2:0>> =rewriteSubject(\2,\4) + "||"


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


__purge_tous_deux_trois__
    >faire tous [deux|trois]
        <<- ~2:0>> *

    >faire tous
        <<- morph(\1, ":[123]p") or (\1 == "fait" and before(r"(?i)\bon ")) ~2>> *



@@@@
@@@@
@@@@
@@@@
................................................................................
TEST: les heureux imbéciles {{payé}} au lance-pierre.


__gn_det_plur_3m__
    [ces|mes|tes|ses|nos|vos|leurs|quels|quelles|aux]       *WORD  *WORD  *WORD
    [plusieurs|quelques|certains|certaines|moult]           *WORD  *WORD  *WORD
    [lesdits|lesdites|desdits|desdites|auxdits|auxdites]    *WORD  *WORD  *WORD
        <<- /gn/ morph(\2, ":[NA].*:[pi]") and morph(\3, ":[NA].*:[pi]", ":(?:[123][sp]|G)") and morph(\4, ":[NA].*:s", "*") and not before(r"(?i)\bune? de +$")
        -4>> =suggPlur(\4)                                                                  # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au pluriel.

TEST: ces petites sottes {{déjantée}}


## certains / certaines
__gn_certains_1m__
................................................................................

# pied
__sgpl_pied__
    [>avoir|>perdre]  pieds
        <<- /sgpl/ -2>> pied                                        # Locution “\1 pied” : écrivez “pied” au singulier.

    à pieds
        <<- /sgpl/ not before(r"(?i)\b(?:lit|fauteuil|armoire|commode|guéridon|tabouret|chaise)s?\b") and not morph(>1, ">sculpter/")
        -2>> pied                                                   # Location “à pied” : écrivez “pied” au singulier.|https://fr.wiktionary.org/wiki/%C3%A0_pied

    [à|aux] >pied >levée
        <<- /sgpl/ ->> au pied levé                                 # Locution adverbiale invariable.

TEST: ils ont tout simplement perdu {{pieds}}
TEST: ils y sont allés à {{pieds}}.
................................................................................
    [de|d’] ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:V¬:Y
    [de|d’] ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:V¬:Y
    [de|d’] ?[ne|n’]¿  [lui|leur]                     en                         @:V¬:Y
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             # Après “de”, le verbe devrait être à l’infinitif.

    [de|d’]  @:V1.*:Q¬:N
        <<- /infi/ not \2[0:1].isupper()
            and not before(r"(?i)\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)")
        -2>> =suggVerbInfi(\2)                                                          # Le verbe devrait être à l’infinitif.

TEST: d’en {{parlé}} sans cesse
TEST: cela suffit de les {{aimait}}
TEST: de ne leur en {{avancé}} que le nécessaire.
TEST: de l’y {{poussé}}
TEST: arrête d’y {{consacré}} autant de temps.
................................................................................

!!!! OCR                                                                                          !!

# Participes passés
__ocr_être_participe_passé__
    >être  ~es?$
        <<- /ocr/ not value(\1, "|êtres|") >>>
        <<- /ocr/ \2.endswith("e") and morph(\2, ":V1.*:Ip.*:[13]s", ":[GMA]") and not before(r"(?i)\belle +(?:ne +|n’|)$")
        -2>> =suggVerbPpas(\2, ":m:s")                                                              # Erreur de numérisation ?
        <<- /ocr/ __else__ and \2.endswith("s") and morph(\2, ":V1.*:Ip.*:2s", ":[GMA]") and not before(r"(?i)\belles +(?:ne +|n’|)$")
        -2>> =suggVerbPpas(\2, ":m:p")                                                              # Erreur de numérisation ?

__ocr_avoir_participe_passé__
    >avoir  ~es?$
        <<- /ocr/ not value(\1, "|avoirs|") >>>
        <<- /ocr/ \2.endswith("e") and morph(\2, ":V1.*:Ip.*:[13]s", ":[GM]|>envie/")
        -2>> =suggVerbPpas(\2, ":m:s")                                                              # Erreur de numérisation ?
................................................................................
TEST: ce sont des faits constestés.
TEST: c’est un fait reconnu.
TEST: fait pourtant avéré et corroboré par le même sondage.
TEST: ce fait rapporté par des témoins au-delà de tout soupçon n’est pas contestable.

#__[i]/infi(infi_faire)__
#    (f(?:ai|[iî]|er|on)\w+) +({w_2}(?:ée?s?|ez))  @@0,$
#    <<- morph(\1, ">faire/") and not before(r"(?i)\b(?:en|[mtsldc]es?|[nv]ous|un) +$") and morph(\2, ":V", ":M")
#        and not (re.search("(?i)^fait$", \1) and \2.endswith("é"))
#        and not (re.search("(?i)^faits$", \1) and \2.endswith("és"))
#    -2>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.


__infi_me_te_se_faire__
    [me|te|se]  >faire  ~(?:ée?s?|ez)$
................................................................................
TEST: sans fin elles se sont succédé


__ppas_se_être__
    [me|m’|te|se|s’]  ?[y|en]¿  (>être)  (*WORD)
    t’  [y|en]  (>être)  (*WORD)
        <<- /ppas/ morph(\2, ":(?:Y|[123][sp])", ":Q") -2>> =suggVerbPpas(\2)                       # Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\1, ":[123]s") and morph(\2, ":Q.*:p") and not before(r"(?i)\bqu[e’][, ]|\bon (?:ne |)$")
        -2>> =suggSing(\2)                                                                          # Le participe passé devrait être au singulier.

    t’  >être  *WORD
        <<- /ppas/ not value(\2, "|es|étais|") >>>
        <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":Q") -3>> =suggVerbPpas(\3)                       # Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\2, ":[123]s") and morph(\3, ":Q.*:p") and not before(r"(?i)\bqu[e’][, ]|\bon (?:ne |)$")
        -3>> =suggSing(\3)                                                                          # Le participe passé devrait être au singulier.

TEST: s’être {{donner}} le mot.
TEST: je me suis {{donnés}} à fond
TEST: c’est de ce qui s’est {{passe}}.
TEST: Ça s’était toujours {{passe}} comme ça avec elle
TEST: elle s’est {{approche}} de la penderie
................................................................................
TEST: Nous l’avons {{mangés}}.
TEST: Nous l’avons {{mangées}}.
TEST: Ils ne me l’ont pas {{donnés}}


__ppas_m_t_avoir__
    [m’|t’] >avoir @:V[0-3]..t_.*:Q.*:p¬:[GWsi]
        <<- /ppas/ not before(r"\bqu[e’]") -3>> =suggSing(\3)
        # Accord avec “\1”. S’il s’agit d’un COD, le participe passé “\3” devrait être au singulier (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: ces livres m’avaient {{ennuyés}} au-delà du dicible.
TEST: Les élèves m’ont {{écoutés}}.
TEST: Les élèves t’ont de temps en temps {{écoutées}}.
TEST: Les élèves ne m’ont pas {{écoutés}}.
TEST: Les élèves ne m’ont pas {{écoutées}}.
................................................................................
!!!! Participes passés avec formes interrogatives                                                 !!
!!
!!

__ppas_avoir_pronom__
    *WORD  /VCint  *WORD
        <<- /ppas/ morphVC(\2, ":V0a") and morph(\3, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \3 != "prise"
            and not morph(\1, ">(?:les|[nv]ous|en)|:[NA].*:[fp]") and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
        -3>> =suggMasSing(\3)                               # Avec “avoir”, il faut un participe passé au masculin singulier, sauf si un COD précède.

    <start>  ?n’¿  (/VCint)  *WORD
        <<- /ppas/ morphVC(\1, ":V0a") and morph(\-1, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \-1 != "prise"
        --1>> =suggMasSing(\-1)                             # Avec “avoir”, il faut un participe passé au masculin singulier, sauf si un COD précède.

__ppas_l_m_t_avoir_pronom__
................................................................................
    <start>  [ne|n’]  ?[le|l’|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  soit
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|l’|en|y]          soit
    <start>  [ne|n’]  [le|l’]                  [lui|leur|en|y]       soit
    <start>  [ne|n’]  [lui|leur]               en                    soit
        <<- /imp/ --1>> sois                                                        # S’il s’agit d’un impératif, écrivez “sois”.

    <start>  soit  @:A¬:G
        <<- /imp/ not after(r"\bsoit\b") -2>> sois                                  # S’il s’agit d’un impératif, écrivez “sois”.

TEST: ne lui {{soit}} pas odieux.
TEST: {{Soit}} cohérent avec toi-même.
TEST: Ne {{soit}} pas con.
TEST: ne leur en {{soit}} pas reconnaissant, ce n’était qu’un calcul de leur part.
TEST: Ne {{soit}} pas en retard !

................................................................................
TEST: certaine est la défaite.
TEST: si tu persévères, certaine deviendra la réussite.


__conj_det_plur_nom__
    [ces|mes|tes|ses|nos|vos|leurs|quelques]  @:[NA].*:[pi]  @:V¬:(?:[13]p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3) -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isAmbiguousAndWrong(\2, \3, ":p", ":3p")
        -3>> =suggVerb(\3, ":3p", suggPlur)                             # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    [ces|mes|tes|ses|nos|vos|leurs|quelques]  @:[NA].*:[pi]  qui  @:V¬:(?:[13]p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\4, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        -4>> =suggVerb(\4, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Ses « chiens » {{coure}} sur ma pelouse.
TEST: mes filles {{passe}} ce matin
TEST: vos filles {{passes}} ce matin
TEST: ces travaux qui {{demande}} tant d’efforts.
TEST: vos questions ne {{réclame}} aucune réflexion.
TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.


__conj_det_plur_nom_confusion__
    les  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggPlur)                             # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    [certains|certaines]  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":m:p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggMasPlur)                          # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":f:p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggFemPlur)                          # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    plusieurs  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
            and not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    [les|certains|certaines|plusieurs]  @:[NA].*:[pi]  qui  @:V¬:(?:[13]p|P|Y|G)
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\4, ":3s") and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        -4>> =suggVerb(\4, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Les abstentions {{est}} présumée manifester un défaut d’opinion marquée
TEST: Les cours de culture générale nous {{apporte}} de l’ouverture d’esprit.
TEST: Les hommes ne le lui {{pardonnes}} pas.
TEST: Les infirmières à mi-temps ne {{travaille}} pas dans cette aile.
TEST: les données, en quantité plus que suffisante, {{indique}} que…
................................................................................


#### NOMS PROPRES

# 3sg
__conj_nom_propre__
    ~^[A-ZÉÈ]  @:[123][sp]¬:(?:G|3s|3p!|P|M|A.*:[si]|N.*:m:s)
        <<- /conj/ not before(r"\b[dD]e l’ *$") and morph(\1, ":M")
            and not morph(<1, ":[VRD]|>(?:ni|et|ou)/") and not before(r"([A-ZÉÈ][\w-]+), +([A-ZÉÈ][\w-]+), +$")
            and not ( morph(\2, ":3p") and before(r"\w") )
        -2>> =suggVerb(\2, ":3s")                                                                   # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Marc {{arrives}} demain.
TEST: Paul ne {{viens}} pas demain.
TEST: Marc Aurèle {{étaient}} l’empereur des Romains. (Pas de trait d’union sur Marc Aurèle.)
TEST: Arthur D. parvient à…
TEST: Les fondateurs pionniers de l’Internet n’avaient pas prévu







|







 







|







 







|







 







|







 







|







 







|
|


|
|







|



|
|







 







|







 







|
|







 







|







 







|







 







|








|







 







|







 







|




|







 







|







 







|



|







 







|



|







 







|







 







|







 







|




|







 







|




|







 







|




|







 







|







 







|







 







|









|







 







|







 







|







 







>
|


|







 







|







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|

|







 







|







 







|





|







 







|







 







|







 







|







 







|






|













|







|









|





|







 







|
|
|







425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
...
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
...
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
...
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
...
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
....
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
....
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
....
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
....
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
....
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
....
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
....
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
....
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
....
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
....
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
....
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
....
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
....
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
....
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
....
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
....
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
....
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
....
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
5125
....
5415
5416
5417
5418
5419
5420
5421
5422
5423
5424
5425
5426
5427
5428
5429
5430
5431
5432
5433
5434
5435
5436
5437
5438
5439
....
5675
5676
5677
5678
5679
5680
5681
5682
5683
5684
5685
5686
5687
5688
5689
....
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
....
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
....
7050
7051
7052
7053
7054
7055
7056
7057
7058
7059
7060
7061
7062
7063
7064
7065
7066
7067
7068
7069
7070
7071
7072
....
7262
7263
7264
7265
7266
7267
7268
7269
7270
7271
7272
7273
7274
7275
7276
....
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
....
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9688
9689
9690
.....
10011
10012
10013
10014
10015
10016
10017
10018
10019
10020
10021
10022
10023
10024
10025
.....
10949
10950
10951
10952
10953
10954
10955
10956
10957
10958
10959
10960
10961
10962
10963
.....
11729
11730
11731
11732
11733
11734
11735
11736
11737
11738
11739
11740
11741
11742
11743
.....
13140
13141
13142
13143
13144
13145
13146
13147
13148
13149
13150
13151
13152
13153
13154
.....
13545
13546
13547
13548
13549
13550
13551
13552
13553
13554
13555
13556
13557
13558
13559
13560
13561
.....
13707
13708
13709
13710
13711
13712
13713
13714
13715
13716
13717
13718
13719
13720
13721
.....
13888
13889
13890
13891
13892
13893
13894
13895
13896
13897
13898
13899
13900
13901
13902
13903
13904
13905
13906
13907
13908
.....
14856
14857
14858
14859
14860
14861
14862
14863
14864
14865
14866
14867
14868
14869
14870
.....
15009
15010
15011
15012
15013
15014
15015
15016
15017
15018
15019
15020
15021
15022
15023
.....
15080
15081
15082
15083
15084
15085
15086
15087
15088
15089
15090
15091
15092
15093
15094
.....
16367
16368
16369
16370
16371
16372
16373
16374
16375
16376
16377
16378
16379
16380
16381
16382
16383
16384
16385
16386
16387
16388
16389
16390
16391
16392
16393
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
16409
16410
16411
16412
16413
16414
16415
16416
16417
16418
16419
16420
16421
16422
16423
16424
16425
16426
.....
16468
16469
16470
16471
16472
16473
16474
16475
16476
16477
16478
16479
16480
16481
16482
16483
16484
    versions? ([0-9]+(?:[.][0-9]+[a-z]?)*) @@$ <<- ~1>> *

# sigles
__<s>(p_sigle1)__
    ([A-Z][.][A-Z][.](?:[A-Z][.])*) +[A-ZÉÀÂÊÎÈÔ]  @@0  <<- ~1>> =\1.replace(".", "")+"."
__[s>(p_sigle2)__
    [a-zA-Z][.][a-zA-Z][.](?:[a-zA-Z][.])*
    <<- not re.search("(?i)^(?:i\\.e\\.|s\\.[tv]\\.p\\.|e\\.g\\.|a\\.k\\.a\\.|c\\.q\\.f\\.d\\.|b\\.a\\.|n\\.b\\.)$", \0) >>>
    <<- \0.__len__() == 4 ->> =\0.replace(".", "").upper() + "|" + \0[0:2] + " " + \0[2:4]
    # Sigle. Il est recommandé d’ôter les points pour les sigles. (S’il s’agit d’un prénom et d’un nom, mettez un espace.)|https://fr.wikipedia.org/wiki/Sigle#Typographie
    <<- __else__ ->> =\0.replace(".", "").upper()                                                   # Sigle. Il est recommandé d’ôter les points pour les sigles.|https://fr.wikipedia.org/wiki/Sigle#Typographie
    <<- \0 != "b.a." ~>> =\0.replace(".", "_")
__[s>(p_sigle3)__
    J[.]-[A-Z][.] <<- ~>> =\0.replace(".", "").replace("-","")

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

# Patronyme réduit à une seule lettre
__[s](p_prénom_lettre_point_patronyme)__
    ([A-ZÉÈÂÎ][\w-]+)[  ][A-ZÉÈÂ]([.])[  ]([A-ZÉÈÂ][\w-]+) @@0,$,$
    <<- morph(\1, ":M[12]") and (morph(\3, ":(?:M[12]|V)") or not spell(\3)) ~2>> *
__[s>(p_prénom_lettre_point)__
    ([A-ZÉÈÂÎ][\w-]+)[  ][A-ZÉÈÂ]([.]) @@0,$
    <<- morph(\1, ":M[12]") and after("^\\W+[a-zéèêîïâ]") ~2>> _

# Patronymes composés avec Le/La/Les
__[s](p_patronyme_composé_avec_le_la_les)__
    [A-ZÉÈÂÎ][\w-]+[-–—]L(?:es?|a) [A-ZÉÈÂÎ][\w-]+ <<- ~>> =\0.replace(" ", "_")

# IP
__[s](p_adresse_IP)__
................................................................................
    -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                                                                                     !!
................................................................................

TEST: ceci, cela{{, …}}                                                   ->> …
TEST: Les chiens, les chats{{.,}} les poules.                             ->> ,|.


# Fin de paragraphe
#__<i>/typo__  ({w_2}) *$   @@0
#    <<- before("[a-zéàùèê][.] ") and not before("^(?:\\d|\w[.])")
#    -1>> \1.|\1…|\1 !|\1 ?|\1 :|\1 ;|\1,                                               # Il manque une ponctuation finale.


!!
!!
!!!! Espaces manquants                                                                            !!
!!
................................................................................
!!
!!!! Guillemets typographiques                                                                    !!
!!
!!

__<s>/typo(typo_guillemets_typographiques_doubles_ouvrants)__
    "(?=\w)
    <<- not before("[a-zA-Zéïîùàâäôö]$") ->> « |“                                                   # Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_doubles_fermants)__
    [\w.?!…,](")(?!\w)  @@*
    <<- -1>> " »|”"                                                                                 # Guillemets typographiques fermants.

TEST: {{"}}Le grand homme.”                                                 ->> « |“
TEST: “Le grand homme.{{"}}                                                 ->> " »|”"

................................................................................
!!
!!!! Cohérence des guillemets                                                                     !!
!!
!!

__<s>/typo(typo_cohérence_guillemets_chevrons_ouvrants)__
    («)[^»“]+?(”)  @@0,$
    <<- not before("\\w$") -1>> “                                                                   # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after("^\\w") -2>> " »"                                                                 # Guillemet fermant différent du guillemet ouvrant («).
__<s>/typo(typo_cohérence_guillemets_chevrons_fermants)__
    (“)[^”«]+?(»)  @@0,$
    <<- not before("\\w$") -1>> "« "                                                                # Guillemet ouvrant différent du guillemet fermant (»).
    <<- not after("^\\w") -2>> ”                                                                    # Guillemet fermant différent du guillemet ouvrant (“).

TEST: C’est {{«}}stupide{{”}}.
TEST: Quel {{“}}emmerdeur{{»}}, ce gars-là.


__<s>/typo(typo_cohérence_guillemets_doubles_ouvrants)__
    (“)[^”’“«]+?(’)(?!\w)  @@0,$
    <<- not before("\\w$") -1>> "‘"                                                                 # Guillemet ouvrant différent du guillemet fermant (’).
    <<- -2>> ”                                                                                      # Guillemet fermant différent du guillemet ouvrant (“).
__<s>/typo(typo_cohérence_guillemets_doubles_fermants)__
    (‘)[^’“«]+?(”)  @@0,$
    <<- not before("\\w$") -1>> "“"                                                                 # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after("^\\w") -2>> ’                                                                    # Guillemet fermant différent du guillemet ouvrant (‘).

TEST: Tu sais, {{‘}}ton ami{{”}} est venu.
TEST: Oui, je vois, mais c’est quand même un {{“}}salopard{{’}}.


__[i]/typo(typo_guillemets_doubles_ouvrants_non_fermés)__
    (“)\w[^”"»]+$  @@0
................................................................................

TEST: C’était mon affaire{{”}}.
TEST: C’est {{“}}compliqué.


__[i]/typo(typo_guillemet_simple_ouvrant_non_fermé)__
    (‘)\w\w[^’']+$  @@0
    <<- before(" $") or isStart() -1>> _                                                            # Guillemet fermant introuvable dans la suite du paragraphe.
__[i]/typo(typo_guillemet_simple_fermant_non_ouvert)__
    ^[^‘']+\w\w(’)  @@$
    <<- after("^ ") or isEnd() -1>> _                                                               # Guillemet ouvrant introuvable dans ce paragraphe.

TEST: ce {{‘}}test ne finira jamais.
TEST: ces actions ne représentent rien{{’}} pour moi.

................................................................................
!!

__[s]/num(num_grand_nombre_soudé)__
    \d\d\d\d+
    <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *$") >>>
    <<- \0.__len__() > 4 ->> =formatNumber(\0)                                                      # Formatage des grands nombres.
    <<- __else__
        and after("^(?:,[0-9]+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])")
        or after("^[   ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\\w’'])")
    ->> =formatNumber(\0)                                                                           # Formatage des grands nombres.

__[s]/num(num_nombre_quatre_chiffres)__
    (?<!,)(\d\d\d\d)[  ]([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*) @@0,$
    <<- morph(\2, ";S", ":[VCR]") or mbUnit(\2) -1>> =formatNumber(\1)                              # Formatage des grands nombres

TEST: {{12345}}                                 ->> 12 345
................................................................................
!!
!!
!!!! Dates                                                                                        !!
!!
!!
__[i]/date(date_nombres)__
    (?<!\d[ /.-])(\d\d?)[ /.-](\d\d?)[ /.-](\d\d\d+)(?![ /.-]\d)  @@0,w,$
    <<- not checkDate(\1, \2, \3) and not before("(?i)\\bversions? +$") ->> _                       # Cette date est invalide.
    <<- ~>> =\0.replace(".", "-").replace(" ", "-").replace("\/", "-")

TEST: le {{29 02 2011}}
TEST: le {{40-02-2011}}
TEST: le {{32.03.2018}}
TEST: le {{81/01/2012}}
TEST: 12-12-2012
................................................................................
TEST: __ocr__ {{II}} pleut tout le temps.
TEST: __ocr__ En l’an {{2OO1}}, tout commença.


## Casse
__[s]/ocr(ocr_casse1)__
    [A-ZÉÈÂÊÎÔ]{w_1}
    <<- \0.istitle() and before("\\w") >>>
    <<- morph(\0, ":G", ":M") ->> =\0.lower()                                                       # Erreur de numérisation ? Casse improbable.
    <<- __else__ and morph(\0, ":[123][sp]", ":[MNA]|>Est/") ->> =\0.lower()                        # Erreur de numérisation ? Casse improbable.

TEST: __ocr__ votre ami la regarde, {{Vous}} ne l’avez pas achetée
TEST: __ocr__ pour accommoder son regard, {{La}} lourde forme demeure
TEST: __ocr__ parler de Nicole, {{Le}} sommeil ne vient pas.
TEST: __ocr__ a fait de toi, Charles, {{Tu}} étais beau quand
................................................................................
TEST: __ocr__ Part-{{On}} demain ?
TEST: __ocr__ À ce compte-{{Ci}}, on n’en viendra jamais à bout.
TEST: __ocr__ Quelques-{{Uns}} sont incapables d’y parvenir.


__[s>/ocr(ocr_casse3)__
    [LDNMTSCÇ]’
    <<- before("\\w") ->> =\0.lower()                                                               # Erreur de numérisation ? Casse douteuse.

TEST: __ocr__ regarde dans l’obscurité de {{L’}}entrepôt


## Lettres isolées
# Note: l’option “mapos” cherche les apostrophes manquantes après les lettres l, d, n, m, t, s, j, c, ç
__[s]/ocr(ocr_lettres_isolées)!2__
    \w(?!’)
    <<- not re.search("[0-9aàAÀyYdlnmtsjcçDLNMTSJCÇ_]", \0) and not before("\\d[   ]+$") and not (\0.isupper() and after0(r"^\."))
    ->> _           # Lettre isolée : erreur de numérisation ?

TEST: __ocr__ des verres luisent sur {{i}} le bureau blanc.
TEST: __ocr__ la voix, {{e}} est celle de…
TEST: __ocr__ ressemble {{h}} une fenêtre de serre.
TEST: __ocr__ Ça a duré 3 h.
TEST: __ocr__ c’est alors que je suis fort.
................................................................................

# l’ / j’ / Y / I
__ocr_lj1__
    ~^Y’[aâeéèêëiîïoôuyh]
        <<- ->> ="l’"+\1[2:] + "|L’"+\1[2:] + "|j’"+\1[2:] + "|J’"+\1[2:]                           # Erreur de numérisation ?

    Y  ~^[aâeéèêëiîïoôuyh]
        <<- before("\\w") and not morph(\2, ":Y") ->> l’\2|L’\2|j’\2|J’\2                           # Erreur de numérisation ?

    ~^[Ii]’[aâeéèêëiîïoôuyh]
        <<- ->> ="l’"+\1[2:] + "|L’"+\1[2:] + "|j’"+\1[2:] + "|J’"+\1[2:]                           # Erreur de numérisation ?

    [I|i|1]  ~^[aâeéèêëiîïoôuy]
        <<- ->> l’\2|L’\2|j’\2|J’\2                                                                 # Erreur de numérisation ?

................................................................................
TEST: __ocr__ {{Y’arrive}} demain.
TEST: __ocr__ {{I’arrive}} demain.


# l’ / V / P
__ocr_l__
    ~^V.
        <<- \1.istitle() and before("\\w") and morph(\1, ":", ":M") >>>
        <<- spell(\1[1:]) ->> ="v"+\1[1:] + "|l’"+\1[1:]                                            # Erreur de numérisation ?
        <<- __else__ ->> ="v"+\1[1:]                                                                # Erreur de numérisation ?

    ~^P[aâeéêèiîïoôuy]
        <<- before("\\w") and morph(\1, ":", ":M") and spell(\1) ->> ="l’"+\1[1:] + "|p"+\1[1:]     # Erreur de numérisation ?

TEST: __ocr__ beaucoup de {{Vélos}} à Versailles.
TEST: __ocr__ avec {{Vagile}} méthode de notre amie Virginie, tout est possible.
TEST: __ocr__ Viens demain.
TEST: __ocr__ Ce jour où Valérie eut sa licence de droit.
TEST: __ocr__ Il scrute Pierre, {{Pair}} maussade.
TEST: __ocr__ Une grosse vague arrivait et {{Peau}} remplit.
................................................................................

TEST: __ocr__ mais {{taudis}} qu’elle œuvrait à leur salut, les nuages s’amoncelaient.


# l’est / Test
__ocr_l_est__
    Test
        <<- before("\\w") ->> l’est                                                                 # Erreur de numérisation ?

TEST: __ocr__ ça {{Test}} à leurs yeux.


# tête / tète
__ocr_tête__
    tète
................................................................................
TEST: le {{31 avril}}
TEST: le {{30 février}}
TEST: {{29 février 2011}}


__date_journée_jour_mois_année__
    ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche])  ?,¿  ?le¿  (~^\d\d?$) - (~^\d\d?$) - (~^\d{2,5}$)
        <<- /date/ not after("^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDay(\1, \2, \3, \4)
        -1>> =getDay(\2, \3, \4)                                                                            # Le jour de la date suivante est incorrect.

    ([lundi|mardi|mercredi|jeudi|vendredi|samedi|dimanche])  ?,¿  ?le¿  (~^\d\d?$)  ([janvier|février|mars|avril|mai|juin|juillet|aout|août|septembre|octobre|novembre|décembre])  (~^\d{2,5}$)
        <<- /date/ not after("^ +av(?:ant|) +J(?:C|ésus-Christ)") and not checkDayWithString(\1, \2, \3, \4)
        -1>> =getDayWithString(\2, \3, \4)                                                          # Le jour de la date suivante est incorrect.

TEST: {{samedi}}, le 10-06-2014                                           ->> mardi
TEST: {{mercredi}}, le 10 juin 2014                                       ->> mardi
TEST: {{lundi}}, 18 août 1912                                             ->> dimanche
TEST: {{jeudi}} 17 aout 1912                                              ->> samedi
TEST: lundi, 18 août 1912 avant Jésus-Christ (date imaginaire)
................................................................................
TEST: les méfaits de la {{vidéoprotection}}


#__[i]/bs__  (tomb\w+) dans les pommes <<- ->> \1 dans les pâmes                                    # « Tomber dans les pâmes » est l’ancienne tournure.

__bs_malgré_que__
    malgré que
        <<- /bs/ not after(" en (?:a|aie|aies|ait|eut|eût|aura|aurait|avait)\\b")
        ->> bien que|quoique                                                                        # “Malgré que” est une tournure populaire. Utilisez “bien que” ou “quoique”.

    malgré qu’
        <<- /bs/ not after(" en (?:a|aie|aies|ait|eut|eût|aura|aurait|avait)\\b")
        ->> bien qu’|quoiqu’                                                                        # “Malgré que” est une tournure populaire. Utilisez “bien que” ou “quoique”.

TEST: {{Malgré que}} je sois fou.


#([mts]e|[nv]ous) (rappel\w+) (de) <<- word(1) != "ne" and not morph(word(1), ":V")
#   -3>> _                                                     # Expression impropre. « Se rappeler quelque chose » ou « Se souvenir de quelque chose ».
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   (~ai$)
    [le|la|l’|les]              [lui|leur|en|y]         (~ai$)
    [lui|leur]                  en                      (~ai$)
        <<- /conj/ not value(>1, "|je|") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp])") and not tag_before(\1, "1s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.

    ~ai$
        <<- /conj/ not value(>1, "|je|") and morph(\1, ":1s", ":(?:E|G|W|M|J|3[sp]|N|A|Q)") and not (\1.istitle() and before0("\\w")) and not tag_before(\1, "1s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.


__conj_xxxas_xxxes__sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~[ae]s$)
        <<- /conj/ morph(\1, ":2s", ":(?:G|W|M|J|3[sp])")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   (~[ae]s$)
    [le|la|l’|les]              [lui|leur|en|y]         (~[ae]s$)
    [lui|leur]                  en                      (~[ae]s$)
        <<- /conj/ not value(>1, "|tu|") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|1p)") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.

    ~[ae]s$
        <<- /conj/ not value(>1, "|tu|") and morph(\1, ":2s", ":(?:E|G|W|M|J|3[sp]|N|A|Q|1p)") and not (\1.istitle() and before0("\\w")) and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.


__conj_xxxxxs_sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~[iudnrtpcï]s$)
        <<- /conj/ morph(\1, ":[12]s", ":(?:G|W|M|J|3[sp]|2p|1p)")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.
................................................................................
    [le|la|l’|les]              [lui|leur|en|y]         (~[iudnrtpcï]s$)
    [lui|leur]                  en                      (~[iudnrtpcï]s$)
        <<- /conj/ not value(>1, "|je|tu|") and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)")
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    étais
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0("\\w")) and not morph(<1, ":[DA].*:p")
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    ~[iudnrtpcï]s$
        <<- /conj/ not value(>1, "|je|tu|") and morph(\1, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p|V0e|N|A|Q)") and not (\1.istitle() and before0("\\w"))
            and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.


__conj_peux_veux_vaux_équivaux_prévaux_sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  ([peux|veux|vaux|équivaux|prévaux])
        <<- /conj/ -1>> =suggVerb(\1, ":3s")                                                        # Incohérence. Le sujet de cette forme verbale est introuvable.
................................................................................
    [me|m’|te|t’|nous|vous]     ?[le|la|l’|les|en|y]¿   ([peux|veux|vaux|équivaux|prévaux])
    [le|la|l’|les]              [lui|leur|en|y]         ([peux|veux|vaux|équivaux|prévaux])
    [lui|leur]                  en                      ([peux|veux|vaux|équivaux|prévaux])
        <<- /conj/ not value(>1, "|je|tu|") and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    vaux
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0("\\w")) and not tag_before(\1, "1s") and not tag_before(\1, "2s")
            and not morph(<1, ":(?:R|D.*:p)")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.

    [peux|veux|équivaux|prévaux]
        <<- /conj/ not value(>1, "|je|tu|") and not (\1.istitle() and before0("\\w")) and not tag_before(\1, "1s") and not tag_before(\1, "2s")
        -1>> =suggVerb(\1, ":3s")                                                                   # Incohérence. Le sujet de cette forme verbale est introuvable.


TEST: Caroline, quand l’heure viendra, {{décideras}} de la conduite à tenir.
TEST: ceux-là, dans tous les cas de figure et dans tous les coups ratés, {{comprenais}} mal pourquoi on leur en voulait.
TEST: Lui, quand il y pensait, en {{arrivai}} à chaque fois à la même conclusion.
TEST: Elle, ici et dans tous les cas de figure, {{veux}} toujours en faire plus.
................................................................................
TEST: ces gens qui vont par monts et par vaux.
TEST: pour ne justement pas donner l’impression de s’être trompé.


## Incohérences avec formes verbales 1pl et 2pl sans sujet
__conj_xxxons_sans_sujet!3__
    @:1p¬:[EGMNAJ]
        <<- /conj/ not value(>1, "|nous|") and not (\1.istitle() and before0("\\w")) and not tag_before(\1, "1p")
        -1>> =suggVerb(\1, ":3p")     # Ceci est un verbe à la 1ʳᵉ personne du pluriel. Sujet (“nous” ou équivalent) introuvable.

__conj_xxxez_sans_sujet!3__
    @:2p¬:[EGMNAJ]
        <<- /conj/ not value(>1, "|vous|") and not (\1.istitle() and before0("\\w")) and not tag_before(\2, "2p")
        -1>> =suggVerb(\1, ":3p")     # Ceci est un verbe à la 2ᵉ personne du pluriel. Sujet (“vous” ou équivalent) introuvable.

TEST: les hommes et les femmes, qui sans un bruit, sans une parole amère, {{continuerons}} leur tâche n’en seront pas plus récompensés.
TEST: il était dit que cette femme et son frère {{promènerez}} leur chien à cette heure de la journée.
TEST: cet homme et cette femme {{pouvez}} y parvenir avec de la persévérance
TEST: Comme on lui disait que vous-même aviez déjà consulté le notaire
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
................................................................................
        -2>> =suggSimil(\2, ":[NA]:.:[si]", True)                                                   # Incohérence avec « \1 » : « \2 » est un verbe.

    [<start>|,]  [ton|son|audit]  @:(?:Y|[123][sp])¬:[NAQ]
        <<- /conf/ \3.islower()
        -3>> =suggSimil(\3, ":[NA]:[me]:[si]", True)                                                # Incohérence avec « \2 » : « \3 » est un verbe.

    un  @:(?:Y|[123][sp])¬:[GNA]
        <<- /conf/ not value(<1, "|dont|l’|d’|sauf|") and not before("(?i)\\bun à +$")
        -2>> =suggSimil(\2, ":[NAQ]:[me]:[si]", True)                                               # Incohérence avec “\1” : “\2” est une forme verbale conjuguée.

TEST: un {{maintient}} difficile.
TEST: quelqu’un arrive.
TEST: cet {{plaît}} est infectée.
TEST: {{ce}} {{rappelle}} n’en finit pas.
TEST: mon {{rackette}} n’a pas porté les fruits espérés.
................................................................................


__conf_à_a_infinitif__
    a  @:Y¬:G
    a  [ne|n’|me|m’|te|t’|se|s’|en|y|lui|nous|vous]  @:Y
    a  [n’|m’|t’|s’|l’|les|lui|nous|vous|leur] [en|y] @:Y
    a  [le|la|l’|les|leur]  @:Y¬:N
        <<- /conf/ not value(<1, "|il|elle|on|n’|m’|t’|") and not before("(?i)\\bqu[e’] |n’(?:en|y) +$")
        -1>> à                                                      # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0

TEST: scrupuleux {{a}} n’en toucher qu’une part infime.
TEST: Ne pas hésiter {{a}} {{demander}} des conseils.
TEST: Sébastien {{a}} {{demander}} des conseils.


................................................................................
    a vive allure
    a voix [haute|basse]
    a vol d’ oiseau
    a vrai dire
    a vue d’ œil
    a y [réfléchir|songer|penser]
    a y regarder de plus près
        <<- /conf/ not value(<1, "|l’|n’|il|elle|on|y|") and not before("(?i)n’en +$")
        -1>> à              # Confusion probable : “a” est une forme conjugée de “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    a [mon|ton|son|notre|votre|leur] [cœur|corps] défendant
    a [mon|ton|son|notre|votre|leur] grand désarroi
    a [mon|ton|son|notre|votre|leur] [avis|côté|détriment|encontre|égard|insu|sujet|tour]
    a [ma|ta|sa|notre|votre|leur] grande [surprise|tristesse]
    a [ma|ta|sa|notre|votre|leur] [connaissance|disposition|guise|portée]
    a [mes|tes|ses|nos|vos|leurs] [dépens|côtés]
    a [mes|tes|ses|nos|vos|leurs] risques et périls
        <<- /conf/ not value(<1, "|que|qu’|l’|n’|il|elle|on|y|") and not before("(?i)n’en +$")
        -1>> à              # Confusion probable : “a” est la conjugaison du verbe “avoir”. Utilisez la préposition “à”.|http://fr.wiktionary.org/wiki/%C3%A0

TEST: Puisqu’on nous méprise, autant y aller {{a}} reculons.
TEST: Les parties {{a}} nouveau divisées ne se réuniront pas avant longtemps.
TEST: ils viennent nous attaquer {{a}} tout bout de champ
TEST: On s’y fait, d’une manière ou d’une autre, {{a}} notre corps défendant.
TEST: on fait ça {{a}} la va-vite.
................................................................................
    sa  @:G¬>(?:tr(?:ès|op)|peu|bien|plus|moins|toute|presque)/|:[NAQ].*:f
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    sa [n’|m’|t’|s’|j’|l’|d’|qu’|lorsqu’|puisqu’|quoiqu’]
        <<- /conf/ -1>> ça                              # Confusion : “sa” (sa maison, sa passion) ≠ “ça” (ça vient, ça heurte).

    çà
        <<- /conf/ not value(<1, "|oh|ah|") and not after("^ +et là")
        ->> ça                                          # Confusion : « çà » ne s’emploie plus guère que dans l’expression « çà et là ».

    ça et là
        <<- /conf/ not morph(<1, ":R") ->> çà et là     # Confusion : « ça » équivaut à « cela ». Dans l’expression « çà et là », « çà » équivaut à « ici ».

    sa  <end>
        <<- /conf/ -1>> ça                              # Confusion probable : “sa” est un déterminant féminin singulier. Pour l’équivalent de “cela” ou “ceci”, écrivez :
................................................................................
    [peux|peut] [importent|importe]
        <<- /conf/ morph(<1, ":C|<start>") -1>> peu                         # Confusion : « \1 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    [très|trop|de|quelque|pour|à] [peux|peut]
        <<- /conf/ -2>> peu                                                 # Confusion : « \2 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    un  [peux|peut]
        <<- /conf/ not value(<1, "|quelqu’|l’|d’|sauf|") -2>> peu           # Confusion : « \2 » est une conjugaison de “pouvoir”, utilisez “peu” pour dire “pas beaucoup”.

    [il|on] ?[ne|n’]¿ peu
        <<- /conf/ --1>> peut                                               # Confusion : « peu » signifie « pas beaucoup ».

    [je|tu] ?[ne|n’]¿ peu
        <<- /conf/ --1>> peux                                               # Confusion : « peu » signifie « pas beaucoup ».

................................................................................
    depuis [>prêt|>pré]
        <<- /conf/ --1>> près                                               # Confusion probable. Être prêt(e) à faire quelque chose. Être près de quelque chose. Le pré est un champ d’herbes.

    très [>prêt|>pré]
        <<- /conf/ -2>> près                                                # Confusion probable. Être prêt(e) à faire quelque chose. Être près de quelque chose. Le pré est un champ d’herbes.

    près à @:Y|>(?:tout|les?|la)/
        <<- /conf/ not value(<1, "|peu|de|") and not before("(?i)\\bau plus $")
        -1>> prêt|prêts                                                     # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] [toi|vous|lui|elle|eux|elles|@:M]
        <<- /conf/ not before("(?i)\\b(obten|obt[iî])") -1>> près           # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] la [lui|leur|@:Y]
        <<- /conf/ \3.islower() -1>> près                                   # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

    >prêt [de|d’] [le|l’|les|me|m’|te|t’|se|s’|ne|n’|en|y|@:Y]
        <<- /conf/ \3.islower() -1>> près                                   # Confusion probable. Être près de (faire) quelque chose. Prêt à faire quelque chose.

................................................................................
    [qui|que|comment|pourquoi|lorsque|quand] son [,|@:[DR]]
        <<- /conf/ -2>> sont    # Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

    [<start>|,] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son     # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ morph(<1, ":V", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[nmts]e)/") and not before("(?i)\\bce qu[e’] |[mts]’en +$")
        -1>> son                # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    [à|chez|dès|par] sont
    [avec|contre|devant|derrière|pour|sans|sur] sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ -2>> son     # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

    en sont @:[NA].*:[me]:s|>[aeéiîou].*/:[NA].*:f:s¬:[GW]
        <<- /conf/ not value(<1, "|ils|elles|leur|lui|nous|vous|m’|t’|s’|l’|") and not before("(?i)\\bce qu[e’] $")
        -2>> son                # Confusion probable : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.

TEST: ne leur {{son}} pas odieux.
TEST: Ces chiens me {{son}} odieux.
TEST: {{sont}} {{pain}}
TEST: en {{sont}} {{absence}}
TEST: qui {{son}} ces gens ?
................................................................................
# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before("(?i)\\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
    [ni|et|par|pour|sans]                           (voire)
    [>aller|>falloir|>pouvoir|>vouloir]  ?[guère|jamais|pas|plus|point|rien]¿  (voire)
        <<- /conf/ -1>> voir            # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire

................................................................................
    entre [moi|toi|lui|elle|nous|vous|eux|elles] et [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- ~>> *

    haut et fort
        <<- not morph(<1, ":D") ~>> *

    hélas
        <<- not morph(<1, ":(?:X|Oo)") and not tag_before(\1, "2s") ~>> *

    nécessité fait loi
        <<- not morph(<1, ":D.*:f:[si]") ~>> *

    nombre [de|des]
        <<- morph(<1, ":(?:R|C[sc])") ~1>> *

................................................................................
    [la|cette]  [baronne|docteur|docteure|députée|duchesse|ministre|sœur|princesse|présidente|professeure|reine|sénatrice]  @:M[12]
        <<- ~3>> *

    [Mr|Mlle|Mme|Mgr|miss]  ~^[A-ZÉÈÊ]
        <<- ~2>> *

    @:Cs  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M") and not before("\\b(?:plus|moins|aussi) .* que +$")
        ~2:4>> =rewriteSubject(\2,\4) + "||"

    <start>  ~^[A-ZÉÈÊ]  et  [moi|toi|lui|elle|nous|vous|eux|elles]
        <<- morph(\2, ":M")
        ~2:0>> =rewriteSubject(\2,\4) + "||"


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


__purge_tous_deux_trois__
    >faire tous [deux|trois]
        <<- ~2:0>> *

    >faire tous
        <<- morph(\1, ":[123]p") or (\1 == "fait" and value(<1, "|on|")) ~2>> *



@@@@
@@@@
@@@@
@@@@
................................................................................
TEST: les heureux imbéciles {{payé}} au lance-pierre.


__gn_det_plur_3m__
    [ces|mes|tes|ses|nos|vos|leurs|quels|quelles|aux]       *WORD  *WORD  *WORD
    [plusieurs|quelques|certains|certaines|moult]           *WORD  *WORD  *WORD
    [lesdits|lesdites|desdits|desdites|auxdits|auxdites]    *WORD  *WORD  *WORD
        <<- /gn/ morph(\2, ":[NA].*:[pi]") and morph(\3, ":[NA].*:[pi]", ":(?:[123][sp]|G)") and morph(\4, ":[NA].*:s", "*") and not before("(?i)\\bune? de +$")
        -4>> =suggPlur(\4)                                                                  # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au pluriel.

TEST: ces petites sottes {{déjantée}}


## certains / certaines
__gn_certains_1m__
................................................................................

# pied
__sgpl_pied__
    [>avoir|>perdre]  pieds
        <<- /sgpl/ -2>> pied                                        # Locution “\1 pied” : écrivez “pied” au singulier.

    à pieds
        <<- /sgpl/ not before("(?i)\\b(?:lit|fauteuil|armoire|commode|guéridon|tabouret|chaise)s?\\b") and not morph(>1, ">sculpter/")
        -2>> pied                                                   # Location “à pied” : écrivez “pied” au singulier.|https://fr.wiktionary.org/wiki/%C3%A0_pied

    [à|aux] >pied >levée
        <<- /sgpl/ ->> au pied levé                                 # Locution adverbiale invariable.

TEST: ils ont tout simplement perdu {{pieds}}
TEST: ils y sont allés à {{pieds}}.
................................................................................
    [de|d’] ?[ne|n’]¿  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:V¬:Y
    [de|d’] ?[ne|n’]¿  [le|la|l’|les]                 [lui|leur|en|y]            @:V¬:Y
    [de|d’] ?[ne|n’]¿  [lui|leur]                     en                         @:V¬:Y
        <<- /infi/ --1>> =suggVerbInfi(\-1)                                             # Après “de”, le verbe devrait être à l’infinitif.

    [de|d’]  @:V1.*:Q¬:N
        <<- /infi/ not \2[0:1].isupper()
            and not before("(?i)\\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se) trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)")
        -2>> =suggVerbInfi(\2)                                                          # Le verbe devrait être à l’infinitif.

TEST: d’en {{parlé}} sans cesse
TEST: cela suffit de les {{aimait}}
TEST: de ne leur en {{avancé}} que le nécessaire.
TEST: de l’y {{poussé}}
TEST: arrête d’y {{consacré}} autant de temps.
................................................................................

!!!! OCR                                                                                          !!

# Participes passés
__ocr_être_participe_passé__
    >être  ~es?$
        <<- /ocr/ not value(\1, "|êtres|") >>>
        <<- /ocr/ \2.endswith("e") and morph(\2, ":V1.*:Ip.*:[13]s", ":[GMA]") and not before("(?i)\\belle +(?:ne +|n’|)$")
        -2>> =suggVerbPpas(\2, ":m:s")                                                              # Erreur de numérisation ?
        <<- /ocr/ __else__ and \2.endswith("s") and morph(\2, ":V1.*:Ip.*:2s", ":[GMA]") and not before("(?i)\\belles +(?:ne +|n’|)$")
        -2>> =suggVerbPpas(\2, ":m:p")                                                              # Erreur de numérisation ?

__ocr_avoir_participe_passé__
    >avoir  ~es?$
        <<- /ocr/ not value(\1, "|avoirs|") >>>
        <<- /ocr/ \2.endswith("e") and morph(\2, ":V1.*:Ip.*:[13]s", ":[GM]|>envie/")
        -2>> =suggVerbPpas(\2, ":m:s")                                                              # Erreur de numérisation ?
................................................................................
TEST: ce sont des faits constestés.
TEST: c’est un fait reconnu.
TEST: fait pourtant avéré et corroboré par le même sondage.
TEST: ce fait rapporté par des témoins au-delà de tout soupçon n’est pas contestable.

#__[i]/infi(infi_faire)__
#    (f(?:ai|[iî]|er|on)\w+) +({w_2}(?:ée?s?|ez))  @@0,$
#    <<- morph(\1, ">faire/") and not before("(?i)\\b(?:en|[mtsldc]es?|[nv]ous|un) +$") and morph(\2, ":V", ":M")
#        and not (re.search("(?i)^fait$", \1) and \2.endswith("é"))
#        and not (re.search("(?i)^faits$", \1) and \2.endswith("és"))
#    -2>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.


__infi_me_te_se_faire__
    [me|te|se]  >faire  ~(?:ée?s?|ez)$
................................................................................
TEST: sans fin elles se sont succédé


__ppas_se_être__
    [me|m’|te|se|s’]  ?[y|en]¿  (>être)  (*WORD)
    t’  [y|en]  (>être)  (*WORD)
        <<- /ppas/ morph(\2, ":(?:Y|[123][sp])", ":Q") -2>> =suggVerbPpas(\2)                       # Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\1, ":[123]s") and morph(\2, ":Q.*:p") and not before("(?i)\\bqu[e’][, ]|\\bon (?:ne |)$")
        -2>> =suggSing(\2)                                                                          # Le participe passé devrait être au singulier.

    t’  >être  *WORD
        <<- /ppas/ not value(\2, "|es|étais|") >>>
        <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":Q") -3>> =suggVerbPpas(\3)                       # Incohérence. Après « s’être », le verbe doit être un participe passé.
        <<- /ppas/ __else__ and morph(\2, ":[123]s") and morph(\3, ":Q.*:p") and not before("(?i)\\bqu[e’][, ]|\\bon (?:ne |)$")
        -3>> =suggSing(\3)                                                                          # Le participe passé devrait être au singulier.

TEST: s’être {{donner}} le mot.
TEST: je me suis {{donnés}} à fond
TEST: c’est de ce qui s’est {{passe}}.
TEST: Ça s’était toujours {{passe}} comme ça avec elle
TEST: elle s’est {{approche}} de la penderie
................................................................................
TEST: Nous l’avons {{mangés}}.
TEST: Nous l’avons {{mangées}}.
TEST: Ils ne me l’ont pas {{donnés}}


__ppas_m_t_avoir__
    [m’|t’] >avoir @:V[0-3]..t_.*:Q.*:p¬:[GWsi]
        <<- /ppas/ not before("(?i)\\bqu(?:e |’)") -3>> =suggSing(\3)
        # Accord avec “\1”. S’il s’agit d’un COD, le participe passé “\3” devrait être au singulier (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: ces livres m’avaient {{ennuyés}} au-delà du dicible.
TEST: Les élèves m’ont {{écoutés}}.
TEST: Les élèves t’ont de temps en temps {{écoutées}}.
TEST: Les élèves ne m’ont pas {{écoutés}}.
TEST: Les élèves ne m’ont pas {{écoutées}}.
................................................................................
!!!! Participes passés avec formes interrogatives                                                 !!
!!
!!

__ppas_avoir_pronom__
    *WORD  /VCint  *WORD
        <<- /ppas/ morphVC(\2, ":V0a") and morph(\3, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \3 != "prise"
            and not morph(\1, ">(?:les|[nv]ous|en)|:[NA].*:[fp]") and not before("(?i)\\b(?:quel(?:le|)s?|combien) ")
        -3>> =suggMasSing(\3)                               # Avec “avoir”, il faut un participe passé au masculin singulier, sauf si un COD précède.

    <start>  ?n’¿  (/VCint)  *WORD
        <<- /ppas/ morphVC(\1, ":V0a") and morph(\-1, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \-1 != "prise"
        --1>> =suggMasSing(\-1)                             # Avec “avoir”, il faut un participe passé au masculin singulier, sauf si un COD précède.

__ppas_l_m_t_avoir_pronom__
................................................................................
    <start>  [ne|n’]  ?[le|l’|en|me|m’|te|t’|nous|vous|lui|leur|y]¿  soit
    <start>  [ne|n’]  [me|m’|te|t’|nous|vous]  [le|l’|en|y]          soit
    <start>  [ne|n’]  [le|l’]                  [lui|leur|en|y]       soit
    <start>  [ne|n’]  [lui|leur]               en                    soit
        <<- /imp/ --1>> sois                                                        # S’il s’agit d’un impératif, écrivez “sois”.

    <start>  soit  @:A¬:G
        <<- /imp/ not after(" soit ") -2>> sois                                     # S’il s’agit d’un impératif, écrivez “sois”.

TEST: ne lui {{soit}} pas odieux.
TEST: {{Soit}} cohérent avec toi-même.
TEST: Ne {{soit}} pas con.
TEST: ne leur en {{soit}} pas reconnaissant, ce n’était qu’un calcul de leur part.
TEST: Ne {{soit}} pas en retard !

................................................................................
TEST: certaine est la défaite.
TEST: si tu persévères, certaine deviendra la réussite.


__conj_det_plur_nom__
    [ces|mes|tes|ses|nos|vos|leurs|quelques]  @:[NA].*:[pi]  @:V¬:(?:[13]p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3) -3>> =suggVerb(\3, ":3p") # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isAmbiguousAndWrong(\2, \3, ":p", ":3p")
        -3>> =suggVerb(\3, ":3p", suggPlur)                             # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    [ces|mes|tes|ses|nos|vos|leurs|quelques]  @:[NA].*:[pi]  qui  @:V¬:(?:[13]p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        -4>> =suggVerb(\4, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Ses « chiens » {{coure}} sur ma pelouse.
TEST: mes filles {{passe}} ce matin
TEST: vos filles {{passes}} ce matin
TEST: ces travaux qui {{demande}} tant d’efforts.
TEST: vos questions ne {{réclame}} aucune réflexion.
TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.


__conj_det_plur_nom_confusion__
    les  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggPlur)                             # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    [certains|certaines]  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        <<- /conj/ not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":m:p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggMasPlur)                          # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
        <<- /conj/ __else__ and isVeryAmbiguousAndWrong(\2, \3, ":f:p", ":3p", value(<1, "|<start>|,|"))
        -3>> =suggVerb(\3, ":3p", suggFemPlur)                          # Accord avec “\1 \2…” incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.

    plusieurs  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|A.*:e:[pi])
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\3, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
            and not checkAgreement(\2, \3)
        -3>> =suggVerb(\3, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    [les|certains|certaines|plusieurs]  @:[NA].*:[pi]  qui  @:V¬:(?:[13]p|P|Y|G)
        <<- /conj/ morph(<1, ":C|<start>|>,")
            and not( morph(\4, ":3s") and before("(?i)\\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        -4>> =suggVerb(\4, ":3p")                                       # Conjugaison erronée. Accord avec “\1 \2 \3…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Les abstentions {{est}} présumée manifester un défaut d’opinion marquée
TEST: Les cours de culture générale nous {{apporte}} de l’ouverture d’esprit.
TEST: Les hommes ne le lui {{pardonnes}} pas.
TEST: Les infirmières à mi-temps ne {{travaille}} pas dans cette aile.
TEST: les données, en quantité plus que suffisante, {{indique}} que…
................................................................................


#### NOMS PROPRES

# 3sg
__conj_nom_propre__
    ~^[A-ZÉÈ]  @:[123][sp]¬:(?:G|3s|3p!|P|M|A.*:[si]|N.*:m:s)
        <<- /conj/ not before("\\b[dD]e l’ *$") and morph(\1, ":M")
            and not morph(<1, ":[VRD]|>(?:ni|et|ou)/") and not before("([A-ZÉÈ][\\w-]+), +([A-ZÉÈ][\\w-]+), +$")
            and not ( morph(\2, ":3p") and before("\\w") )
        -2>> =suggVerb(\2, ":3s")                                                                   # Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Marc {{arrives}} demain.
TEST: Paul ne {{viens}} pas demain.
TEST: Marc Aurèle {{étaient}} l’empereur des Romains. (Pas de trait d’union sur Marc Aurèle.)
TEST: Arthur D. parvient à…
TEST: Les fondateurs pionniers de l’Internet n’avaient pas prévu