Grammalecte  Check-in [3c68a92318]

Overview
Comment:[build][fr] bookmark update
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | build
Files: files | file ages | folders
SHA3-256: 3c68a9231803fdd96c0f4aa827d0f33f383abc2861be196ca4f1b6c7c8314d08
User & Date: olr on 2018-06-25 08:26:56
Other Links: manifest | tags
Context
2018-06-29
09:40
[fr] apostrophe u02BC considérée incorrecte, quoique semblable à u2019 check-in: 376d39455e user: olr tags: fr, trunk
2018-06-25
08:26
[build][fr] bookmark update check-in: 3c68a92318 user: olr tags: build, fr, trunk
07:58
[fr] faux positif: en tant que président du conseil (trailing spaces automatically removed) check-in: 37fb199673 user: olr tags: fr, trunk
Changes

Modified compile_rules.py from [1ea2b6d97a] to [e584887b25].

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
...
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
...
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
    #### REGEX TRIGGER
    i = s.find(" <<-")
    if i == -1:
        print("# Error: no condition at line " + sLineId)
        return None
    sRegex = s[:i].strip()
    s = s[i+4:]
    
    # JS groups positioning codes
    m = re.search("@@\\S+", sRegex)
    if m:
        tGroups = jsconv.groupsPositioningCodeToList(sRegex[m.start()+2:])
        sRegex = sRegex[:m.start()].strip()
    # JS regex
    m = re.search("<js>.+</js>i?", sRegex)
................................................................................
    else:
        sCondition = None

    #### iGroup / positioning
    iGroup = int(m.group(2)) if m.group(2) else 0
    if iGroup > nGroup:
        print("# Selected group > group number in regex at line " + sIdAction)
    
    #### ACTION
    sAction = sAction[m.end():].strip()
    cAction = m.group(1)
    if cAction == "-":
        ## error
        iMsg = sAction.find(" # ")
        if iMsg == -1:
................................................................................
                sMsg = "=m_"+sIdAction
            else:
                for x in re.finditer(r"\\(\d+)", sMsg):
                    if int(x.group(1)) > nGroup:
                        print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
                if re.search("[.]\\w+[(]", sMsg):
                    print("# Error in message at line " + sIdAction + ":  This message looks like code. Line should begin with =")
            
    if sAction[0:1] == "=" or cAction == "=":
        if "define" in sAction and not re.search(r"define\(\\\d+ *, *\[.*\] *\)", sAction):
            print("# Error in action at line " + sIdAction + ": second argument for define must be a list of strings")
        sAction = prepareFunction(sAction)
        sAction = sAction.replace("m.group(i[4])", "m.group("+str(iGroup)+")")
        for x in re.finditer("group[(](\d+)[)]", sAction):
            if int(x.group(1)) > nGroup:
................................................................................
            lOpt.append(sLine)
        elif re.match("[  \t]*$", sLine):
            pass
        elif sLine.startswith("!!"):
            m = zBookmark.search(sLine)
            nExMk = len(m.group(0))
            if sLine[nExMk:].strip():
                printBookmark(nExMk-2, sLine[nExMk:].strip(), i)
        elif sLine.startswith(("    ", "\t")):
            lRuleLine[len(lRuleLine)-1][1] += " " + sLine.strip()
        else:
            lRuleLine.append([i, sLine.strip()])

    # generating options files
    print("  parsing options...")







|







 







|







 







|







 







|







145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
...
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
...
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
    #### REGEX TRIGGER
    i = s.find(" <<-")
    if i == -1:
        print("# Error: no condition at line " + sLineId)
        return None
    sRegex = s[:i].strip()
    s = s[i+4:]

    # JS groups positioning codes
    m = re.search("@@\\S+", sRegex)
    if m:
        tGroups = jsconv.groupsPositioningCodeToList(sRegex[m.start()+2:])
        sRegex = sRegex[:m.start()].strip()
    # JS regex
    m = re.search("<js>.+</js>i?", sRegex)
................................................................................
    else:
        sCondition = None

    #### iGroup / positioning
    iGroup = int(m.group(2)) if m.group(2) else 0
    if iGroup > nGroup:
        print("# Selected group > group number in regex at line " + sIdAction)

    #### ACTION
    sAction = sAction[m.end():].strip()
    cAction = m.group(1)
    if cAction == "-":
        ## error
        iMsg = sAction.find(" # ")
        if iMsg == -1:
................................................................................
                sMsg = "=m_"+sIdAction
            else:
                for x in re.finditer(r"\\(\d+)", sMsg):
                    if int(x.group(1)) > nGroup:
                        print("# Error in groups in message at line " + sIdAction + " ("+str(nGroup)+" groups only)")
                if re.search("[.]\\w+[(]", sMsg):
                    print("# Error in message at line " + sIdAction + ":  This message looks like code. Line should begin with =")

    if sAction[0:1] == "=" or cAction == "=":
        if "define" in sAction and not re.search(r"define\(\\\d+ *, *\[.*\] *\)", sAction):
            print("# Error in action at line " + sIdAction + ": second argument for define must be a list of strings")
        sAction = prepareFunction(sAction)
        sAction = sAction.replace("m.group(i[4])", "m.group("+str(iGroup)+")")
        for x in re.finditer("group[(](\d+)[)]", sAction):
            if int(x.group(1)) > nGroup:
................................................................................
            lOpt.append(sLine)
        elif re.match("[  \t]*$", sLine):
            pass
        elif sLine.startswith("!!"):
            m = zBookmark.search(sLine)
            nExMk = len(m.group(0))
            if sLine[nExMk:].strip():
                printBookmark(nExMk-2, sLine[nExMk:-3].strip(), i)
        elif sLine.startswith(("    ", "\t")):
            lRuleLine[len(lRuleLine)-1][1] += " " + sLine.strip()
        else:
            lRuleLine.append([i, sLine.strip()])

    # generating options files
    print("  parsing options...")

Modified gc_lang/fr/rules.grx from [61fedd664d] to [78fc0fd23f].

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
...
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
...
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
...
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
...
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
...
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
...
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
...
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
...
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
...
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
...
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
....
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
....
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
....
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
....
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
....
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
....
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
....
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
....
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
....
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
....
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
....
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
....
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
....
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
....
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
....
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
....
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
....
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
....
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
....
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
....
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
....
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
....
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
....
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
....
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
....
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
....
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
....
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
....
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
....
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
....
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
....
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
....
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
....
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
....
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
....
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
....
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
....
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
....
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
....
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
....
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
....
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
....
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
....
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
....
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
....
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
....
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
....
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
.....
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
.....
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
.....
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
.....
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
.....
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
.....
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
.....
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
.....
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
.....
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
.....
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
.....
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
.....
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
.....
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
.....
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
.....
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
.....
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
.....
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
.....
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
.....
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
.....
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
.....
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
.....
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
.....
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
.....
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
.....
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
.....
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
.....
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
.....
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
.....
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
.....
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
.....
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554

# ERREURS COURANTES
# http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Fautes_d%27orthographe/Courantes


!!
!!
!! Options
!!
!!

OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf chim, ocr mapos, liga
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
................................................................................
OPTLABEL/debug:     Debug
OPTLABEL/idrule:    Display control rule identifier [!]|Display control rule identifier in the context menu message.



!!
!!
!! Définitions pour les regex
!!
!!

DEF: avoir          [aeo]\w*
DEF: etre           [êeésf]\w+
DEF: avoir_etre     [aeêésfo]\w*
DEF: aller          (?:ai?ll|v[ao]|ir[aio])\w*
................................................................................
!!
!!
!!
!!
!!
!!
!!
!! PASSE 0: PARAGRAPHE PAR PARAGRAPHE
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!



!!
!!
!!! Espaces & tabulations
!!
!!

# Espaces surnuméraires
# Note : les tabulations ne sont pas soulignées dans LibreOffice. Mais l’erreur est bien présente.
__<s>/tab(tab_début_ligne)__           ^[      ]+ <<- ->> ""                   # Espace(s) en début de ligne à supprimer : utilisez les retraits de paragraphe.
__<s>/tab(tab_fin_ligne)__             [       ]+$ <<- ->> ""                  # Espace(s) en fin de ligne à supprimer.
................................................................................
# À partir d’ici, toute règle est susceptible de supprimer des caractères et les remplacer par des espaces ou des chaînes de longueur égale.
#
#


!!!
!!!
!!! Processeur: efface les ponctuations gênantes (URL, sigles, abréviations, IP, heures, etc.)
!!!
!!!

# e-mail
__<i>(p_email)__
    \w[\w.-]*@\w[\w.-]*\w[.]\w+ <<- ~>> *

................................................................................
TEST: Dossier C:\Program Files (x86)\LibreOffice
TEST: [1] Dossier à revoir.



!!!
!!!
!!! Processeur: balises HTML et LaTeX
!!!
!!!

# HTML
__<i>/html(p_html_amp_xxx)__            &amp;[a-zA-Z]+; <<- ~>> _
__<i>/html(p_html_lt)__                 &lt; <<- ~>> "   <"
__<i>/html(p_html_gt)__                 &gt; <<- ~>> >
................................................................................
TEST: __html__  des <b>{{homme}}</b>
TEST: __html__  des [b]{{femme}}[/b]



!!
!!
!!!! Écritures épicènes dystypographiques
!!
!!

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

__[i](typo_écriture_épicène_tous_toutes)__
................................................................................

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.


!!
!!
!!!! 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)
................................................................................
    <<- after("\w\w[.] +\w+") -1>> =\1.capitalize()                                                 # Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

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


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

# 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|ils?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b)  @@0,$
................................................................................
#__<i>/typo__  ({w_2}) *$   @@0
#    <<- before("[a-zéàùèê][.] ") and not before(r"^(?:\d|\w[.])")
#    -1>> \1.|\1…|\1 !|\1 ?|\1 :|\1 ;|\1,                                               # Il manque une ponctuation finale.


!!
!!
!!!! Espaces manquants
!!
!!

__<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.
................................................................................
TEST: espace.{{Manquant}}                                                   ->> " Manquant"
TEST: qui ont refuse.{{de}} se sauver                                       ->> " de"
TEST: pic.twitter.com/PICNAME


!!
!!
!!!! Points
!!
!!

# Points superflus
__[i>/typo(typo_et_cetera)__             etc(?:[.]{3,5}|…) <<- ->> etc.                             # Un seul point après « etc. »

TEST: {{etc…}}
................................................................................
TEST: Ligne de points{{...........................}}
TEST: Aujourd’hui, M. Camus va nous lire son texte.



!!
!!
!!!! Tirets
!!
!!

# Tirets, énumérations et dialogues
__<s>/typo(typo_tiret_début_ligne)__    ^[-_][  ] <<- ->> "— |– "           # Dialogues et énumérations : un tiret cadratin ou demi-cadratin, suivi d’un espace insécable, est requis.
__<s>/typo(typo_tiret_dans_dialogue)__  ^ *«[  ](-[  ]) @@$ <<- -1>> "— |– "
    # Dialogues : un tiret cadratin ou demi-cadratin, suivi d’un espace insécable, est requis. (Attention : à moins qu’il s’agisse d’un dialogue inclus dans un autre dialogue, cette manière d’écrire est erronée.)
................................................................................
TEST: {{—}}Viens là.                                                        ->> "— |– "
TEST: Cette phrase contient{{ - }}c’est certain – des tirets d’incise.      ->> " – | — "
TEST: « {{- }}Viens ! On va en finir avec cette affaire, sale fils de pute. ->> "— |– "


!!
!!
!!!! Ponctuations redondantes
!!
!!

# virgules et points
__<s>/typo(typo_virgules_points)__
    ,[.,]{2,}
    <<- ->> =\0.replace(",", ".").replace("...", "…")                                               # Erreur de numérisation ? Virgules au lieu de points ?
................................................................................
TEST: Succession : a{{;}} b.                                                ->> " ;"
TEST: C’est assez {{: }}parlez !                                            ->> ": "
TEST: {{» }}C’est ce qu’on croit savoir.                                    ->> "» |« "


!!
!!
!!!! Signes typographiques
!!
!!

__<s>/typo(typo_signe_multiplication)__
    (\d+) ?[x*] ?(\d+)  @@0,$ <<- not \0.startswith("0x") ->> \1 × \2                               # Signe de multiplication typographique.

TEST: {{800 x 600}}                                                         ->> 800 × 600
................................................................................

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


!!
!!
!!!! Apostrophes
!!
!!
## Apostrophe typographique
__[i>/apos(apostrophe_typographique)__
    ([ldsncjmç]|jusqu|lorsqu|aujourd|presqu|quelqu|puisqu|qu|prud|entr)['´‘′`](?=[\w"«]) @@0 <<- ->> \1’    # Apostrophe typographique.
__[i>/apos(apostrophe_typographique_après_t)__
    t['´‘′`](?!ils?|elles?|on)(?=[\w"«]) <<- ->> t’                                                         # Apostrophe typographique.
................................................................................
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(r"[a-zA-Zéïîùàâäôö]$") ->> « |“                                                  # Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_doubles_fermants)__
................................................................................
TEST: Le {{'}}grand’ homme.                                                 ->> “|‘|‹
TEST: Le ‘grand{{'}} homme.                                                 ->> ”|’|›
TEST: J’en ai '''marre''' (syntaxe wiki).


!!
!!
!!!! Élisions
!!
!!

__[i]/typo(typo_élision_déterminants)__
    (l[ea] |de )([aâeéêiîoôu]\w+)  @@0,$
    <<- not re.search("(?i)^(?:onz[ei]|énième|iourte|ouistiti|ouate|one-?step|ouf|Ouagadougou|I(?:I|V|X|er|ᵉʳ|ʳᵉ|è?re))", \2) and not \2.isupper() and not morph(\2, ":G", False)
    -1>> =\1[0]+"’"                                         # Élision de l’article devant un mot commençant par une voyelle.|http://fr.wikipedia.org/wiki/Élision
................................................................................
    -1>> cet                                                # Euphonie : « ce » devient « cet » devant un mot commençant par une voyelle.

TEST: {{ce}} animal est dangereux


!!
!!
!!!! 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)
................................................................................
    <<- ->> =\0.replace("2", "₂").replace("3", "₃").replace("4", "₄")                               # Typographie des composés chimiques. [!]

TEST: __chim__ les molécules {{CaCO3}} et {{H2O}}…


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

__<s>/typo(typo_cohérence_guillemets_chevrons_ouvrants)__
    («)[^»“]+?(”)  @@0,$
    <<- not before(r"\w$") -1>> “                                                                   # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after(r"^\w") -2>> " »"                                                                 # Guillemet fermant différent du guillemet ouvrant («).
................................................................................
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|°C|℃)(?![’'])  @@0,0
    <<- -1>> "\2 "
    # Avec une unité de mesure, mettez un espace insécable.
................................................................................
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


!!
!!
!!!! 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.
................................................................................
    <<- ~>> =\0.replace(" ", "_")

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


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

................................................................................
TEST: le {{32.03.2018}}
TEST: le {{81/01/2012}}
TEST: 12-12-2012


!!
!!
!!!! 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) ", False) 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__ Car parfois il y en a. Mais parfois il n’y en a pas.




!!!
!!!
!!! Processeur: Dernier nettoyage avant coupure du paragraphe en phrases
!!!
!!!

# Trait d’union conditionnel (u00AD)
__<i>(p_trait_union_conditionnel1)__    \w+‑\w+‑\w+ <<- ~>> =\0.replace("‑", "")
__<i>(p_trait_union_conditionnel2)__    \w+‑\w+ <<- ~>> =\0.replace("‑", "")

................................................................................
!!
!!
!!
!!
!!
!!
!!
!! PASSE 1: PHRASE PAR PHRASE
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!

[++]



!!!! Doublons (casse identique)

__[s](doublon)__
    ({w1}) {1,3}\1  @@0
    <<- not re.search("(?i)^([nv]ous|faire|en|la|lui|donnant|œuvre|h[éoa]|hou|olé|joli|Bora|couvent|dément|sapiens|très|vroum|[0-9]+)$", \1)
        and not (re.search("^(?:est|une?)$", \1) and before("[’']$"))
        and not (\1 == "mieux" and before("(?i)qui +$"))
    ->> \1   # Doublon.

TEST: Il y a un {{doublon doublon}}.


!!!! Nombres: typographie

#(\d\d\d\d)-(\d\d\d\d)   <<- ->> \1–\2                              # Ne pas séparer deux dates par un trait d’union, mais par un tiret demi-cadratin.

__[s]/num(num_lettre_O_zéro1)__  [\dO]+[O][\dO]+ <<- not option("ocr") ->> =\0.replace("O", "0")    # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                      ->> 2011
................................................................................
TEST: le {{IInd}} siècle                        ->> IIᵈ
TEST: le {{VIième}} siècle                      ->> VIᵉ
TEST: Le {{XXIème}} siècle.                     ->> XXIᵉ
TEST: le {{XXè}} siècle.                        ->> XXᵉ



!!!! Écritures épicènes invariables

__[i](d_typo_écriture_épicène_pluriel)__
    ({w_1}[éuitsrn])_(?:[nt]|)e_s  @@0
    <<- morphex(\1, ":[NAQ]", ":G") =>> define(\1, [":N:A:Q:e:p"])

__[i](d_typo_écriture_épicène_singulier)__
    ({w_2}[éuitsrn])_e  @@0
    <<- morph(\1, ":[NAQ]", False) =>> define(\1, [":N:A:Q:e:s"])


!!!! Dates

__[i]/date(date_jour_mois_année)__
    (\d\d?) (janvier|février|ma(?:rs|i)|a(?:vril|o[ûu]t)|jui(?:n|llet)|septembre|octobre|novembre|décembre) (\d\d\d+)  @@0,w,$
    <<- not checkDateWithString(\1, \2, \3) ->> _                                                   # Cette date est invalide.

TEST: {{29 février 2011}}

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

TEST: le {{30 février}}



!!!
!!!
!!! Processeur: épuration des signes inutiles et quelques simplifications
!!!
!!!

# fin de phrase
__<s>(p_fin_de_phrase)__        [.?!:;…][ .?!… »”")]*$  <<- ~>> *

# début de phrase
................................................................................


TEST: New York {{étaient}} {{devenue}} la plaque tournante de tous les trafics.


!!
!!
!!!! Traits d’union
!!
!!

__<i]/tu(tu_t_euphonique_incorrect)__
    ([-–—− ]t(?:[’' ][-–—−]?|[-–—−][’' ]?))(ils?|elles?|on|tu)  @@0,$
    <<- re.search("(?i)^(?:ils|elles|tu)$", \2) -1>> -      # Le “t” euphonique n’est pas nécessaire avec “\2”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
    <<- __else__ and \1 != "-t-" and \1 != "-T-" -1>> -t-   # Pour le “t” euphonique, il faut deux traits d’union. Pas d’apostrophe. Pas d’espace.
................................................................................
    lors que?
    <<- not before(r"(?i)\bd[eè]s +$") ->> =\0.replace(" ", "")                                     # Attachez les deux mots.|https://fr.wiktionary.org/wiki/lorsque

TEST: Elle y arriva {{lors qu}}’elle trouva l’astuce permettant l’ouverture de la porte.
TEST: Dès lors qu’on sait comment s’y prendre, aucune raison de faillir.


!!!! Virgules

# Dialogues
__[u]/virg(virgule_dialogue_après_nom_propre)__
    ([A-ZÉÈ][\w-]+) (\w+-(?:moi|toi|l(?:ui|a|e(?:ur|s|))|nous|vous|je|tu|ils|elles))  @@0,$
    <<- morphex(\1, ":M", ":G") and not morph(\2, ":N", False) and isStart()
    -1>> \1,                                                                        # Dialogue ? Ajoutez une virgule pour mettre en incise la personne à qui s’adresse la réplique.

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

TEST: Tu vas les {{donner}} Rachel.
TEST: Il va la {{tuer}} Paul.
TEST: Cependant les promesses n’engagent que ceux qui les croient, comme aimait à le dire Jacques Chirac.



!!!! Apostrophe manquante (2)

__<s>/typo(typo_apostrophe_manquante_audace2)__
    ^ *([LDSNCJMTÇ] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ]  @@*
    <<- option("mapos") -1>> =\1[:-1]+"’"                                                           # Il manque peut-être une apostrophe.

TEST: __mapos__ {{L }}opinion des gens, elle s’en moquait.



!!!! A / À: accentuation la préposition en début de phrase

__<s]/typo(typo_À_début_phrase1)__
    ^ *(A) (?!t[’-](?:ils?|elles?|on))({w_2})  @@*,$
    <<- morphex(\2, ":[GNAY]", ":(?:Q|3s)|>(?:priori|post[eé]riori|contrario|capella|fortiori) ")
        or (\2 == "bientôt" and isEnd())
    -1>> À                                                                                          # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase2)__
................................................................................
TEST: — {{A}} t’emmener loin de tout ceci.
TEST: {{A}} bientôt, mon ami.
TEST: A bientôt fini son devoir.
TEST: A priori, nul ne peut y parvenir sans une aide extérieure.
TEST: A devient notre meilleure chance d’y parvenir.


!!!! Accentuation des majuscules

__[u]/maj(maj_accents)__
    E(?:tat|glise|co(?:le|nomie)|quipe|lectri(?:cité|que)|gal(?:ité|ement)|té)s? @@1
    <<- ->> ="É"+\0[1:]                                                                            # Accentuez les majuscules.
    <<- ~>> ="É"+\0[1:]

TEST: Le budget de l’{{Etat}}.



!!!
!!!
!!! Désambiguïsation
!!!
!!!

# mots grammaticaux
__[i](d_dans)__
    dans
    <<- not morph(word(-1), ":D.*:p|>[a-z]+ièmes ", False, False) =>> select(\0, ":R")
................................................................................
TEST: elle finit par être très fière de son fils.
TEST: en tant que président du conseil



!!
!!
!!!! OCR
!!
!!

# ?
__<s]/ocr(ocr_point_interrogation)__
    [  ]7
    <<- after0("^(?: +[A-ZÉÈÂ(]|…|[.][.]+| *$)") ->> " ?"                                           # Erreur de numérisation ?
................................................................................
TEST: __ocr__ trouve {{l£}} temps
TEST: __ocr__ elle s’{{avance*}} sur le seuil
TEST: __ocr__ par beaucoup d’argent ? {{{Il}} débouche le Jack Daniels


!!
!!
!!!! Incohérences de base
!!
!!

### double négation
__[i](double_négation)__
    pas (personne|aucune?|jamais)  @@4
    <<- not morph(word(-1), ":D:[me]" ,False, False) ->> \1|pas, \1
................................................................................

TEST: je ne sais {{des}} {{ses}} choses.



!!
!!
!!!! Style
!!
!!

#__bs__  Mr <<- ->> M.                          # M. est l’usage courant pour “Monsieur”. « Mr » est l’abréviation ancienne, française.

# à / en
__[i]/bs(bs_en_à_ville)__
................................................................................
#Se rappelle de l’amour

#enjoindre à qqn de faire qqch


!!
!!
!!!! Pléonasmes
!!
!!

__[i]/pleo(pleo_abolir)__               (abol\w+) (?:absolument|entièrement|compl[èé]tement|totalement) @@0 <<- morph(\1, ">abolir ", False) ->> \1         # Pléonasme.
__[i]/pleo(pleo_acculer)__              (accul\w+) aux? pieds? du mur @@0 <<- morph(\1, ">acculer ", False) ->> \1                                          # Pléonasme.
__[i]/pleo(pleo_achever)__              (ach[eè]v\w+) (?:absolument|entièrement|compl[èé]tement|totalement) @@0 <<- morph(\1, ">achever ", False) ->> \1    # Pléonasme.
__[i]/pleo(pleo_en_cours)__             actuellement en cours <<- not after(r" +de?\b") ->> en cours                                            # Pléonasme.
................................................................................
TEST: {{ta}} aimée                                            ->> ton
TEST: {{ma}} obligée                                          ->> mon
TEST: Ce couple va donner à la France sa très importante collection qui rejoindra le musée d’Orsay


!!
!!
!!!! Confusions
!!
!!

__[s>/conf(conf_ne_n)__     [nN]e n’                        <<- ->> ne m’|n’                        # Incohérence. Double négation.
__[s>/conf(conf_pronoms1)__ [mtMT]e ([nmst](?:’|e )) @@$    <<- ->> \1                              # Incohérence.
__[s>/conf(conf_pronoms2)__ [sS]e ([mst](?:’|e )) @@$       <<- ->> \1                              # Incohérence.
__[s>/conf(conf_de_d)__     [dD][eu] d’(?![A-ZÉÂÔÈ])        <<- ->> d’                              # Incohérence.
................................................................................
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.



!!
!!
!!!! Pronoms + incohérences
!!
!!
__[i](p_m_enfin)__      m’enfin <<- ~>> *

__[i]/conf(conf_j_y_en_qqch)__
    (j’(?:en +|y +|))({w_1})  @@0,$
    <<- morphex(\2, ":", ":(?:[123][sp]|O[onw])")
................................................................................
TEST: C’que j’comprends, c’est qu’il y a des limites à ce qu’on peut supporter.
TEST: la tentation pour certains médias de ne tout simplement pas rémunérer notre travail si celui-ci n’est finalement pas publié.
TEST: Ne parfois pas être celui qui sabote l’ambiance.


!!
!!
!!!! Formes verbales sans sujet
!!
!!

## Incohérences avec formes verbales 1sg et 2sg sans sujet
__[i](p_notre_père_qui_es_au_cieux)__   notre père (qui est? aux cieux) @@11 <<- ~1>> *

__[i]/conj(conj_xxxai_sans_sujet)!3__
................................................................................
TEST: Mon épouse et moi-même avons toujours dit
TEST: que vous ou moi ignorions à peu près tout du boson de Higgs n’a pas du tout le même sens



!!
!!
!!!! Locutions invariables
!!
!!

## plus que prévu / mois que prévu
__[i]/sgpl(sgpl_que_prévu1)__   (plus|moins|autant) +que (prévu(?:es?|s)) @@0,$ <<- -2>> prévu                          # Invariable. Implicitement, \1 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu2)__   (plus|moins|aussi) +({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu                # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu3)__   (plus|moins|autant) +d(?:e |’)({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu      # Invariable. Implicitement, \1 \2 que ce qui était prévu.
................................................................................
TEST: il y en a moins que {{prévues}}                         ->> prévu
TEST: comme {{convenus}}                                      ->> convenu



!!
!!
!!!! Tout, tous, toute, toutes
!!
!!

__[i](p_fais_les_tous)__
    fai(?:tes|sons|s)-(?:les|[nv]ous) (tou(?:te|)s) @@$ <<- ~1>> *
__[i](p_tout_débuts_petits)__
    (tout) (?:débuts|petits) @@0 <<- before(r"\b(aux|[ldmtsc]es|[nv]os|leurs) +$") ~1>> *
................................................................................
TEST: aux tout débuts, il y eut bien des erreurs
TEST: comment les inégalités sociales impactent la santé des tout petits



!!
!!
!!!! Adverbes de négation
!!
!!

__[i]/neg(ne_manquant1)__
    (?:je|tu|ils?|on|elles?) ([bcdfgjklmnpqrstvwxz][\w-]*) (pas|rien|jamais|guère)  @@w,$
    <<- morph(\1, ":[123][sp]", False) and not (re.search("(?i)^(?:jamais|rien)$", \2) and before(r"\b(?:que?|plus|moins) "))
    -1>> ne \1                                                                                      # Ne … \2 : il manque l’adverbe de négation.
................................................................................
TEST: __neg__ On {{en}} a pas.
TEST: __neg__ Il {{y}} a jamais d’eau.



!!
!!
!!!! Infinitif
!!
!!

__[i](p_ne_plus_pas_jamais_beaucoup_trop_rien)__
    ne (?:pas|plus|jamais) +(beaucoup|trop|rien)  @@$ <<- ~1>> *

__[i]/infi(infi_ne)__
................................................................................
TEST: Non, ne {{manger}} pas ça.
TEST: Ne {{donner}} jamais à manger ces saloperies au chat.         ->> donnez



!!!
!!!
!!! Processeur: épuration des adverbes, locutions adverbiales, interjections et expressions usuelles
!!!
!!!

# Dates
__[s](p_date)__
    (?:[dD]epuis le|[lL]e|[dD]u|[aA]u|[jJ]usqu au|[àÀ] compter du) (?:1(?:er|ᵉʳ)|\d\d?) (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)(?: \d+| dernier| prochain|) <<- ~>> *
__[i](p_en_l_an_de_grâce_année)__
................................................................................


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#


!!!! Redondances dans la phrase

__[i]/redon2(redondances_phrase)__
    ({w_4})[ ,].* (\1)  @@0,$
    <<- not morph(\1, ":(?:G|V0)|>même ", False) -2>> _             # Dans cette phrase, répétition de « \1 » (à gauche).
    <<- __also__ -1>> _                                             # Dans cette phrase, répétition de « \1 » (à droite).

TEST: __redon2__ Quelle {{imposture}}, c’est d’un ennui, c’est une {{imposture}}.
................................................................................
TEST: __redon2__ De loin en loin, elle passe.
TEST: __redon2__ Les mêmes causes produisent/produisant les mêmes effets. (répétition)



!!
!!
!!!! Groupe nominal (1)
!!
!!

#### 1 mot

## Usage impropre

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

TEST: ils trouvent ça de plus en plus {{idiots}}              ->> idiot



!!
!!
!!!! Groupe nominal (2)
!!
!!

## Sans article

__[i]/gn(gn_2m_accord)__
    ^ *({w_2}) +({w_2})  @@*,$
................................................................................
TEST: Les couleurs rouge, jaune et verte ne doivent pas être utilisées
TEST: des passeports américain, canadien, néerlandais, allemand et britannique.



!!
!!
!!!! Groupe nominal (3)
!!
!!

## nombre

__[i]/gn(gn_3m)__
    ^ *({w_2}) +({w_2}) +({w_3})  @@*,w,$
................................................................................

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



!!
!!
!!!! Groupe nominal: Accords avec de / des / du
!!
!!

__[i]/gn(gn_devinette1)__
    (?:[lmts]a|une|cette) +{w_2} +d(?:e (?:[lmts]a|cette)|’une) +(?!des )({w_2}) +({w_2})  @@w,$
    <<- morphex(\2, ":[NAQ].*:(?:m|f:p)", ":(?:G|P|[fe]:[is]|V0|3[sp])") and not apposition(\1, \2)
    -2>> =suggFemSing(@, True)                                                              # Accord erroné : « \2 » devrait être au féminin singulier.
................................................................................

TEST: {{de telles sorte}}



!!
!!
!!!! Singuliers & Pluriels
!!
!!

#### Prépositions

# Similaires à prépositions : http://www.synapse-fr.com/manuels/PP_ATTENDU.htm
# attendu, compris, non-compris, y compris, entendu, excepté, ôté, ouï, passé, supposé, vu
................................................................................
TEST: Son point de {{vus}} prévaudra toujours, faites-vous à cette idée ou dégagez.
TEST: de mon point de {{vues}}



!!
!!
!!!! Confusions
!!
!!

# à / a
__[i]/conf(conf_suite_à)__
    suite (a) ({w1}) @@w,$
    <<- morph(\2, ":D|>[ld] ", False) and isStart() -1>> à          # Confusion : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.
................................................................................


# nouveau / nouvel
# TODO



!!!! Mots composés

__[i]/mc(mc_mot_composé)__
    ({w2})-({w2})  @@0,$
    <<- not \1.isdigit() and not \2.isdigit()
        and not morph(\0, ":", False) and not morph(\2, ":G", False) and spell(\1+\2)
    ->> \1\2                                                                                        # Vous pouvez ôter le trait d’union.
    <<- \2 != "là" and not re.search("(?i)^(?:ex|mi|quasi|semi|non|demi|pro|anti|multi|pseudo|proto|extra)$", \1)
................................................................................

TEST: __mc__ des {{portes-avions}}.



!!
!!
!!!! Casse: majuscules et minuscules
!!
!!

# Les jours
__[s]/maj(maj_jours_semaine)__
    (?:Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche)
    <<- before(r"[\w,] +$") ->> =\0.lower()
................................................................................
!!
!!
!!
!!
!!
!!
!!
!!! Conjugaisons
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!
!!


!!
!!
!!!! Infinitif
!!
!!

__[i]/infi(infi_à_en)__
    à en ({w_2}) @@5
    <<- morphex(\1, ":V", ":Y") -1>> =suggVerbInfi(@)                                               # Le verbe devrait être à l’infinitif.

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

TEST: nous {{épuisants}} à la tâche pour des clopinettes, nous défaillîmes.



!!!
!!!
!!! Processeur: simplification des substantifs
!!!
!!!

### @ : we remove @ we introduced after le/la/les in some cases
__<s>(p_arobase)__      @ <<- ~>> *

### Avant les verbes (ôter seulement les COI!)
................................................................................
TEST: Je me doute bien que vous avez trouvé la réponse.
TEST: Nous nous doutons bien qu’il y a une entourloupe derrière cette affaire.
TEST: Notre but n’était pas de devenir célèbres.
TEST: sans qu’on ait à le lui ordonner



!!!! OCR

# Participes passés
__[i]/ocr(ocr_être_participes_passés)__
    ({etre}) +({w_2}es?) @@0,$
    <<- morph(\1, ":V0e", False) >>>
    <<- \2.endswith("e") and morphex(\2, ":V1.*:Ip.*:[13]s", ":(?:[GM]|A)") and not before(r"(?i)\belle +(?:ne +|n’|)$")
    -2>> =suggVerbPpas(\2, ":m:s")                                                                  # Erreur de numérisation ?
................................................................................
TEST: __ocr__ elle avait envie de s’en sortir enfin.
TEST: __ocr__ la longueur de la circonférence étant égale à…
# TEST: __ocr__ vous êtes {{presses}} de monter à bord de ce train-ci.
# Fonctionne avec nous serons, mais pas nous sommes (bug de JavaScript?)



!!!! Confusions

## guerre / guère
__[i]/conf(conf_ne_pronom_pronom_verbe_guère)__
    ne (?:[mts]e|la|les?|[nv]ous|lui|leur) (?:la |les? |lui |leur |l’|)\w{w_2} (?:plus |)(guerre)  @@$
    <<- -1>> guère                                                                                  # Confusion. La guerre est conflit. Pour l’adverbe signifiant “peu”, écrivez :

TEST: tout ceci ne me rapporte {{guerre}}
................................................................................
    ({aller}) +de (soi[tes])  @@0,$
    <<- morph(\1, ">aller", False) and not after(" soit ") -2>> soi                                 # Confusion.|https://fr.wiktionary.org/wiki/aller_de_soi

TEST: cela ne va pas de {{soit}}.



!!!! Adverbes après verbe

# fort
__[i]/sgpl(sgpl_verbe_fort)__
    ({w_2}) +(forts)  @@0,$
    <<- morphex(\1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre) .*:(?:[123]p|P|Q)|>(?:affirmer|trouver|croire|désirer|estime|préférer|penser|imaginer|voir|vouloir|aimer|adorer|souhaiter) ")
        and not morph(word(1), ":A.*:[me]:[pi]", False)
    -2>> fort                                               # Confusion probable. S’il s’agit ici de l’adverbe “fort” (équivalent de “fortement”), écrivez-le au singulier.
................................................................................
TEST: Il a de grands biens.
TEST: Ce sont des biens de peu de valeur.



!!
!!
!!!! Infinitif
!!
!!

__[i]/infi(infi_d_en_y)__
    d’(?:en|y) +({w_2})  @@$
    <<- morphex(\1, ":V", ":Y") -1>> =suggVerbInfi(@)                                               # Le verbe devrait être à l’infinitif.

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

TEST: lui {{mangée}} beaucoup.



!!
!!
!!!! Usage pronominal avec “avoir” au lieu d’“être”
!!
!!

__[i]/conj(conj_se_conf_être_avoir)__
    (s’)(?:en +|y+ |)({avoir})  @@0,$
    <<- morph(\2, ">avoir ", False) >>>
    <<- morph(\2, ":3p", False) -2>> sont|étaient|seront|seraient                                   # Confusion. Sous sa forme pronominale, un verbe s’emploie avec l’auxilaire “être”, non “avoir”.
................................................................................
TEST: {{nous}} nous {{avons}} donné le temps
TEST: {{vous}} vous {{avez}} perdu toute notion de décence.



!!
!!
!!!! Participes passés: se +être +verbe
!!
!!

__[i]/ppas(ppas_je_me_être_verbe)__
    je +(?:ne +|)m(?:e +|’(?:y +|))(?:s[uo]i[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:s")                                                                  # Si ce participe passé se rapporte bien à “je”, il devrait être au singulier.
................................................................................
TEST: des soins que je m’étais donnés.
TEST: Si t’es pas contente, t’achètes pas.



!!
!!
!!!! Participes passés: se +laisser +adjectif
!!
!!

__[i]/ppas(ppas_me_te_laisser_adj)__
    ([mt]e|l[ae]) +(laiss\w*) +({w_3})  @@0,w,$
    <<- morph(\2, ">laisser ", False) and  morphex(\3, ":[AQ].*:p", ":(?:[YG]|[AQ].*:[is])")
    -3>> =suggSing(@)                                                                               # Accord avec « \1 » : « \3 » devrait être au singulier.
................................................................................
TEST: tu nous laisses indifférentes.
TEST: ils nous laisseront étourdis.
TEST: nous laisserons étourdi cet homme.


!!
!!
!!!! Participes passés: être, avoir été, sembler (+être via pp), devenir, rester, (re)devenir, paraître + participe passé / adj
!!
!!

__[i]/ppas(ppas_je_verbe)__
    j(?:e +|’(?:y +|en +|))(?:ne +|n’|)((?:s[oue]|étai|fus|dev|re(?:dev|st)|par)\w*|a(?:ie?|vais|urais?) +été|eus(?:se|) +été) +({w_2})  @@w,$
    <<- (morph(\1, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \1.endswith(" été")) and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.
................................................................................
TEST: Leur passe-temps, ça a été faire n’importe quoi.
TEST: Ne pas ressortir le livre le plus remarqué de la collaboration aurait été faire acte de censure.
TEST: Partir aurait été assurer sa survie.


!!
!!
!!!! Participes passés: pouvoir/sembler/paraître/vouloir/devoir/croire/déclarer/penser/dire/affirmer + être/avoir été
!!
!!

__[i](p_risque_d_être)__
    risqu\w+ +(d’)être @@* <<- ~1>> *

__[i]/ppas(ppas_je_verbe_être)__
................................................................................
TEST: elles doivent être {{fâché}}
TEST: elles doivent avoir été {{attaqué}}
TEST: elles peuvent avoir été {{trompé}}
TEST: elles souhaitent être plus {{considérée}}



!!!! Participes passés: accord en nombre avec la conjugaison de « être »

## Contrôle de l’
__[i]/ppas(ppas_être_accord_singulier)__
    ({w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|était|f[uû]t|sera(?:it|)|a(?:vait|ura|urait|it|) +été|e[uû]t +été) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:p", ":[GMWYsi]") and not morph(\1, ":G", False)
    -2>> =suggSing(@)                                                        # Accord avec « être » : « \2 » devrait être au singulier.

__[i]/ppas(ppas_être_accord_pluriel)__
    ({w_2}) +(?:qui +|)(?:ne +|n’|)(?:sont|étaient|fu(?:r|ss)ent|ser(?:ont|aient)|soient|ont +été|a(?:vaient|uront|uraient|ient) +été|eu(?:r|ss)ent +été) +({w_2})  @@0,$
    <<- not re.search("(?i)^légion$", \2) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]") and not morph(\1, ":G", False)
    -2>> =suggPlur(@)                                                        # Accord avec « être » : « \2 » devrait être au pluriel.


!!!! Participes passés: accord en genre avec le substantif précédent

__[i]/ppas(ppas_sujet_être_accord_genre)__
    (?<![dD]’)(une? |les? |la |l’|ce(?:s|t|tte|) |[mts](?:on|a|es) |[nv]os |leurs? ) *({w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3)
        and ((morphex(\3, ":[AQ].*:f", ":[GWme]") and morphex(\2, ":m", ":[Gfe]")) or (morphex(\3, ":[AQ].*:m", ":[GWfe]") and morphex(\2, ":f", ":[Gme]")))
        and not ( morph(\3, ":p", False) and morph(\2, ":s", False) )
        and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
................................................................................
TEST: Martine n’est pas {{marié}}.
TEST: Martine est très {{intelligent}}.
TEST: Martine n’est pas très {{intelligent}}.
TEST: Pierre est {{dominée}} par son adversaire.



!!!! Accords avec l’adjectif précédant le pronom

__[i]/ppas(ppas_adj_accord_je_tu)__
    ^ *({w_2}s),? (je?|tu)  @@*,$
    <<- morphex(\1, ":A.*:p", ":(?:G|E|M1|W|s|i)")
    -1>> =suggSing(@)                                                       # Si cet adjectif se réfère au pronom « \2 », l’adjectif devrait être au singulier (et accordé en genre).

TEST: {{Découragés}}, je suis parti.
................................................................................
TEST: Elles se sont {{rendues}} compte
TEST: La puissance publique s’en est-elle rendu compte ?



!!
!!
!!!! Inversion verbe/sujet
!!
!!
__[i]/ppas(ppas_inversion_être_je)__
    (?:s[ou]is|étais|fus(?:sé|)|serais?)-je +({w_2})  @@$
    <<- morphex(\1, ":(?:[123][sp]|Y|[NAQ].*:p)", ":[GWsi]")
    -1>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \1 » devrait être au singulier.
__[i]/ppas(ppas_inversion_être_tu)__
................................................................................

TEST: après avoir mis à jour sont {{profile}}.



!!
!!
!!!! Se croire/considérer/montrer/penser/révéler/savoir/sentir/voir/vouloir + participe passé/adj
!!
!!

__[i]/ppas(ppas_je_me_verbe)__
    je +(?:ne +|)me +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@w,$
    <<- morph(\1, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False) and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.
................................................................................
TEST: mais les considérer uniquement ainsi fait perdre la signification politique de leur geste.
TEST: nous considérer ainsi fait le lit de la haine…



!!
!!
!!!! Avoir + participes passés
!!
!!

#__[i]/conj__  fait(s|e|es) ({w1}) <<- morph(\2, ":V") and not morph(\2, ":Y")
#   ->> fait \1                      # Le participe passé de faire reste au masculin singulier s’il est suivi par un verbe à l’infinitif.

__[i](p_les_avoir_fait_vinfi)__
................................................................................
TEST: c’est vous qui m’avez {{convertit}}.
TEST: parce que t’as envie que je le fasse



!!
!!
!!!! COD précédant que
!!
!!

__[i]/ppas(ppas_det_plur_COD_que_avoir)__
    ([ldmtsc]es) +({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust]e?)(?! [mts]’)  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
        and not ((re.search("^(?:décidé|essayé|tenté|oublié)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
................................................................................
    <<- __also__ and \1 == "a" and \2.endswith("r") and not before(r"(?i)\b(?:[mtn]’|il +|on +|elle +)$")
    -1>> à                                                                                          # Confusion probable : “a” est une conjugaison du verbe avoir. Pour la préposition, écrivez :

TEST: Avoir {{marcher}} toute la journée m’a épuisée.



!!!! du / dû

__[i]/ppas(ppas_avoir_dû_vinfi)__
    ({avoir}) +(due?s?) +(?:[mts]’|)({w_2})  @@0,w,$
    <<- morph(\1, ":V0a", False) and (morph(\3, ":Y") or re.search("^(?:[mtsn]e|[nv]ous|leur|lui)$", \3))
    -2>> dû                                                                                         # Participe passé de devoir : « dû ».

__[i]/ppas(ppas_avoir_pronom_du_vinfi)__
................................................................................
TEST: Ont-ils {{signer}} le contrat ?
TEST: Ai-je déjà {{signez}} le contrat ?
TEST: A-t-il déjà {{signer}} le contrat ?


!!
!!
!!!! Participes passés avec formes interrogatives
!!
!!

__[i]/ppas(ppas_avoir_pronom1)__
    (?<![ltm]’)({avoir})[- ](?:je|tu|ils?|elles?|t-(?:ils?|elles?|on)|on) +({w2})  @@0,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \2 != "prise"
        and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
................................................................................
TEST: se {{considérez}} comme un génie…
TEST: se {{rencontrerons}} demain grands et petits.
TEST: se {{crois}} élu par Dieu…
TEST: avec ceux se trouvant sur leur chemin



!!!! Confusions ou/où

__[i]/conf(conf_det_nom_où_pronom)__
    ^ *(?:l(?:es? +|a +|’)|[nv]o(?:s|tre) +|ce(?:t|tte|s|) +|[mts](?:es|on|a) +|des +)({w_2}) +(ou) +(?:je|tu|ils?|elles? +> +\w+|[nv]ous +> +\w+)  @@w,w
    <<- morphex(\1, ":[NAQ]", ":G")
    -2>> où                                                                         # Confusion probable. Pour évoquer un lieu ou un moment, écrivez :|http://fr.wiktionary.org/wiki/o%C3%B9

TEST: L’hôtel {{ou}} ils sont allés l’été dernier.




!!!
!!!
!!! Processeur avant impératif
!!!
!!!

__<i>(p_n_importe_qui_quoi)__       n(’)importe quo?i @@1 <<- ~1>> `


__<i](p_premier_ne_pro_per_obj1)__
................................................................................
TEST: Ne manquer de rien.
TEST: Ne jamais miser sur ces tocards.
TEST: Ne m’en rien laisser.


!!
!!
!!!! Impératif !
!!
!!

# Confusions
__[i]/imp(imp_confusion_2e_pers_pluriel)__
    ({w_2}(?:er|ai[st]|ée?s?)) (moi|l(?:es?|a|eur|ui)|nous|vous)  @@0,$
    <<- morph(\1, ":V", False) and isStart() >>>
................................................................................
TEST: {{Vas}} au diable !
TEST: {{Écartes}} de moi cette coupe.
TEST: explique-{{leurs}} de quoi il est question.


!!
!!
!!!! Impératif: traits d’union manquants
!!
!!

__[i]/imp(imp_union_moi_toi)__
    (?<!’)({w_2}) ([mt]oi)(?! même)  @@0,$
    <<- morphex(\1, ":E", ":[GM]")
    ->> \1-\2
................................................................................
TEST: {{vas y}}, ce n’est pas dangereux
TEST: {{convenez en}}, c’est une belle affaire malgré son prix élevé



!!!
!!!
!!! Processeur: destruction des pronoms qui précèdent un verbe et de l’adverbe de négation “ne”.
!!!
!!!

# Brainfuck (ici, prudence !)
__[i](p_pro_per_obj01)__
    (ne +(?:l(?:ui|eur|a|es?)|[mts]e|[nv]ous) +(?:l(?:a|es?|ui|eur)|en|y)) +({w_1})  @@0,$
    <<- morph(\2, ":(?:[123][sp]|P|Y)", False) =>> select(\2, ":(?:[123][sp]|P|Y)")
................................................................................
    <<- __also__ ~1>> *
# Fin du Brainfuck



!!
!!
!!!! Confusions
!!
!!

#### CONFUSION a / à
__[i]/conf(conf_pronom_verbe_à)__
    ^ *(?:je|tu|ils?|on|elles?) +({w_2}) +(a)  @@w,$
    <<- morph(\1, ":V", False) and \2 != "A"
................................................................................
TEST: Veillez à éviter de faire des fautes.
TEST: Veillez votre mari qui est malade.



!!
!!
!!!! Infinitif
!!
!!

__[i]/infi(infi_comment_où)__
    (?:comment|où) +({w_2}(?:ée?s?|ez))  @@$
    <<- morphex(\1, ":V", ":M") and not (\1.endswith("ez") and after(" +vous"))
    -1>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.
................................................................................
TEST: ils sont {{tromper}} par tous ces hypocrites.
TEST: Jeûner n’est pas seulement cesser de manger.
TEST: Ne pas aimer n’est pas oublier l’autre.


!!
!!
!!!! Conjugaison
!!
!!

## 1sg
__[i]/conj(conj_j)__
    j’({w_1})  @@2
    <<- morphex(\1, ":V", ":1s|>(?:en|y) ") >>>
................................................................................
    -2>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Des hommes {{arrive}}.
TEST: Des femmes ne {{demande}} rien.
TEST: des femmes qui {{conduise}} la marche du monde.


!!!! Quel(le) que soit / quel(le)s que soient

# singulier
__[i]/conj(conj_quel_quelle_que_3sg1)__
    quel(?:le|)s? que ([sf]\w+) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)  @@w
    <<- morphex(\1, ":V0e", ":3s")
    -1>> =suggVerb(@, ":3s")                                                             # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du singulier.

................................................................................
TEST: Samantha et Eva {{viennes}} demain.
TEST: Samantha et Eva leur {{décrive}} une leçon.



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

__[i]/conj(conj_que_où_comment_verbe_sujet_sing)__
    (?:que?|où|comment|combien|dont|quand|pourquoi) +({w1}) (l(?:e(?:ur | )|a |’)|[mts](?:on|a) |ce(?:t|tte|) |[nv]otre |du ) *(?!plupart|majorité)({w1})  @@w,w,$
    <<- morphex(\1, ":(?:[12]s|3p)", ":(?:3s|G|W|3p!)") and not after("^ +(?:et|ou) (?:l(?:es? |a |’|eurs? )|[mts](?:a|on|es) |ce(?:tte|ts|) |[nv]o(?:s|tre) |d(?:u|es) )")
    -1>> =suggVerb(@, ":3s")                                                        # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du singulier.
................................................................................
TEST: {{puisse}} les hommes enfin comprendre leurs erreurs.                         ->> puissent
TEST: {{puisses}} notre ennemi trembler de peur devant notre courage.               ->> puisse



!!
!!
!!!! Formes interrogatives ?
!!
!!

__[i]/inte(inte_union_xxxe_je)__
    (?<![jJ]’)({w_2}[éèe]) je  @@0
    <<- morphex(\1, ":V.*:1[sŝś]", ":[GNW]") and not before(r"(?i)\bje +$") and morphex(word(1), ":", ":(?:Oo|X|1s)", True)
    ->> =\1[:-1]+"é-je"                                                                             # Forme interrogative ? Mettez un trait d’union.
................................................................................
    -1>> =suggSimil(\1, ":3p", False)                                                               # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du pluriel.

TEST: {{attaquant}}-ils                                     ->> attaquent
TEST: {{prendrons}}-elles un verre avec moi ?



!!!! Verbe auxiliaire

__[i]/conf(conf_avoir_sujet_participe_passé)__
    ({avoir})-(?:je|tu|ils?|elles?|on) +({ppas})  @@0,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
__[i]/conf(conf_sujet_avoir_participe_passé)__
    (?:j’|je |tu |ils? |elles? |on ) *({avoir}) +({ppas})  @@*,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
................................................................................
TEST: Avais-je partie liée avec lui ?
TEST: il {{avait}} parti.



!!
!!
!!!! Modes verbaux
!!
!!

# conditionnel / futur

__[i]/vmode(vmode_j_aimerais_vinfi)__
    j(?:e +|’)(aimerai|préf[éè]rerai|apprécierai|voudrai|souhaiterai|désirerai|adorerai) +({w_1})  @@w,$
................................................................................
!!
!!
!!
!!
!!
!!
!!
!! TESTS: Faux positifs potentiels
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!
!!
!!
!!
!!

!!! À trier
TEST: L’homme sur le bateau de Patrick {{viens}} de temps en temps {{mangé}} chez moi.
TEST: Ces marchands {{passe}} leur temps à se quereller.
TEST: Ils jugeront en toute impartialité de ce cas {{délirante}}.
TEST: Ils sont de manière si étonnante et si admirable {{arrivé}} à ce résultat…
TEST: Les tests grand public de Jean-Paul {{montre}} des résultats surprenants.
TEST: Ils ont à plusieurs reprises {{perdus}} leur sang-froid.
TEST: Ces attaques à main armée {{donne}} la chair de poule.
................................................................................
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.
TODO: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.
TODO: Les côtes sont dans leur ensemble extrêmement découpées.


!!! Indécidable
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests
TEST: Ça a l’air de t’aller.
TEST: Et je m’en sors.
TEST: C’est à chacun d’entre nous de suivre le modèle d’Amos.
TEST: C’est toi qui voulais y aller.
TEST: je ne suis qu’une joueuse en robe de soirée.
TEST: Tu ne fais qu’aggraver les choses.
TEST: Que veut-il ? Vous parler du boulot.
................................................................................
TEST: Enfin, les thèmes de la nouvelle réforme ont été longuement débattus.
TEST: Le moral des ménages au plus haut depuis 2007
TEST: Ce qu’ils nous ont fait
TEST: Comment vous expliquez ça ?
TEST: Comment vous expliquer ça ?


!!! Tests historiques

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.

## Version 0.5.11
TEST: Un moteur à cylindrée fixe

................................................................................
TEST: Je soussigné Pierre Dupont déclare avoir pris connaissance des conditions de ce contrat.
TEST: J’ai mille cent timbres.
TEST: À qui mieux mieux, à qui mieux mieux
TEST: L’est est loin, la gare de l’est aussi.



!!! Tests repris de LanguageTool
## NOTE : ces textes contiennent parfois des erreurs (corrigées quand repérées par le correcteur)

TEST: Au voisinage du zéro absolu de température.
TEST: La couronne périphérique alterne falaises abruptes et plages.
TEST: Henri VIII rencontre François Iᵉʳ.
TEST: à ce jour.
TEST: avoir un bel avenir
................................................................................
TEST: Le 29 février 2008.
TEST: Le 29 février 2012.
TEST: Le 29 février 2016.
TEST: Le 29 février 2020.
TEST: Le 29-février-2004


!!! Le Horla, de Guy de Maupassant
# Nouvelle intégrale (228 lignes)
# Certains points diffèrent du texte original tiré de Wikisource :
# — les paragraphes sont souvent scindés pour des raisons pratiques.
# — les virgules avant les points de suspension ont été supprimées
# — moyen âge -> Moyen Âge
TEST: Le Horla — Guy de Maupassant
TODO: 8 mai. — Quelle journée admirable ! J’ai passé toute la matinée {{étendu}} sur l’herbe, devant ma maison, sous l’énorme platane qui la couvre, l’abrite et l’ombrage tout entière.
................................................................................
TEST: Pourquoi ce corps transparent, ce corps inconnaissable, ce corps d’Esprit, s’il devait craindre, lui aussi, les maux, les blessures, les infirmités, la destruction prématurée ?
TEST: La destruction prématurée ? toute l’épouvante humaine vient d’elle !
TEST: Après l’homme le Horla. — Après celui qui peut mourir tous les jours, à toutes les heures, à toutes les minutes, par tous les accidents, est venu celui qui ne doit mourir qu’à son jour, à son heure, à sa minute, parce qu’il a touché la limite de son existence !
TEST: Non… non… sans aucun doute, sans aucun doute… il n’est pas mort… Alors… alors… il va donc falloir que je me tue, moi !…
# FIN DU HORLA


!!! Double assassinat dans la rue morgue, d’Edgar Poe
# Texte tiré de Wikisource
# Les paragraphes ont été découpés pour réduire la longueur des tests.
TEST: DOUBLE ASSASSINAT DANS LA RUE MORGUE — Edgar Poe
TEST: Quelle chanson chantaient les sirènes ? quel nom Achille avait-il pris, quand il se cachait parmi les femmes ? – Questions embarrassantes, il est vrai, mais qui ne sont pas situées au-delà de toute conjecture.
TEST: Sir Thomas Browne.
TODO: Les facultés de l’esprit qu’on définit par le terme {{analytiques}} sont en elles-mêmes fort peu susceptibles d’analyse.
TEST: Nous ne les apprécions que par leurs résultats. Ce que nous en savons, entre autres choses, c’est qu’elles sont pour celui qui les possède à un degré extraordinaire une source de jouissances des plus vives.
................................................................................
TEST: Néanmoins, qu’il n’ait pas pu débrouiller ce mystère, il n’y a nullement lieu de s’en étonner, et cela est moins singulier qu’il ne le croit ; car, en vérité, notre ami le préfet est un peu trop fin pour être profond. Sa science n’a pas de base.
TEST: Elle est tout en tête et n’a pas de corps, comme les portraits de la déesse Laverna, – ou, si vous aimez mieux, tout en tête et en épaules, comme une morue.
TEST: Mais, après tout, c’est un brave homme. Je l’adore particulièrement pour un merveilleux genre de cant auquel il doit sa réputation de génie.
TEST: Je veux parler de sa manie de nier ce qui est, et d’expliquer ce qui n’est pas[2].
# FIN DU DOUBLE ASSASSINAT DANS LA RUE MORGUE


!!! Vers Dorés, de Pythagore
# Origine?
TEST: Aux dieux, suivant les lois, rends de justes hommages ;
TEST: Respecte le serment, les héros et les sages ;
TEST: Honore tes parents, tes rois, tes bienfaiteurs ;
TEST: Choisi parmi tes amis les hommes les meilleurs.
TEST: Sois obligeant et doux, sois facile en affaires.
TEST: Ne hais pas ton ami pour des fautes légères ;
................................................................................
TEST: XXX. Mais abstiens-toi des aliments que je t’ai défendus. Apprends à discerner ce qui est nécessaire dans la purification et la délivrance de l’âme. Examine tout ; donne à ta raison la première place et, content de te laisser conduire, abandonne-lui les rênes.
TEST: XXXI. Ainsi, quand tu auras quitté les dépouilles mortelles, tu monteras dans l’air libre ; tu deviendras un dieu immortel et la mort n’aura plus d’empire sur toi.
TEST: Fin des vers dorés de Pythagore
TEST: Note : Chez les Pythagoriciens, la monade ou l’unité représente Dieu-même, parce qu’elle n’est engendrée par aucun nombre, qu’elle les engendre tous, qu’elle est simple et sans aucune composition. La dyade, ou le nombre deux, est l’image de la nature créée, parce qu’elle est le premier produit de l’unité, parce qu’elle est inspirée, parce qu’ayant des parties elle peut se décomposer et se défendre. La monade et la dyade réunies forment le ternaire, et représentent l’immensité de tout ce qui existe, l’être immuable et la matière altérable et changeante. J’ignore par quelle propriété le quaternaire, le nombre quatre, est encore un emblème de la divinité.
# FIN DES VERS DORÉS DE PYTHAGORE


!!! Épître du feu philosophique, de Jean Pontanus
# Les paragraphes ont été découpés et ne correspondent pas à ceux du texte.
TEST: Épître du Feu Philosophique
TEST: Lettre concernant la pierre dite philosophale
TEST: Jean Pontanus
TEST: in Theatrum Chimicum, 1614, t. III
TEST: « Nous affirmons, au contraire, — et l’on peut avoir foi en notre sincérité, — qu’il sera impossible d’obtenir le moindre succès dans l’Œuvre si l’on a pas une connaissance parfaite de ce qu’est le Vase des Philosophes ni de quelle manière il faut le fabriquer. Pontanus avoue qu’avant de connaître ce vaisseau secret il avait recommencé, sans succès, plus de deux cents fois le même travail, quoiqu’il besognât sur les matières propres et convenables, et selon la méthode régulière. L’artiste doit faire lui-même son vaisseau ; c’est une maxime de l’art. N’entreprenez rien, en conséquence, tant que vous n’aurez pas reçu toute la lumière sur cette coquille de l’œuf qualifiée secretum secretorum chez les maîtres du Moyen Âge. »
TEST: — Fulcanelli, Le Mystère des Cathédrales, p. 204-205
................................................................................
TEST: Et moyennant notre feu, la médecine se multipliera si elle est conjointe à la matière crue, non seulement en quantité mais aussi en vertu.
TEST: Recherche donc de toutes les forces de ton esprit ce feu, et tu parviendras au but que tu t’es proposé ; car c’est lui qui fait tout l’œuvre, et il est la clef de tous les Philosophes, laquelle ils n’ont jamais révélée dans leurs livres.
TEST: Si tu penses bien profondément aux propriétés du feu ci-dessus, tu la connaîtras, mais non autrement.
TEST: Donc, touché d’un mouvement de pitié, j’ai écrit ceci ; mais, et afin que je me satisfasse, le feu n’est point transmué avec la matière, comme je l’ai dit ci-dessus.
TEST: J’ai bien voulu le dire et en avertir les prudents de ces choses, pour qu’ils ne dépensent pas inutilement leur argent, mais qu’ils sachent auparavant ce qu’ils doivent chercher, et, par ce moyen, parviendront à la vérité de l’Art ; non pas autrement. À Dieu.
# FIN DE L’ÉPÎTRE DU FEU PHILOSOPHIQUE

!!! Le Misanthrope, de Molière
TEST: LE MISANTHROPE (1666)
TEST: de Molière
TEST: Texte établi par Charles Louandre, Charpentier, 1910 (2, pp. 170-239).
TEST: PERSONNAGES
TEST: Alceste, amant de Célimène,
TEST: Philinte, ami d’Alceste,
TEST: Oronte, amant de Célimène,







|







 







|







 







|

























|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|











|







 







|










|







 







|







 







|







 







|







 







|









|







 







|












|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|













|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|













|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







 







|



|







 







|







 







|







 







|







 







|







 







|







 







|







 







|







45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
...
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
...
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
...
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
...
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
...
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
...
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
...
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
...
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
...
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
...
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
...
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
...
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
...
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
...
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
....
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
....
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
....
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
....
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
....
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
....
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
....
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
....
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
....
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
....
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
....
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
....
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
....
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
....
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
....
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
....
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
....
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
....
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
....
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
....
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
....
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
....
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
....
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
....
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
....
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
....
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
....
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
....
5898
5899
5900
5901
5902
5903
5904
5905
5906
5907
5908
5909
5910
5911
5912
....
5915
5916
5917
5918
5919
5920
5921
5922
5923
5924
5925
5926
5927
5928
5929
....
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506
6507
6508
6509
....
7012
7013
7014
7015
7016
7017
7018
7019
7020
7021
7022
7023
7024
7025
7026
....
7066
7067
7068
7069
7070
7071
7072
7073
7074
7075
7076
7077
7078
7079
7080
....
7128
7129
7130
7131
7132
7133
7134
7135
7136
7137
7138
7139
7140
7141
7142
....
7526
7527
7528
7529
7530
7531
7532
7533
7534
7535
7536
7537
7538
7539
7540
....
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
....
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
....
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
....
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
....
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
....
9456
9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470
....
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
....
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
....
9589
9590
9591
9592
9593
9594
9595
9596
9597
9598
9599
9600
9601
9602
9603
....
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
....
9744
9745
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
....
9837
9838
9839
9840
9841
9842
9843
9844
9845
9846
9847
9848
9849
9850
9851
....
9870
9871
9872
9873
9874
9875
9876
9877
9878
9879
9880
9881
9882
9883
9884
.....
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061
10062
10063
10064
.....
10162
10163
10164
10165
10166
10167
10168
10169
10170
10171
10172
10173
10174
10175
10176
10177
10178
10179
10180
10181
10182
10183
10184
10185
10186
10187
10188
10189
10190
.....
10217
10218
10219
10220
10221
10222
10223
10224
10225
10226
10227
10228
10229
10230
10231
.....
10277
10278
10279
10280
10281
10282
10283
10284
10285
10286
10287
10288
10289
10290
10291
.....
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
.....
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
.....
10644
10645
10646
10647
10648
10649
10650
10651
10652
10653
10654
10655
10656
10657
10658
.....
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
.....
10761
10762
10763
10764
10765
10766
10767
10768
10769
10770
10771
10772
10773
10774
10775
.....
10845
10846
10847
10848
10849
10850
10851
10852
10853
10854
10855
10856
10857
10858
10859
10860
10861
10862
10863
10864
10865
10866
10867
10868
10869
10870
10871
10872
10873
.....
10904
10905
10906
10907
10908
10909
10910
10911
10912
10913
10914
10915
10916
10917
10918
.....
11036
11037
11038
11039
11040
11041
11042
11043
11044
11045
11046
11047
11048
11049
11050
.....
11157
11158
11159
11160
11161
11162
11163
11164
11165
11166
11167
11168
11169
11170
11171
.....
11305
11306
11307
11308
11309
11310
11311
11312
11313
11314
11315
11316
11317
11318
11319
.....
11381
11382
11383
11384
11385
11386
11387
11388
11389
11390
11391
11392
11393
11394
11395
.....
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496
11497
11498
11499
.....
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
.....
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
.....
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
.....
12323
12324
12325
12326
12327
12328
12329
12330
12331
12332
12333
12334
12335
12336
12337
.....
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
.....
12506
12507
12508
12509
12510
12511
12512
12513
12514
12515
12516
12517
12518
12519
12520
.....
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
12542
12543
.....
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
12579
12580
12581
12582
12583
12584
12585
12586
.....
12637
12638
12639
12640
12641
12642
12643
12644
12645
12646
12647
12648
12649
12650
12651
.....
13413
13414
13415
13416
13417
13418
13419
13420
13421
13422
13423
13424
13425
13426
13427
.....
15478
15479
15480
15481
15482
15483
15484
15485
15486
15487
15488
15489
15490
15491
15492
.....
15850
15851
15852
15853
15854
15855
15856
15857
15858
15859
15860
15861
15862
15863
15864
.....
16394
16395
16396
16397
16398
16399
16400
16401
16402
16403
16404
16405
16406
16407
16408
.....
16494
16495
16496
16497
16498
16499
16500
16501
16502
16503
16504
16505
16506
16507
16508
.....
16540
16541
16542
16543
16544
16545
16546
16547
16548
16549
16550
16551
16552
16553
16554

# ERREURS COURANTES
# http://fr.wikipedia.org/wiki/Wikip%C3%A9dia:Fautes_d%27orthographe/Courantes


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

OPTGROUP/basic: typo apos, esp tab, nbsp unit, tu maj, num virg, nf chim, ocr mapos, liga
OPTGROUP/gramm: conf sgpl gn
OPTGROUP/verbs: infi conj ppas, imp inte vmode
OPTGROUP/style: bs pleo, redon1 redon2, neg
................................................................................
OPTLABEL/debug:     Debug
OPTLABEL/idrule:    Display control rule identifier [!]|Display control rule identifier in the context menu message.



!!
!!
!! Définitions pour les regex                                                                     !!
!!
!!

DEF: avoir          [aeo]\w*
DEF: etre           [êeésf]\w+
DEF: avoir_etre     [aeêésfo]\w*
DEF: aller          (?:ai?ll|v[ao]|ir[aio])\w*
................................................................................
!!
!!
!!
!!
!!
!!
!!
!! PASSE 0: PARAGRAPHE PAR PARAGRAPHE                                                             !!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!
!!



!!
!!
!!! Espaces & tabulations                                                                         !!
!!
!!

# Espaces surnuméraires
# Note : les tabulations ne sont pas soulignées dans LibreOffice. Mais l’erreur est bien présente.
__<s>/tab(tab_début_ligne)__           ^[      ]+ <<- ->> ""                   # Espace(s) en début de ligne à supprimer : utilisez les retraits de paragraphe.
__<s>/tab(tab_fin_ligne)__             [       ]+$ <<- ->> ""                  # Espace(s) en fin de ligne à supprimer.
................................................................................
# À partir d’ici, toute règle est susceptible de supprimer des caractères et les remplacer par des espaces ou des chaînes de longueur égale.
#
#


!!!
!!!
!!! Processeur: efface les ponctuations gênantes (URL, sigles, abréviations, IP, heures, etc.)    !!
!!!
!!!

# e-mail
__<i>(p_email)__
    \w[\w.-]*@\w[\w.-]*\w[.]\w+ <<- ~>> *

................................................................................
TEST: Dossier C:\Program Files (x86)\LibreOffice
TEST: [1] Dossier à revoir.



!!!
!!!
!!! Processeur: balises HTML et LaTeX                                                             !!
!!!
!!!

# HTML
__<i>/html(p_html_amp_xxx)__            &amp;[a-zA-Z]+; <<- ~>> _
__<i>/html(p_html_lt)__                 &lt; <<- ~>> "   <"
__<i>/html(p_html_gt)__                 &gt; <<- ~>> >
................................................................................
TEST: __html__  des <b>{{homme}}</b>
TEST: __html__  des [b]{{femme}}[/b]



!!
!!
!!!! Écritures épicènes dystypographiques                                                         !!
!!
!!

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

__[i](typo_écriture_épicène_tous_toutes)__
................................................................................

TEST: je suis {{déconsidéré.e}} par ma hiérarchie.
TEST: il faut en parler à l’{{auteur(e)}} et à son agent.


!!
!!
!!!! 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)
................................................................................
    <<- after("\w\w[.] +\w+") -1>> =\1.capitalize()                                                 # Majuscule en début de phrase, sauf éventuellement lors d’une énumération.

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


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

# 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|ils?|nous|vous|elles?|on|les?|l[a’]|ces?|des?|cette|[mts](?:on|a|es))\b)  @@0,$
................................................................................
#__<i>/typo__  ({w_2}) *$   @@0
#    <<- before("[a-zéàùèê][.] ") and not before(r"^(?:\d|\w[.])")
#    -1>> \1.|\1…|\1 !|\1 ?|\1 :|\1 ;|\1,                                               # Il manque une ponctuation finale.


!!
!!
!!!! Espaces manquants                                                                            !!
!!
!!

__<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.
................................................................................
TEST: espace.{{Manquant}}                                                   ->> " Manquant"
TEST: qui ont refuse.{{de}} se sauver                                       ->> " de"
TEST: pic.twitter.com/PICNAME


!!
!!
!!!! Points                                                                                       !!
!!
!!

# Points superflus
__[i>/typo(typo_et_cetera)__             etc(?:[.]{3,5}|…) <<- ->> etc.                             # Un seul point après « etc. »

TEST: {{etc…}}
................................................................................
TEST: Ligne de points{{...........................}}
TEST: Aujourd’hui, M. Camus va nous lire son texte.



!!
!!
!!!! Tirets                                                                                       !!
!!
!!

# Tirets, énumérations et dialogues
__<s>/typo(typo_tiret_début_ligne)__    ^[-_][  ] <<- ->> "— |– "           # Dialogues et énumérations : un tiret cadratin ou demi-cadratin, suivi d’un espace insécable, est requis.
__<s>/typo(typo_tiret_dans_dialogue)__  ^ *«[  ](-[  ]) @@$ <<- -1>> "— |– "
    # Dialogues : un tiret cadratin ou demi-cadratin, suivi d’un espace insécable, est requis. (Attention : à moins qu’il s’agisse d’un dialogue inclus dans un autre dialogue, cette manière d’écrire est erronée.)
................................................................................
TEST: {{—}}Viens là.                                                        ->> "— |– "
TEST: Cette phrase contient{{ - }}c’est certain – des tirets d’incise.      ->> " – | — "
TEST: « {{- }}Viens ! On va en finir avec cette affaire, sale fils de pute. ->> "— |– "


!!
!!
!!!! Ponctuations redondantes                                                                     !!
!!
!!

# virgules et points
__<s>/typo(typo_virgules_points)__
    ,[.,]{2,}
    <<- ->> =\0.replace(",", ".").replace("...", "…")                                               # Erreur de numérisation ? Virgules au lieu de points ?
................................................................................
TEST: Succession : a{{;}} b.                                                ->> " ;"
TEST: C’est assez {{: }}parlez !                                            ->> ": "
TEST: {{» }}C’est ce qu’on croit savoir.                                    ->> "» |« "


!!
!!
!!!! Signes typographiques                                                                        !!
!!
!!

__<s>/typo(typo_signe_multiplication)__
    (\d+) ?[x*] ?(\d+)  @@0,$ <<- not \0.startswith("0x") ->> \1 × \2                               # Signe de multiplication typographique.

TEST: {{800 x 600}}                                                         ->> 800 × 600
................................................................................

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


!!
!!
!!!! Apostrophes                                                                                  !!
!!
!!
## Apostrophe typographique
__[i>/apos(apostrophe_typographique)__
    ([ldsncjmç]|jusqu|lorsqu|aujourd|presqu|quelqu|puisqu|qu|prud|entr)['´‘′`](?=[\w"«]) @@0 <<- ->> \1’    # Apostrophe typographique.
__[i>/apos(apostrophe_typographique_après_t)__
    t['´‘′`](?!ils?|elles?|on)(?=[\w"«]) <<- ->> t’                                                         # Apostrophe typographique.
................................................................................
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(r"[a-zA-Zéïîùàâäôö]$") ->> « |“                                                  # Guillemets typographiques ouvrants.
__<s>/typo(typo_guillemets_typographiques_doubles_fermants)__
................................................................................
TEST: Le {{'}}grand’ homme.                                                 ->> “|‘|‹
TEST: Le ‘grand{{'}} homme.                                                 ->> ”|’|›
TEST: J’en ai '''marre''' (syntaxe wiki).


!!
!!
!!!! Élisions                                                                                     !!
!!
!!

__[i]/typo(typo_élision_déterminants)__
    (l[ea] |de )([aâeéêiîoôu]\w+)  @@0,$
    <<- not re.search("(?i)^(?:onz[ei]|énième|iourte|ouistiti|ouate|one-?step|ouf|Ouagadougou|I(?:I|V|X|er|ᵉʳ|ʳᵉ|è?re))", \2) and not \2.isupper() and not morph(\2, ":G", False)
    -1>> =\1[0]+"’"                                         # Élision de l’article devant un mot commençant par une voyelle.|http://fr.wikipedia.org/wiki/Élision
................................................................................
    -1>> cet                                                # Euphonie : « ce » devient « cet » devant un mot commençant par une voyelle.

TEST: {{ce}} animal est dangereux


!!
!!
!!!! 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)
................................................................................
    <<- ->> =\0.replace("2", "₂").replace("3", "₃").replace("4", "₄")                               # Typographie des composés chimiques. [!]

TEST: __chim__ les molécules {{CaCO3}} et {{H2O}}…


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

__<s>/typo(typo_cohérence_guillemets_chevrons_ouvrants)__
    («)[^»“]+?(”)  @@0,$
    <<- not before(r"\w$") -1>> “                                                                   # Guillemet ouvrant différent du guillemet fermant (”).
    <<- not after(r"^\w") -2>> " »"                                                                 # Guillemet fermant différent du guillemet ouvrant («).
................................................................................
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|°C|℃)(?![’'])  @@0,0
    <<- -1>> "\2 "
    # Avec une unité de mesure, mettez un espace insécable.
................................................................................
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


!!
!!
!!!! 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.
................................................................................
    <<- ~>> =\0.replace(" ", "_")

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


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

................................................................................
TEST: le {{32.03.2018}}
TEST: le {{81/01/2012}}
TEST: 12-12-2012


!!
!!
!!!! 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) ", False) 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__ Car parfois il y en a. Mais parfois il n’y en a pas.




!!!
!!!
!!! Processeur: Dernier nettoyage avant coupure du paragraphe en phrases                          !!
!!!
!!!

# Trait d’union conditionnel (u00AD)
__<i>(p_trait_union_conditionnel1)__    \w+‑\w+‑\w+ <<- ~>> =\0.replace("‑", "")
__<i>(p_trait_union_conditionnel2)__    \w+‑\w+ <<- ~>> =\0.replace("‑", "")

................................................................................
!!
!!
!!
!!
!!
!!
!!
!! PASSE 1: PHRASE PAR PHRASE                                                                     !!
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!

[++]



!!!! Doublons (casse identique)                                                                   !!

__[s](doublon)__
    ({w1}) {1,3}\1  @@0
    <<- not re.search("(?i)^([nv]ous|faire|en|la|lui|donnant|œuvre|h[éoa]|hou|olé|joli|Bora|couvent|dément|sapiens|très|vroum|[0-9]+)$", \1)
        and not (re.search("^(?:est|une?)$", \1) and before("[’']$"))
        and not (\1 == "mieux" and before("(?i)qui +$"))
    ->> \1   # Doublon.

TEST: Il y a un {{doublon doublon}}.


!!!! Nombres: typographie                                                                         !!

#(\d\d\d\d)-(\d\d\d\d)   <<- ->> \1–\2                              # Ne pas séparer deux dates par un trait d’union, mais par un tiret demi-cadratin.

__[s]/num(num_lettre_O_zéro1)__  [\dO]+[O][\dO]+ <<- not option("ocr") ->> =\0.replace("O", "0")    # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».
__[s]/num(num_lettre_O_zéro2)__  [1-9]O <<- not option("ocr") ->> =\0.replace("O", "0")             # S’il s’agit d’un nombre, utilisez le chiffre « 0 » plutôt que la lettre « O ».

TEST: année {{2O11}}                                                      ->> 2011
................................................................................
TEST: le {{IInd}} siècle                        ->> IIᵈ
TEST: le {{VIième}} siècle                      ->> VIᵉ
TEST: Le {{XXIème}} siècle.                     ->> XXIᵉ
TEST: le {{XXè}} siècle.                        ->> XXᵉ



!!!! Écritures épicènes invariables                                                               !!

__[i](d_typo_écriture_épicène_pluriel)__
    ({w_1}[éuitsrn])_(?:[nt]|)e_s  @@0
    <<- morphex(\1, ":[NAQ]", ":G") =>> define(\1, [":N:A:Q:e:p"])

__[i](d_typo_écriture_épicène_singulier)__
    ({w_2}[éuitsrn])_e  @@0
    <<- morph(\1, ":[NAQ]", False) =>> define(\1, [":N:A:Q:e:s"])


!!!! Dates                                                                                        !!

__[i]/date(date_jour_mois_année)__
    (\d\d?) (janvier|février|ma(?:rs|i)|a(?:vril|o[ûu]t)|jui(?:n|llet)|septembre|octobre|novembre|décembre) (\d\d\d+)  @@0,w,$
    <<- not checkDateWithString(\1, \2, \3) ->> _                                                   # Cette date est invalide.

TEST: {{29 février 2011}}

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

TEST: le {{30 février}}



!!!
!!!
!!! Processeur: épuration des signes inutiles et quelques simplifications                         !!
!!!
!!!

# fin de phrase
__<s>(p_fin_de_phrase)__        [.?!:;…][ .?!… »”")]*$  <<- ~>> *

# début de phrase
................................................................................


TEST: New York {{étaient}} {{devenue}} la plaque tournante de tous les trafics.


!!
!!
!!!! Traits d’union                                                                               !!
!!
!!

__<i]/tu(tu_t_euphonique_incorrect)__
    ([-–—− ]t(?:[’' ][-–—−]?|[-–—−][’' ]?))(ils?|elles?|on|tu)  @@0,$
    <<- re.search("(?i)^(?:ils|elles|tu)$", \2) -1>> -      # Le “t” euphonique n’est pas nécessaire avec “\2”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?T1=t+euphonique&id=2513
    <<- __else__ and \1 != "-t-" and \1 != "-T-" -1>> -t-   # Pour le “t” euphonique, il faut deux traits d’union. Pas d’apostrophe. Pas d’espace.
................................................................................
    lors que?
    <<- not before(r"(?i)\bd[eè]s +$") ->> =\0.replace(" ", "")                                     # Attachez les deux mots.|https://fr.wiktionary.org/wiki/lorsque

TEST: Elle y arriva {{lors qu}}’elle trouva l’astuce permettant l’ouverture de la porte.
TEST: Dès lors qu’on sait comment s’y prendre, aucune raison de faillir.


!!!! Virgules                                                                                     !!

# Dialogues
__[u]/virg(virgule_dialogue_après_nom_propre)__
    ([A-ZÉÈ][\w-]+) (\w+-(?:moi|toi|l(?:ui|a|e(?:ur|s|))|nous|vous|je|tu|ils|elles))  @@0,$
    <<- morphex(\1, ":M", ":G") and not morph(\2, ":N", False) and isStart()
    -1>> \1,                                                                        # Dialogue ? Ajoutez une virgule pour mettre en incise la personne à qui s’adresse la réplique.

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

TEST: Tu vas les {{donner}} Rachel.
TEST: Il va la {{tuer}} Paul.
TEST: Cependant les promesses n’engagent que ceux qui les croient, comme aimait à le dire Jacques Chirac.



!!!! Apostrophe manquante (2)                                                                     !!

__<s>/typo(typo_apostrophe_manquante_audace2)__
    ^ *([LDSNCJMTÇ] )[aeéiouhAEÉIOUHyîèêôûYÎÈÊÔÛ]  @@*
    <<- option("mapos") -1>> =\1[:-1]+"’"                                                           # Il manque peut-être une apostrophe.

TEST: __mapos__ {{L }}opinion des gens, elle s’en moquait.



!!!! A / À: accentuation la préposition en début de phrase                                        !!

__<s]/typo(typo_À_début_phrase1)__
    ^ *(A) (?!t[’-](?:ils?|elles?|on))({w_2})  @@*,$
    <<- morphex(\2, ":[GNAY]", ":(?:Q|3s)|>(?:priori|post[eé]riori|contrario|capella|fortiori) ")
        or (\2 == "bientôt" and isEnd())
    -1>> À                                                                                          # S’il s’agit de la préposition « à », il faut accentuer la majuscule.
__<s>/typo(typo_À_début_phrase2)__
................................................................................
TEST: — {{A}} t’emmener loin de tout ceci.
TEST: {{A}} bientôt, mon ami.
TEST: A bientôt fini son devoir.
TEST: A priori, nul ne peut y parvenir sans une aide extérieure.
TEST: A devient notre meilleure chance d’y parvenir.


!!!! Accentuation des majuscules                                                                  !!

__[u]/maj(maj_accents)__
    E(?:tat|glise|co(?:le|nomie)|quipe|lectri(?:cité|que)|gal(?:ité|ement)|té)s? @@1
    <<- ->> ="É"+\0[1:]                                                                            # Accentuez les majuscules.
    <<- ~>> ="É"+\0[1:]

TEST: Le budget de l’{{Etat}}.



!!!
!!!
!!! Désambiguïsation                                                                              !!
!!!
!!!

# mots grammaticaux
__[i](d_dans)__
    dans
    <<- not morph(word(-1), ":D.*:p|>[a-z]+ièmes ", False, False) =>> select(\0, ":R")
................................................................................
TEST: elle finit par être très fière de son fils.
TEST: en tant que président du conseil



!!
!!
!!!! OCR                                                                                          !!
!!
!!

# ?
__<s]/ocr(ocr_point_interrogation)__
    [  ]7
    <<- after0("^(?: +[A-ZÉÈÂ(]|…|[.][.]+| *$)") ->> " ?"                                           # Erreur de numérisation ?
................................................................................
TEST: __ocr__ trouve {{l£}} temps
TEST: __ocr__ elle s’{{avance*}} sur le seuil
TEST: __ocr__ par beaucoup d’argent ? {{{Il}} débouche le Jack Daniels


!!
!!
!!!! Incohérences de base                                                                         !!
!!
!!

### double négation
__[i](double_négation)__
    pas (personne|aucune?|jamais)  @@4
    <<- not morph(word(-1), ":D:[me]" ,False, False) ->> \1|pas, \1
................................................................................

TEST: je ne sais {{des}} {{ses}} choses.



!!
!!
!!!! Style                                                                                        !!
!!
!!

#__bs__  Mr <<- ->> M.                          # M. est l’usage courant pour “Monsieur”. « Mr » est l’abréviation ancienne, française.

# à / en
__[i]/bs(bs_en_à_ville)__
................................................................................
#Se rappelle de l’amour

#enjoindre à qqn de faire qqch


!!
!!
!!!! Pléonasmes                                                                                   !!
!!
!!

__[i]/pleo(pleo_abolir)__               (abol\w+) (?:absolument|entièrement|compl[èé]tement|totalement) @@0 <<- morph(\1, ">abolir ", False) ->> \1         # Pléonasme.
__[i]/pleo(pleo_acculer)__              (accul\w+) aux? pieds? du mur @@0 <<- morph(\1, ">acculer ", False) ->> \1                                          # Pléonasme.
__[i]/pleo(pleo_achever)__              (ach[eè]v\w+) (?:absolument|entièrement|compl[èé]tement|totalement) @@0 <<- morph(\1, ">achever ", False) ->> \1    # Pléonasme.
__[i]/pleo(pleo_en_cours)__             actuellement en cours <<- not after(r" +de?\b") ->> en cours                                            # Pléonasme.
................................................................................
TEST: {{ta}} aimée                                            ->> ton
TEST: {{ma}} obligée                                          ->> mon
TEST: Ce couple va donner à la France sa très importante collection qui rejoindra le musée d’Orsay


!!
!!
!!!! Confusions                                                                                   !!
!!
!!

__[s>/conf(conf_ne_n)__     [nN]e n’                        <<- ->> ne m’|n’                        # Incohérence. Double négation.
__[s>/conf(conf_pronoms1)__ [mtMT]e ([nmst](?:’|e )) @@$    <<- ->> \1                              # Incohérence.
__[s>/conf(conf_pronoms2)__ [sS]e ([mst](?:’|e )) @@$       <<- ->> \1                              # Incohérence.
__[s>/conf(conf_de_d)__     [dD][eu] d’(?![A-ZÉÂÔÈ])        <<- ->> d’                              # Incohérence.
................................................................................
TEST: car elles pénètrent dans les poumons voire le système sanguin.
TEST: des enfants malades, qui préfèrent souvent voir Dark Vador que des vieux clowns un peu flippants.



!!
!!
!!!! Pronoms + incohérences                                                                       !!
!!
!!
__[i](p_m_enfin)__      m’enfin <<- ~>> *

__[i]/conf(conf_j_y_en_qqch)__
    (j’(?:en +|y +|))({w_1})  @@0,$
    <<- morphex(\2, ":", ":(?:[123][sp]|O[onw])")
................................................................................
TEST: C’que j’comprends, c’est qu’il y a des limites à ce qu’on peut supporter.
TEST: la tentation pour certains médias de ne tout simplement pas rémunérer notre travail si celui-ci n’est finalement pas publié.
TEST: Ne parfois pas être celui qui sabote l’ambiance.


!!
!!
!!!! Formes verbales sans sujet                                                                   !!
!!
!!

## Incohérences avec formes verbales 1sg et 2sg sans sujet
__[i](p_notre_père_qui_es_au_cieux)__   notre père (qui est? aux cieux) @@11 <<- ~1>> *

__[i]/conj(conj_xxxai_sans_sujet)!3__
................................................................................
TEST: Mon épouse et moi-même avons toujours dit
TEST: que vous ou moi ignorions à peu près tout du boson de Higgs n’a pas du tout le même sens



!!
!!
!!!! Locutions invariables                                                                        !!
!!
!!

## plus que prévu / mois que prévu
__[i]/sgpl(sgpl_que_prévu1)__   (plus|moins|autant) +que (prévu(?:es?|s)) @@0,$ <<- -2>> prévu                          # Invariable. Implicitement, \1 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu2)__   (plus|moins|aussi) +({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu                # Invariable. Implicitement, \1 \2 que ce qui était prévu.
__[i]/sgpl(sgpl_que_prévu3)__   (plus|moins|autant) +d(?:e |’)({w_2}) +que (prévu(?:es?|s)) @@0,w,$ <<- -3>> prévu      # Invariable. Implicitement, \1 \2 que ce qui était prévu.
................................................................................
TEST: il y en a moins que {{prévues}}                         ->> prévu
TEST: comme {{convenus}}                                      ->> convenu



!!
!!
!!!! Tout, tous, toute, toutes                                                                    !!
!!
!!

__[i](p_fais_les_tous)__
    fai(?:tes|sons|s)-(?:les|[nv]ous) (tou(?:te|)s) @@$ <<- ~1>> *
__[i](p_tout_débuts_petits)__
    (tout) (?:débuts|petits) @@0 <<- before(r"\b(aux|[ldmtsc]es|[nv]os|leurs) +$") ~1>> *
................................................................................
TEST: aux tout débuts, il y eut bien des erreurs
TEST: comment les inégalités sociales impactent la santé des tout petits



!!
!!
!!!! Adverbes de négation                                                                         !!
!!
!!

__[i]/neg(ne_manquant1)__
    (?:je|tu|ils?|on|elles?) ([bcdfgjklmnpqrstvwxz][\w-]*) (pas|rien|jamais|guère)  @@w,$
    <<- morph(\1, ":[123][sp]", False) and not (re.search("(?i)^(?:jamais|rien)$", \2) and before(r"\b(?:que?|plus|moins) "))
    -1>> ne \1                                                                                      # Ne … \2 : il manque l’adverbe de négation.
................................................................................
TEST: __neg__ On {{en}} a pas.
TEST: __neg__ Il {{y}} a jamais d’eau.



!!
!!
!!!! Infinitif                                                                                    !!
!!
!!

__[i](p_ne_plus_pas_jamais_beaucoup_trop_rien)__
    ne (?:pas|plus|jamais) +(beaucoup|trop|rien)  @@$ <<- ~1>> *

__[i]/infi(infi_ne)__
................................................................................
TEST: Non, ne {{manger}} pas ça.
TEST: Ne {{donner}} jamais à manger ces saloperies au chat.         ->> donnez



!!!
!!!
!!! Processeur: épuration des adverbes, locutions adverbiales, interjections et expressions usuelles  !!
!!!
!!!

# Dates
__[s](p_date)__
    (?:[dD]epuis le|[lL]e|[dD]u|[aA]u|[jJ]usqu au|[àÀ] compter du) (?:1(?:er|ᵉʳ)|\d\d?) (?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)(?: \d+| dernier| prochain|) <<- ~>> *
__[i](p_en_l_an_de_grâce_année)__
................................................................................


#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#


!!!! Redondances dans la phrase                                                                   !!

__[i]/redon2(redondances_phrase)__
    ({w_4})[ ,].* (\1)  @@0,$
    <<- not morph(\1, ":(?:G|V0)|>même ", False) -2>> _             # Dans cette phrase, répétition de « \1 » (à gauche).
    <<- __also__ -1>> _                                             # Dans cette phrase, répétition de « \1 » (à droite).

TEST: __redon2__ Quelle {{imposture}}, c’est d’un ennui, c’est une {{imposture}}.
................................................................................
TEST: __redon2__ De loin en loin, elle passe.
TEST: __redon2__ Les mêmes causes produisent/produisant les mêmes effets. (répétition)



!!
!!
!!!! Groupe nominal (1)                                                                           !!
!!
!!

#### 1 mot

## Usage impropre

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

TEST: ils trouvent ça de plus en plus {{idiots}}              ->> idiot



!!
!!
!!!! Groupe nominal (2)                                                                           !!
!!
!!

## Sans article

__[i]/gn(gn_2m_accord)__
    ^ *({w_2}) +({w_2})  @@*,$
................................................................................
TEST: Les couleurs rouge, jaune et verte ne doivent pas être utilisées
TEST: des passeports américain, canadien, néerlandais, allemand et britannique.



!!
!!
!!!! Groupe nominal (3)                                                                           !!
!!
!!

## nombre

__[i]/gn(gn_3m)__
    ^ *({w_2}) +({w_2}) +({w_3})  @@*,w,$
................................................................................

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



!!
!!
!!!! Groupe nominal: Accords avec de / des / du                                                   !!
!!
!!

__[i]/gn(gn_devinette1)__
    (?:[lmts]a|une|cette) +{w_2} +d(?:e (?:[lmts]a|cette)|’une) +(?!des )({w_2}) +({w_2})  @@w,$
    <<- morphex(\2, ":[NAQ].*:(?:m|f:p)", ":(?:G|P|[fe]:[is]|V0|3[sp])") and not apposition(\1, \2)
    -2>> =suggFemSing(@, True)                                                              # Accord erroné : « \2 » devrait être au féminin singulier.
................................................................................

TEST: {{de telles sorte}}



!!
!!
!!!! Singuliers & Pluriels                                                                        !!
!!
!!

#### Prépositions

# Similaires à prépositions : http://www.synapse-fr.com/manuels/PP_ATTENDU.htm
# attendu, compris, non-compris, y compris, entendu, excepté, ôté, ouï, passé, supposé, vu
................................................................................
TEST: Son point de {{vus}} prévaudra toujours, faites-vous à cette idée ou dégagez.
TEST: de mon point de {{vues}}



!!
!!
!!!! Confusions                                                                                   !!
!!
!!

# à / a
__[i]/conf(conf_suite_à)__
    suite (a) ({w1}) @@w,$
    <<- morph(\2, ":D|>[ld] ", False) and isStart() -1>> à          # Confusion : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.
................................................................................


# nouveau / nouvel
# TODO



!!!! Mots composés                                                                                !!

__[i]/mc(mc_mot_composé)__
    ({w2})-({w2})  @@0,$
    <<- not \1.isdigit() and not \2.isdigit()
        and not morph(\0, ":", False) and not morph(\2, ":G", False) and spell(\1+\2)
    ->> \1\2                                                                                        # Vous pouvez ôter le trait d’union.
    <<- \2 != "là" and not re.search("(?i)^(?:ex|mi|quasi|semi|non|demi|pro|anti|multi|pseudo|proto|extra)$", \1)
................................................................................

TEST: __mc__ des {{portes-avions}}.



!!
!!
!!!! Casse: majuscules et minuscules                                                              !!
!!
!!

# Les jours
__[s]/maj(maj_jours_semaine)__
    (?:Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche)
    <<- before(r"[\w,] +$") ->> =\0.lower()
................................................................................
!!
!!
!!
!!
!!
!!
!!
!!! Conjugaisons                                                                                  !!
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!
!!


!!
!!
!!!! Infinitif                                                                                    !!
!!
!!

__[i]/infi(infi_à_en)__
    à en ({w_2}) @@5
    <<- morphex(\1, ":V", ":Y") -1>> =suggVerbInfi(@)                                               # Le verbe devrait être à l’infinitif.

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

TEST: nous {{épuisants}} à la tâche pour des clopinettes, nous défaillîmes.



!!!
!!!
!!! Processeur: simplification des substantifs                                                    !!
!!!
!!!

### @ : we remove @ we introduced after le/la/les in some cases
__<s>(p_arobase)__      @ <<- ~>> *

### Avant les verbes (ôter seulement les COI!)
................................................................................
TEST: Je me doute bien que vous avez trouvé la réponse.
TEST: Nous nous doutons bien qu’il y a une entourloupe derrière cette affaire.
TEST: Notre but n’était pas de devenir célèbres.
TEST: sans qu’on ait à le lui ordonner



!!!! OCR                                                                                          !!

# Participes passés
__[i]/ocr(ocr_être_participes_passés)__
    ({etre}) +({w_2}es?) @@0,$
    <<- morph(\1, ":V0e", False) >>>
    <<- \2.endswith("e") and morphex(\2, ":V1.*:Ip.*:[13]s", ":(?:[GM]|A)") and not before(r"(?i)\belle +(?:ne +|n’|)$")
    -2>> =suggVerbPpas(\2, ":m:s")                                                                  # Erreur de numérisation ?
................................................................................
TEST: __ocr__ elle avait envie de s’en sortir enfin.
TEST: __ocr__ la longueur de la circonférence étant égale à…
# TEST: __ocr__ vous êtes {{presses}} de monter à bord de ce train-ci.
# Fonctionne avec nous serons, mais pas nous sommes (bug de JavaScript?)



!!!! Confusions                                                                                   !!

## guerre / guère
__[i]/conf(conf_ne_pronom_pronom_verbe_guère)__
    ne (?:[mts]e|la|les?|[nv]ous|lui|leur) (?:la |les? |lui |leur |l’|)\w{w_2} (?:plus |)(guerre)  @@$
    <<- -1>> guère                                                                                  # Confusion. La guerre est conflit. Pour l’adverbe signifiant “peu”, écrivez :

TEST: tout ceci ne me rapporte {{guerre}}
................................................................................
    ({aller}) +de (soi[tes])  @@0,$
    <<- morph(\1, ">aller", False) and not after(" soit ") -2>> soi                                 # Confusion.|https://fr.wiktionary.org/wiki/aller_de_soi

TEST: cela ne va pas de {{soit}}.



!!!! Adverbes après verbe                                                                         !!

# fort
__[i]/sgpl(sgpl_verbe_fort)__
    ({w_2}) +(forts)  @@0,$
    <<- morphex(\1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre) .*:(?:[123]p|P|Q)|>(?:affirmer|trouver|croire|désirer|estime|préférer|penser|imaginer|voir|vouloir|aimer|adorer|souhaiter) ")
        and not morph(word(1), ":A.*:[me]:[pi]", False)
    -2>> fort                                               # Confusion probable. S’il s’agit ici de l’adverbe “fort” (équivalent de “fortement”), écrivez-le au singulier.
................................................................................
TEST: Il a de grands biens.
TEST: Ce sont des biens de peu de valeur.



!!
!!
!!!! Infinitif                                                                                    !!
!!
!!

__[i]/infi(infi_d_en_y)__
    d’(?:en|y) +({w_2})  @@$
    <<- morphex(\1, ":V", ":Y") -1>> =suggVerbInfi(@)                                               # Le verbe devrait être à l’infinitif.

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

TEST: lui {{mangée}} beaucoup.



!!
!!
!!!! Usage pronominal avec “avoir” au lieu d’“être”                                               !!
!!
!!

__[i]/conj(conj_se_conf_être_avoir)__
    (s’)(?:en +|y+ |)({avoir})  @@0,$
    <<- morph(\2, ">avoir ", False) >>>
    <<- morph(\2, ":3p", False) -2>> sont|étaient|seront|seraient                                   # Confusion. Sous sa forme pronominale, un verbe s’emploie avec l’auxilaire “être”, non “avoir”.
................................................................................
TEST: {{nous}} nous {{avons}} donné le temps
TEST: {{vous}} vous {{avez}} perdu toute notion de décence.



!!
!!
!!!! Participes passés: se +être +verbe                                                           !!
!!
!!

__[i]/ppas(ppas_je_me_être_verbe)__
    je +(?:ne +|)m(?:e +|’(?:y +|))(?:s[uo]i[st]|étai[st]|fu(?:sses?|s|t)|serai[st]?) +({w_3}) @@$
    <<- morphex(\1, ":Q.*:p", ":(?:G|Q.*:[si])") and ( morph(\1, ":V[123]_.__p_e_") or (isRealEnd() and not before(r"\b[qQ]ue? +$")) )
    -1>> =suggVerbPpas(\1, ":m:s")                                                                  # Si ce participe passé se rapporte bien à “je”, il devrait être au singulier.
................................................................................
TEST: des soins que je m’étais donnés.
TEST: Si t’es pas contente, t’achètes pas.



!!
!!
!!!! Participes passés: se +laisser +adjectif                                                     !!
!!
!!

__[i]/ppas(ppas_me_te_laisser_adj)__
    ([mt]e|l[ae]) +(laiss\w*) +({w_3})  @@0,w,$
    <<- morph(\2, ">laisser ", False) and  morphex(\3, ":[AQ].*:p", ":(?:[YG]|[AQ].*:[is])")
    -3>> =suggSing(@)                                                                               # Accord avec « \1 » : « \3 » devrait être au singulier.
................................................................................
TEST: tu nous laisses indifférentes.
TEST: ils nous laisseront étourdis.
TEST: nous laisserons étourdi cet homme.


!!
!!
!!!! Participes passés: être, avoir été, sembler (+être via pp), devenir, rester, (re)devenir, paraître + participe passé / adj   !!
!!
!!

__[i]/ppas(ppas_je_verbe)__
    j(?:e +|’(?:y +|en +|))(?:ne +|n’|)((?:s[oue]|étai|fus|dev|re(?:dev|st)|par)\w*|a(?:ie?|vais|urais?) +été|eus(?:se|) +été) +({w_2})  @@w,$
    <<- (morph(\1, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \1.endswith(" été")) and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.
................................................................................
TEST: Leur passe-temps, ça a été faire n’importe quoi.
TEST: Ne pas ressortir le livre le plus remarqué de la collaboration aurait été faire acte de censure.
TEST: Partir aurait été assurer sa survie.


!!
!!
!!!! Participes passés: pouvoir/sembler/paraître/vouloir/devoir/croire/déclarer/penser/dire/affirmer + être/avoir été  !!
!!
!!

__[i](p_risque_d_être)__
    risqu\w+ +(d’)être @@* <<- ~1>> *

__[i]/ppas(ppas_je_verbe_être)__
................................................................................
TEST: elles doivent être {{fâché}}
TEST: elles doivent avoir été {{attaqué}}
TEST: elles peuvent avoir été {{trompé}}
TEST: elles souhaitent être plus {{considérée}}



!!!! Participes passés: accord en nombre avec la conjugaison de « être »                          !!

## Contrôle de l’
__[i]/ppas(ppas_être_accord_singulier)__
    ({w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|était|f[uû]t|sera(?:it|)|a(?:vait|ura|urait|it|) +été|e[uû]t +été) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:p", ":[GMWYsi]") and not morph(\1, ":G", False)
    -2>> =suggSing(@)                                                        # Accord avec « être » : « \2 » devrait être au singulier.

__[i]/ppas(ppas_être_accord_pluriel)__
    ({w_2}) +(?:qui +|)(?:ne +|n’|)(?:sont|étaient|fu(?:r|ss)ent|ser(?:ont|aient)|soient|ont +été|a(?:vaient|uront|uraient|ient) +été|eu(?:r|ss)ent +été) +({w_2})  @@0,$
    <<- not re.search("(?i)^légion$", \2) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]") and not morph(\1, ":G", False)
    -2>> =suggPlur(@)                                                        # Accord avec « être » : « \2 » devrait être au pluriel.


!!!! Participes passés: accord en genre avec le substantif précédent                              !!

__[i]/ppas(ppas_sujet_être_accord_genre)__
    (?<![dD]’)(une? |les? |la |l’|ce(?:s|t|tte|) |[mts](?:on|a|es) |[nv]os |leurs? ) *({w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3)
        and ((morphex(\3, ":[AQ].*:f", ":[GWme]") and morphex(\2, ":m", ":[Gfe]")) or (morphex(\3, ":[AQ].*:m", ":[GWfe]") and morphex(\2, ":f", ":[Gme]")))
        and not ( morph(\3, ":p", False) and morph(\2, ":s", False) )
        and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
................................................................................
TEST: Martine n’est pas {{marié}}.
TEST: Martine est très {{intelligent}}.
TEST: Martine n’est pas très {{intelligent}}.
TEST: Pierre est {{dominée}} par son adversaire.



!!!! Accords avec l’adjectif précédant le pronom                                                  !!

__[i]/ppas(ppas_adj_accord_je_tu)__
    ^ *({w_2}s),? (je?|tu)  @@*,$
    <<- morphex(\1, ":A.*:p", ":(?:G|E|M1|W|s|i)")
    -1>> =suggSing(@)                                                       # Si cet adjectif se réfère au pronom « \2 », l’adjectif devrait être au singulier (et accordé en genre).

TEST: {{Découragés}}, je suis parti.
................................................................................
TEST: Elles se sont {{rendues}} compte
TEST: La puissance publique s’en est-elle rendu compte ?



!!
!!
!!!! Inversion verbe/sujet                                                                        !!
!!
!!
__[i]/ppas(ppas_inversion_être_je)__
    (?:s[ou]is|étais|fus(?:sé|)|serais?)-je +({w_2})  @@$
    <<- morphex(\1, ":(?:[123][sp]|Y|[NAQ].*:p)", ":[GWsi]")
    -1>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \1 » devrait être au singulier.
__[i]/ppas(ppas_inversion_être_tu)__
................................................................................

TEST: après avoir mis à jour sont {{profile}}.



!!
!!
!!!! Se croire/considérer/montrer/penser/révéler/savoir/sentir/voir/vouloir + participe passé/adj  !!
!!
!!

__[i]/ppas(ppas_je_me_verbe)__
    je +(?:ne +|)me +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@w,$
    <<- morph(\1, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False) and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.
................................................................................
TEST: mais les considérer uniquement ainsi fait perdre la signification politique de leur geste.
TEST: nous considérer ainsi fait le lit de la haine…



!!
!!
!!!! Avoir + participes passés                                                                    !!
!!
!!

#__[i]/conj__  fait(s|e|es) ({w1}) <<- morph(\2, ":V") and not morph(\2, ":Y")
#   ->> fait \1                      # Le participe passé de faire reste au masculin singulier s’il est suivi par un verbe à l’infinitif.

__[i](p_les_avoir_fait_vinfi)__
................................................................................
TEST: c’est vous qui m’avez {{convertit}}.
TEST: parce que t’as envie que je le fasse



!!
!!
!!!! COD précédant que                                                                            !!
!!
!!

__[i]/ppas(ppas_det_plur_COD_que_avoir)__
    ([ldmtsc]es) +({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust]e?)(?! [mts]’)  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
        and not ((re.search("^(?:décidé|essayé|tenté|oublié)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
................................................................................
    <<- __also__ and \1 == "a" and \2.endswith("r") and not before(r"(?i)\b(?:[mtn]’|il +|on +|elle +)$")
    -1>> à                                                                                          # Confusion probable : “a” est une conjugaison du verbe avoir. Pour la préposition, écrivez :

TEST: Avoir {{marcher}} toute la journée m’a épuisée.



!!!! du / dû                                                                                      !!

__[i]/ppas(ppas_avoir_dû_vinfi)__
    ({avoir}) +(due?s?) +(?:[mts]’|)({w_2})  @@0,w,$
    <<- morph(\1, ":V0a", False) and (morph(\3, ":Y") or re.search("^(?:[mtsn]e|[nv]ous|leur|lui)$", \3))
    -2>> dû                                                                                         # Participe passé de devoir : « dû ».

__[i]/ppas(ppas_avoir_pronom_du_vinfi)__
................................................................................
TEST: Ont-ils {{signer}} le contrat ?
TEST: Ai-je déjà {{signez}} le contrat ?
TEST: A-t-il déjà {{signer}} le contrat ?


!!
!!
!!!! Participes passés avec formes interrogatives                                                 !!
!!
!!

__[i]/ppas(ppas_avoir_pronom1)__
    (?<![ltm]’)({avoir})[- ](?:je|tu|ils?|elles?|t-(?:ils?|elles?|on)|on) +({w2})  @@0,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \2 != "prise"
        and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
................................................................................
TEST: se {{considérez}} comme un génie…
TEST: se {{rencontrerons}} demain grands et petits.
TEST: se {{crois}} élu par Dieu…
TEST: avec ceux se trouvant sur leur chemin



!!!! Confusions ou/où                                                                             !!

__[i]/conf(conf_det_nom_où_pronom)__
    ^ *(?:l(?:es? +|a +|’)|[nv]o(?:s|tre) +|ce(?:t|tte|s|) +|[mts](?:es|on|a) +|des +)({w_2}) +(ou) +(?:je|tu|ils?|elles? +> +\w+|[nv]ous +> +\w+)  @@w,w
    <<- morphex(\1, ":[NAQ]", ":G")
    -2>> où                                                                         # Confusion probable. Pour évoquer un lieu ou un moment, écrivez :|http://fr.wiktionary.org/wiki/o%C3%B9

TEST: L’hôtel {{ou}} ils sont allés l’été dernier.




!!!
!!!
!!! Processeur avant impératif                                                                    !!
!!!
!!!

__<i>(p_n_importe_qui_quoi)__       n(’)importe quo?i @@1 <<- ~1>> `


__<i](p_premier_ne_pro_per_obj1)__
................................................................................
TEST: Ne manquer de rien.
TEST: Ne jamais miser sur ces tocards.
TEST: Ne m’en rien laisser.


!!
!!
!!!! Impératif !                                                                                  !!
!!
!!

# Confusions
__[i]/imp(imp_confusion_2e_pers_pluriel)__
    ({w_2}(?:er|ai[st]|ée?s?)) (moi|l(?:es?|a|eur|ui)|nous|vous)  @@0,$
    <<- morph(\1, ":V", False) and isStart() >>>
................................................................................
TEST: {{Vas}} au diable !
TEST: {{Écartes}} de moi cette coupe.
TEST: explique-{{leurs}} de quoi il est question.


!!
!!
!!!! Impératif: traits d’union manquants                                                          !!
!!
!!

__[i]/imp(imp_union_moi_toi)__
    (?<!’)({w_2}) ([mt]oi)(?! même)  @@0,$
    <<- morphex(\1, ":E", ":[GM]")
    ->> \1-\2
................................................................................
TEST: {{vas y}}, ce n’est pas dangereux
TEST: {{convenez en}}, c’est une belle affaire malgré son prix élevé



!!!
!!!
!!! Processeur: destruction des pronoms qui précèdent un verbe et de l’adverbe de négation “ne”.  !!
!!!
!!!

# Brainfuck (ici, prudence !)
__[i](p_pro_per_obj01)__
    (ne +(?:l(?:ui|eur|a|es?)|[mts]e|[nv]ous) +(?:l(?:a|es?|ui|eur)|en|y)) +({w_1})  @@0,$
    <<- morph(\2, ":(?:[123][sp]|P|Y)", False) =>> select(\2, ":(?:[123][sp]|P|Y)")
................................................................................
    <<- __also__ ~1>> *
# Fin du Brainfuck



!!
!!
!!!! Confusions                                                                                   !!
!!
!!

#### CONFUSION a / à
__[i]/conf(conf_pronom_verbe_à)__
    ^ *(?:je|tu|ils?|on|elles?) +({w_2}) +(a)  @@w,$
    <<- morph(\1, ":V", False) and \2 != "A"
................................................................................
TEST: Veillez à éviter de faire des fautes.
TEST: Veillez votre mari qui est malade.



!!
!!
!!!! Infinitif                                                                                    !!
!!
!!

__[i]/infi(infi_comment_où)__
    (?:comment|où) +({w_2}(?:ée?s?|ez))  @@$
    <<- morphex(\1, ":V", ":M") and not (\1.endswith("ez") and after(" +vous"))
    -1>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.
................................................................................
TEST: ils sont {{tromper}} par tous ces hypocrites.
TEST: Jeûner n’est pas seulement cesser de manger.
TEST: Ne pas aimer n’est pas oublier l’autre.


!!
!!
!!!! Conjugaison                                                                                  !!
!!
!!

## 1sg
__[i]/conj(conj_j)__
    j’({w_1})  @@2
    <<- morphex(\1, ":V", ":1s|>(?:en|y) ") >>>
................................................................................
    -2>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « des \1… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Des hommes {{arrive}}.
TEST: Des femmes ne {{demande}} rien.
TEST: des femmes qui {{conduise}} la marche du monde.


!!!! Quel(le) que soit / quel(le)s que soient                                                     !!

# singulier
__[i]/conj(conj_quel_quelle_que_3sg1)__
    quel(?:le|)s? que ([sf]\w+) +(?:l[ea]|ce(?:t|tte|)|[mts](?:a|on)|[nv]otre|leur)  @@w
    <<- morphex(\1, ":V0e", ":3s")
    -1>> =suggVerb(@, ":3s")                                                             # Conjugaison erronée. Mettez “être” à la 3ᵉ personne du singulier.

................................................................................
TEST: Samantha et Eva {{viennes}} demain.
TEST: Samantha et Eva leur {{décrive}} une leçon.



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

__[i]/conj(conj_que_où_comment_verbe_sujet_sing)__
    (?:que?|où|comment|combien|dont|quand|pourquoi) +({w1}) (l(?:e(?:ur | )|a |’)|[mts](?:on|a) |ce(?:t|tte|) |[nv]otre |du ) *(?!plupart|majorité)({w1})  @@w,w,$
    <<- morphex(\1, ":(?:[12]s|3p)", ":(?:3s|G|W|3p!)") and not after("^ +(?:et|ou) (?:l(?:es? |a |’|eurs? )|[mts](?:a|on|es) |ce(?:tte|ts|) |[nv]o(?:s|tre) |d(?:u|es) )")
    -1>> =suggVerb(@, ":3s")                                                        # Conjugaison erronée. Accord avec « \2 \3… ». Le verbe devrait être à la 3ᵉ personne du singulier.
................................................................................
TEST: {{puisse}} les hommes enfin comprendre leurs erreurs.                         ->> puissent
TEST: {{puisses}} notre ennemi trembler de peur devant notre courage.               ->> puisse



!!
!!
!!!! Formes interrogatives ?                                                                      !!
!!
!!

__[i]/inte(inte_union_xxxe_je)__
    (?<![jJ]’)({w_2}[éèe]) je  @@0
    <<- morphex(\1, ":V.*:1[sŝś]", ":[GNW]") and not before(r"(?i)\bje +$") and morphex(word(1), ":", ":(?:Oo|X|1s)", True)
    ->> =\1[:-1]+"é-je"                                                                             # Forme interrogative ? Mettez un trait d’union.
................................................................................
    -1>> =suggSimil(\1, ":3p", False)                                                               # Forme interrogative : « \1 » n’est pas un verbe à la 3ᵉ personne du pluriel.

TEST: {{attaquant}}-ils                                     ->> attaquent
TEST: {{prendrons}}-elles un verre avec moi ?



!!!! Verbe auxiliaire                                                                             !!

__[i]/conf(conf_avoir_sujet_participe_passé)__
    ({avoir})-(?:je|tu|ils?|elles?|on) +({ppas})  @@0,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
__[i]/conf(conf_sujet_avoir_participe_passé)__
    (?:j’|je |tu |ils? |elles? |on ) *({avoir}) +({ppas})  @@*,$
    <<- morph(\1, ">avoir ", False) and morph(\2, ":V.......e_.*:Q", False) -1>> _  # Incohérence. La forme verbale “\2” ne peut pas être utilisé avec l’auxiliaire “avoir”, seulement avec l’auxiliaire “être”.
................................................................................
TEST: Avais-je partie liée avec lui ?
TEST: il {{avait}} parti.



!!
!!
!!!! Modes verbaux                                                                                !!
!!
!!

# conditionnel / futur

__[i]/vmode(vmode_j_aimerais_vinfi)__
    j(?:e +|’)(aimerai|préf[éè]rerai|apprécierai|voudrai|souhaiterai|désirerai|adorerai) +({w_1})  @@w,$
................................................................................
!!
!!
!!
!!
!!
!!
!!
!! TESTS: Faux positifs potentiels                                                                !!
!!
!!
!!
!!
!!
!!
!!
................................................................................
!!
!!
!!
!!
!!
!!

!!! À trier                                                                                       !!
TEST: L’homme sur le bateau de Patrick {{viens}} de temps en temps {{mangé}} chez moi.
TEST: Ces marchands {{passe}} leur temps à se quereller.
TEST: Ils jugeront en toute impartialité de ce cas {{délirante}}.
TEST: Ils sont de manière si étonnante et si admirable {{arrivé}} à ce résultat…
TEST: Les tests grand public de Jean-Paul {{montre}} des résultats surprenants.
TEST: Ils ont à plusieurs reprises {{perdus}} leur sang-froid.
TEST: Ces attaques à main armée {{donne}} la chair de poule.
................................................................................
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.
TODO: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.
TODO: Les côtes sont dans leur ensemble extrêmement découpées.


!!! Indécidable                                                                                   !!
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests                                                                                  !!
TEST: Ça a l’air de t’aller.
TEST: Et je m’en sors.
TEST: C’est à chacun d’entre nous de suivre le modèle d’Amos.
TEST: C’est toi qui voulais y aller.
TEST: je ne suis qu’une joueuse en robe de soirée.
TEST: Tu ne fais qu’aggraver les choses.
TEST: Que veut-il ? Vous parler du boulot.
................................................................................
TEST: Enfin, les thèmes de la nouvelle réforme ont été longuement débattus.
TEST: Le moral des ménages au plus haut depuis 2007
TEST: Ce qu’ils nous ont fait
TEST: Comment vous expliquez ça ?
TEST: Comment vous expliquer ça ?


!!! Tests historiques                                                                             !!

## Version 0.5.14
TEST: par le léger tissu de rayonne qui les protégeait en ce moment.

## Version 0.5.11
TEST: Un moteur à cylindrée fixe

................................................................................
TEST: Je soussigné Pierre Dupont déclare avoir pris connaissance des conditions de ce contrat.
TEST: J’ai mille cent timbres.
TEST: À qui mieux mieux, à qui mieux mieux
TEST: L’est est loin, la gare de l’est aussi.



!!! Tests repris de LanguageTool                                                                  !!
## NOTE : ces textes contiennent parfois des erreurs (corrigées quand repérées par le correcteur)

TEST: Au voisinage du zéro absolu de température.
TEST: La couronne périphérique alterne falaises abruptes et plages.
TEST: Henri VIII rencontre François Iᵉʳ.
TEST: à ce jour.
TEST: avoir un bel avenir
................................................................................
TEST: Le 29 février 2008.
TEST: Le 29 février 2012.
TEST: Le 29 février 2016.
TEST: Le 29 février 2020.
TEST: Le 29-février-2004


!!! Le Horla, de Guy de Maupassant                                                                !!
# Nouvelle intégrale (228 lignes)
# Certains points diffèrent du texte original tiré de Wikisource :
# — les paragraphes sont souvent scindés pour des raisons pratiques.
# — les virgules avant les points de suspension ont été supprimées
# — moyen âge -> Moyen Âge
TEST: Le Horla — Guy de Maupassant
TODO: 8 mai. — Quelle journée admirable ! J’ai passé toute la matinée {{étendu}} sur l’herbe, devant ma maison, sous l’énorme platane qui la couvre, l’abrite et l’ombrage tout entière.
................................................................................
TEST: Pourquoi ce corps transparent, ce corps inconnaissable, ce corps d’Esprit, s’il devait craindre, lui aussi, les maux, les blessures, les infirmités, la destruction prématurée ?
TEST: La destruction prématurée ? toute l’épouvante humaine vient d’elle !
TEST: Après l’homme le Horla. — Après celui qui peut mourir tous les jours, à toutes les heures, à toutes les minutes, par tous les accidents, est venu celui qui ne doit mourir qu’à son jour, à son heure, à sa minute, parce qu’il a touché la limite de son existence !
TEST: Non… non… sans aucun doute, sans aucun doute… il n’est pas mort… Alors… alors… il va donc falloir que je me tue, moi !…
# FIN DU HORLA


!!! Double assassinat dans la rue morgue, d’Edgar Poe                                                                 !!
# Texte tiré de Wikisource
# Les paragraphes ont été découpés pour réduire la longueur des tests.
TEST: DOUBLE ASSASSINAT DANS LA RUE MORGUE — Edgar Poe
TEST: Quelle chanson chantaient les sirènes ? quel nom Achille avait-il pris, quand il se cachait parmi les femmes ? – Questions embarrassantes, il est vrai, mais qui ne sont pas situées au-delà de toute conjecture.
TEST: Sir Thomas Browne.
TODO: Les facultés de l’esprit qu’on définit par le terme {{analytiques}} sont en elles-mêmes fort peu susceptibles d’analyse.
TEST: Nous ne les apprécions que par leurs résultats. Ce que nous en savons, entre autres choses, c’est qu’elles sont pour celui qui les possède à un degré extraordinaire une source de jouissances des plus vives.
................................................................................
TEST: Néanmoins, qu’il n’ait pas pu débrouiller ce mystère, il n’y a nullement lieu de s’en étonner, et cela est moins singulier qu’il ne le croit ; car, en vérité, notre ami le préfet est un peu trop fin pour être profond. Sa science n’a pas de base.
TEST: Elle est tout en tête et n’a pas de corps, comme les portraits de la déesse Laverna, – ou, si vous aimez mieux, tout en tête et en épaules, comme une morue.
TEST: Mais, après tout, c’est un brave homme. Je l’adore particulièrement pour un merveilleux genre de cant auquel il doit sa réputation de génie.
TEST: Je veux parler de sa manie de nier ce qui est, et d’expliquer ce qui n’est pas[2].
# FIN DU DOUBLE ASSASSINAT DANS LA RUE MORGUE


!!! Vers Dorés, de Pythagore                                                                      !!
# Origine?
TEST: Aux dieux, suivant les lois, rends de justes hommages ;
TEST: Respecte le serment, les héros et les sages ;
TEST: Honore tes parents, tes rois, tes bienfaiteurs ;
TEST: Choisi parmi tes amis les hommes les meilleurs.
TEST: Sois obligeant et doux, sois facile en affaires.
TEST: Ne hais pas ton ami pour des fautes légères ;
................................................................................
TEST: XXX. Mais abstiens-toi des aliments que je t’ai défendus. Apprends à discerner ce qui est nécessaire dans la purification et la délivrance de l’âme. Examine tout ; donne à ta raison la première place et, content de te laisser conduire, abandonne-lui les rênes.
TEST: XXXI. Ainsi, quand tu auras quitté les dépouilles mortelles, tu monteras dans l’air libre ; tu deviendras un dieu immortel et la mort n’aura plus d’empire sur toi.
TEST: Fin des vers dorés de Pythagore
TEST: Note : Chez les Pythagoriciens, la monade ou l’unité représente Dieu-même, parce qu’elle n’est engendrée par aucun nombre, qu’elle les engendre tous, qu’elle est simple et sans aucune composition. La dyade, ou le nombre deux, est l’image de la nature créée, parce qu’elle est le premier produit de l’unité, parce qu’elle est inspirée, parce qu’ayant des parties elle peut se décomposer et se défendre. La monade et la dyade réunies forment le ternaire, et représentent l’immensité de tout ce qui existe, l’être immuable et la matière altérable et changeante. J’ignore par quelle propriété le quaternaire, le nombre quatre, est encore un emblème de la divinité.
# FIN DES VERS DORÉS DE PYTHAGORE


!!! Épître du feu philosophique, de Jean Pontanus                                                 !!
# Les paragraphes ont été découpés et ne correspondent pas à ceux du texte.
TEST: Épître du Feu Philosophique
TEST: Lettre concernant la pierre dite philosophale
TEST: Jean Pontanus
TEST: in Theatrum Chimicum, 1614, t. III
TEST: « Nous affirmons, au contraire, — et l’on peut avoir foi en notre sincérité, — qu’il sera impossible d’obtenir le moindre succès dans l’Œuvre si l’on a pas une connaissance parfaite de ce qu’est le Vase des Philosophes ni de quelle manière il faut le fabriquer. Pontanus avoue qu’avant de connaître ce vaisseau secret il avait recommencé, sans succès, plus de deux cents fois le même travail, quoiqu’il besognât sur les matières propres et convenables, et selon la méthode régulière. L’artiste doit faire lui-même son vaisseau ; c’est une maxime de l’art. N’entreprenez rien, en conséquence, tant que vous n’aurez pas reçu toute la lumière sur cette coquille de l’œuf qualifiée secretum secretorum chez les maîtres du Moyen Âge. »
TEST: — Fulcanelli, Le Mystère des Cathédrales, p. 204-205
................................................................................
TEST: Et moyennant notre feu, la médecine se multipliera si elle est conjointe à la matière crue, non seulement en quantité mais aussi en vertu.
TEST: Recherche donc de toutes les forces de ton esprit ce feu, et tu parviendras au but que tu t’es proposé ; car c’est lui qui fait tout l’œuvre, et il est la clef de tous les Philosophes, laquelle ils n’ont jamais révélée dans leurs livres.
TEST: Si tu penses bien profondément aux propriétés du feu ci-dessus, tu la connaîtras, mais non autrement.
TEST: Donc, touché d’un mouvement de pitié, j’ai écrit ceci ; mais, et afin que je me satisfasse, le feu n’est point transmué avec la matière, comme je l’ai dit ci-dessus.
TEST: J’ai bien voulu le dire et en avertir les prudents de ces choses, pour qu’ils ne dépensent pas inutilement leur argent, mais qu’ils sachent auparavant ce qu’ils doivent chercher, et, par ce moyen, parviendront à la vérité de l’Art ; non pas autrement. À Dieu.
# FIN DE L’ÉPÎTRE DU FEU PHILOSOPHIQUE

!!! Le Misanthrope, de Molière                                                                    !!
TEST: LE MISANTHROPE (1666)
TEST: de Molière
TEST: Texte établi par Charles Louandre, Charpentier, 1910 (2, pp. 170-239).
TEST: PERSONNAGES
TEST: Alceste, amant de Célimène,
TEST: Philinte, ami d’Alceste,
TEST: Oronte, amant de Célimène,