Grammalecte  Check-in [9178b9116a]

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | gcerw
Files: files | file ages | folders
SHA3-256: 9178b9116a9bf3d9bc0dd373486eb0a9274b22631a6d15a8ebb95a2f8b0620ed
User & Date: olr on 2020-04-18 16:16:04
Other Links: branch diff | manifest | tags
Context
2020-05-09
17:21
merge trunk check-in: 607a6d50af user: olr tags: gcerw
2020-04-18
16:16
merge trunk check-in: 9178b9116a user: olr tags: gcerw
16:14
[fr] ajustements check-in: 5ae7d109af user: olr tags: trunk, fr
2020-04-17
20:46
[tb] small update check-in: e85aa05f71 user: olr tags: tb, gcerw
Changes

Modified compile_rules.py from [ed8f69534c] to [cec64f3971].

1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
"""
Grammalecte: compile rules
"""

import re
import os
import traceback
import json
import colorsys
import time


import compile_rules_js_convert as jsconv
import compile_rules_graph as crg


dDEFINITIONS = {}
dDECLENSIONS = {}










>







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"""
Grammalecte: compile rules
"""

import re
import os
import traceback
import json
import colorsys
import time
import hashlib

import compile_rules_js_convert as jsconv
import compile_rules_graph as crg


dDEFINITIONS = {}
dDECLENSIONS = {}
467
468
469
470
471
472
473


474
475
476
477
478



479
480
481
482
483
484
485
486
487
488









489
490
491

492
493
494
495
496
497
498
499
500
501
502
503
504
505
    print("  {:>6}:  {}".format(nLine, "  " * nLevel + sComment))


def make (spLang, sLang, bUseCache=False):
    "compile rules, returns a dictionary of values"
    # for clarity purpose, don’t create any file here



    if bUseCache and os.path.isfile("_build/data_cache.json"):
        print("> don’t rebuild rules, use cache...")
        sJSON = open("_build/data_cache.json", "r", encoding="utf-8").read()
        dCacheVars = json.loads(sJSON)
        print("  build made at: " + time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(dCacheVars.get("fBuildTime", 0))))



        return dCacheVars

    fBuildTime = time.time()

    print("> read rules file...")
    try:
        lRules = open(spLang + "/rules.grx", 'r', encoding="utf-8").readlines()
    except OSError:
        print("Error. Rules file in project [" + sLang + "] not found.")
        exit()










    # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines
    print("  parsing rules...")

    lRuleLine = []
    lTest = []
    lOpt = []
    bGraph = False
    lGraphRule = []

    for i, sLine in enumerate(lRules, 1):
        if sLine.startswith('#END'):
            # arbitrary end
            printBookmark(0, "BREAK BY #END", i)
            break
        elif sLine.startswith("#"):
            # comment
            pass







>
>
|
|


|
>
>
>
|
<
<



|



>
>
>
>
>
>
>
>
>



>






|







468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485


486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
    print("  {:>6}:  {}".format(nLine, "  " * nLevel + sComment))


def make (spLang, sLang, bUseCache=False):
    "compile rules, returns a dictionary of values"
    # for clarity purpose, don’t create any file here

    dCacheVars = None

    if os.path.isfile("_build/data_cache.json"):
        print("> data cache found")
        sJSON = open("_build/data_cache.json", "r", encoding="utf-8").read()
        dCacheVars = json.loads(sJSON)
        sBuildDate = time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(dCacheVars.get("fBuildTime", 0)))
        if bUseCache:
            print("> use cache (no rebuild asked)")
            print("  build made at: " + sBuildDate)
            return dCacheVars



    print("> read rules file...")
    try:
        sFileContent = open(spLang + "/rules.grx", 'r', encoding="utf-8").read()
    except OSError:
        print("Error. Rules file in project [" + sLang + "] not found.")
        exit()

    xHasher = hashlib.new("sha3_512")
    xHasher.update(sFileContent.encode("utf-8"))
    sFileHash = xHasher.hexdigest()

    if dCacheVars and sFileHash == dCacheVars.get("sFileHash", ""):
        print("> cache hash identical to file hash, use cache")
        print("  build made at: " + sBuildDate)
        return dCacheVars

    # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines
    print("  parsing rules...")
    fBuildTime = time.time()
    lRuleLine = []
    lTest = []
    lOpt = []
    bGraph = False
    lGraphRule = []

    for i, sLine in enumerate(sFileContent.split("\n"), 1):
        if sLine.startswith('#END'):
            # arbitrary end
            printBookmark(0, "BREAK BY #END", i)
            break
        elif sLine.startswith("#"):
            # comment
            pass
624
625
626
627
628
629
630

631
632
633
634
635
636
637
        sJSCallables += "        return " + jsconv.py2js(sReturn) + ";\n"
        sJSCallables += "    },\n"

    displayStats(lParagraphRules, lSentenceRules)

    dVars = {
        "fBuildTime": fBuildTime,

        "callables": sPyCallables,
        "callablesJS": sJSCallables,
        "gctests": sGCTests,
        "gctestsJS": sGCTestsJS,
        "paragraph_rules": mergeRulesByOption(lParagraphRules),
        "sentence_rules": mergeRulesByOption(lSentenceRules),
        "paragraph_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lParagraphRulesJS)),







>







638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
        sJSCallables += "        return " + jsconv.py2js(sReturn) + ";\n"
        sJSCallables += "    },\n"

    displayStats(lParagraphRules, lSentenceRules)

    dVars = {
        "fBuildTime": fBuildTime,
        "sFileHash": sFileHash,
        "callables": sPyCallables,
        "callablesJS": sJSCallables,
        "gctests": sGCTests,
        "gctestsJS": sGCTestsJS,
        "paragraph_rules": mergeRulesByOption(lParagraphRules),
        "sentence_rules": mergeRulesByOption(lSentenceRules),
        "paragraph_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lParagraphRulesJS)),

Modified compile_rules_graph.py from [b7d9668574] to [07d8ba5d53].

453
454
455
456
457
458
459
460
461
462
463
464
465
466
467


def make (lRule, sLang, dDef, dDecl, dOptPriority):
    "compile rules, returns a dictionary of values"
    # for clarity purpose, don’t create any file here

    # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines
    print("  parsing rules...")
    lTokenLine = []
    lActions = []
    bActionBlock = False
    nPriority = -1
    dAllGraph = {}
    dGraphCode = {}
    sGraphName = ""







|







453
454
455
456
457
458
459
460
461
462
463
464
465
466
467


def make (lRule, sLang, dDef, dDecl, dOptPriority):
    "compile rules, returns a dictionary of values"
    # for clarity purpose, don’t create any file here

    # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines
    print("  parsing graph rules...")
    lTokenLine = []
    lActions = []
    bActionBlock = False
    nPriority = -1
    dAllGraph = {}
    dGraphCode = {}
    sGraphName = ""
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
            lActions.clear()
            iActionBlock += 1
        else:
            print("Unknown line at:", iLine)
            print(sLine)

    # processing rules
    print("  processing rules...")
    initProcessPoolExecutor()
    fStartTimer = time.time()
    # build graph
    lResult = []
    nRule = 0
    for sGraphName, lRuleLine in dAllGraph.items():
        nRule += len(lRuleLine)







|







541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
            lActions.clear()
            iActionBlock += 1
        else:
            print("Unknown line at:", iLine)
            print(sLine)

    # processing rules
    print("  processing graph rules...")
    initProcessPoolExecutor()
    fStartTimer = time.time()
    # build graph
    lResult = []
    nRule = 0
    for sGraphName, lRuleLine in dAllGraph.items():
        nRule += len(lRuleLine)

Modified gc_lang/fr/data/phonet_simil.txt from [f5b40261bf] to [a259a1667c].

818
819
820
821
822
823
824

825
826
827
828
829
830
831
vaine vaines veine veines viennes
vairon vairons verrons verront
val vals valent
valet valets valais valait valaient valez vallée vallées
vallon vallons valons
vaux vaut vau veau veaux vos
vent vents vend vends van vans

ver vers verre verres vert verts vair
vernis vernit
verrat verrats verra verras
verset versets verser
veule veules veulent
veux veut vœu vœux
vil vils vile viles ville villes







>







818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
vaine vaines veine veines viennes
vairon vairons verrons verront
val vals valent
valet valets valais valait valaient valez vallée vallées
vallon vallons valons
vaux vaut vau veau veaux vos
vent vents vend vends van vans
vente ventes vante vantes vantent
ver vers verre verres vert verts vair
vernis vernit
verrat verrats verra verras
verset versets verser
veule veules veulent
veux veut vœu vœux
vil vils vile viles ville villes

Modified gc_lang/fr/rules.grx from [851f30ab1c] to [8db209f637].

425
426
427
428
429
430
431

432
433
434
435
436
437
438
439
__<s>/typo(typo_point_collé_à_mot_suivant)__     [  ][.](?=\w)  <<- ->> ". |."                      # L’espace se place après le point, et non avant (ou bien sert de liant entre deux lettres).

TEST: Il a fini{{ .}} Va te faire foutre, connard.
TEST: Merde{{ .}}Ça m’emmerde, ces trucs.


# Trois points et espaces

__<s>/typo(typo_3points_après_espace)__         \w+([  ]…)  @@$ <<- -1>> …                          # Pas d’espace avant le signe “…”.

TEST: J’en ai marre{{ …}} c’est ça.                             ->> …
TEST: ça va…


# Virgules et espaces
__<s>/typo(typo_virgule_entre_deux_espaces)__    "[  ],(?=[  ])"  <<- ->> ,                         # Pas d’espace avant une virgule.







>
|







425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
__<s>/typo(typo_point_collé_à_mot_suivant)__     [  ][.](?=\w)  <<- ->> ". |."                      # L’espace se place après le point, et non avant (ou bien sert de liant entre deux lettres).

TEST: Il a fini{{ .}} Va te faire foutre, connard.
TEST: Merde{{ .}}Ça m’emmerde, ces trucs.


# Trois points et espaces
__<s>/typo(typo_points_suspension_après_espace)__
    \w+([  ]…)  @@$ <<- -1>> …                                                                      # Pas d’espace avant le signe “…”.

TEST: J’en ai marre{{ …}} c’est ça.                             ->> …
TEST: ça va…


# Virgules et espaces
__<s>/typo(typo_virgule_entre_deux_espaces)__    "[  ],(?=[  ])"  <<- ->> ,                         # Pas d’espace avant une virgule.
910
911
912
913
914
915
916

917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935


936
937
938
939
940
941
942
__<s>/typo(typo_espace_manquant_après2)__
    [?!;%‰‱˚»}]({w_1}|[({[])  @@$  <<- -1>> " \1"                                                 # Il manque un espace.
__[s>/typo(typo_espace_manquant_après3)__
    {w_1}[.]({w_1}|[({[])  @@$
    <<- (\1.__len__() > 1 and not \1[0:1].isdigit() and spell(\1)) or after("^’") -1>> " \1"        # Il manque un espace.
__[s>/typo(typo_espace_manquant_après4)__
    {w_2}[…]({w_1}|[({[])  @@$

    <<- \1.__len__() == 1 or \1[0:1].isupper() -1>> " \1"                                           # Il manque un espace.

TEST: J’en ai marre,{{ça}} suffit.                                          ->> " ça"
TEST: elle est délirante.{{Devine}} ce qu’elle a dit.                       ->> " Devine"
TEST: Voilà,{{il}} manque un espace.                                        ->> " il"
TEST: Dernier essai.{{Voilà}}, c’est ça.                                    ->> " Voilà"
TEST: muni de lunettes protectrices et.{{d}}’un casque.                     ->> " d"
TEST: espace:{{manquant}}                                                   ->> " manquant"
TEST: espace{{;}}{{manquant}}
TEST: espace ;{{manquant}}                                                  ->> " manquant"
TEST: espace{{?}}{{manquant}}
TEST: espace{{!}}{{manquant}}
TEST: une espace ?{{(}}oui ou non)                                          ->> " ("
TEST: espace.{{Manquant}}                                                   ->> " Manquant"
TEST: C’est bien.{{Les}} invités seront contents.                           ->> " Les"
TEST: qui ont refusé.{{de}} se sauver                                       ->> " de"
TEST: Y parvenir quoi qu’il en soit.{{Le}} sort en est jeté.                ->> " Le"
TEST: merde…{{Ça}} suffit                                                   ->> " Ça"
TEST: merde…{{(}}je suis fatigué)                                           ->> " ("


TEST: pic.twitter.com/PICNAME


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







>
|


















>
>







911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
__<s>/typo(typo_espace_manquant_après2)__
    [?!;%‰‱˚»}]({w_1}|[({[])  @@$  <<- -1>> " \1"                                                 # Il manque un espace.
__[s>/typo(typo_espace_manquant_après3)__
    {w_1}[.]({w_1}|[({[])  @@$
    <<- (\1.__len__() > 1 and not \1[0:1].isdigit() and spell(\1)) or after("^’") -1>> " \1"        # Il manque un espace.
__[s>/typo(typo_espace_manquant_après4)__
    {w_2}[…]({w_1}|[({[])  @@$
    <<- \1[0:1].isupper() or \1.__len__() > 5 or not \1.isalpha()
        or (\1.__len__() > 1 and spell(\1)) -1>> " \1"                                              # Il manque un espace.

TEST: J’en ai marre,{{ça}} suffit.                                          ->> " ça"
TEST: elle est délirante.{{Devine}} ce qu’elle a dit.                       ->> " Devine"
TEST: Voilà,{{il}} manque un espace.                                        ->> " il"
TEST: Dernier essai.{{Voilà}}, c’est ça.                                    ->> " Voilà"
TEST: muni de lunettes protectrices et.{{d}}’un casque.                     ->> " d"
TEST: espace:{{manquant}}                                                   ->> " manquant"
TEST: espace{{;}}{{manquant}}
TEST: espace ;{{manquant}}                                                  ->> " manquant"
TEST: espace{{?}}{{manquant}}
TEST: espace{{!}}{{manquant}}
TEST: une espace ?{{(}}oui ou non)                                          ->> " ("
TEST: espace.{{Manquant}}                                                   ->> " Manquant"
TEST: C’est bien.{{Les}} invités seront contents.                           ->> " Les"
TEST: qui ont refusé.{{de}} se sauver                                       ->> " de"
TEST: Y parvenir quoi qu’il en soit.{{Le}} sort en est jeté.                ->> " Le"
TEST: merde…{{Ça}} suffit                                                   ->> " Ça"
TEST: merde…{{(}}je suis fatigué)                                           ->> " ("
TEST: ça deviendra…{{compliqué}}                                            ->> " compliqué"
TEST: ça se croit…{{fort}}… n’est-ce pas ?                                  ->> " fort"
TEST: pic.twitter.com/PICNAME


!!
!!
!!!! Points                                                                                       !!
!!
3866
3867
3868
3869
3870
3871
3872



3873


3874
3875
3876

3877

3878
3879
3880
3881
3882
3883
3884
TEST: ce que je veux c’est ce {{véhicule ci}}
TEST: Laisse ce chiot là où il est !
TEST: Ce fut là en fait une appellation fautive


### Préfixes
__tu_préfixe_ex__



    ex  $:N¬*


        <<- /tu/ not value(\2, "|aequo|nihilo|cathedra|absurdo|abrupto|")
        ->> ex-\2                                                           # S’il s’agit d’un seul mot, il manque un trait d’union.


TEST: Son {{ex ami}} est un vrai cauchemar.

TEST: Ton ex donne du fil à retordre.


__tu_préfixe_in__
    in [dix-huit|douze|seize|folio|octavo|quarto|plano]
        <<- /tu/ not value(<1, "|drive|plug|sit|") ->> \1-\2                # Il manque un trait d’union.








>
>
>
|
>
>
|
|

>

>







3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
TEST: ce que je veux c’est ce {{véhicule ci}}
TEST: Laisse ce chiot là où il est !
TEST: Ce fut là en fait une appellation fautive


### Préfixes
__tu_préfixe_ex__
    l’ ex  @:[NT]¬*
        <<- /tu/ not value(\3, "|aequo|nihilo|cathedra|absurdo|abrupto|")
        -2:3>> \2-\3                                                        # S’il s’agit d’un seul mot, il manque un trait d’union.

    ex [>ami|>patron|>locataire]
    ex @:N¬:[AGWMV]
        <<- /tu/ not value(\2, "|aequo|nihilo|cathedra|absurdo|abrupto|") and not value(<1, "|l’|")
        ->> \1-\2                                                           # S’il s’agit d’un seul mot, il manque un trait d’union.

TEST: l’{{ex fournisseur}} de ce produit
TEST: Son {{ex ami}} est un vrai cauchemar.
TEST: Mon ex alcoolique
TEST: Ton ex donne du fil à retordre.


__tu_préfixe_in__
    in [dix-huit|douze|seize|folio|octavo|quarto|plano]
        <<- /tu/ not value(<1, "|drive|plug|sit|") ->> \1-\2                # Il manque un trait d’union.

9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
    depuis l’ [année|heure|instant]                 ou
        <<- /conf/ --1>> où                                 # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

    >être ?$:W¿ dans [une|cette|la] situation ou
    [vient|vint|viendra|viendrait] un temps ou
        <<- /conf/ --1>> où                                 # Confusion probable. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

     ou le vent
        <<- /conf/ -2>> où                                  # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

TEST: {{Ou}} sont tes affaires ?                                    ->> Où
TEST: au moment {{ou}} elle allait enfin réussir                    ->> où
TEST: je ne sais même pas par {{ou}} commencer                      ->> où
TEST: {{ou}} et comment s’y prendre                                 ->> où
TEST: vers {{ou}} se tourner quand tout va mal ?                    ->> où







|







9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
    depuis l’ [année|heure|instant]                 ou
        <<- /conf/ --1>> où                                 # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

    >être ?$:W¿ dans [une|cette|la] situation ou
    [vient|vint|viendra|viendrait] un temps ou
        <<- /conf/ --1>> où                                 # Confusion probable. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

    [là|>aller] ou le vent
        <<- /conf/ -2>> où                                  # Confusion. La conjonction “ou” signale une alternative. Pour évoquer un lieu, un temps ou une situation, écrivez “où”.

TEST: {{Ou}} sont tes affaires ?                                    ->> Où
TEST: au moment {{ou}} elle allait enfin réussir                    ->> où
TEST: je ne sais même pas par {{ou}} commencer                      ->> où
TEST: {{ou}} et comment s’y prendre                                 ->> où
TEST: vers {{ou}} se tourner quand tout va mal ?                    ->> où
9792
9793
9794
9795
9796
9797
9798
9799
9800

9801
9802
9803
9804
9805
9806
9807
TEST: depuis {{prêt}} de 10 minutes
TEST: depuis {{prés}} de vingt siècles.
TEST: collait au millimètre près à la réalité


# prix / pris
__conf_prix_pris__
    [à|a] n’importe quel pris
    quel est [le|mon|ton|son|notre|votre|leur|leurs] pris

        <<- /conf/ --1>> prix                                               # Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix

    prix dans [la|une|cette] [tourmente|tempête|tornade]
    prix dans [la|une|cette] coulée de [boue|lave]
    prix dans l’ [orage|ouragan]
    prix dans les [flots|vagues|tempêtes|tornades|orages|ouragans]
    prix par surprise







|

>







9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
TEST: depuis {{prêt}} de 10 minutes
TEST: depuis {{prés}} de vingt siècles.
TEST: collait au millimètre près à la réalité


# prix / pris
__conf_prix_pris__
    [à|a] n’importe [quel+s] pris
    quel est [le|mon|ton|son|notre|votre|leur|leurs] pris
    à [quel+s] pris
        <<- /conf/ --1>> prix                                               # Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix

    prix dans [la|une|cette] [tourmente|tempête|tornade]
    prix dans [la|une|cette] coulée de [boue|lave]
    prix dans l’ [orage|ouragan]
    prix dans les [flots|vagues|tempêtes|tornades|orages|ouragans]
    prix par surprise
10337
10338
10339
10340
10341
10342
10343
10344
10345
10346
10347
10348
10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363










10364
10365
10366
10367
10368
10369
10370
10371


10372
10373
10374
10375
10376
10377
10378

TEST: Méfiez-vous de cette {{soi-disante}} sorcière.
TEST: Méfiez-vous de cette {{soit-disant}} sorcière.
TEST: Méfiez-vous de cette {{soi disant}} sorcière.


__conf_soi_soit_soie__
    [chez|sur|avec|pour] soit
    don de soit
    estime de soit
        <<- /conf/ not after(" soit ") --1>> soi                                                    # Confusion probable.

    [ça|cela|ceci] >aller ?$:W¿ de soit
        <<- /conf/ not after(" soit ") --1>> soi                                                    # Confusion probable.|https://fr.wiktionary.org/wiki/aller_de_soi

    en soit
        <<- /conf/ morph(>1, ":[GY]|<end>", ">à/") and not value(<1, "|il|on|elle|n’|m’|t’|s’|") and not before("(?i)quel(?:s|les?|) qu[’ ]$") and not after(" soit ")
        -2>> soi                                                                                    # Confusion probable.

    [soi|sois|soit|>soie]  >même
        <<- /conf/ morph(<1, ":[YQ]|>(?:avec|contre|par|pour|sur)/|<start>|>,") ->> soi-même        # Confusion probable : moi-même, toi-même, lui-même, elle-même, soi-même, elles-mêmes, eux-mêmes.

    [sois-même|soit-même|soie-même|soies-même|soi-mêmes|sois-mêmes|soit-mêmes|soie-mêmes|soies-mêmes]
        <<- /conf/ ->> soi-même                                                                     # Confusion : moi-même, toi-même, lui-même, elle-même, soi-même, elles-mêmes, eux-mêmes.

    que  sa  soi  @:[WXAQ]
        <<- /conf/ -3>> soit|soie                       # Confusion. Pour le verbe être au subjonctif, écrivez “soit”. Pour la fibre servant à la confection de textile, écrivez “soie”.











TEST: chez {{soit}}, c’est presque toujours mieux.
TEST: ce n’est pas la philosophie en {{soit}} qui est problématique
TEST: quel que {{soie}} sa pensée, je refuse d’y accorder de l’attention.
TEST: Penser par {{soit même}}…
TEST: S’aimer {{soit-même}}, c’est le début d’une grande histoire d’amour. (Oscar Wilde)
TEST: pas sûr que {{sa}} {{soi}} terminé avant demain
TEST: Cela va presque de {{soit}}


TEST: Je regrette que l’on en soit encore à des considérations que je croyais dépassées
TEST: Quoi qu’il en soit
TEST: À moins qu’elle n’en soit la victime.
TEST: Je doute qu’il s’en soit sorti si aisément.
TEST: Je refuse, quoi qu’il en soit.
TEST: on ne s’étonne plus que le parquet de Paris en soit à agir sous l’effet de quelque urgence médiatique
TEST: Vous êtes soit pour soit contre, mais pas les deux en même temps







|
|
|
















|
>
>
>
>
>
>
>
>
>
>








>
>







10349
10350
10351
10352
10353
10354
10355
10356
10357
10358
10359
10360
10361
10362
10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377
10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389
10390
10391
10392
10393
10394
10395
10396
10397
10398
10399
10400
10401
10402

TEST: Méfiez-vous de cette {{soi-disante}} sorcière.
TEST: Méfiez-vous de cette {{soit-disant}} sorcière.
TEST: Méfiez-vous de cette {{soi disant}} sorcière.


__conf_soi_soit_soie__
    [chez|sur|avec|pour] [soit|sois]
    don de [soit|sois]
    estime de [soit|sois]
        <<- /conf/ not after(" soit ") --1>> soi                                                    # Confusion probable.

    [ça|cela|ceci] >aller ?$:W¿ de soit
        <<- /conf/ not after(" soit ") --1>> soi                                                    # Confusion probable.|https://fr.wiktionary.org/wiki/aller_de_soi

    en soit
        <<- /conf/ morph(>1, ":[GY]|<end>", ">à/") and not value(<1, "|il|on|elle|n’|m’|t’|s’|") and not before("(?i)quel(?:s|les?|) qu[’ ]$") and not after(" soit ")
        -2>> soi                                                                                    # Confusion probable.

    [soi|sois|soit|>soie]  >même
        <<- /conf/ morph(<1, ":[YQ]|>(?:avec|contre|par|pour|sur)/|<start>|>,") ->> soi-même        # Confusion probable : moi-même, toi-même, lui-même, elle-même, soi-même, elles-mêmes, eux-mêmes.

    [sois-même|soit-même|soie-même|soies-même|soi-mêmes|sois-mêmes|soit-mêmes|soie-mêmes|soies-mêmes]
        <<- /conf/ ->> soi-même                                                                     # Confusion : moi-même, toi-même, lui-même, elle-même, soi-même, elles-mêmes, eux-mêmes.

    que  sa  soi  @:[WXAQ]
        <<- /conf/ -3>> soit|soie                                               # Confusion. Pour le verbe être au subjonctif, écrivez “soit”. Pour la fibre servant à la confection de textile, écrivez “soie”.

    >être [soi+s|>soie] [moi|toi|lui|elle|nous|vous|eux|iel|iels] ?,¿ [soit|soi+s|>soie]
    >être [soi+s|>soie] [moi|toi|lui|elle|nous|vous|eux|iel|iels] ?,¿ [soit|soi+s|>soie]
    >être [soi+s|>soie] $:D $:N ?,¿ [soit|soi+s|>soie]
        <<- /conf/ morph(\1, "[123][sp]") -2>> soit                             # Pour évoquer une possibilité, écrivez “soit”.|https://fr.wiktionary.org/wiki/soit#Conjonction

    >être soit [moi|toi|lui|elle|nous|vous|eux|iel|iels] ?,¿ [soit|soi+s|>soie]
    >être soit [moi|toi|lui|elle|nous|vous|eux|iel|iels] ?,¿ [soit|soi+s|>soie]
    >être soit $:D $:N ?,¿ [soit|soi+s|>soie]
        <<- /conf/ morph(\1, "[123][sp]") --1>> soit                            # Pour évoquer une possibilité, écrivez “soit”.|https://fr.wiktionary.org/wiki/soit#Conjonction

TEST: chez {{soit}}, c’est presque toujours mieux.
TEST: ce n’est pas la philosophie en {{soit}} qui est problématique
TEST: quel que {{soie}} sa pensée, je refuse d’y accorder de l’attention.
TEST: Penser par {{soit même}}…
TEST: S’aimer {{soit-même}}, c’est le début d’une grande histoire d’amour. (Oscar Wilde)
TEST: pas sûr que {{sa}} {{soi}} terminé avant demain
TEST: Cela va presque de {{soit}}
TEST: c’est {{soi}} lui, soit moi                                                   ->> soit
TEST: ce serait soit elle, {{soie}} une inconnue                                    ->> soit
TEST: Je regrette que l’on en soit encore à des considérations que je croyais dépassées
TEST: Quoi qu’il en soit
TEST: À moins qu’elle n’en soit la victime.
TEST: Je doute qu’il s’en soit sorti si aisément.
TEST: Je refuse, quoi qu’il en soit.
TEST: on ne s’étonne plus que le parquet de Paris en soit à agir sous l’effet de quelque urgence médiatique
TEST: Vous êtes soit pour soit contre, mais pas les deux en même temps
10650
10651
10652
10653
10654
10655
10656
10657
10658
10659
10660
10661
10662
10663
10664
10665
10666
10667
10668

TEST: ce n’est pas contre {{toit}}
TEST: sous son {{toi}}, c’est sa loi qui prime.


# tour à tour
__conf_tour_à_tour__
    >tourd  [à|a]   >tourd
    tours   [à|a]   tours
    tour    a       tour
        <<- /conf/ ->> tour à tour                                  # Locution adverbiale invariable. Écrivez “tour à tour”.|https://fr.wiktionary.org/wiki/tour_%C3%A0_tour
        <<- ~>> *

TEST: ils sont {{tours à tours}} fâchés.


# tout à coup
__conf_tout_à_coup__
    !! tout à coup ¡¡







|
|
<

<







10674
10675
10676
10677
10678
10679
10680
10681
10682

10683

10684
10685
10686
10687
10688
10689
10690

TEST: ce n’est pas contre {{toit}}
TEST: sous son {{toi}}, c’est sa loi qui prime.


# tour à tour
__conf_tour_à_tour__
    !! tour à tour ¡¡
    [tour+s|>tourd] [à|a] [tour+s|>tourd]

        <<- /conf/ ->> tour à tour                                  # Locution adverbiale invariable. Écrivez “tour à tour”.|https://fr.wiktionary.org/wiki/tour_%C3%A0_tour


TEST: ils sont {{tours à tours}} fâchés.


# tout à coup
__conf_tout_à_coup__
    !! tout à coup ¡¡
10681
10682
10683
10684
10685
10686
10687
















10688
10689
10690
10691
10692
10693
10694
10695
    [toute|toutes] [chose+s|chosent] [égale+s|égal+s|égalent] [par|>part|pare+s] ailleurs
        <<- /conf/ ->> toutes choses égales par ailleurs            # Confusion.|https://fr.wiktionary.org/wiki/toutes_choses_%C3%A9gales_par_ailleurs

TEST: {{Toutes choses égales part ailleurs}}.
TEST: ce serait, toutes choses égales par ailleurs, la meilleure solution possible.


















__conf_un_tant_soit_peut__
    !! un tant soit peu ¡¡
    [un|1] [temps|>tan|tant] [soi|sois|>soie|soit] [peu|peux|peut]
        <<- /conf/ ->> un tant soit peu                             # Confusion. Écrivez “un tant soit peu”.|https://fr.wiktionary.org/wiki/tant_soit_peu

TEST: {{un temps soit peu}} perdu dans cette affaire.
TEST: ils l’avaient {{1 tant soi peu}} oublié
TEST: être un tant soit peu courageux, ça ne peut pas faire de mal







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|







10703
10704
10705
10706
10707
10708
10709
10710
10711
10712
10713
10714
10715
10716
10717
10718
10719
10720
10721
10722
10723
10724
10725
10726
10727
10728
10729
10730
10731
10732
10733
    [toute|toutes] [chose+s|chosent] [égale+s|égal+s|égalent] [par|>part|pare+s] ailleurs
        <<- /conf/ ->> toutes choses égales par ailleurs            # Confusion.|https://fr.wiktionary.org/wiki/toutes_choses_%C3%A9gales_par_ailleurs

TEST: {{Toutes choses égales part ailleurs}}.
TEST: ce serait, toutes choses égales par ailleurs, la meilleure solution possible.


# très / trait
__conf_très_trait__
    [un|le|ce|mon|ton|son|notre|votre|leur]  [trait|traits|trais|traie|traies|traient]  @:A.*:[me]:[si]¬:G  @:N.*:[me]:[si]¬:(?:G|3[sp])
        <<- /conf/ -2>> très            # Confusion possible. Si “\3” est bien l’adjectif de “\4” et que vous voulez que le “\4” est beaucoup “\3”, utilisez l’adverbe “très”.|https://fr.wiktionary.org/wiki/tr%C3%A8s

    [des|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs]  [trait|traits|trais|traie|traies|traient]  @:A.*:[me]:[pi]¬:G  @:N.*:[me]:[pi]¬:(?:G|3[sp])
        <<- /conf/ -2>> très            # Confusion possible. Si “\3” est bien l’adjectif de “\4” et que vous voulez que les “\4” sont beaucoup “\3”, utilisez l’adverbe “très”.|https://fr.wiktionary.org/wiki/tr%C3%A8s

TEST: un {{trait}} petit homme
TEST: les {{traits}} mauvais choix du patron nous ont conduits à la ruine.
TEST: je ne les trais pas, mais il le faudrait.
TEST: un trait mal dessiné
TEST: je lui lançais un trait bien piquant


# un tant soit peu
__conf_un_tant_soit_peu__
    !! un tant soit peu ¡¡
    [un|1] [temps|>tan|tant] [soi|sois|>soie|soit] [peu|peux|peut]
        <<- /conf/ ->> un tant soit peu                             # Confusion. Écrivez “un tant soit peu”.|https://fr.wiktionary.org/wiki/tant_soit_peu

TEST: {{un temps soit peu}} perdu dans cette affaire.
TEST: ils l’avaient {{1 tant soi peu}} oublié
TEST: être un tant soit peu courageux, ça ne peut pas faire de mal
12389
12390
12391
12392
12393
12394
12395
12396
12397



12398

12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
    dans un [premier|second] temps
    dans une [certaine|large|moindre] mesure
    d’ abord
    d’ affilée
    d’ ailleurs
    d’ alors
    d’ année en année
    d’ aujourd’hui
    d’ antan



    d’ autant [plus|moins]

    d’ [autrefois|part]
    d’ autres fois
    d’ [arrache-pied|arrachepied]
    d’ arrière en avant
    d’ avant en arrière
    d’ à côté
    d’ âge mûr
    d’ emblée
    d’ empoigne
    d’ en [bas|dessous|face|haut]
    d’ entre [nous|vous|eux|elles]







|
|
>
>
>

>
|

<
<







12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442


12443
12444
12445
12446
12447
12448
12449
    dans un [premier|second] temps
    dans une [certaine|large|moindre] mesure
    d’ abord
    d’ affilée
    d’ ailleurs
    d’ alors
    d’ année en année
    d’ antan
    d’ après-guerre
    d’ [arrache-pied|arrachepied]
    d’ arrière en avant
    d’ aujourd’hui
    d’ autant [plus|moins]
    d’ autre part
    d’ autrefois
    d’ autres fois


    d’ avant en arrière
    d’ à côté
    d’ âge mûr
    d’ emblée
    d’ empoigne
    d’ en [bas|dessous|face|haut]
    d’ entre [nous|vous|eux|elles]
12524
12525
12526
12527
12528
12529
12530

12531
12532
12533
12534
12535
12536
12537
    [de|d’] pure forme
    [de|d’] sang-froid
    [de|d’] seconde [catégorie|importance|main|zone]
    [de|d’] semaine en semaine
    [de|d’] si bon matin
    [de|d’] si bonne heure
    [de|d’] siècle en siècle

    [de|d’] source sûre
    [de|d’] taille moyenne
    [de|d’] telle sorte
    [de|d’] temps à autre
    [de|d’] temps en temps
    [de|d’] [très|trop] [loin|près]
    [de|d’] vive voix







>







12564
12565
12566
12567
12568
12569
12570
12571
12572
12573
12574
12575
12576
12577
12578
    [de|d’] pure forme
    [de|d’] sang-froid
    [de|d’] seconde [catégorie|importance|main|zone]
    [de|d’] semaine en semaine
    [de|d’] si bon matin
    [de|d’] si bonne heure
    [de|d’] siècle en siècle
    [de|d’] sinistre mémoire
    [de|d’] source sûre
    [de|d’] taille moyenne
    [de|d’] telle sorte
    [de|d’] temps à autre
    [de|d’] temps en temps
    [de|d’] [très|trop] [loin|près]
    [de|d’] vive voix
13690
13691
13692
13693
13694
13695
13696
13697
13698
13699
13700
13701
13702
13703
13704
# END OF NG
#<end>
#@:[VR]¬[NAP]
#, @¬:[NA]
#[ne|n’|me|m’|te|t’|se|s’|le|la|l’|les|leur|leur|mon|ma|ta|sa|notre|votre|mes|tes|ses|ce|cet|cette|ces|je|j’|tu|il|on|nous|vous|ils|iels|ça|ceci|cela|c’|ç’|chaque]


__simplication_substantifs__
    abus [de|d’] position dominante
    abus [de|d’] pouvoir
    >accusé [de|d’] reception
    >acte [de|d’] [baptême|caution|cautionnement|cession|contrition|licitation|mariage|naissance|notoriété|propriété|quittance|reconnaissance|répudiation|vente]
    >acte d’ [achat|engagement]
    >acte [de|d’] gestion ?courante¿
    >acte [de|d’] procédure ?pénale¿







|







13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
# END OF NG
#<end>
#@:[VR]¬[NAP]
#, @¬:[NA]
#[ne|n’|me|m’|te|t’|se|s’|le|la|l’|les|leur|leur|mon|ma|ta|sa|notre|votre|mes|tes|ses|ce|cet|cette|ces|je|j’|tu|il|on|nous|vous|ils|iels|ça|ceci|cela|c’|ç’|chaque]


__substantifs_multi_mots__
    abus [de|d’] position dominante
    abus [de|d’] pouvoir
    >accusé [de|d’] reception
    >acte [de|d’] [baptême|caution|cautionnement|cession|contrition|licitation|mariage|naissance|notoriété|propriété|quittance|reconnaissance|répudiation|vente]
    >acte d’ [achat|engagement]
    >acte [de|d’] gestion ?courante¿
    >acte [de|d’] procédure ?pénale¿
13789
13790
13791
13792
13793
13794
13795

13796
13797
13798
13799
13800
13801
13802
    [clair+s] [de|d’] lune
    >classement sans suite
    [>clé|>clef] à molette
    >clin d’ œil
    >clause [de|d’] [confidentialité|non-concurrence]
    >clause [de|d’] non concurrence
    >code [de|d’] ?bonne¿ conduite

    >commis d’ office
    >compagne [de|d’] route
    >compagnon [de|d’] route
    >complémentaire santé
    [composante+s] alpha
    >compte à rebours
    >compte offshore







>







13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
    [clair+s] [de|d’] lune
    >classement sans suite
    [>clé|>clef] à molette
    >clin d’ œil
    >clause [de|d’] [confidentialité|non-concurrence]
    >clause [de|d’] non concurrence
    >code [de|d’] ?bonne¿ conduite
    >colosse aux pieds d’ argile
    >commis d’ office
    >compagne [de|d’] route
    >compagnon [de|d’] route
    >complémentaire santé
    [composante+s] alpha
    >compte à rebours
    >compte offshore
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
    >cure [de|d’] [désintoxication|désintox]
    >déclaration sur l’ honneur
    >délai [de|d’] [attente|carence|connexion|prescription|préavis|rétraction|rigueur]
    >demande d’ asile
    >descente aux [enfers|flambeaux]
    dieu tout-puissant
    [>dîner|>diner] aux chandelles
    >digne [de|d’] [confiance|foi]
    >digne [de|d’] ce nom
    >don en nature
    >donneur [de|d’] >leçon
    >dossier d’ inscription ?[administrative|scolaire]¿
    >dossier [de|d’] presse
    >eau [de|d’] [bouleau|bleuet|chaux|coco|javel|jouvence|mer|parfum|pluie|seltz|source|vie]
    >eau [de|d’] noix [de|d’] coco
    >économie [de|d’] >bout [de|d’] >chandelle







<
<







13867
13868
13869
13870
13871
13872
13873


13874
13875
13876
13877
13878
13879
13880
    >cure [de|d’] [désintoxication|désintox]
    >déclaration sur l’ honneur
    >délai [de|d’] [attente|carence|connexion|prescription|préavis|rétraction|rigueur]
    >demande d’ asile
    >descente aux [enfers|flambeaux]
    dieu tout-puissant
    [>dîner|>diner] aux chandelles


    >don en nature
    >donneur [de|d’] >leçon
    >dossier d’ inscription ?[administrative|scolaire]¿
    >dossier [de|d’] presse
    >eau [de|d’] [bouleau|bleuet|chaux|coco|javel|jouvence|mer|parfum|pluie|seltz|source|vie]
    >eau [de|d’] noix [de|d’] coco
    >économie [de|d’] >bout [de|d’] >chandelle
13892
13893
13894
13895
13896
13897
13898

13899
13900
13901
13902
13903
13904
13905
    >frayeur [de|d’] tous les diables
    >frousse [de|d’] tous les diables
    >fusil à pompe
    >garde à vue
    >garde du corps
    gaz à >effet [de|d’] serre
    >gilet [de|d’] sauvetage

    >grain [de|d’] [blé|maïs|sable]
    >grève [de|d’] la faim
    >groupe [de|d’] [discussion|parole|prière|pression|travail]
    >guerre éclair
    >hall d’ entrée
    >harcèlement [de|d’] rue
    >heure [sup|sup’]







>







13932
13933
13934
13935
13936
13937
13938
13939
13940
13941
13942
13943
13944
13945
13946
    >frayeur [de|d’] tous les diables
    >frousse [de|d’] tous les diables
    >fusil à pompe
    >garde à vue
    >garde du corps
    gaz à >effet [de|d’] serre
    >gilet [de|d’] sauvetage
    >gouvernement d’ union nationale
    >grain [de|d’] [blé|maïs|sable]
    >grève [de|d’] la faim
    >groupe [de|d’] [discussion|parole|prière|pression|travail]
    >guerre éclair
    >hall d’ entrée
    >harcèlement [de|d’] rue
    >heure [sup|sup’]
14012
14013
14014
14015
14016
14017
14018
14019
14020
14021
14022
14023
14024
14025
14026
14027
14028
14029
14030
14031
14032
14033
14034
14035
14036
14037
14038
14039
14040
14041
14042
    >police [de|d’] [caractères|écriture]
    >politique spectacle
    >pomme [de|d’] [discorde|terre|reinette|pin|Adam|api|amour|ambre|eau|or]
    >pompe à [chaleur|essence|fric]
    >port [de|d’] plaisance
    >porte [de|d’] [entrée|service|garage|sortie]
    >porte d’ entrée
    >pot [de|d’] [chambre|colle]
    >poudre aux yeux
    >pouvoir d’ achat
    >presse à >scandale
    preuve ?suffisante¿ du contraire
    preuves ?suffisantes¿ du contraire
    >pure comme [le|du] cristal
    prix [de|d’] revient
    quelqu’un d’ autre
    >question [de|d’] vie ou [de|d’] mort
    >rapport [de|d’] force
    >rat [de|d’] bibliothèque
    >rayon [de|d’] soleil
    >réaction en [chaîne|chaine]
    région Grand Est
    >règlement [de|d’] comptes
    >sourd comme un pot
    >requête en nullité
    >requête en non [conciliation|inscription|lieu]
    >requête en non révocation [de|d’] sursis
    >responsable qualité
    [>resto|>restau] u
    >retour à la case départ
    >revue [de|d’] presse







|















|







14053
14054
14055
14056
14057
14058
14059
14060
14061
14062
14063
14064
14065
14066
14067
14068
14069
14070
14071
14072
14073
14074
14075
14076
14077
14078
14079
14080
14081
14082
14083
    >police [de|d’] [caractères|écriture]
    >politique spectacle
    >pomme [de|d’] [discorde|terre|reinette|pin|Adam|api|amour|ambre|eau|or]
    >pompe à [chaleur|essence|fric]
    >port [de|d’] plaisance
    >porte [de|d’] [entrée|service|garage|sortie]
    >porte d’ entrée
    >pot [de|d’] [chambre|colle|départ]
    >poudre aux yeux
    >pouvoir d’ achat
    >presse à >scandale
    preuve ?suffisante¿ du contraire
    preuves ?suffisantes¿ du contraire
    >pure comme [le|du] cristal
    prix [de|d’] revient
    quelqu’un d’ autre
    >question [de|d’] vie ou [de|d’] mort
    >rapport [de|d’] force
    >rat [de|d’] bibliothèque
    >rayon [de|d’] soleil
    >réaction en [chaîne|chaine]
    région Grand Est
    >règlement [de|d’] comptes
    >sujet [de|d’] préoccupation
    >requête en nullité
    >requête en non [conciliation|inscription|lieu]
    >requête en non révocation [de|d’] sursis
    >responsable qualité
    [>resto|>restau] u
    >retour à la case départ
    >revue [de|d’] presse
14136
14137
14138
14139
14140
14141
14142


14143
14144
14145
14146
14147
14148
14149
14150
14151
14152
14153
14154
14155
14156
14157
14158
14159
14160

14161
14162
14163
14164
14165
14166
14167
    >con comme un balai
    >con comme une valise sans >poignée
    >corvéable à merci
    >court sur pattes
    [cousu+ses] [main]
    [cousu+ses] [de|d’] fil blanc
    [daté+ses] du [1er|1ᵉʳ|1|01|2|02|3|03|4|04|5|05|6|06|7|07|8|08|9|09|10|11|12|13|14|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31] {mois} ?[prochain|passé|dernier|~^[0-9]{2,5}$]¿


    >droit comme un i
    >fort en gueule
    >fou de rage ?[contenue|retenue]¿
    >élu à la majarité absolue
    >haut comme [trois|3] pommes
    >haut en couleur
    [libéré+ses] sur parole
    >lent à la détente
    >mort de trouille
    >nu comme un ver
    >nu comme des vers
    >nul et non >avenu
    >noir comme la nuit
    >noir comme une nuit sans lune
    [réglé+ses] comme du papier à musique
    [remis+es] à plat
    >sain [de|d’] [corps|esprit]
    >sain [de|d’] [corps|esprit] et [de|d’] [corps|esprit]

    >têtu comme une [bourrique|mule]
    >têtu comme un [âne|bourriquot|mulet]
        <<- ~2:0>> *

    flambant >neuf
        <<- ~1>> *








>
>


















>







14177
14178
14179
14180
14181
14182
14183
14184
14185
14186
14187
14188
14189
14190
14191
14192
14193
14194
14195
14196
14197
14198
14199
14200
14201
14202
14203
14204
14205
14206
14207
14208
14209
14210
14211
    >con comme un balai
    >con comme une valise sans >poignée
    >corvéable à merci
    >court sur pattes
    [cousu+ses] [main]
    [cousu+ses] [de|d’] fil blanc
    [daté+ses] du [1er|1ᵉʳ|1|01|2|02|3|03|4|04|5|05|6|06|7|07|8|08|9|09|10|11|12|13|14|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31] {mois} ?[prochain|passé|dernier|~^[0-9]{2,5}$]¿
    >digne [de|d’] [confiance|foi]
    >digne [de|d’] ce nom
    >droit comme un i
    >fort en gueule
    >fou de rage ?[contenue|retenue]¿
    >élu à la majarité absolue
    >haut comme [trois|3] pommes
    >haut en couleur
    [libéré+ses] sur parole
    >lent à la détente
    >mort de trouille
    >nu comme un ver
    >nu comme des vers
    >nul et non >avenu
    >noir comme la nuit
    >noir comme une nuit sans lune
    [réglé+ses] comme du papier à musique
    [remis+es] à plat
    >sain [de|d’] [corps|esprit]
    >sain [de|d’] [corps|esprit] et [de|d’] [corps|esprit]
    >sourd comme un pot
    >têtu comme une [bourrique|mule]
    >têtu comme un [âne|bourriquot|mulet]
        <<- ~2:0>> *

    flambant >neuf
        <<- ~1>> *

14714
14715
14716
14717
14718
14719
14720




14721
14722
14723
14724
14725
14726
14727
    à l’ époque  @¬:A.*:[fe]:[si]
    à l’ époque  [<end>|,|)]
        <<- ~1:3>> *

    à répétition  @¬:A.*:[fe]:[si]
    à répétition  [<end>|,|)]
        <<- ~1:2>> *





    au [départ|quotidien]  @:¬:A.*:[me]:[si]
    au [départ|quotidien]  [<end>|,|)]
        <<- ~1:2>> *

    au pire  @:A¬:N.*:[me]:[si]
    au pire  [<end>|,|)]







>
>
>
>







14758
14759
14760
14761
14762
14763
14764
14765
14766
14767
14768
14769
14770
14771
14772
14773
14774
14775
    à l’ époque  @¬:A.*:[fe]:[si]
    à l’ époque  [<end>|,|)]
        <<- ~1:3>> *

    à répétition  @¬:A.*:[fe]:[si]
    à répétition  [<end>|,|)]
        <<- ~1:2>> *

    au bout d’ un moment  @:¬:A.*:[me]:[si]
    au bout d’ un moment  [<end>|,|)]
        <<- ~1:5>> *

    au [départ|quotidien]  @:¬:A.*:[me]:[si]
    au [départ|quotidien]  [<end>|,|)]
        <<- ~1:2>> *

    au pire  @:A¬:N.*:[me]:[si]
    au pire  [<end>|,|)]
14857
14858
14859
14860
14861
14862
14863




14864
14865
14866
14867
14868
14869
14870
    [de|d’]  [façon|manière]  ?non¿  @:A.*:[fe]:[si]  et  ?non¿  @:A.*:[fe]:[si]¬:[GM]
    [de|d’]  [façon|manière]  ?non¿  @:A.*:[fe]:[si]
        <<- ~>> *

    le plus clair [de|d’] [mon|ton|son|notre|votre|leur] temps @:¬:A:[me]:[si]|>d[e’]/
    le plus clair [de|d’] [mon|ton|son|notre|votre|leur] temps [<end>|,|)]
        <<- ~1:6>> *





    pour partie  @:¬:A.*:f:s
    pour partie  [<end>|,|)]
        <<- ~1:2>> *

    semblait-il
    semble-t-il







>
>
>
>







14905
14906
14907
14908
14909
14910
14911
14912
14913
14914
14915
14916
14917
14918
14919
14920
14921
14922
    [de|d’]  [façon|manière]  ?non¿  @:A.*:[fe]:[si]  et  ?non¿  @:A.*:[fe]:[si]¬:[GM]
    [de|d’]  [façon|manière]  ?non¿  @:A.*:[fe]:[si]
        <<- ~>> *

    le plus clair [de|d’] [mon|ton|son|notre|votre|leur] temps @:¬:A:[me]:[si]|>d[e’]/
    le plus clair [de|d’] [mon|ton|son|notre|votre|leur] temps [<end>|,|)]
        <<- ~1:6>> *

    pour de bon  @:¬:[NA].*:m:s
    pour de bon  [<end>|,|)]
        <<- ~1:3>> *

    pour partie  @:¬:A.*:f:s
    pour partie  [<end>|,|)]
        <<- ~1:2>> *

    semblait-il
    semble-t-il
15001
15002
15003
15004
15005
15006
15007

15008
15009
15010
15011
15012
15013
15014
    >faire amende honorable
    >faire bande à part
    >faire bon accueil
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
    >faire de [mon|ton|son|notre|votre|leur] mieux

    >faire figure d’ exception
    >faire front commun
    >faire grise mine
    >faire grand [bruit|cas]
    >faire ?[bonne|excellente|grande|mauvaise]¿ impression
    >faire long feu
    >faire [machine|marche] arrière







>







15053
15054
15055
15056
15057
15058
15059
15060
15061
15062
15063
15064
15065
15066
15067
    >faire amende honorable
    >faire bande à part
    >faire bon accueil
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
    >faire de [mon|ton|son|notre|votre|leur] mieux
    >faire faux bond
    >faire figure d’ exception
    >faire front commun
    >faire grise mine
    >faire grand [bruit|cas]
    >faire ?[bonne|excellente|grande|mauvaise]¿ impression
    >faire long feu
    >faire [machine|marche] arrière
15064
15065
15066
15067
15068
15069
15070

15071
15072
15073
15074
15075
15076
15077
    >prendre bonne note
    >prendre [congé|conscience|contact|ombrage|note|peur|position|possession|racine|soin|vie]
    >prendre d’ assaut
    >prendre [de|d’] [court|vitesse]
    >prendre ?[ça|cela|ceci]¿ en charge
    >prendre ?[ça|cela|ceci]¿ pour argent comptant
    >prendre par surprise

    >prêter à confusion
    >prêter main forte
    >prêter main-forte
    >rebrousser chemin
    >réduire à néant
    >réduire en miettes
    >refaire surface







>







15117
15118
15119
15120
15121
15122
15123
15124
15125
15126
15127
15128
15129
15130
15131
    >prendre bonne note
    >prendre [congé|conscience|contact|ombrage|note|peur|position|possession|racine|soin|vie]
    >prendre d’ assaut
    >prendre [de|d’] [court|vitesse]
    >prendre ?[ça|cela|ceci]¿ en charge
    >prendre ?[ça|cela|ceci]¿ pour argent comptant
    >prendre par surprise
    >prendre pour argent comptant
    >prêter à confusion
    >prêter main forte
    >prêter main-forte
    >rebrousser chemin
    >réduire à néant
    >réduire en miettes
    >refaire surface
17014
17015
17016
17017
17018
17019
17020














17021
17022
17023
17024
17025
17026
17027
TEST: {{Attendues}} qu’on n’en sait rien, impossible de tirer des conclusions définitives.
TEST: Il viendra, étant {{donnée}} son addiction…
TEST: {{Vues}} les idioties qu’on entend, normal qu’on perde la tête.
TEST: {{Passées}} les premières heures du jour…
TEST: Il faut même être indulgent pour accorder une place à cette dernière, vu qu’elle a pour condition le mensonge des instincts
TEST: Vu la dureté extrême des conditions de survie…
















#### Nombres cardinaux

# vingt
__sgpl_vingt__
    vingts
        <<- /sgpl/ not value(<1, "|quatre|") ->> vingt                                      # “Vingt” ne prend la marque du pluriel que dans “quatre-vingts”.







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







17068
17069
17070
17071
17072
17073
17074
17075
17076
17077
17078
17079
17080
17081
17082
17083
17084
17085
17086
17087
17088
17089
17090
17091
17092
17093
17094
17095
TEST: {{Attendues}} qu’on n’en sait rien, impossible de tirer des conclusions définitives.
TEST: Il viendra, étant {{donnée}} son addiction…
TEST: {{Vues}} les idioties qu’on entend, normal qu’on perde la tête.
TEST: {{Passées}} les premières heures du jour…
TEST: Il faut même être indulgent pour accorder une place à cette dernière, vu qu’elle a pour condition le mensonge des instincts
TEST: Vu la dureté extrême des conditions de survie…


#### ce + sont / étaient

__conf_ce_être_pluriel__
    ce       [sont|seront|seraient|furent]  [de|d’]  @:A.*:s¬:[Gpi]  @:N¬:G
    c’       étaient                        [de|d’]  @:A.*:s¬:[Gpi]  @:N¬:G
    [c’|ç’]  avaient été                    [de|d’]  @:A.*:s¬:[Gpi]  @:N¬:G
        <<- /sgpl/ --2>> =suggPlur(\-2)                                                     # Après “ce sont”, il est vraisemblable que ce qui est évoqué soit au pluriel.

TEST: ce sont de {{beau}} jouet                                 ->> beaux
TEST: ç’avaient été de {{belle}} festivité
TEST: ce furent de {{large}} étude sur plusieurs années
TEST: ce sont d’autre part des petits malins.


#### Nombres cardinaux

# vingt
__sgpl_vingt__
    vingts
        <<- /sgpl/ not value(<1, "|quatre|") ->> vingt                                      # “Vingt” ne prend la marque du pluriel que dans “quatre-vingts”.
17607
17608
17609
17610
17611
17612
17613
17614
17615

17616
17617
17618
17619
17620
17621
17622
    [>brûler|>bruler] a vif
    >charger a blanc
    >chauffer a blanc
    >fermer a [>clé|>clef]
    [>gonfler|>regonfler] a bloc
    >jeter a terre
    [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>plat|>table|>terre]
    >naviguer a [vu+ses]
    [>mettre|>remettre] a l’ [écart|épreuve]

    >parer a toute éventualité
    >passer a tabac
    >percer a jour
    >prendre a la légère
    >prêter a >confusion
    >réduire a néant
    >saigner a blanc







<

>







17675
17676
17677
17678
17679
17680
17681

17682
17683
17684
17685
17686
17687
17688
17689
17690
    [>brûler|>bruler] a vif
    >charger a blanc
    >chauffer a blanc
    >fermer a [>clé|>clef]
    [>gonfler|>regonfler] a bloc
    >jeter a terre
    [>mettre|>remettre] a [bas|>flot|>jour|>niveau|>nu|>plat|>table|>terre]

    [>mettre|>remettre] a l’ [écart|épreuve]
    >naviguer a [vu+ses]
    >parer a toute éventualité
    >passer a tabac
    >percer a jour
    >prendre a la légère
    >prêter a >confusion
    >réduire a néant
    >saigner a blanc
17637
17638
17639
17640
17641
17642
17643

17644
17645
17646
17647
17648
17649
17650
17651

17652
17653
17654
17655
17656
17657
17658
17659
17660
17661
17662
17663
17664
17665
    >donner [sens|suite] a
    enclin a
    en être [réduit+ses] a
    en proie a
    >laisser libre cours a
    >parvenir a
    >prêter attention a

        <<- /conf/ \-1 != "A" and not tag_before(\1, "_àCOI_") --1>> à      # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    >appeler a
    >avoir du mal a
    >commencer a
    >condamner a
    >dire [adieu|merde] a
    >faire confiance a

    >mentir a
    >préparer a
    >prêter serment a
    >rendre service a
    >réussir a
    >viser a
        <<- /conf/ not tag_before(\1, "_propsub_") and not morph(\1, ":Y")
        --1>> à                                                             # Confusion probable : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    @:V¬:[YGNAWM]  a
        <<- /conf/ \-1 != "A" and not tag_before(\1, "_propsub_") and not morph(>1, ":Q")
        --1>> à                                                             # Confusion probable : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    [/VCint|/VCimp]  a







>
|







>






|







17705
17706
17707
17708
17709
17710
17711
17712
17713
17714
17715
17716
17717
17718
17719
17720
17721
17722
17723
17724
17725
17726
17727
17728
17729
17730
17731
17732
17733
17734
17735
    >donner [sens|suite] a
    enclin a
    en être [réduit+ses] a
    en proie a
    >laisser libre cours a
    >parvenir a
    >prêter attention a
        <<- /conf/ \-1 != "A" and not tag_before(\1, "_àCOI_") and not value(>1, "|été|")
        --1>> à                                                             # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    >appeler a
    >avoir du mal a
    >commencer a
    >condamner a
    >dire [adieu|merde] a
    >faire confiance a
    >faire faux bond a
    >mentir a
    >préparer a
    >prêter serment a
    >rendre service a
    >réussir a
    >viser a
        <<- /conf/ not tag_before(\1, "_propsub_") and not morph(\1, ":Y") and not value(>1, "|été|")
        --1>> à                                                             # Confusion probable : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    @:V¬:[YGNAWM]  a
        <<- /conf/ \-1 != "A" and not tag_before(\1, "_propsub_") and not morph(>1, ":Q")
        --1>> à                                                             # Confusion probable : “a” est la conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.|http://fr.wiktionary.org/wiki/%C3%A0

    [/VCint|/VCimp]  a
18139
18140
18141
18142
18143
18144
18145
18146
18147
18148
18149
18150
18151
18152
18153

# ce / se
__conf_ce_se_verbe__
    [<start>|,|(] se [ne|n’] [>être|>devoir|>pouvoir]
    [<start>|,|(] se [sera|serait|seraient|sont|seront|fut|fût|furent|fussent] $:D
    [<start>|,|(] se >devoir être
    [<start>|,|(] se >pouvoir être
        <<- /conf/ -2>> ce                              # Confusion probable. Si vous voulez dire, “ceci”, “cela” ou “ça”, écrivez “c’”.||http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=2440

TEST: {{se}} n’est pas pour cette raison que j’ai abandonné mes études.
TEST: grâce à quoi, {{se}} put être fait dans les règles.
TEST: {{se}} serait les pires vacances de sa vie
TEST: des pans entiers de l’univers — pour reprendre l’expression d’Orwell — se sont d’ores et déjà volatilisés
TEST: À la pause, ils se sont tous les deux assis à l’arrière, et j’ai vu progressivement leurs corps se rapprocher.








|







18209
18210
18211
18212
18213
18214
18215
18216
18217
18218
18219
18220
18221
18222
18223

# ce / se
__conf_ce_se_verbe__
    [<start>|,|(] se [ne|n’] [>être|>devoir|>pouvoir]
    [<start>|,|(] se [sera|serait|seraient|sont|seront|fut|fût|furent|fussent] $:D
    [<start>|,|(] se >devoir être
    [<start>|,|(] se >pouvoir être
        <<- /conf/ -2>> ce                              # Confusion probable. Si vous voulez dire, “ceci”, “cela” ou “ça”, écrivez “c’”.|http://bdl.oqlf.gouv.qc.ca/bdl/gabarit_bdl.asp?id=2440

TEST: {{se}} n’est pas pour cette raison que j’ai abandonné mes études.
TEST: grâce à quoi, {{se}} put être fait dans les règles.
TEST: {{se}} serait les pires vacances de sa vie
TEST: des pans entiers de l’univers — pour reprendre l’expression d’Orwell — se sont d’ores et déjà volatilisés
TEST: À la pause, ils se sont tous les deux assis à l’arrière, et j’ai vu progressivement leurs corps se rapprocher.

18389
18390
18391
18392
18393
18394
18395
18396
18397
18398
18399
18400
18401
18402
18403
    >datte [du|de|des] [>bac|>baptême|>brevet|>calendrier|>carême|>carnaval|>concert|>début|>dépôt|>demande|>dernier|>diffusion|>document|>fermeture|>fin|>jour|>journal|>lancement|>livraison|mise+s|>mariage|>message|>mort|>naissance|>parution|>pentecôte|>péremption|>post|>prélèvement|>premier|>pris|>prochain|>publication|>ramadan|>rapport|>réception|>référendum|>règlement|>retraite|>réunion|>séminaire|>show|>sortie|>spectacle|>terme|>tirage|>tournage|>trajet|>vente|>virement|>vol|>vote|>voyage|>lundi|>mardi|>mercredi|>jeudi|>vendredi|>samedi|>dimanche|congrès|décès|permis|procès]
    >datte d’ [accouchement|actualisation|achat|adhésion|anniversaire|apparition|échéance|édition|émission|engagement|entrée|envoi|examen|exécution|expédition|expiration|immatriculation|imputation|inscription|origine|ouverture|ovulation|aujourd’hui|Halloween]
    >datte de l’ [accouchement|actualisation|achat|adhésion|anniversaire|apparition|échéance|édition|émission|engagement|entrée|envoi|examen|exécution|expédition|expiration|immatriculation|imputation|inscription|origine|ouverture|ovulation]
    >datte du /NUM [janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre]
        <<- /conf/ -1>> =\1.replace("tt", "t").replace("TT", "T")       # Confusion probable. La datte est un fruit. Pour évoquer un jour dans l’année, écrivez “date”.|https://fr.wiktionary.org/wiki/date

    >dernier en >datte
        <<- /conf/ -3>> date                                            # Confusion probable. La datte est un fruit. Pour évoquer un jour dans l’année, écrivez “date”.||https://fr.wiktionary.org/wiki/date

TEST: il va faire un cake aux {{dates}}.
TEST: elle a fait de la confiture de {{dates}}
TEST: Des {{dates}} fraîches.
TEST: des {{dates}} dénoyautées.
TEST: une {{date}} muscade
TEST: c’est la dernière en {{datte}}.







|







18459
18460
18461
18462
18463
18464
18465
18466
18467
18468
18469
18470
18471
18472
18473
    >datte [du|de|des] [>bac|>baptême|>brevet|>calendrier|>carême|>carnaval|>concert|>début|>dépôt|>demande|>dernier|>diffusion|>document|>fermeture|>fin|>jour|>journal|>lancement|>livraison|mise+s|>mariage|>message|>mort|>naissance|>parution|>pentecôte|>péremption|>post|>prélèvement|>premier|>pris|>prochain|>publication|>ramadan|>rapport|>réception|>référendum|>règlement|>retraite|>réunion|>séminaire|>show|>sortie|>spectacle|>terme|>tirage|>tournage|>trajet|>vente|>virement|>vol|>vote|>voyage|>lundi|>mardi|>mercredi|>jeudi|>vendredi|>samedi|>dimanche|congrès|décès|permis|procès]
    >datte d’ [accouchement|actualisation|achat|adhésion|anniversaire|apparition|échéance|édition|émission|engagement|entrée|envoi|examen|exécution|expédition|expiration|immatriculation|imputation|inscription|origine|ouverture|ovulation|aujourd’hui|Halloween]
    >datte de l’ [accouchement|actualisation|achat|adhésion|anniversaire|apparition|échéance|édition|émission|engagement|entrée|envoi|examen|exécution|expédition|expiration|immatriculation|imputation|inscription|origine|ouverture|ovulation]
    >datte du /NUM [janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre]
        <<- /conf/ -1>> =\1.replace("tt", "t").replace("TT", "T")       # Confusion probable. La datte est un fruit. Pour évoquer un jour dans l’année, écrivez “date”.|https://fr.wiktionary.org/wiki/date

    >dernier en >datte
        <<- /conf/ -3>> date                                            # Confusion probable. La datte est un fruit. Pour évoquer un jour dans l’année, écrivez “date”.|https://fr.wiktionary.org/wiki/date

TEST: il va faire un cake aux {{dates}}.
TEST: elle a fait de la confiture de {{dates}}
TEST: Des {{dates}} fraîches.
TEST: des {{dates}} dénoyautées.
TEST: une {{date}} muscade
TEST: c’est la dernière en {{datte}}.
19830
19831
19832
19833
19834
19835
19836

19837
19838
19839
19840
19841
19842
19843
19844
    il >être [tant|>tan] [de|d’] [nous|vous] [la|le|les|l’]
    il >être [tant|>tan] [de|d’] [la|le|les|lui|nous|vous|leur|l’] $:Y
    il >être [tant|>tan] [de|d’] $:Y
        <<- /conf/ -3>> temps                                       # Confusion. Si vous voulez dire “c’est le moment de”, écrivez “temps”.|https://fr.wiktionary.org/wiki/il_est_temps

    [>avoir|>prendre|<start>|,|(] du bon [tant|>tan]
    c’ >être [le|l’] bon ?vieux¿ [tant|>tan]

        <<- /conf/ --1>> temps                                      # Confusion. Pour parler d’un période heureuse, écrivez “temps”.

TEST: en {{tan}} que meneuse intrépide, elle a toujours fait preuve d’une grande imagination.
TEST: il est bien évidemment {{tant}} d’en finir avec ça.
TEST: c’était le bon {{tan}}
TEST: elle sait prendre du bon {{tant}}









>
|







19900
19901
19902
19903
19904
19905
19906
19907
19908
19909
19910
19911
19912
19913
19914
19915
    il >être [tant|>tan] [de|d’] [nous|vous] [la|le|les|l’]
    il >être [tant|>tan] [de|d’] [la|le|les|lui|nous|vous|leur|l’] $:Y
    il >être [tant|>tan] [de|d’] $:Y
        <<- /conf/ -3>> temps                                       # Confusion. Si vous voulez dire “c’est le moment de”, écrivez “temps”.|https://fr.wiktionary.org/wiki/il_est_temps

    [>avoir|>prendre|<start>|,|(] du bon [tant|>tan]
    c’ >être [le|l’] bon ?vieux¿ [tant|>tan]
    au bon vieux [tant|>tan]
        <<- /conf/ --1>> temps                                      # Confusion. Pour parler d’un période heureuse, écrivez “temps”.|https://fr.wiktionary.org/wiki/temps

TEST: en {{tan}} que meneuse intrépide, elle a toujours fait preuve d’une grande imagination.
TEST: il est bien évidemment {{tant}} d’en finir avec ça.
TEST: c’était le bon {{tan}}
TEST: elle sait prendre du bon {{tant}}


25339
25340
25341
25342
25343
25344
25345

25346
25347
25348
25349
25350
25351
25352
TEST: Ses « chiens » {{coure}} sur ma pelouse.
TEST: mes filles {{passe}} ce matin
TEST: vos filles {{passes}} ce matin
TEST: ces travaux qui {{demande}} tant d’efforts.
TEST: vos questions ne {{réclame}} aucune réflexion.
TEST: Ces attaques à main armée {{donne}} la chair de poule.
TEST: Ces marchands {{passe}} leur temps à se quereller.

TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.
TEST: trier les cons et les connes expose à un violent coup de boomerang
TEST: Tu penses que quelqu’un qui frappe sa femme et ses enfants est un bon père ?


__conj_det_plur_nom_confusion__
    les  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])







>







25410
25411
25412
25413
25414
25415
25416
25417
25418
25419
25420
25421
25422
25423
25424
TEST: Ses « chiens » {{coure}} sur ma pelouse.
TEST: mes filles {{passe}} ce matin
TEST: vos filles {{passes}} ce matin
TEST: ces travaux qui {{demande}} tant d’efforts.
TEST: vos questions ne {{réclame}} aucune réflexion.
TEST: Ces attaques à main armée {{donne}} la chair de poule.
TEST: Ces marchands {{passe}} leur temps à se quereller.
TEST: maints hommes {{oublie}} leurs origines pour mieux se construire un passé glorieux
TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.
TEST: trier les cons et les connes expose à un violent coup de boomerang
TEST: Tu penses que quelqu’un qui frappe sa femme et ses enfants est un bon père ?


__conj_det_plur_nom_confusion__
    les  @:[NA].*:[pi]  @:V¬:(?:3p|P|Y|G|M|A.*:e:[pi])

Modified gc_lang/fr/webext/content_scripts/panel_gc.css from [9864829a36] to [9a73dd19f8].

100
101
102
103
104
105
106


107
108
109
110
111
112
113
div#grammalecte_tooltip_message_block {
    margin: 0;
    padding: 5px 10px 5px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
div#grammalecte_tooltip_actions {


    margin: 0;
    padding: 7px 10px 5px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
div#grammalecte_tooltip_rule_id {
    display: none;







>
>







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
div#grammalecte_tooltip_message_block {
    margin: 0;
    padding: 5px 10px 5px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
div#grammalecte_tooltip_actions {
    display: flex;
    justify-content: space-between;
    margin: 0;
    padding: 7px 10px 5px 10px;
    background-color: hsl(210, 50%, 30%);
    color: hsl(210, 50%, 96%);
}
div#grammalecte_tooltip_rule_id {
    display: none;
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

















164
165
166
167
168
169
170
    text-decoration: none;
}
div#grammalecte_tooltip_ignore:hover {
    background-color: hsl(30, 30%, 50%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(30, 30%, 60%);
}
div#grammalecte_tooltip_url, div#grammalecte_tooltip_db_search {
    display: inline-block;
    margin-left: 10px;
    padding: 1px 5px;
    background-color: hsl(210, 50%, 50%);
    color: hsla(210, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 12px;
    text-decoration: none;
}
div#grammalecte_tooltip_url:hover, div#grammalecte_tooltip_db_search:hover {
    background-color: hsl(210, 50%, 60%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}


















div#grammalecte_tooltip_sugg_title {
    padding: 0 10px;
    background-color: hsl(210, 10%, 90%);
    color: hsl(210, 50%, 30%);
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 10px;







|











|




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







142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
    text-decoration: none;
}
div#grammalecte_tooltip_ignore:hover {
    background-color: hsl(30, 30%, 50%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(30, 30%, 60%);
}
div#grammalecte_tooltip_url {
    display: inline-block;
    margin-left: 10px;
    padding: 1px 5px;
    background-color: hsl(210, 50%, 50%);
    color: hsla(210, 0%, 96%, 1);
    border-radius: 2px;
    cursor: pointer;
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 12px;
    text-decoration: none;
}
div#grammalecte_tooltip_url:hover {
    background-color: hsl(210, 50%, 60%);
    color: hsla(0, 0%, 100%, 1);
    text-shadow: 0 0 3px hsl(210, 30%, 60%);
}
div#grammalecte_tooltip_db_search {
    display: inline-block;
    margin-left: 10px;
    padding: 1px 5px;
    /*background-color: hsl(210, 50%, 50%);*/
    color: hsla(210, 0%, 96%, .1);
    border-radius: 2px;
    cursor: pointer;
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 12px;
    text-decoration: none;
}
div#grammalecte_tooltip_db_search:hover {
    background-color: hsla(210, 50%, 50%, .1);
    color: hsla(0, 0%, 100%, .2);
    text-shadow: 0 0 3px hsla(210, 30%, 60%, .2);
}

div#grammalecte_tooltip_sugg_title {
    padding: 0 10px;
    background-color: hsl(210, 10%, 90%);
    color: hsl(210, 50%, 30%);
    font-family: Tahoma, "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", sans-serif;
    font-size: 10px;

Modified gc_lang/fr/webext/content_scripts/panel_gc.js from [229ed751b6] to [2282aa660c].

790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824


class GrammalecteTooltip {

    constructor (xParent, xGCPanelContent) {
        this.xParent = xParent;
        this.sErrorId = null;
        this.bDebug = false;
        this.xTooltip = oGrammalecte.createNode("div", {id: "grammalecte_tooltip"});
        this.xTooltipArrow = oGrammalecte.createNode("img", {
            id: "grammalecte_tooltip_arrow",
            src: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwAAADsABataJCQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAAnSURBVChTY/j//z8cq/kW/wdhZDEMSXRFWCVhGKwAmwQyHngFxf8B5fOGYfeFpYoAAAAASUVORK5CYII=",
            alt: "^",
        });
        // message
        let xMessageBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message_block"});
        xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_rule_id"}));
        xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message", textContent: "Erreur."}));
        this.xTooltip.appendChild(xMessageBlock);
        // suggestions
        this.xTooltip.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"}));
        this.xTooltipSuggBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_block"});
        this.xTooltip.appendChild(this.xTooltipSuggBlock);
        // actions
        let xActions = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_actions"});
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_ignore", textContent: "Ignorer"}));
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_url", textContent: "Voulez-vous en savoir plus ?…"}, {url: ""}));
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_db_search", textContent: " ››› base de données"}, {url: ""}));
        this.xTooltip.appendChild(xActions);
        // add tooltip to the page
        xGCPanelContent.appendChild(this.xTooltip);
        xGCPanelContent.appendChild(this.xTooltipArrow);
    }

    show (xParagraph, sNodeErrorId) {  // err







<



















|







790
791
792
793
794
795
796

797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823


class GrammalecteTooltip {

    constructor (xParent, xGCPanelContent) {
        this.xParent = xParent;
        this.sErrorId = null;

        this.xTooltip = oGrammalecte.createNode("div", {id: "grammalecte_tooltip"});
        this.xTooltipArrow = oGrammalecte.createNode("img", {
            id: "grammalecte_tooltip_arrow",
            src: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAOwAAADsABataJCQAAABl0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC4xNzNun2MAAAAnSURBVChTY/j//z8cq/kW/wdhZDEMSXRFWCVhGKwAmwQyHngFxf8B5fOGYfeFpYoAAAAASUVORK5CYII=",
            alt: "^",
        });
        // message
        let xMessageBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message_block"});
        xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_rule_id"}));
        xMessageBlock.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_message", textContent: "Erreur."}));
        this.xTooltip.appendChild(xMessageBlock);
        // suggestions
        this.xTooltip.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_title", textContent: "SUGGESTIONS :"}));
        this.xTooltipSuggBlock = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_sugg_block"});
        this.xTooltip.appendChild(this.xTooltipSuggBlock);
        // actions
        let xActions = oGrammalecte.createNode("div", {id: "grammalecte_tooltip_actions"});
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_ignore", textContent: "Ignorer"}));
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_url", textContent: "Voulez-vous en savoir plus ?…"}, {url: ""}));
        xActions.appendChild(oGrammalecte.createNode("div", {id: "grammalecte_tooltip_db_search", textContent: "››"}, {url: ""}));
        this.xTooltip.appendChild(xActions);
        // add tooltip to the page
        xGCPanelContent.appendChild(this.xTooltip);
        xGCPanelContent.appendChild(this.xTooltipArrow);
    }

    show (xParagraph, sNodeErrorId) {  // err
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859

860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
            this.xTooltipArrow.style.top = (xNodeErr.offsetTop + 16) + "px";
            let nUsefulErrorWidth = ((xNodeErr.offsetLeft + xNodeErr.offsetWidth) > nArrowLimit) ? (nArrowLimit - xNodeErr.offsetLeft) : xNodeErr.offsetWidth;
            this.xTooltipArrow.style.left = (xNodeErr.offsetLeft + Math.floor((nUsefulErrorWidth / 2)) - 4) + "px"; // 4 is half the width of the arrow.
            this.xTooltip.style.top = (xNodeErr.offsetTop + 20) + "px";
            this.xTooltip.style.left = (xNodeErr.offsetLeft > nTooltipLeftLimit) ? nTooltipLeftLimit + "px" : xNodeErr.offsetLeft + "px";
            if (xNodeErr.dataset.error_type === "grammar") {
                // grammar error
                this.xParent.getElementById("grammalecte_tooltip_db_search").style.display = "none";
                if (xNodeErr.dataset.gc_message.includes(" ##")) {
                    this.bDebug = true;
                    // display rule id
                    let n = xNodeErr.dataset.gc_message.indexOf(" ##");
                    this.xParent.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message.slice(0, n);
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").textContent = "Règle : " + xNodeErr.dataset.gc_message.slice(n+2);
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "block";
                } else {
                    this.bDebug = false;
                    this.xParent.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message;
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "none";
                }
                if (xNodeErr.dataset.gc_url != "") {
                    this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = xNodeErr.dataset.gc_url;
                    this.xParent.getElementById("grammalecte_tooltip_url").style.display = "inline";
                } else {
                    this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = "";
                    this.xParent.getElementById("grammalecte_tooltip_url").style.display = "none";
                }

                this.xParent.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                let iSugg = 0;
                this.clearSuggestionBlock();
                if (xNodeErr.dataset.suggestions.length > 0) {
                    for (let sSugg of xNodeErr.dataset.suggestions.split("|")) {
                        this.xTooltipSuggBlock.appendChild(this._createSuggestion(xNodeErr.dataset.error_id, 0, iSugg, sSugg));
                        this.xTooltipSuggBlock.appendChild(document.createTextNode(" "));
                        iSugg += 1;
                    }
                } else {
                    this.xTooltipSuggBlock.textContent = "Aucune.";
                }
            }
            if (xNodeErr.dataset.error_type === "spelling") {
                // spelling mistake
                this.xParent.getElementById("grammalecte_tooltip_message").textContent = "Mot inconnu du dictionnaire.";
                this.xParent.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "none";
                this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = "";
                this.xParent.getElementById("grammalecte_tooltip_url").style.display = "none";
                if (this.bDebug) {
                    this.xParent.getElementById("grammalecte_tooltip_db_search").style.display = "inline";
                    this.xParent.getElementById("grammalecte_tooltip_db_search").dataset.url = "https://grammalecte.net/dictionary.php?prj=fr&lemma="+xNodeErr.textContent;
                } else {
                    this.xParent.getElementById("grammalecte_tooltip_db_search").style.display = "none";
                }
                this.clearSuggestionBlock();
                this.xTooltipSuggBlock.textContent = "Recherche de graphies possibles…";
                oGrammalecteBackgroundPort.getSpellSuggestions(xNodeErr.textContent, "__GrammalectePanel__", xNodeErr.dataset.error_id);
            }
            this.xTooltipArrow.style.display = "block";
            this.xTooltip.style.display = "block";
        }
        catch (e) {
            showError(e);
        }
    }

    clearSuggestionBlock () {
        while (this.xTooltipSuggBlock.firstChild) {
            this.xTooltipSuggBlock.removeChild(this.xTooltipSuggBlock.firstChild);
        }
    }

    setTooltipColor () {
        // todo
    }

    hide () {
        this.xTooltipArrow.style.display = "none";
        this.xTooltip.style.display = "none";
    }

    _createSuggestion (sErrorId, iSuggBlock, iSugg, sSugg) {
        let xNodeSugg = document.createElement("div");







<

<






<










>




















<
|
|
<
<
<


















<
<
<
<







832
833
834
835
836
837
838

839

840
841
842
843
844
845

846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876

877
878



879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896




897
898
899
900
901
902
903
            this.xTooltipArrow.style.top = (xNodeErr.offsetTop + 16) + "px";
            let nUsefulErrorWidth = ((xNodeErr.offsetLeft + xNodeErr.offsetWidth) > nArrowLimit) ? (nArrowLimit - xNodeErr.offsetLeft) : xNodeErr.offsetWidth;
            this.xTooltipArrow.style.left = (xNodeErr.offsetLeft + Math.floor((nUsefulErrorWidth / 2)) - 4) + "px"; // 4 is half the width of the arrow.
            this.xTooltip.style.top = (xNodeErr.offsetTop + 20) + "px";
            this.xTooltip.style.left = (xNodeErr.offsetLeft > nTooltipLeftLimit) ? nTooltipLeftLimit + "px" : xNodeErr.offsetLeft + "px";
            if (xNodeErr.dataset.error_type === "grammar") {
                // grammar error

                if (xNodeErr.dataset.gc_message.includes(" ##")) {

                    // display rule id
                    let n = xNodeErr.dataset.gc_message.indexOf(" ##");
                    this.xParent.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message.slice(0, n);
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").textContent = "Règle : " + xNodeErr.dataset.gc_message.slice(n+2);
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "block";
                } else {

                    this.xParent.getElementById("grammalecte_tooltip_message").textContent = xNodeErr.dataset.gc_message;
                    this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "none";
                }
                if (xNodeErr.dataset.gc_url != "") {
                    this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = xNodeErr.dataset.gc_url;
                    this.xParent.getElementById("grammalecte_tooltip_url").style.display = "inline";
                } else {
                    this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = "";
                    this.xParent.getElementById("grammalecte_tooltip_url").style.display = "none";
                }
                this.xParent.getElementById("grammalecte_tooltip_db_search").style.display = "none";
                this.xParent.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                let iSugg = 0;
                this.clearSuggestionBlock();
                if (xNodeErr.dataset.suggestions.length > 0) {
                    for (let sSugg of xNodeErr.dataset.suggestions.split("|")) {
                        this.xTooltipSuggBlock.appendChild(this._createSuggestion(xNodeErr.dataset.error_id, 0, iSugg, sSugg));
                        this.xTooltipSuggBlock.appendChild(document.createTextNode(" "));
                        iSugg += 1;
                    }
                } else {
                    this.xTooltipSuggBlock.textContent = "Aucune.";
                }
            }
            if (xNodeErr.dataset.error_type === "spelling") {
                // spelling mistake
                this.xParent.getElementById("grammalecte_tooltip_message").textContent = "Mot inconnu du dictionnaire.";
                this.xParent.getElementById("grammalecte_tooltip_ignore").dataset.error_id = xNodeErr.dataset.error_id;
                this.xParent.getElementById("grammalecte_tooltip_rule_id").style.display = "none";
                this.xParent.getElementById("grammalecte_tooltip_url").dataset.url = "";
                this.xParent.getElementById("grammalecte_tooltip_url").style.display = "none";

                this.xParent.getElementById("grammalecte_tooltip_db_search").style.display = "inline-block";
                this.xParent.getElementById("grammalecte_tooltip_db_search").dataset.url = "https://grammalecte.net/dictionary.php?prj=fr&lemma="+xNodeErr.textContent;



                this.clearSuggestionBlock();
                this.xTooltipSuggBlock.textContent = "Recherche de graphies possibles…";
                oGrammalecteBackgroundPort.getSpellSuggestions(xNodeErr.textContent, "__GrammalectePanel__", xNodeErr.dataset.error_id);
            }
            this.xTooltipArrow.style.display = "block";
            this.xTooltip.style.display = "block";
        }
        catch (e) {
            showError(e);
        }
    }

    clearSuggestionBlock () {
        while (this.xTooltipSuggBlock.firstChild) {
            this.xTooltipSuggBlock.removeChild(this.xTooltipSuggBlock.firstChild);
        }
    }





    hide () {
        this.xTooltipArrow.style.display = "none";
        this.xTooltip.style.display = "none";
    }

    _createSuggestion (sErrorId, iSuggBlock, iSugg, sSugg) {
        let xNodeSugg = document.createElement("div");