Grammalecte  Check-in [c8d5d25458]

Overview
Comment:[fr] ajustements
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr
Files: files | file ages | folders
SHA3-256: c8d5d254587ea7078484a37e20acdd0a2524304096ab08e3fd5b77b04faa82dd
User & Date: olr on 2020-05-01 21:49:46
Other Links: manifest | tags
Context
2020-05-01
21:50
[fr] màj: notes sur le français check-in: 4e9296499d user: olr tags: fr, trunk
21:49
[fr] ajustements check-in: c8d5d25458 user: olr tags: fr, trunk
07:57
[fr] ajustements, version 1.9.1 check-in: aa26883b27 user: olr tags: fr, trunk, v1.9.1
Changes

Modified gc_lang/fr/rules.grx from [cbddb618fa] to [b7f755dbc5].

507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
...
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
...
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
...
632
633
634
635
636
637
638








































































































639
640
641
642
643
644
645
...
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
...
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
...
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
...
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
...
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
...
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
...
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
...
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
...
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
....
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
....
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
....
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
....
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
....
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
....
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
....
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
....
6469
6470
6471
6472
6473
6474
6475









6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
.....
15668
15669
15670
15671
15672
15673
15674






15675
15676
15677
15678
15679
15680
15681
15682
15683
15684
15685
15686
15687
.....
15729
15730
15731
15732
15733
15734
15735




15736
15737
15738
15739
15740
15741
15742
.....
16246
16247
16248
16249
16250
16251
16252

16253
16254
16255
16256
16257
16258
16259
16260
16261
16262
16263
16264

16265
16266
16267
16268
16269
16270
16271
.....
19732
19733
19734
19735
19736
19737
19738
19739
19740
19741
19742
19743
19744
19745
19746
19747
19748
19749
19750
19751
19752
19753
19754
19755
19756
.....
19757
19758
19759
19760
19761
19762
19763


19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
19777
19778
19779
19780
19781
19782
19783
19784
19785
.....
19797
19798
19799
19800
19801
19802
19803

19804
19805
19806
19807
19808
19809
19810
.....
20784
20785
20786
20787
20788
20789
20790
20791
20792
20793
20794



20795
20796
20797

20798
20799
20800
20801
20802
20803
20804
.....
21503
21504
21505
21506
21507
21508
21509

21510
21511
21512
21513
21514
21515
21516
.....
26631
26632
26633
26634
26635
26636
26637
26638
26639
26640
26641
26642
26643
26644
26645

26646
26647
26648
26649

26650
26651
26652
26653
26654




































26655
26656
26657
26658






26659
26660
26661
26662
26663
26664
26665
.....
26674
26675
26676
26677
26678
26679
26680

26681
26682
26683












26684
26685
26686
26687



26688
26689
26690
26691
26692
26693
26694
.....
26697
26698
26699
26700
26701
26702
26703





















26704
26705
26706
26707
26708
26709
26710
.....
26735
26736
26737
26738
26739
26740
26741
26742
26743
26744
26745
26746
26747
26748
26749
26750
26751
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765
26766
26767
26768
26769
    \w[\w.-]*@\w[\w.-]*\w[.]\w\w+ <<- ~>> __MAIL__

# URL
__<i>(p_URL)__
    (?:ht|f)tps?://[\w./?&!%=+*"'@$#-]+ <<- ~>> __URL__
__<i](p_URL2)__
    ((?:{w_1}[.])*)({w_2})([.](?:com|net|org|info|fr|ca|be|ch|i[ot]|co[.]uk|tk|jp|zh|ru|us|nl|xyz)) @@0,**,$
    <<- ~1>> *
    <<- ~2>> =\2.capitalize()
    <<- ~3>> *

# Numéro de chapitre
__<i>(p_chapitre)__
    ^\d+[.][\d.-]* <<- ~>> *

# Numéro suivi de plusieurs espaces, considéré comme une numérotation de chapitre
__<i>(p_num_chapitre)__
................................................................................
    (?:versions?|mises? [àa] jour) ([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("-","")

# Mr et MM
__[s>(p_M_point)__
    (M[.]) (?:[A-ZÉÈÎ]\w*|l[e'’])  @@0 <<- ~1>> Mr
__[s>(p_MM_point)__
................................................................................
    "\d+ (m) "  @@w <<- ~1>> _

# crochets
__[s](p_points_suspension_entre_crochets)__
    \[…\] <<- ~>> *
__[s](p_mot_entre_crochets)__
    \[({w_1})\] @@1
    <<- \1.isdigit() ~>> *
    <<- __else__ and morph(\1, ":G") ~>> =" " + \1 + " "
    <<- __else__ and \1.isalpha() ~>> " _"

# parenthèses
__[s](points_suspension_entre_parenthèses)__
    \(…\)
    <<- ->> […]                 && Pour indiquer une troncature de texte, on utilise usuellement des crochets.
    <<- ~>> *
__<i>(p_préfixes_entre_parenthèses)__
    " (\(r[eé]\))\w+"  @@1
        <<- ~1>> *

TEST: par {{O.R.}}                                          ->> OR|O. R.
TEST: l’{{A.N.P.E.}} n’existe plus
TEST: ce chien […] ne {{semblez}} pas en forme.
................................................................................
TEST: C’est dans le dossier D:\Data
TEST: Dossier C:\Program Files (x86)\LibreOffice
TEST: [1] Dossier à revoir.
TEST: jusqu’à 12h47
TEST: Allons (re)voir ce film
TEST: La figure 110 représente…










































































































!!!
!!!
!!! Processeur: balises HTML, LaTeX, Markdown                                                     !!
!!!
!!!

................................................................................
__<s>/latex(p_latex3)__     \{(?:abstract|align|cases|center|description|enumerate|equation|figure|flush(?:left|right)|gather|minipage|multline|quot(?:ation|e)|SaveVerbatim|table|tabular|thebibliography|[vV]erbatim|verse|wrapfigure)\} <<- ~>> *

# Markdown
__<s>/md(p_md_span_ouvrant)__   " ([*_]+)\w" @@1 <<- ~1>> *
__<i>/md(p_md_span_fermant)__   "[a-z0-9àéîïôûüù]([*_]+)[,.;:!?) ]" @@1 <<- ~1>> *
__<s>/md(p_md_titre_début)__    "^#+" <<- ~>> *
__<s>/md(p_md_titre_fin)__      "#+ *$" <<- ~>> *
__<s>/md(p_md_liste)__          "^[*+] " <<- ~>> *
__<s>/md(p_md_citation)__       "^>[ >]+ " <<- ~>> *

TEST: __html__  des <b>{{homme}}</b>
TEST: __html__  des [b]{{femme}}[/b]
TEST: __html__  il est venu&nbsp;: c’était bien…
TEST: __md__    ces **{{femme}}**

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

# (attention aux modifs: brainfuck d’intensité non négligeable)
# La désambiguïsation est faite lors de la deuxième passe

__[i](eepi_écriture_épicène_tous_toutes)__
    tous?[.(/·•⋅–—-]te[.)/·•⋅–—-]?s
    <<- option("eepi") ->> tous et toutes|toutes et tous                                            && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{tou.tes}} sont là.                                              ->> tous et toutes|toutes et tous


__[i](eepi_écriture_épicène_ceux_celles)__
    c[./·•⋅–—-]?eux?[./·•⋅–—-]elles
    <<- option("eepi") ->> ceux et celles|celles et ceux                                            && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: avec {{ceux.elles}} qui viendront                                 ->> ceux et celles|celles et ceux


__[u](eepi_écriture_épicène_pluriel_eur_divers)__
    ({w_2})eurs?[.(/·•⋅–—-][tdp]?(rice|euse|se|[oe]resse)[.)/·•⋅–—-]?s  @@0,**
    <<- option("eepi") and \2 != "se" ->> \1eurs et \1\2s|\1\2s et \1eurs                           && Écriture épicène dystypographique et imprononçable.
    <<- option("eepi") and \2 == "se" ->> \1eurs et \1euses|\1euses et \1eurs                       && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: travaillons avec les {{instituteur.trice.s}}                          ->> instituteurs et institutrices|institutrices et instituteurs
TEST: La communauté des {{développeur·se·s}} open source                    ->> développeurs et développeuses|développeuses et développeurs


__[u](eepi_écriture_épicène_pluriel_eux_euses)__
    ({w_2})eux[.(/·•⋅–—-](?:[tdsi]?euse|se)[.)/·•⋅–—-]?s  @@0
    <<- option("eepi") ->> \1eux et \1euses|\1euses et \1eux                                        && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{nombreux·ses}} sont les profs qui s’indignent de cette situation.   ->> nombreux et nombreuses|nombreuses et nombreux


__[u](eepi_écriture_épicène_pluriel_aux_ales)__
    ({w_2})aux[.(/·•⋅–—-][tnmcpbd]?a?le[.)/·•⋅–—-]?s  @@0
    <<- option("eepi") ->> \1aux et \1ales|\1ales et \1aux|\1al·e·s                                 && Écriture épicène dystypographique et imprononçable. Pour ce cas, il peut être intéressant de faire comme si le pluriel masculin était régulier, ce qui rend l’ensemble prononçable…
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{locaux·ales}}                                                   ->> locaux et locales|locales et locaux|local·e·s
TEST: LOCAL·E·S
TEST: amical·e·s


__[u](eepi_écriture_épicène_pluriel_er_ère)__
    ({w_2})[eè]rs?[.(/·•⋅–—-]i?è?re[.)/·•⋅–—-]?s  @@0
    <<- option("eepi") ->> \1ers et \1ères|\1ères et \1ers                                          && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: les {{conseiller.ière.s}}                                         ->> conseillers et conseillères|conseillères et conseillers
#TEST: les {{artificièr.e.s}}                                            ->> artificiers et artificières|artificières et artificiers


__[u](eepi_écriture_épicène_pluriel_if_ive)__
    ({w_2})ifs?[.(/·•⋅–—-][std]?i?ve[.)/·•⋅–—-]?s  @@0
    <<- option("eepi") ->> \1ifs et \1ives|\1ives et \1ifs                                          && Écriture épicène dystypographique et imprononçable.
    <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{inclusif.ive.s}}                                                ->> inclusifs et inclusives|inclusives et inclusifs
TEST: {{offensif.ve.s}}                                                 ->> offensifs et offensives|offensives et offensifs


__[u](eepi_écriture_épicène_pluriel_e)__
    ({w_1}[éuitsrnldf])[-·–—.•⋅(/]([ntlf]?e)[-·–—.•⋅)/]?s  @@0,**
    <<- not (\0.endswith(".Les") or \0.endswith(".Tes")) >>>
    <<- ~>> =normalizeInclusiveWriting(\0)
    <<- option("eepi") and not \0.endswith("les") and not \0.endswith("LES") and not re.search("(?i)·[ntlf]?e·s$", \0) >>>
    <<- \1.endswith("s") or \1.endswith("S") ->> \1 et \1\2s|\1\2s et \1|\1·\2·s                    && Écriture épicène dystypographique. Préférez écrire lisiblement. Sinon, utilisez les points médians.
    <<- __else__ ->> \1s et \1\2s|\1\2s et \1s|\1·\2·s                                              && Écriture épicène dystypographique. Préférez écrire lisiblement. Sinon, utilisez les points médians.

TEST: nous sommes {{déconsidéré-e-s}}.
TEST: serons-nous toujours {{perdu.e.s}}.
TEST: les illustres {{inconnu(e)s}}.
TEST: la situation des {{salarié/e/s}}.
TEST: des {{Iranien-ne-s}} sont venues                                  ->> Iraniens et Iraniennes|Iraniennes et Iraniens|Iranien·ne·s
TEST: rendez-vous avec des {{écrivain(e)s}}                             ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s
................................................................................
TEST: IMMORTEL·LE·S
TEST: Berlinois·e·s
TEST: Iranien·ne·s


__[i](eepi_écriture_épicène_singulier)__
    ({w_1}[éuitsrnldf])([-·–—.•⋅/][ntl]?e|[(][ntl]?e[)])  @@0,$
    <<- not (\0.endswith(".Le") or \0.endswith(".Ne") or \0.endswith(".De"))
        and not ((\0.endswith("-le") or \0.endswith("-Le") or \0.endswith("-LE")) and not (\1.endswith("l") or \1.endswith("L"))) >>>
    <<- ~>> =normalizeInclusiveWriting(\0)
    <<- option("eepi") and (\1 == "un" or \1 == "Un" or \1 == "UN") ->> un ou une|une ou un                 && Écriture épicène imprononçable. Préférez écrire lisiblement.
    <<- __else__ and option("eepi") and not re.search("(?i)·[ntl]?e$", \2) ->> =\1+"·"+\2[1:].rstrip(")")   && Écriture épicène. Utilisez un point médian.

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.                      ->> déconsidéré·e
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.               ->> auteur·e
TEST: le ou la {{patron/ne}}                                            ->> patron·ne
TEST: Totalement {{con(ne)}}                                            ->> con·ne
TEST: un ou une {{intellectuel.le}}                                     ->> intellectuel·le
TEST: INTELLECTUEL·LE
................................................................................
TEST: Épuisé·e


__[i](typo_écriture_invariable)__
    ({w_3})([-·–—.•⋅/]s|[(]s[)])  @@0,$
        <<- ~>> =normalizeInclusiveWriting(\0)
        <<- option("typo") and option("eepi") and not \0.endswith("·s") and not (\0.endswith("/s") and morph(\1, ";S"))
        ->> \1·s                    && Écriture invariable. Utilisez un point médian.

TEST: la ou les {{fille(s)}}                                            ->> fille·s
TEST: le ou les patron·s
TEST: combien de rad/s



................................................................................
!!!! Majuscules manquantes                                                                        !!
!!
!!

# Majuscules après un point
__[s]/maj(majuscule_après_point)__
    ({w_2})[.] ([a-zàâéèêîôç]\w*)  @@0,$
    <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
        and morph(\1, ":") and morph(\2, ":")
    -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_début_paragraphe)__
    ^ *([a-zàâéèêîôç](?:[\w-]+[’'`‘]?|[’'`‘]))  @@$
    <<- after("\\w\\w[.] +\\w+") -1>> =\1.capitalize()                                              && Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

# autre possibilité: avec or (sContext != "Writer" and after("[.] *$"))
TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.
TEST: {{j’}}arrive. Prépare-toi.
TEST: {{qu’}}il est grand, ce batiment. Faut voir si on pourra la détruire avec si peu de charges.


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

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

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


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

# virgules manquantes
__[i>/virg(virgule_manquante_avant_etc)__   {w_1}( etc[.])  @@$ <<- -1>> , etc.                     && Avant « etc. », il faut mettre une virgule.
__[i>/virg(virgule_manquante_avant_car)__
    ({w_1})( car)(?= (?:j[e’]|tu|ie?ls?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b)  @@0,$
    <<- not morph(\1, ":[DR]") -2>> , car
    && Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447
__[i>/virg(virgule_manquante_avant_mais)__
    ({w_1})( mais)(?= (?:j[e’]|tu|ie?ls?|nous|vous|elles?|on)\b)  @@0,$
    <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais
    && Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445
__[i>/virg(virgule_manquante_avant_donc)__
    ({w_1})( donc)(?= (?:j[e’]|tu|ie?ls?|elles?|on)\b)  @@0,$
    <<- not morph(\1, ":[VG]") -2>> , donc
    && Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448

TEST: Un chien, un chat{{ etc.}}                                            ->> , etc.
TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit.                   ->> , car
TEST: Je suis fatigué{{ mais}} il a joué toute la nuit.                     ->> , mais
TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire.              ->> , donc
TEST: il s’est donc tu
TEST: Chacun peut l’entendre d’une manière différente et donc on se demande bien ce qui est mesuré dans les réponses.
................................................................................


__<s>/virg(virg_virgule_avant_points_suspension)__
    , *… <<- ->> …                                                          && Typographie : pas de virgule avant les points de suspension.

__<s>/virg(virg_virgule_après_point)__
    ({w1})([.],)  @@0,$
    <<- not re.search("^(?:etc|[A-Z]|fig|hab|litt|circ|coll|ref|étym|suppl|bibl|bibliogr|cit|vol|déc|nov|oct|janv|juil|avr|sept|pp?)$", \1)
    -2>> ,|.                                                                && Pas de virgule après un point (sauf éventuellement après une abréviation).

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


# Fin de paragraphe
#__<i>/typo__  ({w_2}) *$   @@0
................................................................................

__<s>/typo(typo_espace_manquant_après1)__
    ({w1})[,:]({w_1})  @@0,$  <<- not \1.isdigit() -2>> " \2"                                       && Il manque un espace.
__<s>/typo(typo_espace_manquant_après2)__
    [?!;%‰‱˚»}]({w_1}|[({[])  @@$  <<- -1>> " \1"                                                 && Il manque un espace.
__[s>/typo(typo_espace_manquant_après3)__
    {w_1}[.]({w_1}|[({[])  @@$
    <<- (\1.__len__() > 1 and not \1[0:1].isdigit() and spell(\1)) or after("^’") -1>> " \1"        && Il manque un espace.
__[s>/typo(typo_espace_manquant_après4)__
    {w_2}[…]({w_1}|[({[])  @@$
    <<- \1[0:1].isupper() or \1.__len__() > 5 or not \1.isalpha()
        or (\1.__len__() > 1 and spell(\1)) -1>> " \1"                                              && Il manque un espace.

TEST: J’en ai marre,{{ça}} suffit.                                          ->> " ça"
TEST: elle est délirante.{{Devine}} ce qu’elle a dit.                       ->> " Devine"
TEST: Voilà,{{il}} manque un espace.                                        ->> " il"
TEST: Dernier essai.{{Voilà}}, c’est ça.                                    ->> " Voilà"
TEST: muni de lunettes protectrices et.{{d}}’un casque.                     ->> " d"
TEST: espace:{{manquant}}                                                   ->> " manquant"
................................................................................
!!!! Ponctuations redondantes                                                                     !!
!!
!!

# virgules et points
__<s>/typo(typo_virgules_points)__
    ,[.,]{2,}
    <<- ->> =\0.replace(",", ".").replace("...", "…")                                               && Erreur de numérisation ? Virgules au lieu de points ?

TEST: Ah !{{,.,}} et en quoi consistait le festin ?


__<s>/typo(typo_ponctuation_superflue1)__    , ?([.,;:!?]) @@$ <<- ->> =",|" + \1       && Une de ces ponctuations est superflue.
__<s>/typo(typo_ponctuation_superflue2)__    ; ?([.,;:…!?]) @@$ <<- ->> =";|" + \1      && Une de ces ponctuations est superflue.
__<s>/typo(typo_ponctuation_superflue3)__    :[.,;:…!?] <<- ->> =":|" + \0[1]           && Une de ces ponctuations est superflue.
................................................................................
# ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
__<s>/liga(ligatures_typographiques)__              [fiflffffifflſtst] <<- ->> =undoLigature(\0)             && Suppression de la ligature typographique.

TEST: __liga__ un {{fl}}ottement                                           ->> fl
TEST: __liga__ une belle {{fi}}gure                                        ->> fi


!!
!!
!!!! Apostrophes                                                                                  !!
!!
!!
## Apostrophe typographique
__[i>/apos(apostrophe_typographique)!8__
    ([ldsncjmç]|jusqu|lorsqu|aujourd|presqu|quelqu|puisqu|qu|prud|entr)['´‘′`ʼ](?=[\w"«]) @@0 <<- ->> \1’    && Apostrophe typographique.
__[i>/apos(apostrophe_typographique_après_t)!8__
    t['´‘′`ʼ](?!ils?|elles?|on)(?=[\w"«]) <<- ->> t’                                                         && Apostrophe typographique.

TEST: {{C'}}est l’apostrophe typographique qui manque.                    ->> C’
TEST: C’est {{l'}}apostrophe typographique qui manque.                    ->> l’
TEST: {{Aujourd'}}hui, je suis fatigué
TEST: Je pense {{qu`}}elle se trompe
TEST: Que {{t'}}arrive-t-il ?


__[i>/typo(typo_apostrophe_incorrecte)!8__
    (([ldsncjmtç]|lorsqu|puisqu|presqu|quoiqu|quelqu|jusqu|qu|aujourd|entr)(?:[’'´‘′`ʼ][’'´‘′`ʼ ]|”|“|"| [’'´‘′`ʼ] ?))[aeéiouhœæyîèêôû]  @@0,0
    <<- not (\2.__len__() == 1  and  \1.endswith("′ ")) -1>> \2’                                    && Apostrophe incorrecte.

TEST: {{C’ }}est rageant.                                                 ->> C’
TEST: {{Lorsqu’ }}il vient, on s’ennuie.
TEST: {{l’'}}électricien est parti
TEST: Je pense {{qu ` }}elle ne viendra pas.


## Apostrophes manquantes
__[i>/typo(typo_apostrophe_manquante)!8__
    "(lorsqu|puisqu|presqu|quoiqu|jusqu|qu|aujourd|entr) "  @@0
    <<- ->> \1’                        && Il manque vraisemblablement une apostrophe.
    <<- ~>> \1’
# Solution prudente :
__[i>/typo(typo_apostrophe_manquante_prudence1)!8__
    ne ([mtsl] )([aeéiouhyîèêôû][\w-]*)  @@3,$  <<- -1>> =\1[:-1]+"’"                               && Il manque une apostrophe.
__[i>/typo(typo_apostrophe_manquante_prudence2)!8__
    (?:je|tu|ie?ls?|nous|vous|on|ça|elles?) ([nmtsl] )([aeéiouhyîèêôû][\w-]*)  @@*,$
    <<- not option("mapos") and morph(\2, ":V") -1>> =\1[:-1]+"’"                                   && Il manque probablement une apostrophe.
# Solution audacieuse :
__[s>/typo(typo_apostrophe_manquante_audace1)!8__
    ([ldsncjmtç] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ]  @@0
    <<- option("mapos") and not before("(?i)(?:lettre|caractère|glyphe|dimension|variable|fonction|point) *$")
    -1>> =\1[:-1]+"’"                                                                               && Il manque peut-être une apostrophe.
# Note : pour les majuscules, la règle se situe lors de la passe suivante.

TEST: __mapos__ {{n }}arrive pas à sa cheville
TEST: le coup {{qu }}avait donné                                                ->> qu’
TEST: pendant {{qu }}il avançait d’un pas indolent                              ->> qu’
TEST: {{jusqu }}à plus soif                                                     ->> jusqu’
TEST: il ne {{m }}avait jamais fait défaut                                      ->> m’
TEST: Il {{s }}était dit qu’il ne le ferait pas.                                ->> s’
TEST: Je {{m }}étais imaginé que je pourrais pas retrouver cet objet.           ->> m’
TEST: Je {{n }}ai pas retrouvé l’ambiance de mes années de lycée.               ->> n’


!!
!!
!!!! 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.{{"}}                                                 ->> " »|”"


__<s>/typo(typo_guillemets_typographiques_simples_doubles_ouvrants)__
    (?:^|[ –—-])('')(?=\w)  @@*
    <<- -1>> « |“                                                                                   && Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_simples_doubles_fermants)__
    [\w.?!…,]('')(?![\w'’])  @@*
    <<- -1>> " »|”"                                                                                 && Guillemets typographiques fermants.

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


__<s>/typo(typo_guillemets_typographiques_simples_ouvrants)__
    (?:^|[ –—-])(['’])(?=\w)  @@*
    <<- -1>> “|‘|‹                                                                                  && Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_simples_fermants)__
    [\w.?!,](')(?![\w'])  @@*
    <<- -1>> ”|’|›                                                                                  && Guillemets typographiques fermants.

TEST: {{'}}Ça’ recommence.                                                  ->> “|‘|‹
TEST: Le {{'}}grand’ homme.                                                 ->> “|‘|‹
TEST: Le ‘grand{{'}} homme.                                                 ->> ”|’|›
TEST: dans les {{’}}beaux quartiers{{’}}
TEST: J’en ai '''marre''' (syntaxe wiki).


!!
!!
!!!! Divers                                                                                       !!
!!
!!

## NF (memo: don’t use flag i)
__[s]/nf(nf_norme_française)__
    [nN][fF][  -]?(?:c|C|e|E|p|P|q|Q|s|S|x|X|z|Z|[eE][nN](?:[  -][iI][sS][oO]|))[  -]?[0-9]+(?:[/ ‑-][0-9]+|)
    <<- not re.search("^NF (?:C|E|P|Q|S|X|Z|EN(?: ISO|)) [0-9]+(?:‑[0-9]+|)", \0)
    ->> =formatNF(\0)                                       && Norme française. Utilisez les espaces et tirets insécables.|http://fr.wikipedia.org/wiki/Liste_de_normes_NF

TEST: __nf__ Norme française : {{Nf-EN ISO 3892-23}}



!!
!!
!!!! 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
    <<- -1>> _                                                                                      && Guillemets fermants introuvables dans la suite du paragraphe.
__[i]/typo(typo_guillemets_doubles_fermants_non_ouverts)__
    ^[^“„«"]+\w(”)  @@$
    <<- -1>> _                                                                                      && Guillemets ouvrants introuvables dans ce paragraphe.

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.

TEST: « Je suis là.
TEST: — Oui, nous t’avons vu arriver. »
TEST: « J’en suis “malade”. »
................................................................................
!!
!!!! Espaces insécables avant unités de mesure                                                    !!
!!
!!

__[s]/unit(unit_nbsp_avant_unités1)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)([kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|px|MHz|°C|℃)(?![’'])  @@0,0,$
    <<- option("num") ->> =formatNumber(\2) + " " + \3          && Avec une unité de mesure, mettez un espace insécable.
    <<- __else__ ->> "\2 \3"                                    && Avec une unité de mesure, mettez un espace insécable.

__[s]/unit(unit_nbsp_avant_unités2)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)  @@0,0,$
    <<- morph(\3, ";S", ":[VCR]") or mbUnit(\3) or not spell(\3) >>>
    <<- option("num") ->> =formatNumber(\2) + " " + \3          && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
    <<- __else__ ->> "\2 \3"                                    && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

__[s]/unit(unit_nbsp_avant_unités3)__
    ((\d+) )([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)(?![’'])  @@0,0,$
    <<- (\2.__len__() > 4 and not spell(\3)) or morph(\3, ";S", ":[VCR]") or mbUnit(\3) >>>
    <<- option("num") ->> =formatNumber(\2) + " " + \3          && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
    <<- __else__ ->> "\2 \3"                                    && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

TEST: Ça a duré {{3µs}}                                 ->> 3 µs
TEST: Ça a duré {{3,5 µs}}                              ->> 3,5 µs
TEST: il y en a {{3 m²}}                                ->> 3 m²
TEST: il a fait {{10%}}                                 ->> 10 %
TEST: Ça coûte {{13,4¥}}.                               ->> 13,4 ¥
TEST: il mesure {{30,3 cm}}                             ->> 30,3 cm
................................................................................
!!
!!!! Grands nombres                                                                               !!
!!
!!

__[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]+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])") and not (re.search("^[01]+$", \0) and after("^,[01]+\\b")))
        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
TEST: {{123456}}                                ->> 123 456
TEST: {{1234567}}                               ->> 1 234 567
TEST: {{12345678}}                              ->> 12 345 678
TEST: {{023456789}}                             ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                            ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
................................................................................
TEST: {{4000}} Å                                ->> 4 000
TEST: {{3240}} µA                               ->> 3 240
TEST: 1111 0011,01 (binaire)


__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
    <<- option("num") ->> =\0.replace(".", " ")                                                     && Grands nombres : utilisez des espaces insécables plutôt que des points.
    <<- ~>> =\0.replace(".", "_")

TEST: il cumule {{200.000.000}} de pertes sèches


__[s](num_grand_nombre_avec_espaces)__
    \d\d?\d?(?: \d\d\d)+
    <<- option("num") ->> =\0.replace(" ", " ")                                                     && Grands nombres : utilisez des espaces insécables.
    <<- ~>> =\0.replace(" ", "_")

TEST: Il a perdu {{20 000}} euros à la Bourse en un seul mois.


!!
!!
!!!! Dates                                                                                        !!
................................................................................
!!
!!
!!!! Redondances                                                                                  !!
!!
!!
__[i]/redon1(redondances_paragraphe)__
    ({w_4})[  ,.;!?:].*[  ](\1)  @@0,$
    <<- not morph(\1, ":(?:G|V0)|>(?:t(?:antôt|emps|rès)|loin|souvent|parfois|quelquefois|côte|petit|même)/") and not \1[0].isupper()
    -2>> _                                                      && Dans ce paragraphe, répétition de « \1 » (à gauche).
    <<- __also__ -1>> _                                         && Dans ce paragraphe, répétition de « \1 » (à droite).

TEST: __redon1__ Tu es son {{avenir}}. Et lui aussi est ton {{avenir}}.
TEST: __redon1__ Car parfois il y en a. Mais parfois il n’y en a pas.



!!
................................................................................
!!!! OCR                                                                                          !!
!!
!!

# ?
__<s]/ocr(ocr_point_interrogation)__
    [  ]7
    <<- after0("^(?: +[A-ZÉÈÂ(]|…|[.][.]+| *$)") ->> " ?"                                           && Erreur de numérisation ?

TEST: __ocr__ des chiffrements{{ 7}} Paul n’en sait rien.
TEST: __ocr__ veux-tu en parler{{ 7}}


# !
__<s]/ocr(ocr_exclamation1)__
    [  ]I(?![ ’'][aâeéèêëiîïoôuy])
    <<- ->> " !"                                                                                    && Erreur de numérisation ?
__<s]/ocr(ocr_exclamation2)__
    [  ]1(?= [A-ZÉÈÂÎ])
    <<- not morph(word(1), ";S") and not morph(word(-1), ":R") ->> " !"                             && Erreur de numérisation ?

TEST: __ocr__ Oh{{ I}} c’est pas formidable ?
TEST: __ocr__ Vraiment{{ 1}} Paul n’en savait rien.
TEST: __ocr__ Ça prendra 1 h.
TEST: __ocr__ Valeur : 1 KHz.


................................................................................
    elle ?aussi¿ ~é(?:es|s)$
        <<- /ppas/ morph(\-1, ":Q") and not morph(<1, ":(?:V0a|R)") --1>> =suggVerbPpas(\-1, ":f:s")+"|"+suggVerbTense(\-1, ":Iq", ":3s")
        && Incohérence probable. Après “elle”, il faut un participe passé féminin singulier ou une forme verbale conjuguée (3ᵉ personne du singulier).

TEST: elle {{mangé}}.
TEST: elle aussi {{mangées}}.











__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tag_before(\1, "_ceque_") and not value(<1, "|ou|") -2>> _                    && Incohérence probable avec “presque” : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: presque {{délaissait}} par tout le monde.
TEST: Tout le monde ou presque déteste ces gens-là.


__conf_sur_vconj__
    sur  @:(?:[123][sp]|P)¬:[GNAQM]
................................................................................
    en [certaines|quelques|plusieurs] occasions  [<end>|,|)]
        <<- ~1:3>> *

    en de multiples occasions  @¬:A.*:[fe]:[pi]
    en de multiples occasions  [<end>|,|)]
        <<- ~1:4>> *







    en un sens  @¬:A.*:[me]:[si]
    en un sens  [<end>|,|)]
        <<- ~1:3>> *

    en sus
        <<- not value(<1, "|j’|tu|il|elle|on|n’") ~>> *

    entre autres choses  @¬:A.*:[fe]:[pi]
    entre autres choses  [<end>|,|)]
        <<- ~1:3>> *

    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  [<end>|,|)]
................................................................................
    pour partie  @:¬:A.*:f:s
    pour partie  [<end>|,|)]
        <<- ~1:2>> *

    pour un temps  @:¬:[NA].*:[me]:[si]
    pour un temps  [<end>|,|)]
        <<- ~1:3>> *





    semblait-il
    semble-t-il
        <<- not value(<1, "|ça|cela|ceci|me|m’|te|t’|lui|nous|vous|leur|ne|n’|") ~>> *

    tête la première
        <<- not morph(<1, ":D") and not morph(>1, ":[NA].*:[fe]:[si]") ~>> *
................................................................................
    >arriver a point nommé
    >arriver a bon port
    >battre a plate couture
    [>brûler|>bruler] a vif
    >charger a blanc
    >chauffer a blanc
    >chuter a terre

    >fermer a [>clé|>clef]
    [>gonfler|>regonfler] a bloc
    >jeter a terre
    [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>plat|>profit|>table|>terre]
    [>mettre|>remettre] a l’ [écart|épreuve]
    >naviguer a [vu+ses]
    >parer a toute éventualité
    >passer a tabac
    >percer a jour
    >prendre a la légère
    >prêter a >confusion
    >réduire a néant

    >saigner a blanc
    >sentir a l’ aise
    >tenir a [carreau|cœur|distance]
    >tirer a blanc
    >tomber a [pic|point|terre]
    >tirer a blanc
    >tourner a l’ aigre
................................................................................
TEST: celles {{perdue}} aura une pénalité
TEST: celles venues chanter doivent se rendre là-bas.


## Nombres
__gn_nombre_lettres_1m__
    $:B:e:p  *WORD
        <<- /gn/ not value(\1, "|neuf|mille|") and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL) and not re.search("^[IVXLDM]+$", \1)
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    neuf  *WORD
        <<- /gn/ ( morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ not value(\2, "|multiplié|divisé|") and (morph(\2, ":[NA].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.        ->> idiots
TEST: Il a abandonné neuf {{enfant}}.                                               ->> enfants
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.              ->> travailleurs
TEST: Il y a quatre cents {{mot}} dans la phrase.                                   ->> mots
TEST: cent {{mot}}                                                                  ->> mots
................................................................................
TEST: cinquante {{mot}}                                                             ->> mots
TEST: mille cinquante {{mot}}                                                       ->> mots
TEST: deux {{tête}}                                                                 ->> têtes
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue
TEST: Le produit de cinq multiplié par trois.




__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|")
        -2>> =suggSing(\2)                                                                  && Accord de nombre erroné : « \1 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N")
            and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|"))
            or \1 in aREGULARPLURAL )
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné : « \2 » devrait être au pluriel.

    *NUM  *WORD  *WORD
        <<- /gn/ not value(\2, "|fois|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not value(<1, "|et|ou|de|d’|") and not morph(\3, ">(?:seule|maximum|minimum)/") >>>
        <<- /gn/ ((morph(\2, ":[NA].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NA].*:m", "*")))
            and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné entre « \2 » et « \3 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2, True)                           && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", "*") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.
................................................................................
TEST: elle fut le 13 janvier décapitée
TEST: elles furent le 18 janvier décorées
TEST: en quantité 2 fois moindre
TEST: 1 La Mort
TEST: L’année 2019 a commencé à le montrer
TEST: La « première génération » d’ordinateurs des années 1950 a déjà largement cédé la place à une deuxième (transistorisée)
TEST: Au sein du club des pays les plus prospères, la richesse par habitant est néanmoins 52 fois supérieure à celle des pays à faibles revenus, d’après la Banque mondiale.



##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              && Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

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

TEST: Ils y voient {{clairs}}.
TEST: Il vit Claire au théâtre.
TEST: J’y vois clair, mec.


# vu / vue
__sgpl_point_de_vue__
    >point de [vu|vus|vues]
        <<- /sgpl/ -3>> vue                                         && Dans un “point de vue”, “vue” est toujours au féminin singulier.




TEST: c’est son point de {{vu}} qui prime.
TEST: Son point de {{vus}} prévaudra toujours, faites-vous à cette idée ou dégagez.
TEST: de mon point de {{vues}}



__sgpl_verbe__
    >faire rires
        <<- /sgpl/ -2>> rire                                        && Faire rire. Rire est un verbe, il ne prend pas la marque du pluriel.

    [>pouvoir|>vouloir|>falloir] [rires|mangers|êtres|avoirs]
................................................................................
TEST: faut-il {{pensé}} à ces choses-là encore et encore ?
TEST: il faut n’{{estimait}} que la valeur de nos actes
TEST: il fallait bien cela pour nous épargner
TEST: une faille s’est ouverte sous nos pieds
TEST: il faut en moyenne 1000 litres d’eau pour produire un kilo de céréales
TEST: Xi Jinping a réaffirmé en janvier dernier qu’il utiliserait s’il le faut la force militaire
TEST: Comme il a fallu la mort d’un homme



__infi_faire__
    >faire  ~(?:ée?s?|ez)$
        <<- /infi/ not morph(<1, ">(?:en|de|être)/") and morph(\2, ":V", ":[MG]") and not (morph(\1, ":N") and morph(\2, ":Q.*:m:[sp]"))
        -2>> =suggVerbInfi(\2)                                                                      && Après le verbe “faire”, ce verbe devrait être à l’infinitif.

................................................................................
TEST: celles-là {{on}} {{vraiment}} un problème avec la religion.
TEST: j’ai, tu as, ils ont, elles {{on}}
TEST: ces gens-là ils {{on}} {{raison}} plus souvent que la plupart des gens.
TEST: Ils soutiennent ceux qui {{on}} {{tant}} de raison d’être en colère.
TEST: Or parmi celles-ci on trouve typiquement d’un côté les structures



!!
!!
!!!! Inversion verbe sujet                                                                        !!
!!
!!

__conj_que_où_comment_verbe_sujet_sing__

    [que|qu’|où|comment|combien|dont|quand|pourquoi]  @:[123][sp]¬:(?:3s|G|W|3p!)  [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.


    [que|qu’|où|comment|combien|dont|quand|pourquoi]  @:[123][sp]¬:(?:3s|G|W|3p!)  [le|la|l’|leur]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not (morph(\4, ":Y") and morph(\2, ">(?:pouvoir|vouloir|devoir)"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.





































TEST: les possibilités qu’{{offrent}} le chien
TEST: les possibilités que {{donnent}} le chien.
TEST: Où {{vas}} l’homme ?
TEST: l’histoire dont {{bénéficient}} notre langue.






TEST: de la même façon que survivent le swing ou le latin.
TEST: en proportion des efforts que requièrent son entretien et son exploitation
TEST: une crainte aussi que renforcent son éloignement et le protocole compliqué
TEST: à l’époque de Mansur que grandissent la place et le rôle de…
TEST: où vivent la majorité des immigrés et des enfants d’immigrés
TEST: Que deviennent la vitesse, le courant, ainsi que le rendement ?
TEST: Le complexe argilo-humique est mieux hydraté que ne pourraient l’être les micelles d’argile ou humiques
................................................................................
        <<- /conj/ morph(<1, ":R") and not value(\4, "|plupart|majorité|groupe|") and not (value(>1, "|et|ou|") and morph(>2, ":D"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: une muraille contre laquelle {{venaient}} la masse armée et vociférante.


__conj_que_où_comment_verbe_sujet_pluriel__

    [que|qu’|où|comment|combien|dont|quand|pourquoi]  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ -2>> =suggVerb(\2, ":3p")                                        && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.













TEST: D’où {{vienne}} les hommes ?
TEST: Comment {{danse}} les femmes ?
TEST: les idioties qu’{{aime}} les hommes, j’en ai marre.
TEST: l’amour dont {{parle}} les femmes





__conj_lxquel_verbe_sujet_pluriel__
    [lequel|laquelle|lesquels|lesquelles]  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ morph(<1, ":R") -2>> =suggVerb(\2, ":3p")                        && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: les amusements pour lesquels {{vienne}} les invités.
................................................................................

__conj_puisse__
    [<start>|,|(]  puisse  @:D.*:p
        <<- /conj/ -2>> puissent                                                    && Conjugaison erronée. Ce verbe devrait s’accorder au substantif qui le suit.

TEST: {{puisse}} les hommes enfin comprendre leurs erreurs.                         ->> puissent
TEST: {{puisses}} notre ennemi trembler de peur devant notre courage.               ->> puisse























!!
!!
!!!! Quel(le) que soit / quel(le)s que soient                                                     !!
!!
!!
................................................................................
        <<- /conj/ -1>> \1s                                                         && Accord avec “\4 \5”. Utilisez le pluriel.

TEST: Quels que {{soit}} les salopards qui ont fait ça.
TEST: Quelles que {{sois}} les chaussures que je mets, elles me font mal aux pieds.
TEST: {{Quel}} que soient les avantages reçus, ce n’est pas assez.
TEST: {{Quelle}} que soient nos problèmes, on en parle toujours trop.



!!
!!
!!!! Verbes sans sujets                                                                           !!
!!
!!

__conj_que_où_comment_verbe_sans_sujet!3__
    [que|qu’|où|comment|combien|dont|quand|pourquoi|lequel|laquelle|lesquels|lesquelles|si]  @:[12][sp]¬:(?:G|W|3[sp]|Y|P|Q|N|A|M|VC)
        <<- /conj/ morph(\2, ":[12]s") and not value(>1, "|je|tu|") -2>> =suggVerb(\2, ":3s")                           && Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.
        <<- /conj/ __else__ and morph(\2, ":[12]p") and not value(>1, "|nous|vous|") -2>> =suggVerb(\2, ":3p")          && Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: Qu’est-ce que tu crois que {{deviens}} réellement, immanquablement et subitement cet homme après une telle dérouillée ?
TEST: peu importe ce que tu crois du lieu où l’{{abandonnerais}} ce salopard…
TEST: nous savons comment {{arriverons}} ces problèmes…
TEST: combien {{paraissez}} folles ces augmentations
TEST: ces sciences, ces religions, ces philosophies ne sont que contes destinés à nous donner l’illusion de la connaissance.
TEST: Le ministre de l’Intérieur a estimé que Calais avait vécu “un degré de violence jamais connu”.
TEST: à des règles aussi absurdes que précises



!!
!!
!!!! Verbe auxiliaire                                                                             !!
!!
!!







|
|
|







 







|
|
|
|
|







 







|
|
|




|
|







 







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







 







|







 







|
|






|
|






|
|
|







|
|






|
|








|
|







|
|







|
|
|
|
|







 







|
|
|
|
|







 







|







 







|
|
|






|







 







|







 







|
|


|
|


|
|







 







|
|







 







|


|
|







 







|







 







<
<
<
<
<
<
<
<
<
<

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


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







|
|













|
|


|
|







|
|


|
|







|


|







|


|







 







|
|



|
|
|



|
|
|







 







|
|
|
|
|
|



|







 







|
|






|
|







 







|
|
|







 







|








|


|







 







>
>
>
>
>
>
>
>
>



|







 







>
>
>
>
>
>





|







 







>
>
>
>







 







>












>







 







|




|




|







 







>
>









|




|







 







>







 







|



>
>
>



>







 







>







 







<







>
|



>
|




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




>
>
>
>
>
>







 







>
|


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




>
>
>







 







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







 







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







507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
...
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
...
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
...
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
...
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
...
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
...
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
...
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
...
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
...
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
....
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
....
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
....
1201
1202
1203
1204
1205
1206
1207










1208













































1209
1210











































1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
....
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
....
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
....
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
....
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
....
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
....
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
.....
15683
15684
15685
15686
15687
15688
15689
15690
15691
15692
15693
15694
15695
15696
15697
15698
15699
15700
15701
15702
15703
15704
15705
15706
15707
15708
.....
15750
15751
15752
15753
15754
15755
15756
15757
15758
15759
15760
15761
15762
15763
15764
15765
15766
15767
.....
16271
16272
16273
16274
16275
16276
16277
16278
16279
16280
16281
16282
16283
16284
16285
16286
16287
16288
16289
16290
16291
16292
16293
16294
16295
16296
16297
16298
.....
19759
19760
19761
19762
19763
19764
19765
19766
19767
19768
19769
19770
19771
19772
19773
19774
19775
19776
19777
19778
19779
19780
19781
19782
19783
.....
19784
19785
19786
19787
19788
19789
19790
19791
19792
19793
19794
19795
19796
19797
19798
19799
19800
19801
19802
19803
19804
19805
19806
19807
19808
19809
19810
19811
19812
19813
19814
.....
19826
19827
19828
19829
19830
19831
19832
19833
19834
19835
19836
19837
19838
19839
19840
.....
20814
20815
20816
20817
20818
20819
20820
20821
20822
20823
20824
20825
20826
20827
20828
20829
20830
20831
20832
20833
20834
20835
20836
20837
20838
.....
21537
21538
21539
21540
21541
21542
21543
21544
21545
21546
21547
21548
21549
21550
21551
.....
26666
26667
26668
26669
26670
26671
26672

26673
26674
26675
26676
26677
26678
26679
26680
26681
26682
26683
26684
26685
26686
26687
26688
26689
26690
26691
26692
26693
26694
26695
26696
26697
26698
26699
26700
26701
26702
26703
26704
26705
26706
26707
26708
26709
26710
26711
26712
26713
26714
26715
26716
26717
26718
26719
26720
26721
26722
26723
26724
26725
26726
26727
26728
26729
26730
26731
26732
26733
26734
26735
26736
26737
26738
26739
26740
26741
26742
26743
.....
26752
26753
26754
26755
26756
26757
26758
26759
26760
26761
26762
26763
26764
26765
26766
26767
26768
26769
26770
26771
26772
26773
26774
26775
26776
26777
26778
26779
26780
26781
26782
26783
26784
26785
26786
26787
26788
.....
26791
26792
26793
26794
26795
26796
26797
26798
26799
26800
26801
26802
26803
26804
26805
26806
26807
26808
26809
26810
26811
26812
26813
26814
26815
26816
26817
26818
26819
26820
26821
26822
26823
26824
26825
.....
26850
26851
26852
26853
26854
26855
26856





















26857
26858
26859
26860
26861
26862
26863
    \w[\w.-]*@\w[\w.-]*\w[.]\w\w+ <<- ~>> __MAIL__

# URL
__<i>(p_URL)__
    (?:ht|f)tps?://[\w./?&!%=+*"'@$#-]+ <<- ~>> __URL__
__<i](p_URL2)__
    ((?:{w_1}[.])*)({w_2})([.](?:com|net|org|info|fr|ca|be|ch|i[ot]|co[.]uk|tk|jp|zh|ru|us|nl|xyz)) @@0,**,$
        <<- ~1>> *
        <<- ~2>> =\2.capitalize()
        <<- ~3>> *

# Numéro de chapitre
__<i>(p_chapitre)__
    ^\d+[.][\d.-]* <<- ~>> *

# Numéro suivi de plusieurs espaces, considéré comme une numérotation de chapitre
__<i>(p_num_chapitre)__
................................................................................
    (?:versions?|mises? [àa] jour) ([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("-","")

# Mr et MM
__[s>(p_M_point)__
    (M[.]) (?:[A-ZÉÈÎ]\w*|l[e'’])  @@0 <<- ~1>> Mr
__[s>(p_MM_point)__
................................................................................
    "\d+ (m) "  @@w <<- ~1>> _

# crochets
__[s](p_points_suspension_entre_crochets)__
    \[…\] <<- ~>> *
__[s](p_mot_entre_crochets)__
    \[({w_1})\] @@1
        <<- \1.isdigit() ~>> *
        <<- __else__ and morph(\1, ":G") ~>> =" " + \1 + " "
        <<- __else__ and \1.isalpha() ~>> " _"

# parenthèses
__[s](points_suspension_entre_parenthèses)__
    \(…\)
        <<- ->> […]                 && Pour indiquer une troncature de texte, on utilise usuellement des crochets.
        <<- ~>> *
__<i>(p_préfixes_entre_parenthèses)__
    " (\(r[eé]\))\w+"  @@1
        <<- ~1>> *

TEST: par {{O.R.}}                                          ->> OR|O. R.
TEST: l’{{A.N.P.E.}} n’existe plus
TEST: ce chien […] ne {{semblez}} pas en forme.
................................................................................
TEST: C’est dans le dossier D:\Data
TEST: Dossier C:\Program Files (x86)\LibreOffice
TEST: [1] Dossier à revoir.
TEST: jusqu’à 12h47
TEST: Allons (re)voir ce film
TEST: La figure 110 représente…



!!
!!
!!!! Apostrophes                                                                                  !!
!!
!!
## Apostrophe typographique
__[i>/apos(apostrophe_typographique)!8__
    ([ldsncjmç]|jusqu|lorsqu|aujourd|presqu|quelqu|puisqu|qu|prud|entr)['´‘′`ʼ](?=[\w"«<]) @@0 <<- ->> \1’   && Apostrophe typographique.
__[i>/apos(apostrophe_typographique_après_t)!8__
    t['´‘′`ʼ](?!ils?|elles?|on)(?=[\w"«<]) <<- ->> t’                                                        && Apostrophe typographique.

TEST: {{C'}}est l’apostrophe typographique qui manque.                    ->> C’
TEST: C’est {{l'}}apostrophe typographique qui manque.                    ->> l’
TEST: {{Aujourd'}}hui, je suis fatigué
TEST: Je pense {{qu`}}elle se trompe
TEST: Que {{t'}}arrive-t-il ?


__[i>/typo(typo_apostrophe_incorrecte)!8__
    (([ldsncjmtç]|lorsqu|puisqu|presqu|quoiqu|quelqu|jusqu|qu|aujourd|entr)(?:[’'´‘′`ʼ][’'´‘′`ʼ ]|”|“|"| [’'´‘′`ʼ] ?))[aeéiouhœæyàîèêôû<]  @@0,0
        <<- not (\2.__len__() == 1  and  \1.endswith("′ ")) -1>> \2’                                 && Apostrophe incorrecte.

TEST: {{C’ }}est rageant.                                                 ->> C’
TEST: {{Lorsqu’ }}il vient, on s’ennuie.
TEST: {{l’'}}électricien est parti
TEST: Je pense {{qu ` }}elle ne viendra pas.


## Apostrophes manquantes
__[i>/typo(typo_apostrophe_manquante)!8__
    "((lorsqu|puisqu|presqu|quoiqu|jusqu|qu|aujourd|entr) )[aeéiouhyàîèêôû<]"  @@0,0
        <<- -1>> \2’                                                                                && Il manque vraisemblablement une apostrophe.
        <<- ~1>> \2’
# Solution prudente :
__[i>/typo(typo_apostrophe_manquante_prudence1)!8__
    ne ([mtsl] )[aeéiouhyàîèêôû<]  @@3
        <<- -1>> =\1[:-1]+"’"                                                                       && Il manque une apostrophe.
__[i>/typo(typo_apostrophe_manquante_prudence2)!8__
    (?:je|tu|ie?ls?|nous|vous|on|ça|elles?) ([nmtsl] )([aeéiouhyàîèêôû][\w-]*|<)  @@*,$
        <<- not option("mapos") and (\2 == "<" or morph(\2, ":V")) -1>> =\1[:-1]+"’"                && Il manque probablement une apostrophe.
# Solution audacieuse :
__[s>/typo(typo_apostrophe_manquante_audace1)!8__
    ([ldsncjmtç] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ<]  @@0
        <<- option("mapos") and not before("(?i)(?:lettre|caractère|glyphe|dimension|variable|fonction|point) *$")
        -1>> =\1[:-1]+"’"                                                                           && Il manque peut-être une apostrophe.
# Note : pour les majuscules, la règle se situe lors de la passe suivante.

TEST: __mapos__ {{n }}arrive pas à sa cheville
TEST: le coup {{qu }}avait donné                                                ->> qu’
TEST: pendant {{qu }}il avançait d’un pas indolent                              ->> qu’
TEST: {{jusqu }}à plus soif                                                     ->> jusqu’
TEST: il ne {{m }}avait jamais fait défaut                                      ->> m’
TEST: Il {{s }}était dit qu’il ne le ferait pas.                                ->> s’
TEST: Je {{m }}étais imaginé que je pourrais pas retrouver cet objet.           ->> m’
TEST: Je {{n }}ai pas retrouvé l’ambiance de mes années de lycée.               ->> n’
TEST: ne fais rien {{jusqu'}}<b>à demain</b>                                    ->> jusqu’
TEST: cette fois, {{c'}}<i>est</i> mort                                         ->> c’


!!
!!
!!!! 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.{{"}}                                                 ->> " »|”"


__<s>/typo(typo_guillemets_typographiques_simples_doubles_ouvrants)__
    (?:^|[ –—-])('')(?=\w)  @@*
        <<- -1>> « |“                                                                               && Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_simples_doubles_fermants)__
    [\w.?!…,]('')(?![\w'’])  @@*
        <<- -1>> " »|”"                                                                             && Guillemets typographiques fermants.

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


__<s>/typo(typo_guillemets_typographiques_simples_ouvrants)__
    (?:^|[ –—-])(['’])(?=\w)  @@*
        <<- -1>> “|‘|‹                                                                              && Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_simples_fermants)__
    [\w.?!](')(?:[   ]|$)  @@*
        <<- -1>> ”|’|›                                                                              && Guillemets typographiques fermants.

TEST: {{'}}Ça’ recommence.                                                  ->> “|‘|‹
TEST: Le {{'}}grand’ homme.                                                 ->> “|‘|‹
TEST: Le ‘grand{{'}} homme.                                                 ->> ”|’|›
TEST: Le grand ‘homme{{'}}                                                  ->> ”|’|›
TEST: dans les {{’}}beaux quartiers{{’}}
TEST: J’en ai '''marre''' (syntaxe wiki).


!!!
!!!
!!! Processeur: balises HTML, LaTeX, Markdown                                                     !!
!!!
!!!

................................................................................
__<s>/latex(p_latex3)__     \{(?:abstract|align|cases|center|description|enumerate|equation|figure|flush(?:left|right)|gather|minipage|multline|quot(?:ation|e)|SaveVerbatim|table|tabular|thebibliography|[vV]erbatim|verse|wrapfigure)\} <<- ~>> *

# Markdown
__<s>/md(p_md_span_ouvrant)__   " ([*_]+)\w" @@1 <<- ~1>> *
__<i>/md(p_md_span_fermant)__   "[a-z0-9àéîïôûüù]([*_]+)[,.;:!?) ]" @@1 <<- ~1>> *
__<s>/md(p_md_titre_début)__    "^#+" <<- ~>> *
__<s>/md(p_md_titre_fin)__      "#+ *$" <<- ~>> *
__<s>/md(p_md_liste)__          "^ *[*+] " <<- ~>> *
__<s>/md(p_md_citation)__       "^>[ >]+ " <<- ~>> *

TEST: __html__  des <b>{{homme}}</b>
TEST: __html__  des [b]{{femme}}[/b]
TEST: __html__  il est venu&nbsp;: c’était bien…
TEST: __md__    ces **{{femme}}**

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

# (attention aux modifs: brainfuck d’intensité non négligeable)
# La désambiguïsation est faite lors de la deuxième passe

__[i](eepi_écriture_épicène_tous_toutes)__
    tous?[.(/·•⋅–—-]te[.)/·•⋅–—-]?s
        <<- option("eepi") ->> tous et toutes|toutes et tous                                        && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{tou.tes}} sont là.                                              ->> tous et toutes|toutes et tous


__[i](eepi_écriture_épicène_ceux_celles)__
    c[./·•⋅–—-]?eux?[./·•⋅–—-]elles
        <<- option("eepi") ->> ceux et celles|celles et ceux                                        && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: avec {{ceux.elles}} qui viendront                                 ->> ceux et celles|celles et ceux


__[u](eepi_écriture_épicène_pluriel_eur_divers)__
    ({w_2})eurs?[.(/·•⋅–—-][tdp]?(rice|euse|se|[oe]resse)[.)/·•⋅–—-]?s  @@0,**
        <<- option("eepi") and \2 != "se" ->> \1eurs et \1\2s|\1\2s et \1eurs                       && Écriture épicène dystypographique et imprononçable.
        <<- option("eepi") and \2 == "se" ->> \1eurs et \1euses|\1euses et \1eurs                   && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: travaillons avec les {{instituteur.trice.s}}                          ->> instituteurs et institutrices|institutrices et instituteurs
TEST: La communauté des {{développeur·se·s}} open source                    ->> développeurs et développeuses|développeuses et développeurs


__[u](eepi_écriture_épicène_pluriel_eux_euses)__
    ({w_2})eux[.(/·•⋅–—-](?:[tdsi]?euse|se)[.)/·•⋅–—-]?s  @@0
        <<- option("eepi") ->> \1eux et \1euses|\1euses et \1eux                                    && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{nombreux·ses}} sont les profs qui s’indignent de cette situation.   ->> nombreux et nombreuses|nombreuses et nombreux


__[u](eepi_écriture_épicène_pluriel_aux_ales)__
    ({w_2})aux[.(/·•⋅–—-][tnmcpbd]?a?le[.)/·•⋅–—-]?s  @@0
        <<- option("eepi") ->> \1aux et \1ales|\1ales et \1aux|\1al·e·s                             && Écriture épicène dystypographique et imprononçable. Pour ce cas, il peut être intéressant de faire comme si le pluriel masculin était régulier, ce qui rend l’ensemble prononçable…
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{locaux·ales}}                                                   ->> locaux et locales|locales et locaux|local·e·s
TEST: LOCAL·E·S
TEST: amical·e·s


__[u](eepi_écriture_épicène_pluriel_er_ère)__
    ({w_2})[eè]rs?[.(/·•⋅–—-]i?è?re[.)/·•⋅–—-]?s  @@0
        <<- option("eepi") ->> \1ers et \1ères|\1ères et \1ers                                      && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: les {{conseiller.ière.s}}                                         ->> conseillers et conseillères|conseillères et conseillers
#TEST: les {{artificièr.e.s}}                                            ->> artificiers et artificières|artificières et artificiers


__[u](eepi_écriture_épicène_pluriel_if_ive)__
    ({w_2})ifs?[.(/·•⋅–—-][std]?i?ve[.)/·•⋅–—-]?s  @@0
        <<- option("eepi") ->> \1ifs et \1ives|\1ives et \1ifs                                      && Écriture épicène dystypographique et imprononçable.
        <<- ~>> =normalizeInclusiveWriting(\0)

TEST: {{inclusif.ive.s}}                                                ->> inclusifs et inclusives|inclusives et inclusifs
TEST: {{offensif.ve.s}}                                                 ->> offensifs et offensives|offensives et offensifs


__[u](eepi_écriture_épicène_pluriel_e)__
    ({w_1}[éuitsrnldf])[-·–—.•⋅(/]([ntlf]?e)[-·–—.•⋅)/]?s  @@0,**
        <<- not (\0.endswith(".Les") or \0.endswith(".Tes")) >>>
        <<- ~>> =normalizeInclusiveWriting(\0)
        <<- option("eepi") and not \0.endswith("les") and not \0.endswith("LES") and not re.search("(?i)·[ntlf]?e·s$", \0) >>>
        <<- \1.endswith("s") or \1.endswith("S") ->> \1 et \1\2s|\1\2s et \1|\1·\2·s                && Écriture épicène dystypographique. Préférez écrire lisiblement. Sinon, utilisez les points médians.
        <<- __else__ ->> \1s et \1\2s|\1\2s et \1s|\1·\2·s                                          && Écriture épicène dystypographique. Préférez écrire lisiblement. Sinon, utilisez les points médians.

TEST: nous sommes {{déconsidéré-e-s}}.
TEST: serons-nous toujours {{perdu.e.s}}.
TEST: les illustres {{inconnu(e)s}}.
TEST: la situation des {{salarié/e/s}}.
TEST: des {{Iranien-ne-s}} sont venues                                  ->> Iraniens et Iraniennes|Iraniennes et Iraniens|Iranien·ne·s
TEST: rendez-vous avec des {{écrivain(e)s}}                             ->> écrivains et écrivaines|écrivaines et écrivains|écrivain·e·s
................................................................................
TEST: IMMORTEL·LE·S
TEST: Berlinois·e·s
TEST: Iranien·ne·s


__[i](eepi_écriture_épicène_singulier)__
    ({w_1}[éuitsrnldf])([-·–—.•⋅/][ntl]?e|[(][ntl]?e[)])  @@0,$
        <<- not (\0.endswith(".Le") or \0.endswith(".Ne") or \0.endswith(".De"))
            and not ((\0.endswith("-le") or \0.endswith("-Le") or \0.endswith("-LE")) and not (\1.endswith("l") or \1.endswith("L"))) >>>
        <<- ~>> =normalizeInclusiveWriting(\0)
        <<- option("eepi") and (\1 == "un" or \1 == "Un" or \1 == "UN") ->> un ou une|une ou un                 && Écriture épicène imprononçable. Préférez écrire lisiblement.
        <<- __else__ and option("eepi") and not re.search("(?i)·[ntl]?e$", \2) ->> =\1+"·"+\2[1:].rstrip(")")   && Écriture épicène. Utilisez un point médian.

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.                      ->> déconsidéré·e
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.               ->> auteur·e
TEST: le ou la {{patron/ne}}                                            ->> patron·ne
TEST: Totalement {{con(ne)}}                                            ->> con·ne
TEST: un ou une {{intellectuel.le}}                                     ->> intellectuel·le
TEST: INTELLECTUEL·LE
................................................................................
TEST: Épuisé·e


__[i](typo_écriture_invariable)__
    ({w_3})([-·–—.•⋅/]s|[(]s[)])  @@0,$
        <<- ~>> =normalizeInclusiveWriting(\0)
        <<- option("typo") and option("eepi") and not \0.endswith("·s") and not (\0.endswith("/s") and morph(\1, ";S"))
        ->> \1·s                                                                                    && Écriture invariable. Utilisez un point médian.

TEST: la ou les {{fille(s)}}                                            ->> fille·s
TEST: le ou les patron·s
TEST: combien de rad/s



................................................................................
!!!! Majuscules manquantes                                                                        !!
!!
!!

# Majuscules après un point
__[s]/maj(majuscule_après_point)__
    ({w_2})[.] ([a-zàâéèêîôç]\w*)  @@0,$
        <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
            and morph(\1, ":") and morph(\2, ":")
        -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_début_paragraphe)__
    ^ *([a-zàâéèêîôç](?:[\w-]+[’'`‘]?|[’'`‘]))  @@$
        <<- after("\\w\\w[.] +\\w+") -1>> =\1.capitalize()                                          && Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

# autre possibilité: avec or (sContext != "Writer" and after("[.] *$"))
TEST: {{je}} suis disponible quand tu veux. Mais pas aujourd’hui.
TEST: {{j’}}arrive. Prépare-toi.
TEST: {{qu’}}il est grand, ce batiment. Faut voir si on pourra la détruire avec si peu de charges.


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

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

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


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

# virgules manquantes
__[i>/virg(virgule_manquante_avant_etc)__   {w_1}( etc[.])  @@$ <<- -1>> , etc.                     && Avant « etc. », il faut mettre une virgule.
__[i>/virg(virgule_manquante_avant_car)__
    ({w_1})( car)(?= (?:j[e’]|tu|ie?ls?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b)  @@0,$
        <<- not morph(\1, ":[DR]") -2>> , car
        && Si « car » est la conjonction de coordination, une virgule est peut-être souhaitable.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3447
__[i>/virg(virgule_manquante_avant_mais)__
    ({w_1})( mais)(?= (?:j[e’]|tu|ie?ls?|nous|vous|elles?|on)\b)  @@0,$
        <<- not morph(\1, ">(?:[mtscl]es|[nv]os|quels)/") -2>> , mais
        && Si « mais » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3445
__[i>/virg(virgule_manquante_avant_donc)__
    ({w_1})( donc)(?= (?:j[e’]|tu|ie?ls?|elles?|on)\b)  @@0,$
        <<- not morph(\1, ":[VG]") -2>> , donc
        && Si « donc » est la conjonction de coordination, une virgule est souhaitable si elle introduit une nouvelle proposition.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=3448

TEST: Un chien, un chat{{ etc.}}                                            ->> , etc.
TEST: Je suis fatigué{{ car}} ils ont joué toute la nuit.                   ->> , car
TEST: Je suis fatigué{{ mais}} il a joué toute la nuit.                     ->> , mais
TEST: il l’a vu de ses propres yeux{{ donc}} il faut y croire.              ->> , donc
TEST: il s’est donc tu
TEST: Chacun peut l’entendre d’une manière différente et donc on se demande bien ce qui est mesuré dans les réponses.
................................................................................


__<s>/virg(virg_virgule_avant_points_suspension)__
    , *… <<- ->> …                                                          && Typographie : pas de virgule avant les points de suspension.

__<s>/virg(virg_virgule_après_point)__
    ({w1})([.],)  @@0,$
        <<- not re.search("^(?:etc|[A-Z]|fig|hab|litt|circ|coll|ref|étym|suppl|bibl|bibliogr|cit|vol|déc|nov|oct|janv|juil|avr|sept|pp?)$", \1)
        -2>> ,|.                                                            && Pas de virgule après un point (sauf éventuellement après une abréviation).

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


# Fin de paragraphe
#__<i>/typo__  ({w_2}) *$   @@0
................................................................................

__<s>/typo(typo_espace_manquant_après1)__
    ({w1})[,:]({w_1})  @@0,$  <<- not \1.isdigit() -2>> " \2"                                       && Il manque un espace.
__<s>/typo(typo_espace_manquant_après2)__
    [?!;%‰‱˚»}]({w_1}|[({[])  @@$  <<- -1>> " \1"                                                 && Il manque un espace.
__[s>/typo(typo_espace_manquant_après3)__
    {w_1}[.]({w_1}|[({[])  @@$
        <<- (\1.__len__() > 1 and not \1[0:1].isdigit() and spell(\1)) or after("^’") -1>> " \1"    && Il manque un espace.
__[s>/typo(typo_espace_manquant_après4)__
    {w_2}[…]({w_1}|[({[])  @@$
        <<- \1[0:1].isupper() or \1.__len__() > 5 or not \1.isalpha()
            or (\1.__len__() > 1 and spell(\1)) -1>> " \1"                                          && Il manque un espace.

TEST: J’en ai marre,{{ça}} suffit.                                          ->> " ça"
TEST: elle est délirante.{{Devine}} ce qu’elle a dit.                       ->> " Devine"
TEST: Voilà,{{il}} manque un espace.                                        ->> " il"
TEST: Dernier essai.{{Voilà}}, c’est ça.                                    ->> " Voilà"
TEST: muni de lunettes protectrices et.{{d}}’un casque.                     ->> " d"
TEST: espace:{{manquant}}                                                   ->> " manquant"
................................................................................
!!!! Ponctuations redondantes                                                                     !!
!!
!!

# virgules et points
__<s>/typo(typo_virgules_points)__
    ,[.,]{2,}
        <<- ->> =\0.replace(",", ".").replace("...", "…")                               && Erreur de numérisation ? Virgules au lieu de points ?

TEST: Ah !{{,.,}} et en quoi consistait le festin ?


__<s>/typo(typo_ponctuation_superflue1)__    , ?([.,;:!?]) @@$ <<- ->> =",|" + \1       && Une de ces ponctuations est superflue.
__<s>/typo(typo_ponctuation_superflue2)__    ; ?([.,;:…!?]) @@$ <<- ->> =";|" + \1      && Une de ces ponctuations est superflue.
__<s>/typo(typo_ponctuation_superflue3)__    :[.,;:…!?] <<- ->> =":|" + \0[1]           && Une de ces ponctuations est superflue.
................................................................................
# ligatures typographiques : fi, fl, ff, ffi, ffl, ft, st
__<s>/liga(ligatures_typographiques)__              [fiflffffifflſtst] <<- ->> =undoLigature(\0)             && Suppression de la ligature typographique.

TEST: __liga__ un {{fl}}ottement                                           ->> fl
TEST: __liga__ une belle {{fi}}gure                                        ->> fi


























































!!
!!











































!!!! Divers                                                                                       !!
!!
!!

## NF (memo: don’t use flag i)
__[s]/nf(nf_norme_française)__
    [nN][fF][  -]?(?:c|C|e|E|p|P|q|Q|s|S|x|X|z|Z|[eE][nN](?:[  -][iI][sS][oO]|))[  -]?[0-9]+(?:[/ ‑-][0-9]+|)
        <<- not re.search("^NF (?:C|E|P|Q|S|X|Z|EN(?: ISO|)) [0-9]+(?:‑[0-9]+|)", \0)
        ->> =formatNF(\0)                                       && Norme française. Utilisez les espaces et tirets insécables.|http://fr.wikipedia.org/wiki/Liste_de_normes_NF

TEST: __nf__ Norme française : {{Nf-EN ISO 3892-23}}



!!
!!
!!!! 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
        <<- -1>> _                                                                                  && Guillemets fermants introuvables dans la suite du paragraphe.
__[i]/typo(typo_guillemets_doubles_fermants_non_ouverts)__
    ^[^“„«"]+\w(”)  @@$
        <<- -1>> _                                                                                  && Guillemets ouvrants introuvables dans ce paragraphe.

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.

TEST: « Je suis là.
TEST: — Oui, nous t’avons vu arriver. »
TEST: « J’en suis “malade”. »
................................................................................
!!
!!!! Espaces insécables avant unités de mesure                                                    !!
!!
!!

__[s]/unit(unit_nbsp_avant_unités1)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹]|)) ?)([kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|px|MHz|°C|℃)(?![’'])  @@0,0,$
        <<- option("num") ->> =formatNumber(\2) + " " + \3          && Avec une unité de mesure, mettez un espace insécable.
        <<- __else__ ->> "\2 \3"                                    && Avec une unité de mesure, mettez un espace insécable.

__[s]/unit(unit_nbsp_avant_unités2)__
    ((\d+(?:,\d+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])) ?)([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)  @@0,0,$
        <<- morph(\3, ";S", ":[VCR]") or mbUnit(\3) or not spell(\3) >>>
        <<- option("num") ->> =formatNumber(\2) + " " + \3          && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
        <<- __else__ ->> "\2 \3"                                    && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

__[s]/unit(unit_nbsp_avant_unités3)__
    ((\d+) )([a-zA-Zµ][a-zA-Z0-9Ωℓ⁰¹²³⁴⁵⁶⁷⁸⁹/·]*)(?![’'])  @@0,0,$
        <<- (\2.__len__() > 4 and not spell(\3)) or morph(\3, ";S", ":[VCR]") or mbUnit(\3) >>>
        <<- option("num") ->> =formatNumber(\2) + " " + \3          && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.
        <<- __else__ ->> "\2 \3"                                    && Si “\3” est une unité de mesure, il manque un espace insécable. Si le nombre se rapporte au mot suivant, c’est aussi valable.

TEST: Ça a duré {{3µs}}                                 ->> 3 µs
TEST: Ça a duré {{3,5 µs}}                              ->> 3,5 µs
TEST: il y en a {{3 m²}}                                ->> 3 m²
TEST: il a fait {{10%}}                                 ->> 10 %
TEST: Ça coûte {{13,4¥}}.                               ->> 13,4 ¥
TEST: il mesure {{30,3 cm}}                             ->> 30,3 cm
................................................................................
!!
!!!! Grands nombres                                                                               !!
!!
!!

__[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]+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])") and not (re.search("^[01]+$", \0) and after("^,[01]+\\b")))
            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
TEST: {{123456}}                                ->> 123 456
TEST: {{1234567}}                               ->> 1 234 567
TEST: {{12345678}}                              ->> 12 345 678
TEST: {{023456789}}                             ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                            ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
................................................................................
TEST: {{4000}} Å                                ->> 4 000
TEST: {{3240}} µA                               ->> 3 240
TEST: 1111 0011,01 (binaire)


__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
        <<- option("num") ->> =\0.replace(".", " ")                                                 && Grands nombres : utilisez des espaces insécables plutôt que des points.
        <<- ~>> =\0.replace(".", "_")

TEST: il cumule {{200.000.000}} de pertes sèches


__[s](num_grand_nombre_avec_espaces)__
    \d\d?\d?(?: \d\d\d)+
        <<- option("num") ->> =\0.replace(" ", " ")                                                 && Grands nombres : utilisez des espaces insécables.
        <<- ~>> =\0.replace(" ", "_")

TEST: Il a perdu {{20 000}} euros à la Bourse en un seul mois.


!!
!!
!!!! Dates                                                                                        !!
................................................................................
!!
!!
!!!! Redondances                                                                                  !!
!!
!!
__[i]/redon1(redondances_paragraphe)__
    ({w_4})[  ,.;!?:].*[  ](\1)  @@0,$
        <<- not morph(\1, ":(?:G|V0)|>(?:t(?:antôt|emps|rès)|loin|souvent|parfois|quelquefois|côte|petit|même)/") and not \1[0].isupper()
        -2>> _                                                      && Dans ce paragraphe, répétition de « \1 » (à gauche).
        <<- __also__ -1>> _                                         && Dans ce paragraphe, répétition de « \1 » (à droite).

TEST: __redon1__ Tu es son {{avenir}}. Et lui aussi est ton {{avenir}}.
TEST: __redon1__ Car parfois il y en a. Mais parfois il n’y en a pas.



!!
................................................................................
!!!! OCR                                                                                          !!
!!
!!

# ?
__<s]/ocr(ocr_point_interrogation)__
    [  ]7
        <<- after0("^(?: +[A-ZÉÈÂ(]|…|[.][.]+| *$)") ->> " ?"                                       && Erreur de numérisation ?

TEST: __ocr__ des chiffrements{{ 7}} Paul n’en sait rien.
TEST: __ocr__ veux-tu en parler{{ 7}}


# !
__<s]/ocr(ocr_exclamation1)__
    [  ]I(?![ ’'][aâeéèêëiîïoôuy])
        <<- ->> " !"                                                                                && Erreur de numérisation ?
__<s]/ocr(ocr_exclamation2)__
    [  ]1(?= [A-ZÉÈÂÎ])
        <<- not morph(word(1), ";S") and not morph(word(-1), ":R") ->> " !"                         && Erreur de numérisation ?

TEST: __ocr__ Oh{{ I}} c’est pas formidable ?
TEST: __ocr__ Vraiment{{ 1}} Paul n’en savait rien.
TEST: __ocr__ Ça prendra 1 h.
TEST: __ocr__ Valeur : 1 KHz.


................................................................................
    elle ?aussi¿ ~é(?:es|s)$
        <<- /ppas/ morph(\-1, ":Q") and not morph(<1, ":(?:V0a|R)") --1>> =suggVerbPpas(\-1, ":f:s")+"|"+suggVerbTense(\-1, ":Iq", ":3s")
        && Incohérence probable. Après “elle”, il faut un participe passé féminin singulier ou une forme verbale conjuguée (3ᵉ personne du singulier).

TEST: elle {{mangé}}.
TEST: elle aussi {{mangées}}.


__conf_en_tant_que_subst__
    en  tant  [que|qu’]  @:V¬:[NAG]
        <<- /conf/ --1>> =suggSimil(\-1, ":[NA]")
        && Confusion probable. Après « en tant que », il faut un substantif, pas un verbe. Exemples : en tant que femme, en tant que patron, en tant que trentenaire…

TEST: en tant qu’{{abaisse}}
TEST: en tant que tel


__conf_presque_vconj__
    presque  @:[123][sp]¬:[GNAQWM]
        <<- /conf/ not tag_before(\1, "_ceque_") and not value(<1, "|ou|") -2>> _                   && Incohérence probable avec “presque” : « \2 » n’est ni un adjectif, ni un participe passé, ni un adverbe.

TEST: presque {{délaissait}} par tout le monde.
TEST: Tout le monde ou presque déteste ces gens-là.


__conf_sur_vconj__
    sur  @:(?:[123][sp]|P)¬:[GNAQM]
................................................................................
    en [certaines|quelques|plusieurs] occasions  [<end>|,|)]
        <<- ~1:3>> *

    en de multiples occasions  @¬:A.*:[fe]:[pi]
    en de multiples occasions  [<end>|,|)]
        <<- ~1:4>> *

    <start> en fait
        <<- ~2:3>> *

    en fait
        <<- not value(<1, "|je|tu|n’|il|on|elle|iel|") ~>> ␣

    en un sens  @¬:A.*:[me]:[si]
    en un sens  [<end>|,|)]
        <<- ~1:3>> *

    en sus
        <<- not value(<1, "|j’|tu|il|elle|on|n’|") ~>> *

    entre autres choses  @¬:A.*:[fe]:[pi]
    entre autres choses  [<end>|,|)]
        <<- ~1:3>> *

    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  [<end>|,|)]
................................................................................
    pour partie  @:¬:A.*:f:s
    pour partie  [<end>|,|)]
        <<- ~1:2>> *

    pour un temps  @:¬:[NA].*:[me]:[si]
    pour un temps  [<end>|,|)]
        <<- ~1:3>> *

    sans surprise  @:¬:[NA].*:[fe]:[si]
    sans surprise  [<end>|,|)]
        <<- ~1:2>> *

    semblait-il
    semble-t-il
        <<- not value(<1, "|ça|cela|ceci|me|m’|te|t’|lui|nous|vous|leur|ne|n’|") ~>> *

    tête la première
        <<- not morph(<1, ":D") and not morph(>1, ":[NA].*:[fe]:[si]") ~>> *
................................................................................
    >arriver a point nommé
    >arriver a bon port
    >battre a plate couture
    [>brûler|>bruler] a vif
    >charger a blanc
    >chauffer a blanc
    >chuter a terre
    >être a bloc
    >fermer a [>clé|>clef]
    [>gonfler|>regonfler] a bloc
    >jeter a terre
    [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>plat|>profit|>table|>terre]
    [>mettre|>remettre] a l’ [écart|épreuve]
    >naviguer a [vu+ses]
    >parer a toute éventualité
    >passer a tabac
    >percer a jour
    >prendre a la légère
    >prêter a >confusion
    >réduire a néant
    >rester a >flot
    >saigner a blanc
    >sentir a l’ aise
    >tenir a [carreau|cœur|distance]
    >tirer a blanc
    >tomber a [pic|point|terre]
    >tirer a blanc
    >tourner a l’ aigre
................................................................................
TEST: celles {{perdue}} aura une pénalité
TEST: celles venues chanter doivent se rendre là-bas.


## Nombres
__gn_nombre_lettres_1m__
    $:B:e:p  *WORD
        <<- /gn/ not value(\1, "|neuf|mille|") and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL) and not re.search("^[IVXLDM]+$", \1)
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    neuf  *WORD
        <<- /gn/ ( morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    mille  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|multiplié|divisé|") and (morph(\2, ":[NA].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.        ->> idiots
TEST: Il a abandonné neuf {{enfant}}.                                               ->> enfants
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.              ->> travailleurs
TEST: Il y a quatre cents {{mot}} dans la phrase.                                   ->> mots
TEST: cent {{mot}}                                                                  ->> mots
................................................................................
TEST: cinquante {{mot}}                                                             ->> mots
TEST: mille cinquante {{mot}}                                                       ->> mots
TEST: deux {{tête}}                                                                 ->> têtes
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.
TEST: L’article VII mentionné dans la revue
TEST: Le produit de cinq multiplié par trois.
TEST: deux divisé par douze
TEST: il en faut trois minimum, cinq maximum


__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|")
        -2>> =suggSing(\2)                                                                  && Accord de nombre erroné : « \1 » devrait être au singulier.

    *NUM  *WORD
        <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N")
            and ( (morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|"))
            or \1 in aREGULARPLURAL )
        -2>> =suggPlur(\2)                                                                  && Accord de nombre erroné : « \2 » devrait être au pluriel.

    *NUM  *WORD  *WORD
        <<- /gn/ not value(\2, "|maximum|minimum|fois|multiplié|divisé|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|")
            and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not value(<1, "|et|ou|de|d’|") and not morph(\3, ">(?:seule|maximum|minimum)/") >>>
        <<- /gn/ ((morph(\2, ":[NA].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NA].*:m", "*")))
            and not apposition(\2, \3)
        -3>> =switchGender(\3, True)                                                                && Accord de genre erroné entre « \2 » et « \3 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2, True)                           && Accord de genre erroné avec « \3 ».
        <<- /gn/ morph(\2, ":[NA].*:[pi]", "*") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A"))
        -3>> =suggPlur(\3)                                                                          && Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.
................................................................................
TEST: elle fut le 13 janvier décapitée
TEST: elles furent le 18 janvier décorées
TEST: en quantité 2 fois moindre
TEST: 1 La Mort
TEST: L’année 2019 a commencé à le montrer
TEST: La « première génération » d’ordinateurs des années 1950 a déjà largement cédé la place à une deuxième (transistorisée)
TEST: Au sein du club des pays les plus prospères, la richesse par habitant est néanmoins 52 fois supérieure à celle des pays à faibles revenus, d’après la Banque mondiale.
TEST: 1 à 2 comprimés par jour voire 2 à 3 maximum


##  trouver ça/ceci/cela + adj
__gn_trouver_ça_adj__
    >trouver  [ça|cela|ceci]  @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M)
        <<- /gn/ -3>> =suggMasSing(\3)                                              && Trouver \2 + [adjectif] : l’adjectif s’accorde avec “\2” (au masculin singulier).

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

TEST: Ils y voient {{clairs}}.
TEST: Il vit Claire au théâtre.
TEST: J’y vois clair, mec.


# vu / vue
__sgpl_vue_vu__
    >point de [vu|vus|vues]
        <<- /sgpl/ -3>> vue                                         && Dans un “point de vue”, “vue” est toujours au féminin singulier.

    >perdre de [vu|vus|vues]
        <<- /sgpl/ -3>> vue                                         && Dans un “perdre de vue”, “vue” est toujours au féminin singulier.

TEST: c’est son point de {{vu}} qui prime.
TEST: Son point de {{vus}} prévaudra toujours, faites-vous à cette idée ou dégagez.
TEST: de mon point de {{vues}}
TEST: elle a perdu de {{vu}} ses anciens amis


__sgpl_verbe__
    >faire rires
        <<- /sgpl/ -2>> rire                                        && Faire rire. Rire est un verbe, il ne prend pas la marque du pluriel.

    [>pouvoir|>vouloir|>falloir] [rires|mangers|êtres|avoirs]
................................................................................
TEST: faut-il {{pensé}} à ces choses-là encore et encore ?
TEST: il faut n’{{estimait}} que la valeur de nos actes
TEST: il fallait bien cela pour nous épargner
TEST: une faille s’est ouverte sous nos pieds
TEST: il faut en moyenne 1000 litres d’eau pour produire un kilo de céréales
TEST: Xi Jinping a réaffirmé en janvier dernier qu’il utiliserait s’il le faut la force militaire
TEST: Comme il a fallu la mort d’un homme
TEST: Et il faut en fait, pour les expliquer, tenir compte de trois éléments complémentaires.


__infi_faire__
    >faire  ~(?:ée?s?|ez)$
        <<- /infi/ not morph(<1, ">(?:en|de|être)/") and morph(\2, ":V", ":[MG]") and not (morph(\1, ":N") and morph(\2, ":Q.*:m:[sp]"))
        -2>> =suggVerbInfi(\2)                                                                      && Après le verbe “faire”, ce verbe devrait être à l’infinitif.

................................................................................
TEST: celles-là {{on}} {{vraiment}} un problème avec la religion.
TEST: j’ai, tu as, ils ont, elles {{on}}
TEST: ces gens-là ils {{on}} {{raison}} plus souvent que la plupart des gens.
TEST: Ils soutiennent ceux qui {{on}} {{tant}} de raison d’être en colère.
TEST: Or parmi celles-ci on trouve typiquement d’un côté les structures



!!
!!
!!!! Inversion verbe sujet                                                                        !!
!!
!!

__conj_que_où_comment_verbe_sujet_sing__
    [que|qu’|où|comment|combien|dont|quand|pourquoi|puisque|puisqu’|lorsque|lorqu’|auquel|auxquels|auxquelles]
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    [que|qu’|où|comment|combien|dont|quand|pourquoi|puisque|puisqu’|lorsque|lorqu’|auquel|auxquels|auxquelles]
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [le|la|l’|leur]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not (morph(\4, ":Y") and morph(\2, ">(?:pouvoir|vouloir|devoir)"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    duquel
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    duquel
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [le|la|l’|leur]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not (morph(\4, ":Y") and morph(\2, ">(?:pouvoir|vouloir|devoir)")) and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    desquels
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    desquels
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [le|la|l’|leur]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not (morph(\4, ":Y") and morph(\2, ">(?:pouvoir|vouloir|devoir)")) and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    desquelles
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

    desquelles
        ||  @:[123][sp]¬:(?:3s|G|W|3p!)  [le|la|l’|leur]  *WORD
        <<- /conj/ not value(\4, "|plupart|majorité|groupe|") and not tag(\4, "_enum_") and not (value(>1, "|et|ou|") and morph(>2, ":D")) and not (value(>2, "|et|ou|") and morph(>3, ":D"))
            and not (morph(\4, ":Y") and morph(\2, ">(?:pouvoir|vouloir|devoir)")) and not morph(<1, ":[NA]")
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: les possibilités qu’{{offrent}} le chien
TEST: les possibilités que {{donnent}} le chien.
TEST: Où {{vas}} l’homme ?
TEST: l’histoire dont {{bénéficient}} notre langue.
TEST: le feu, duquel {{proviennent}} la vie
TEST: le feu, duquel {{proviennent}} notre existence
TEST: les hommes, desquels {{arrivent}} la mort
TEST: les hommes, desquels {{arrivent}} votre dstruction
TEST: les lois, desquelles {{proviennent}} notre soumission
TEST: les lois, desquelles {{proviennent}} leur cohésion
TEST: de la même façon que survivent le swing ou le latin.
TEST: en proportion des efforts que requièrent son entretien et son exploitation
TEST: une crainte aussi que renforcent son éloignement et le protocole compliqué
TEST: à l’époque de Mansur que grandissent la place et le rôle de…
TEST: où vivent la majorité des immigrés et des enfants d’immigrés
TEST: Que deviennent la vitesse, le courant, ainsi que le rendement ?
TEST: Le complexe argilo-humique est mieux hydraté que ne pourraient l’être les micelles d’argile ou humiques
................................................................................
        <<- /conj/ morph(<1, ":R") and not value(\4, "|plupart|majorité|groupe|") and not (value(>1, "|et|ou|") and morph(>2, ":D"))
        -2>> =suggVerb(\2, ":3s")                                                   && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: une muraille contre laquelle {{venaient}} la masse armée et vociférante.


__conj_que_où_comment_verbe_sujet_pluriel__
    [que|qu’|où|comment|combien|dont|quand|pourquoi|puisque|puisqu’|lorsque|lorqu’|auquel|auxquels|auxquelles]
        ||  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ -2>> =suggVerb(\2, ":3p")                                        && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    duquel
        ||  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ not morph(<1, ":[NA]") -2>> =suggVerb(\2, ":3p")                 && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    desquels
        ||  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ not morph(<1, ":[NA]") -2>> =suggVerb(\2, ":3p")                 && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

    desquelles
        ||  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ not morph(<1, ":[NA]") -2>> =suggVerb(\2, ":3p")                 && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: D’où {{vienne}} les hommes ?
TEST: Comment {{danse}} les femmes ?
TEST: les idioties qu’{{aime}} les hommes, j’en ai marre.
TEST: l’amour dont {{parle}} les femmes
TEST: duquel {{arrive}} les ennuis
TEST: les hommes, desquels {{arrive}} nos problèmes
TEST: les femmes, desquelles {{provient}} ces outils


__conj_lxquel_verbe_sujet_pluriel__
    [lequel|laquelle|lesquels|lesquelles]  @:[123][sp]¬:(?:3p|G|W)  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|certains|certaines|plusieurs|maints|maintes]  *WORD
        <<- /conj/ morph(<1, ":R") -2>> =suggVerb(\2, ":3p")                        && Conjugaison erronée. Accord avec “\3 \4…”. Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: les amusements pour lesquels {{vienne}} les invités.
................................................................................

__conj_puisse__
    [<start>|,|(]  puisse  @:D.*:p
        <<- /conj/ -2>> puissent                                                    && Conjugaison erronée. Ce verbe devrait s’accorder au substantif qui le suit.

TEST: {{puisse}} les hommes enfin comprendre leurs erreurs.                         ->> puissent
TEST: {{puisses}} notre ennemi trembler de peur devant notre courage.               ->> puisse


!!
!!
!!!! Verbes sans sujets                                                                           !!
!!
!!

__conj_que_où_comment_verbe_sans_sujet!3__
    [que|qu’|où|comment|combien|dont|quand|pourquoi|puisque|puisqu’|lorsque|lorqu’|auquel|auxquels|auxquelles|duquel|desquels|desquelles|lequel|laquelle|lesquels|lesquelles|si]  @:[12][sp]¬:(?:G|W|3[sp]|Y|P|Q|N|A|M|VC)
        <<- /conj/ morph(\2, ":[12]s") and not value(>1, "|je|tu|") -2>> =suggVerb(\2, ":3s")                           && Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.
        <<- /conj/ __else__ and morph(\2, ":[12]p") and not value(>1, "|nous|vous|") -2>> =suggVerb(\2, ":3p")          && Conjugaison erronée. Ce verbe devrait être à la 3ᵉ personne.

TEST: Qu’est-ce que tu crois que {{deviens}} réellement, immanquablement et subitement cet homme après une telle dérouillée ?
TEST: peu importe ce que tu crois du lieu où l’{{abandonnerais}} ce salopard…
TEST: nous savons comment {{arriverons}} ces problèmes…
TEST: combien {{paraissez}} folles ces augmentations
TEST: ces sciences, ces religions, ces philosophies ne sont que contes destinés à nous donner l’illusion de la connaissance.
TEST: Le ministre de l’Intérieur a estimé que Calais avait vécu “un degré de violence jamais connu”.
TEST: à des règles aussi absurdes que précises



!!
!!
!!!! Quel(le) que soit / quel(le)s que soient                                                     !!
!!
!!
................................................................................
        <<- /conj/ -1>> \1s                                                         && Accord avec “\4 \5”. Utilisez le pluriel.

TEST: Quels que {{soit}} les salopards qui ont fait ça.
TEST: Quelles que {{sois}} les chaussures que je mets, elles me font mal aux pieds.
TEST: {{Quel}} que soient les avantages reçus, ce n’est pas assez.
TEST: {{Quelle}} que soient nos problèmes, on en parle toujours trop.
























!!
!!
!!!! Verbe auxiliaire                                                                             !!
!!
!!