Grammalecte  Check-in [2f2ddcbb20]

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | gcerw
Files: files | file ages | folders
SHA3-256: 2f2ddcbb2081e244fe2fc25e83e0101bfdfb1f607cb44e54eb9a58bc2f458202
User & Date: olr on 2020-04-09 20:27:44
Other Links: branch diff | manifest | tags
Context
2020-04-17
17:40
merge trunk (from previous checkin: mise à jour du dictionnaire) check-in: 193d73c90f user: olr tags: gcerw
2020-04-09
20:27
merge trunk check-in: 2f2ddcbb20 user: olr tags: gcerw
20:22
[graphspell] suggestions: chai -> j’sais check-in: 84fc065208 user: olr tags: trunk, graphspell
2020-04-08
18:29
[core][graphspell] move lexicographer to graphspell check-in: 66fb137996 user: olr tags: core, graphspell, gcerw
Changes

Modified gc_lang/fr/rules.grx from [6a36715a8b] to [d3143fc704].

1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479

1480
1481
1482
1483
1484
1485
1486
TEST: __ocr__ À ce compte-{{Ci}}, on n’en viendra jamais à bout.
TEST: __ocr__ Quelques-{{Uns}} sont incapables d’y parvenir.


## Mots inconnus du dictionnaire
__[s]/ocr(mots_composés_inconnus)__
    \w+-\w+
        <<- not spell(\0) and not re.search("(?i)-(?:je|tu|on|nous|vous|ie?ls?|elles?|ce|là|ci|les?|la|leur|une?s|moi|toi)$", \0)
        ->> _                                                                                       # Erreur de numérisation ? Mot composé inconnu du dictionnaire.

TEST: __ocr__ c’est du {{base-bal}}]
TEST: __ocr__ cet homme-là est corrompu.
TEST: __ocr__ cette femme-là est revenue nous dire ce qu’elle pensait de nous.
TEST: __ocr__ Est-ce le bon moment pour nous ennuyer avec ça ?
TEST: __ocr__ Alors, dis-moi, comment triompher de tous les empires de la Terre ?



## Trait d’union conditionnel
__[i]/ocr(tu_trait_union_conditionnel)__
    ({w1})‑({w1})  @@0,$
    <<- ->> \1\2|\1-\2                                                                              # Trait d’union conditionnel. Erreur de numérisation ?








|







>







1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
TEST: __ocr__ À ce compte-{{Ci}}, on n’en viendra jamais à bout.
TEST: __ocr__ Quelques-{{Uns}} sont incapables d’y parvenir.


## Mots inconnus du dictionnaire
__[s]/ocr(mots_composés_inconnus)__
    \w+-\w+
        <<- not spell(\0) and not re.search("(?i)-(?:je|tu|on|nous|vous|ie?ls?|elles?|ce|là|ci|les?|la|leur|une?s|moi|toi|en|y)$", \0)
        ->> _                                                                                       # Erreur de numérisation ? Mot composé inconnu du dictionnaire.

TEST: __ocr__ c’est du {{base-bal}}]
TEST: __ocr__ cet homme-là est corrompu.
TEST: __ocr__ cette femme-là est revenue nous dire ce qu’elle pensait de nous.
TEST: __ocr__ Est-ce le bon moment pour nous ennuyer avec ça ?
TEST: __ocr__ Alors, dis-moi, comment triompher de tous les empires de la Terre ?
TEST: __ocr__ prenez-en.


## Trait d’union conditionnel
__[i]/ocr(tu_trait_union_conditionnel)__
    ({w1})‑({w1})  @@0,$
    <<- ->> \1\2|\1-\2                                                                              # Trait d’union conditionnel. Erreur de numérisation ?

1515
1516
1517
1518
1519
1520
1521












1522
1523
1524
1525
1526
1527
1528
        <<- __else__ ->> le|la                                                                      # Erreur de numérisation ?

TEST: __ocr__ avec {{1e}} chien du policier
TEST: __ocr__ il le jura sur {{1a}} tête de sa mère
TEST: __ocr__ {{1c}} chat du voinsin est idiot
TEST: __ocr__ {{[e}} chien a faim














__[i]/ocr(ocr_les)__
    [1[\]][ea]s
        <<- ->> les                                                                                 # Erreur de numérisation ?

TEST: __ocr__ {{1es}} jours clairs
TEST: __ocr__ {{[as}} amis sont présents







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







1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
        <<- __else__ ->> le|la                                                                      # Erreur de numérisation ?

TEST: __ocr__ avec {{1e}} chien du policier
TEST: __ocr__ il le jura sur {{1a}} tête de sa mère
TEST: __ocr__ {{1c}} chat du voinsin est idiot
TEST: __ocr__ {{[e}} chien a faim


__[i]/conf(conf_1e_1a_1es)__
    [1[\]][ea]s?
        <<- \0.endswith("e") and (morph(word(1), ":(?:N.*:[me]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> le       # Erreur de frappe ?
        <<- \0.endswith("a") and (morph(word(1), ":(?:N.*:[fe]:[si]|V)", ":G") or morph(word(-1), ">ne/")) ->> la       # Erreur de frappe ?
        <<- \0.endswith("es") and (morph(word(1), ":(?:N.*:[pi]|V)", ":G") or morph(word(-1), ">ne/")) ->> les          # Erreur de frappe ?

TEST: {{1e}} marginal                                           ->> le
TEST: {{1a}} venue des problèmes                                ->> la
TEST: {{1es}} enfants sont au lit                               ->> les
TEST: Je… ne {{1e}}… crois pas…


__[i]/ocr(ocr_les)__
    [1[\]][ea]s
        <<- ->> les                                                                                 # Erreur de numérisation ?

TEST: __ocr__ {{1es}} jours clairs
TEST: __ocr__ {{[as}} amis sont présents
13394
13395
13396
13397
13398
13399
13400

13401
13402
13403
13404
13405
13406
13407
#<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’] 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¿
    >acte d’ état ?civil¿







>







13407
13408
13409
13410
13411
13412
13413
13414
13415
13416
13417
13418
13419
13420
13421
#<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¿
    >acte d’ état ?civil¿
13444
13445
13446
13447
13448
13449
13450

13451
13452
13453
13454
13455
13456
13457
    [>boîte|>boite] à [gants|outils|sardines]
    >bombe à [eau|fission|fusion|fragmentation|hydrogène|neutrons|retardement]
    >bombe à rayonnement renforcé
    >bonnet [de|d’] nuit
    >bon à rien
    >boucle d’ >oreille
    bras d’ honneur

    >brave ?d’¿ entre les braves
    >brosse à [>dent|reluire]
    >bureau [de|d’] [tabac|vote]
    >cabinet [de|d’] [toilette|travail]
    >camp [de|d’] [concentration|internement|rééducation|vacances]
    >canne à [pêche|sucre]
    >canon à eau







>







13458
13459
13460
13461
13462
13463
13464
13465
13466
13467
13468
13469
13470
13471
13472
    [>boîte|>boite] à [gants|outils|sardines]
    >bombe à [eau|fission|fusion|fragmentation|hydrogène|neutrons|retardement]
    >bombe à rayonnement renforcé
    >bonnet [de|d’] nuit
    >bon à rien
    >boucle d’ >oreille
    bras d’ honneur
    bras [de|d’] fer
    >brave ?d’¿ entre les braves
    >brosse à [>dent|reluire]
    >bureau [de|d’] [tabac|vote]
    >cabinet [de|d’] [toilette|travail]
    >camp [de|d’] [concentration|internement|rééducation|vacances]
    >canne à [pêche|sucre]
    >canon à eau
13492
13493
13494
13495
13496
13497
13498
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
    >compagnon [de|d’] route
    >complémentaire santé
    [composante+s] alpha
    >compte à rebours
    concours [de|d’] beauté
    >condamné à mort
    >conférence [de|d’] presse
    >con comme la lune
    >con comme un balai
    >con comme une valise sans >poignée
    >conseiller d’ orientation [scolaire|professionnelle]
    >contrôle [de|d’] routine
    >convention [récepteur|générateur]
    >coque [de|d’] noix
    >corbeille à >pain
    >corvéable à merci
    >coup [de|d’] [avance|balai|barre|bâton|bec|bélier|bite|blues|bol|botte|boule|boutoir|cœur|chaud|coude|couteau|dé|dent|déprime|éclat|épaule|épée|estoc|État|foudre|fil|froid|genou|grâce|>griffe|grisou|gueule|hache|hanche|jarnac|jeune|jus|klaxon|main|maître|maitre|marteau|massue|nostalgie|œil|patte|pied|poignard|poing|poker|pouce|pute|queue|rabot|rein|sabre|sabot|sang|savate|semonce|sifflet|soleil|surin|tête|théâtre|tonnerre|trique|torchon|vent|vieux]
    >coup [de|d’] baguette ?magique¿
    >coup d’ épée dans l’ eau
    >coup d’ un soir
    >coup du sort
    >coureur [de|d’] >jupon
    >courroie [de|d’] transmission
    >course contre la montre
    [cousu+ses] [main]
    [cousu+ses] [de|d’] fil blanc
    >crayon à [lèvres|sourcils]
    >cour d’ assises
    [>coût|>cout] [de|d’] revient
    >couteau à cran d’ arrêt
    >crise de >nerf
    >cuillère à [café|soupe]
    >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]
    [>dîner|>diner] aux chandelles
    >digne [de|d’] [confiance|foi]
    >digne [de|d’] ce nom
    >don en nature
    >donneur [de|d’] >leçon
    >dossier [de|d’] presse
    >droit comme un i
    >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
    >éditeur [de|d’] presse
    >effet [de|d’] bord
    >élément à charge
    >emploi du temps







<
<
<





<








<
<

















<







13507
13508
13509
13510
13511
13512
13513



13514
13515
13516
13517
13518

13519
13520
13521
13522
13523
13524
13525
13526


13527
13528
13529
13530
13531
13532
13533
13534
13535
13536
13537
13538
13539
13540
13541
13542
13543

13544
13545
13546
13547
13548
13549
13550
    >compagnon [de|d’] route
    >complémentaire santé
    [composante+s] alpha
    >compte à rebours
    concours [de|d’] beauté
    >condamné à mort
    >conférence [de|d’] presse



    >conseiller d’ orientation [scolaire|professionnelle]
    >contrôle [de|d’] routine
    >convention [récepteur|générateur]
    >coque [de|d’] noix
    >corbeille à >pain

    >coup [de|d’] [avance|balai|barre|bâton|bec|bélier|bite|blues|bol|botte|boule|boutoir|cœur|chaud|coude|couteau|dé|dent|déprime|éclat|épaule|épée|estoc|État|foudre|fil|froid|genou|grâce|>griffe|grisou|gueule|hache|hanche|jarnac|jeune|jus|klaxon|main|maître|maitre|marteau|massue|nostalgie|œil|patte|pied|poignard|poing|poker|pouce|pute|queue|rabot|rein|sabre|sabot|sang|savate|semonce|sifflet|soleil|surin|tête|théâtre|tonnerre|trique|torchon|vent|vieux]
    >coup [de|d’] baguette ?magique¿
    >coup d’ épée dans l’ eau
    >coup d’ un soir
    >coup du sort
    >coureur [de|d’] >jupon
    >courroie [de|d’] transmission
    >course contre la montre


    >crayon à [lèvres|sourcils]
    >cour d’ assises
    [>coût|>cout] [de|d’] revient
    >couteau à cran d’ arrêt
    >crise de >nerf
    >cuillère à [café|soupe]
    >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]
    [>dîner|>diner] aux chandelles
    >digne [de|d’] [confiance|foi]
    >digne [de|d’] ce nom
    >don en nature
    >donneur [de|d’] >leçon
    >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
    >éditeur [de|d’] presse
    >effet [de|d’] bord
    >élément à charge
    >emploi du temps
13593
13594
13595
13596
13597
13598
13599
13600
13601
13602
13603
13604
13605
13606
13607
    >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
    >haut comme [trois|3] pommes
    >heure [sup|sup’]
    >histoire à dormir debout
    >histoire avec un [grand|petit] h
    >homme [de|d’] [affaires|armes|confiance|exception|État|Église|honneur|lettres|loi|main|paille]
    >homme d’ âge mûr
    >homme à poigne
    >homme à tout faire







<







13601
13602
13603
13604
13605
13606
13607

13608
13609
13610
13611
13612
13613
13614
    >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’]
    >histoire à dormir debout
    >histoire avec un [grand|petit] h
    >homme [de|d’] [affaires|armes|confiance|exception|État|Église|honneur|lettres|loi|main|paille]
    >homme d’ âge mûr
    >homme à poigne
    >homme à tout faire
13617
13618
13619
13620
13621
13622
13623

13624
13625

13626
13627
13628
13629
13630
13631
13632
    >journal [de|d’] bord
    >juge d’ instruction
    >langue [de|d’] bois
    >lame [de|d’] fond
    >lettre [de|d’] recommandation
    >lampe à [huile|pétrole]
    >lampe [de|d’] chevet

    >lavage [de|d’] cerveau
    >liaison sans lendemain

    >lime à >ongle
    >liste d’ attente
    >lit à baldaquin
    >lit [de|d’] camp
    >livraison à domicile
    >livre [de|d’] [poche|chevet]
    >livret d’ épargne ?[bancaire|populaire|salariale]¿







>


>







13624
13625
13626
13627
13628
13629
13630
13631
13632
13633
13634
13635
13636
13637
13638
13639
13640
13641
    >journal [de|d’] bord
    >juge d’ instruction
    >langue [de|d’] bois
    >lame [de|d’] fond
    >lettre [de|d’] recommandation
    >lampe à [huile|pétrole]
    >lampe [de|d’] chevet
    >langue [de|d’] bois
    >lavage [de|d’] cerveau
    >liaison sans lendemain
    >ligne [de|d’] mire
    >lime à >ongle
    >liste d’ attente
    >lit à baldaquin
    >lit [de|d’] camp
    >livraison à domicile
    >livre [de|d’] [poche|chevet]
    >livret d’ épargne ?[bancaire|populaire|salariale]¿
13664
13665
13666
13667
13668
13669
13670
13671
13672
13673
13674
13675
13676
13677
13678
13679
13680
13681
13682
13683
13684
13685
13686
13687
13688
13689
    >moteur [>essence|>diésel|>diesel]
    >motion [de|d’] [blâme|censure|défiance]
    >moule à [>gaufre|>gâteau|brioche|manqué|savarin|charlotte|tarte]
    >moulin à [café|eau|paroles|poivre|prières|vent]
    noix [de|d’] [cajou|pécan|pecan|coco|lavage|muscade|veau|macadamia]
    >nounou à domicile
    >nourrice à domicile
    >nu comme un ver
    >nu comme des vers
    >nul et non >avenu
    >occasion en or ?massif¿
    >oiseau [de|d’] [malheur|nuit|proie]
    >oiseau [de|d’] mauvais augure
    >onde [de|d’] choc
    orge [perlé|mondé|carré]
    >noir comme la nuit
    >noir comme une nuit sans lune
    >nuit [de|d’] noces
    >pain de mie
    >panier à linge
    >piano à queue
    >papier à [>lettre|musique]
    >parc d’ attractions
    >parole en l’ air
    >partie [de|d’] jambes en l’ air
    >passage à tabac







<
<
<





<
<

|







13673
13674
13675
13676
13677
13678
13679



13680
13681
13682
13683
13684


13685
13686
13687
13688
13689
13690
13691
13692
13693
    >moteur [>essence|>diésel|>diesel]
    >motion [de|d’] [blâme|censure|défiance]
    >moule à [>gaufre|>gâteau|brioche|manqué|savarin|charlotte|tarte]
    >moulin à [café|eau|paroles|poivre|prières|vent]
    noix [de|d’] [cajou|pécan|pecan|coco|lavage|muscade|veau|macadamia]
    >nounou à domicile
    >nourrice à domicile



    >occasion en or ?massif¿
    >oiseau [de|d’] [malheur|nuit|proie]
    >oiseau [de|d’] mauvais augure
    >onde [de|d’] choc
    orge [perlé|mondé|carré]


    >nuit [de|d’] noces
    >pain [de|d’] mie
    >panier à linge
    >piano à queue
    >papier à [>lettre|musique]
    >parc d’ attractions
    >parole en l’ air
    >partie [de|d’] jambes en l’ air
    >passage à tabac
13715
13716
13717
13718
13719
13720
13721
13722
13723
13724
13725
13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746
13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758
13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781
    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
    >réaction en [chaîne|chaine]
    région Grand Est
    [réglé+ses] comme du papier à musique
    >règlement [de|d’] comptes
    [remis+es] à plat
    >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
    >rivière à sec
    >robe [de|d’] [chambre|soirée]
    >robe du soir
    >robe sans >manche
    >roman à l’ eau [de|d’] rose
    >roue [avant|arrière]
    >rouge à lèvres
    >roulement à billes
    [>ru|>ruisseau] à sec
    >sac à [bandoulière|dos|main|langer|merde|foutre]
    >sac [de|d’] [couchage|sport|voyage]
    >salle à manger
    >salle [de|d’] [attente|>bain|conférence|lecture|séjour|vente]
    >sain [de|d’] [corps|esprit]
    >sain [de|d’] [corps|esprit] et [de|d’] [corps|esprit]
    >sclérose en plaques
    [secret+s] défense
    >sel [de|d’] [aluminium|ammonium|mer]
    >serpent à sonnette
    >service d’ ordre
    >seuil [de|d’] tolérance
    >seuil [de|d’] tolérance à la douleur
    >silo à [>grains|blé]
    >soldat d’ élite
    >sonnette d’ alarme
    >sortie [de|d’] secours
    >soue à >cochonne
    >sourd comme un pot
    >système d’ exploitation
    >système D
    >tableau [de|d’] chasse
    >table à repasser
    >table [de|d’] chevet
    >taille *NUM
    tas [de|d’] ferraille ?rouillée¿
    >talon >aiguille
    taux [de|d’] [abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure|change|cholestérol|cholesterol|glycémie|fécondité|participation|testostérone|TVA]
    >témoin à charge
    tenants et aboutissants
    >ténor du barreau
    >tête à claques
    >tête [de|d’] [linotte|déterré|déterrée|déterrés|déterrées|mule]
    >têtu comme une [bourrique|mule]
    >têtu comme un [âne|bourriquot|mulet]
    >terrain à découvert
    >tigre à dents [de|d’] sabre
    >tigre [de|d’] papier ?mâché¿
    >tir [de|d’] barrage
    >tiret d’ incise
    >tireur d’ élite
    >titre [de|d’] [noblesse|propriété|séjour]







<

|



















<
<












<














<
<







13719
13720
13721
13722
13723
13724
13725

13726
13727
13728
13729
13730
13731
13732
13733
13734
13735
13736
13737
13738
13739
13740
13741
13742
13743
13744
13745
13746


13747
13748
13749
13750
13751
13752
13753
13754
13755
13756
13757
13758

13759
13760
13761
13762
13763
13764
13765
13766
13767
13768
13769
13770
13771
13772


13773
13774
13775
13776
13777
13778
13779
    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
    >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
    >rivière à sec
    >robe [de|d’] [chambre|soirée]
    >robe du soir
    >robe sans >manche
    >roman à l’ eau [de|d’] rose
    >roue [avant|arrière]
    >rouge à lèvres
    >roulement à billes
    [>ru|>ruisseau] à sec
    >sac à [bandoulière|dos|main|langer|merde|foutre]
    >sac [de|d’] [couchage|sport|voyage]
    >salle à manger
    >salle [de|d’] [attente|>bain|conférence|lecture|séjour|vente]


    >sclérose en plaques
    [secret+s] défense
    >sel [de|d’] [aluminium|ammonium|mer]
    >serpent à sonnette
    >service d’ ordre
    >seuil [de|d’] tolérance
    >seuil [de|d’] tolérance à la douleur
    >silo à [>grains|blé]
    >soldat d’ élite
    >sonnette d’ alarme
    >sortie [de|d’] secours
    >soue à >cochonne

    >système d’ exploitation
    >système D
    >tableau [de|d’] chasse
    >table à repasser
    >table [de|d’] chevet
    >taille *NUM
    tas [de|d’] ferraille ?rouillée¿
    >talon >aiguille
    taux [de|d’] [abstention|absorption|alcool|alphabétisation|endettement|inflation|intérêt|imposition|occupation|ouverture|œstrogène|urée|usure|change|cholestérol|cholesterol|glycémie|fécondité|participation|testostérone|TVA]
    >témoin à charge
    tenants et aboutissants
    >ténor du barreau
    >tête à claques
    >tête [de|d’] [linotte|déterré|déterrée|déterrés|déterrées|mule]


    >terrain à découvert
    >tigre à dents [de|d’] sabre
    >tigre [de|d’] papier ?mâché¿
    >tir [de|d’] barrage
    >tiret d’ incise
    >tireur d’ élite
    >titre [de|d’] [noblesse|propriété|séjour]
13811
13812
13813
13814
13815
13816
13817





13818


13819

13820

13821











13822
13823
13824
13825
13826
13827
13828
    >volée [de|d’] bois vert
    >voiture [de|d’] location
    >zone [de|d’] confort
    >zone [de|d’] transit ?principal¿
        <<- ~2:0>> *
        <<- =>> =select(\1, ":N")






    >court sur pattes


    [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}$]¿

    >fou de rage ?[contenue|retenue]¿

    >mort de trouille











        <<- ~2:0>> *

    [>homme|>femme|>cinéaste|>politicien|>acteur|>auteur|>sculpteur|>compositeur|>musicien|>groupe|>romancier|>peintre|>photographe|>sportif|>philosophe|>intellectuel|>polémiste] à succès
    [>homme|>femme] d’ >affaire à succès
        <<- ~-2:0>> *

    [>bébé|fils|>fille|>enfant|>neveu|>nièce|>frère|>sœur] [de|d’] $:B [mois|ans]







>
>
>
>
>

>
>

>

>

>
>
>
>
>
>
>
>
>
>
>







13809
13810
13811
13812
13813
13814
13815
13816
13817
13818
13819
13820
13821
13822
13823
13824
13825
13826
13827
13828
13829
13830
13831
13832
13833
13834
13835
13836
13837
13838
13839
13840
13841
13842
13843
13844
13845
13846
    >volée [de|d’] bois vert
    >voiture [de|d’] location
    >zone [de|d’] confort
    >zone [de|d’] transit ?principal¿
        <<- ~2:0>> *
        <<- =>> =select(\1, ":N")

    >brut [de|d’] décoffrage
    >con comme la lune
    >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
    >fou de rage ?[contenue|retenue]¿
    >haut comme [trois|3] pommes
    >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>> *

    [>homme|>femme|>cinéaste|>politicien|>acteur|>auteur|>sculpteur|>compositeur|>musicien|>groupe|>romancier|>peintre|>photographe|>sportif|>philosophe|>intellectuel|>polémiste] à succès
    [>homme|>femme] d’ >affaire à succès
        <<- ~-2:0>> *

    [>bébé|fils|>fille|>enfant|>neveu|>nièce|>frère|>sœur] [de|d’] $:B [mois|ans]
19704
19705
19706
19707
19708
19709
19710

19711
19712
19713
19714
19715
19716
19717
    sous peine                                  [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..ée?s?$
        <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1)                                # Après “sous peine de”, le verbe devrait être à l’infinitif.

TEST: afin de leur {{percée}} une ouverture
TEST: en train de {{percées}}
TEST: elle tricha à seule fin d’{{allée}} à l’université
TEST: ils sont à même de {{trouvé}} la bonne réponse

TEST: Nous étions en train de {{trouvé}} une solution à ces soucis récurrents.
TEST: il a l’air de {{pensée}} qu’on est des crétins
TEST: tu avais raison de {{pensée}} ça
TEST: nous eûmes la chance de la {{trouvée}} facilement
TEST: avoir raison de la {{considérée}} ainsi
TEST: vous avez le droit de lui {{craché}} à la gueule
TEST: ils ont vite fait de nous {{poussée}} à bout







>







19722
19723
19724
19725
19726
19727
19728
19729
19730
19731
19732
19733
19734
19735
19736
    sous peine                                  [de|d’]  ?[le|l’|la|leur|les|nous|vous|lui]¿  ~..ée?s?$
        <<- /infi/ analyse(\-1, ":Q", ":M") --1>> =suggVerbInfi(\-1)                                # Après “sous peine de”, le verbe devrait être à l’infinitif.

TEST: afin de leur {{percée}} une ouverture
TEST: en train de {{percées}}
TEST: elle tricha à seule fin d’{{allée}} à l’université
TEST: ils sont à même de {{trouvé}} la bonne réponse
TEST: ces explications sont plus à même de les {{touchés}}
TEST: Nous étions en train de {{trouvé}} une solution à ces soucis récurrents.
TEST: il a l’air de {{pensée}} qu’on est des crétins
TEST: tu avais raison de {{pensée}} ça
TEST: nous eûmes la chance de la {{trouvée}} facilement
TEST: avoir raison de la {{considérée}} ainsi
TEST: vous avez le droit de lui {{craché}} à la gueule
TEST: ils ont vite fait de nous {{poussée}} à bout
23796
23797
23798
23799
23800
23801
23802
23803
23804
23805
23806
23807
23808
23809
23810
23811
23812
23813
23814
23815
23816
23817
23818
23819
23820
23821
23822
23823
23824
23825
23826
23827
23828
23829
23830
23831
23832
23833
23834
23835
23836
23837
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:(?:[123][sp]|P|Y)¬:X
    [ne|n’]  [le|la|l’|les]                 [lui|leur|en|y]            @:(?:[123][sp]|P|Y)¬:X
    [ne|n’]  [lui|leur]                     en                         @:(?:[123][sp]|P|Y)¬:X
        <<- ~1:-2>> *


__purge_proposition_subordonnée__
    [que|qu’]   je                      ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:1s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:2s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:3s    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:1p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:2p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  @:V[123].*:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         @:V[123].*:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             @:V[123].*:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [lui|leur|y]                    en                          @:V[123].*:3p    @:[123][sp]
        <<- morph(<1, ":N", ":V") ~1:-2>> *


__tag_verbe_infinitif_sujet__
    [<start>|,|(]  [ne|n’]  ?[en|y]¿ ?presque¿ [pas|rien|guère|point|jamais|plus]
    [<start>|,|(]  [ne|n’]  $:Y
    [<start>|,|(]  $:Y







|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







23815
23816
23817
23818
23819
23820
23821
23822
23823
23824
23825
23826
23827
23828
23829
23830
23831
23832
23833
23834
23835
23836
23837
23838
23839
23840
23841
23842
23843
23844
23845
23846
23847
23848
23849
23850
23851
23852
23853
23854
23855
23856
    [ne|n’]  [me|m’|te|t’|se|s’|nous|vous]  [le|la|l’|les|en|y]        @:(?:[123][sp]|P|Y)¬:X
    [ne|n’]  [le|la|l’|les]                 [lui|leur|en|y]            @:(?:[123][sp]|P|Y)¬:X
    [ne|n’]  [lui|leur]                     en                         @:(?:[123][sp]|P|Y)¬:X
        <<- ~1:-2>> *


__purge_proposition_subordonnée__
    [que|qu’]   je                      ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:1s    @:[123][sp]
    [que|qu’]   je                      ?[ne|n’]¿   [lui|leur|y]                    en                          $:1s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:2s    @:[123][sp]
    [que|qu’]   tu                      ?[ne|n’]¿   [lui|leur|y]                    en                          $:2s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:3s    @:[123][sp]
    [que|qu’]   [il|elle|on|iel|$:M]    ?[ne|n’]¿   [lui|leur|y]                    en                          $:3s    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:1p    @:[123][sp]
    [que|qu’]   nous                    ?[ne|n’]¿   [lui|leur|y]                    en                          $:1p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:2p    @:[123][sp]
    [que|qu’]   vous                    ?[ne|n’]¿   [lui|leur|y]                    en                          $:2p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:3p    @:[123][sp]
    [que|qu’]   [ils|elles|iels]        ?[ne|n’]¿   [lui|leur|y]                    en                          $:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿  $:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]         $:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [le|la|l’|les]                  [lui|leur|en|y]             $:3p    @:[123][sp]
    [que|qu’]   $:M et $:M              ?[ne|n’]¿   [lui|leur|y]                    en                          $:3p    @:[123][sp]
        <<- morph(<1, ":N", ":V") ~1:-2>> *


__tag_verbe_infinitif_sujet__
    [<start>|,|(]  [ne|n’]  ?[en|y]¿ ?presque¿ [pas|rien|guère|point|jamais|plus]
    [<start>|,|(]  [ne|n’]  $:Y
    [<start>|,|(]  $:Y
24896
24897
24898
24899
24900
24901
24902

24903
24904
24905
24906
24907
24908
24909
TEST: certains hommes {{marchande}} sans cesse
TEST: tu sais, certains filtres {{donnes}} de mauvais résultats
TEST: certaines femmes {{danse}} beaucoup
TEST: tu sais, certaines danses {{dérive}} d’autres
TEST: certaines demandes qui {{donne}} le tournis.
TEST: plusieurs personnes {{devienne}} des robots
TEST: plusieurs pressions qui ne {{donne}} pas les résultats attendus.

TEST: l’écart entre les riches et les pauvres n’était pas si grand.
TEST: Les grands hommes politiques
TEST: les charmantes petites mines de toutes les jeunes filles
TEST: Les pauvres petites dames sont folles
TEST: Sauf que l’un comme l’autre avaient dû y renoncer.
TEST: L’un comme l’autre devaient y renoncer.
TEST: Les écrivaines Marie Darrieussecq et Annie Ernaux







>







24915
24916
24917
24918
24919
24920
24921
24922
24923
24924
24925
24926
24927
24928
24929
TEST: certains hommes {{marchande}} sans cesse
TEST: tu sais, certains filtres {{donnes}} de mauvais résultats
TEST: certaines femmes {{danse}} beaucoup
TEST: tu sais, certaines danses {{dérive}} d’autres
TEST: certaines demandes qui {{donne}} le tournis.
TEST: plusieurs personnes {{devienne}} des robots
TEST: plusieurs pressions qui ne {{donne}} pas les résultats attendus.
TEST: les invités que tu as servis {{outrepasse}} leur droit
TEST: l’écart entre les riches et les pauvres n’était pas si grand.
TEST: Les grands hommes politiques
TEST: les charmantes petites mines de toutes les jeunes filles
TEST: Les pauvres petites dames sont folles
TEST: Sauf que l’un comme l’autre avaient dû y renoncer.
TEST: L’un comme l’autre devaient y renoncer.
TEST: Les écrivaines Marie Darrieussecq et Annie Ernaux

Modified gc_lang/fr/webext/background.js from [6e8ab066e7] to [3958c7eb7d].

338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
browser.contextMenus.create({ id: "grammar_checker_page",       title: "Analyser la page",                          contexts: ["all"] });
browser.contextMenus.create({ id: "separator_tools",            type: "separator",                                  contexts: ["all"] });
// Tools
browser.contextMenus.create({ id: "conjugueur_tab",             title: "Conjugueur [onglet]",                       contexts: ["all"] });
browser.contextMenus.create({ id: "conjugueur_window",          title: "Conjugueur [fenêtre]",                      contexts: ["all"] });
//browser.contextMenus.create({ id: "dictionaries",               title: "Dictionnaires",                             contexts: ["all"] });
browser.contextMenus.create({ id: "lexicon_editor",             title: "Éditeur lexical",                           contexts: ["all"] });
// Rescan page
browser.contextMenus.create({ id: "separator_rescan",           type: "separator",                                  contexts: ["editable"] });


browser.contextMenus.onClicked.addListener(function (xInfo, xTab) {
    // xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData
    // xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab
    // confusing: no way to get the node where we click?!
    switch (xInfo.menuItemId) {







<
<







338
339
340
341
342
343
344


345
346
347
348
349
350
351
browser.contextMenus.create({ id: "grammar_checker_page",       title: "Analyser la page",                          contexts: ["all"] });
browser.contextMenus.create({ id: "separator_tools",            type: "separator",                                  contexts: ["all"] });
// Tools
browser.contextMenus.create({ id: "conjugueur_tab",             title: "Conjugueur [onglet]",                       contexts: ["all"] });
browser.contextMenus.create({ id: "conjugueur_window",          title: "Conjugueur [fenêtre]",                      contexts: ["all"] });
//browser.contextMenus.create({ id: "dictionaries",               title: "Dictionnaires",                             contexts: ["all"] });
browser.contextMenus.create({ id: "lexicon_editor",             title: "Éditeur lexical",                           contexts: ["all"] });




browser.contextMenus.onClicked.addListener(function (xInfo, xTab) {
    // xInfo = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/contextMenus/OnClickData
    // xTab = https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/Tab
    // confusing: no way to get the node where we click?!
    switch (xInfo.menuItemId) {

Modified gc_lang/fr/webext/content_scripts/init.js from [56313a38a6] to [d79ff895de].

170
171
172
173
174
175
176













177
178
179
180
181
182
183
            }
            return xNode;
        }
        catch (e) {
            showError(e);
        }
    },














    getCaretPosition: function (xElement) {
        // JS awfulness again.
        // recepie from https://stackoverflow.com/questions/4811822/get-a-ranges-start-and-end-offsets-relative-to-its-parent-container
        let nCaretOffsetStart = 0;
        let nCaretOffsetEnd = 0;
        let xSelection = window.getSelection();







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







170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
            }
            return xNode;
        }
        catch (e) {
            showError(e);
        }
    },

    findOriginEditableNode: function (xNode) {
        if (!xNode) {
            return null;
        }
        if (xNode.tagName == "TEXTAREA" || xNode.tagName == "INPUT" || xNode.tagName == "IFRAME") {
            return xNode;
        }
        const findNode = function (xNode) {
            return (!xNode.parentNode.isContentEditable) ? xNode : findNode(xNode.parentNode);
        }
        return findNode(xNode);
    },

    getCaretPosition: function (xElement) {
        // JS awfulness again.
        // recepie from https://stackoverflow.com/questions/4811822/get-a-ranges-start-and-end-offsets-relative-to-its-parent-container
        let nCaretOffsetStart = 0;
        let nCaretOffsetEnd = 0;
        let xSelection = window.getSelection();
274
275
276
277
278
279
280







281
282
283
284
285
286
287
        Send messages to the background
        object {
            sCommand: the action to perform
            oParam: parameters necessary for the execution of the action
            oInfo: all kind of informations that needs to be sent back (usually to know where to use the result)
        }
    */







    parseAndSpellcheck: function (sText, sDestination) {
        this.xConnect.postMessage({
            sCommand: "parseAndSpellcheck",
            oParam: { sText: sText, sCountry: "FR", bDebug: false, bContext: false },
            oInfo: { sDestination: sDestination }
        });
    },







>
>
>
>
>
>
>







287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
        Send messages to the background
        object {
            sCommand: the action to perform
            oParam: parameters necessary for the execution of the action
            oInfo: all kind of informations that needs to be sent back (usually to know where to use the result)
        }
    */

    checkConnection: function () {
        if (!this.xConnect) {
            this.xConnect = browser.runtime.connect({name: "content-script port"});
        }
    },

    parseAndSpellcheck: function (sText, sDestination) {
        this.xConnect.postMessage({
            sCommand: "parseAndSpellcheck",
            oParam: { sText: sText, sCountry: "FR", bDebug: false, bContext: false },
            oInfo: { sDestination: sDestination }
        });
    },
396
397
398
399
400
401
402

403
404
405
406
407
408
409
410
                /*
                    Commands received from the context menu
                    (Context menu are initialized in background)
                */
                // Grammar checker commands
                case "grammar_checker_editable":
                    if (oGrammalecte.xRightClickedNode !== null) {

                        oGrammalecte.startGCPanel(oGrammalecte.xRightClickedNode);
                    } else {
                        oGrammalecte.showMessage("Erreur. Le node sur lequel vous avez cliqué n’a pas pu être identifié. Sélectionnez le texte à corriger et relancez le correcteur via le menu contextuel.");
                    }
                    break;
                case "grammar_checker_page":
                    oGrammalecte.startGCPanel(oGrammalecte.getPageText());
                    break;







>
|







416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
                /*
                    Commands received from the context menu
                    (Context menu are initialized in background)
                */
                // Grammar checker commands
                case "grammar_checker_editable":
                    if (oGrammalecte.xRightClickedNode !== null) {
                        let xNode = oGrammalecte.findOriginEditableNode(oGrammalecte.xRightClickedNode);
                        oGrammalecte.startGCPanel(xNode);
                    } else {
                        oGrammalecte.showMessage("Erreur. Le node sur lequel vous avez cliqué n’a pas pu être identifié. Sélectionnez le texte à corriger et relancez le correcteur via le menu contextuel.");
                    }
                    break;
                case "grammar_checker_page":
                    oGrammalecte.startGCPanel(oGrammalecte.getPageText());
                    break;
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442

    /*
        Other messages from background
    */
    listen2: function () {
        browser.runtime.onMessage.addListener(function (oMessage) {
            let {sActionRequest} = oMessage;
            let xActiveNode = document.activeElement;
            switch (sActionRequest) {
                /*
                    Commands received from the keyboard (shortcuts)
                */
                case "shortcutGrammarChecker":
                    if (xActiveNode && (xActiveNode.tagName == "TEXTAREA" || xActiveNode.tagName == "INPUT" || xActiveNode.isContentEditable)) {
                        oGrammalecte.startGCPanel(xActiveNode);







|







449
450
451
452
453
454
455
456
457
458
459
460
461
462
463

    /*
        Other messages from background
    */
    listen2: function () {
        browser.runtime.onMessage.addListener(function (oMessage) {
            let {sActionRequest} = oMessage;
            let xActiveNode = oGrammalecte.findOriginEditableNode(document.activeElement);
            switch (sActionRequest) {
                /*
                    Commands received from the keyboard (shortcuts)
                */
                case "shortcutGrammarChecker":
                    if (xActiveNode && (xActiveNode.tagName == "TEXTAREA" || xActiveNode.tagName == "INPUT" || xActiveNode.isContentEditable)) {
                        oGrammalecte.startGCPanel(xActiveNode);

Modified gc_lang/fr/webext/content_scripts/menu.css from [caed9e4799] to [1d3547cd1d].

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
    CSS
    Button for Grammalecte
*/

div.grammalecte_menu_main_button {
    all: initial;
    position: absolute;
    box-sizing: border-box;
    display: none;
    margin: -12px 0 0 -12px;
    width: 16px;
    height: 16px;
    background-color: hsla(210, 80%, 95%, .5);
    border: 3px solid hsla(210, 80%, 50%, .9);
    border-top: 3px solid hsla(210, 80%, 90%, .9);
    border-left: 3px solid hsla(210, 80%, 90%, .9);
    border-radius: 50%;










|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
    CSS
    Button for Grammalecte
*/

div.grammalecte_menu_main_button {
    all: initial;
    position: absolute;
    box-sizing: border-box;
    display: none;
    margin: -10px 0 0 -18px;
    width: 16px;
    height: 16px;
    background-color: hsla(210, 80%, 95%, .5);
    border: 3px solid hsla(210, 80%, 50%, .9);
    border-top: 3px solid hsla(210, 80%, 90%, .9);
    border-left: 3px solid hsla(210, 80%, 90%, .9);
    border-radius: 50%;

Modified gc_lang/fr/webext/content_scripts/menu.js from [1c8166f9c8] to [60324e1838].

34
35
36
37
38
39
40
41




42

43
44
45
46
47
48
49
50
51
52
53





54
55
56
57
58
59
60
61
62
63
64

65
66
67
68
69
70
71
72
73

74
75
76
77
78
79
80
        if (oOptions.hasOwnProperty("ui_options")) {
            this._bTextArea = oOptions.ui_options.textarea;
            this._bEditableNode = oOptions.ui_options.editablenode;
        }
    }

    examineNode (xNode) {
        if (xNode && xNode instanceof HTMLElement) {




            if (xNode === this.xTextNode) {

                this.move();
                return;
            }
            if ( ( (xNode.tagName == "TEXTAREA" && this._bTextArea && xNode.getAttribute("spellcheck") !== "false")
                    || ( (xNode.tagName == "P" || xNode.tagName == "DIV") && xNode.isContentEditable && this._bEditableNode )
                    || (xNode.tagName == "IFRAME" && this._bIframe) )
                    && xNode.style.display !== "none" && xNode.style.visibility !== "hidden"
                    && !(xNode.dataset.grammalecte_button  &&  xNode.dataset.grammalecte_button == "false") ) {
                this.xTextNode = xNode;
                this.show()
            }





            else {
                this.xTextNode = null;
                this.hide();
            }
        }
        else {
            this.xTextNode = null;
            this.hide();
        }
    }


    show () {
        if (this.xTextNode) {
            this.xButton.style.display = "none"; // we hide it before showing it again to relaunch the animation
            this.move();
            this.xButton.style.display = "block";
        }
    }

    hide () {

        this.xButton.style.display = "none";
    }

    move () {
        if (this.xTextNode) {
            let oCoord = oGrammalecte.getElementCoord(this.xTextNode);
            this.xButton.style.top = `${oCoord.bottom}px`;







|
>
>
>
>
|
>
|
|
|
|
<
|
<
|
|
|
|
>
>
>
>
>
|
<
|

<
|
<
|



>
|
|






|
>







34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

52

53
54
55
56
57
58
59
60
61
62

63
64

65

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
        if (oOptions.hasOwnProperty("ui_options")) {
            this._bTextArea = oOptions.ui_options.textarea;
            this._bEditableNode = oOptions.ui_options.editablenode;
        }
    }

    examineNode (xNode) {
        if (!xNode || !xNode instanceof HTMLElement) {
            // not a node
            this.reject();
            return;
        }
        if (xNode === this.xTextNode) {
            // same node -> possibly click for resizing -> move it
            this.move();
            return;
        }
        if ( ( (xNode.tagName == "TEXTAREA" && this._bTextArea && xNode.getAttribute("spellcheck") !== "false")

               || (xNode.tagName == "IFRAME" && this._bIframe) )

             && !(xNode.dataset.grammalecte_button  &&  xNode.dataset.grammalecte_button == "false") ) {
            // textarea or iframe
            this.accept(xNode)
        }
        else if (xNode.isContentEditable && this._bEditableNode) {
            // editable node
            xNode = oGrammalecte.findOriginEditableNode(xNode);
            if ((xNode.tagName == "P" || xNode.tagName == "DIV") && !(xNode.dataset.grammalecte_button && xNode.dataset.grammalecte_button == "false")) {
                this.accept(xNode);
            } else {

                this.reject();
            }

        } else {

            this.reject();
        }
    }

    accept (xNode=null) {
        if (xNode) {
            this.xTextNode = xNode;
            this.xButton.style.display = "none"; // we hide it before showing it again to relaunch the animation
            this.move();
            this.xButton.style.display = "block";
        }
    }

    reject () {
        this.xTextNode = null;
        this.xButton.style.display = "none";
    }

    move () {
        if (this.xTextNode) {
            let oCoord = oGrammalecte.getElementCoord(this.xTextNode);
            this.xButton.style.top = `${oCoord.bottom}px`;

Modified gc_lang/fr/webext/content_scripts/panel_gc.js from [a5deafa9f3] to [6633e04592].

1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
    }

    write () {
        if (this.xNode !== null) {
            if (this.bResultInEvent) {
                const xEvent = new CustomEvent("GrammalecteResult", { detail: JSON.stringify({ sType: "text", sText: this.getText() }) });
                this.xNode.dispatchEvent(xEvent);
                console.log("[Grammalecte debug] Text sent to xNode via event:", xEvent.detail);
            }
            else if (this.bTextArea) {
                this.xNode.value = this.getText();
                console.log("[Grammalecte debug] text written in textarea:", this.getText());
            }
            else if (this.bIframe) {
                //console.log(this.getText());
            }
            else {
                let sText = "";
                this.eraseNodeContent();
                this.dParagraph.forEach((val, key) => {
                    this.xNode.appendChild(document.createTextNode(val.normalize("NFC")));
                    this.xNode.appendChild(document.createElement("br"));
                    sText += val.normalize("NFC") + "\n";
                });
                console.log("[Grammalecte debug] text written in editable node:", sText);
            }
        }
        else if (this.xResultNode !== null) {
            const xEvent = new CustomEvent("GrammalecteResult", { detail: JSON.stringify({ sType: "text", sText: this.getText() }) });
            this.xResultNode.dispatchEvent(xEvent);
            console.log("[Grammalecte debug] Text sent to xResultNode via event:", xEvent.detail);
        }
    }
}







|



|





<




<

|





|



1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064

1065
1066
1067
1068

1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
    }

    write () {
        if (this.xNode !== null) {
            if (this.bResultInEvent) {
                const xEvent = new CustomEvent("GrammalecteResult", { detail: JSON.stringify({ sType: "text", sText: this.getText() }) });
                this.xNode.dispatchEvent(xEvent);
                //console.log("[Grammalecte debug] Text sent to xNode via event:", xEvent.detail);
            }
            else if (this.bTextArea) {
                this.xNode.value = this.getText();
                //console.log("[Grammalecte debug] text written in textarea:", this.getText());
            }
            else if (this.bIframe) {
                //console.log(this.getText());
            }
            else {

                this.eraseNodeContent();
                this.dParagraph.forEach((val, key) => {
                    this.xNode.appendChild(document.createTextNode(val.normalize("NFC")));
                    this.xNode.appendChild(document.createElement("br"));

                });
                //console.log("[Grammalecte debug] text written in editable node:", this.getText());
            }
        }
        else if (this.xResultNode !== null) {
            const xEvent = new CustomEvent("GrammalecteResult", { detail: JSON.stringify({ sType: "text", sText: this.getText() }) });
            this.xResultNode.dispatchEvent(xEvent);
            //console.log("[Grammalecte debug] Text sent to xResultNode via event:", xEvent.detail);
        }
    }
}

Modified graphspell-js/char_player.js from [14e0bd8318] to [de17cf162c].

64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    aConsonant: new Set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ"),
    aDouble: new Set("bcdfjklmnprstzBCDFJKLMNPRSTZ"),  // letters that may be used twice successively


    // Similar chars

    d1to1: new Map([
        ["1", "1liîLIÎ"],
        ["2", "2zZ"],
        ["3", "3eéèêEÉÈÊ"],
        ["4", "4aàâAÀÂ"],
        ["5", "5sgSG"],
        ["6", "6bdgBDG"],
        ["7", "7ltLT"],
        ["8", "8bB"],
        ["9", "9gbdGBD"],
        ["0", "0oôOÔ"],

        ["a", "aAàÀâÂáÁäÄāĀæÆ"],
        ["A", "AaÀàÂâÁáÄäĀāÆæ"],
        ["à", "aAàÀâÂáÁäÄāĀæÆ"],
        ["À", "AaÀàÂâÁáÄäĀāÆæ"],
        ["â", "aAàÀâÂáÁäÄāĀæÆ"],
        ["Â", "AaÀàÂâÁáÄäĀāÆæ"],







|
|
|
|
|
|
|
|
|
|







64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    aConsonant: new Set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ"),
    aDouble: new Set("bcdfjklmnprstzBCDFJKLMNPRSTZ"),  // letters that may be used twice successively


    // Similar chars

    d1to1: new Map([
        ["1", "1liîLIÎ"],
        ["2", "2zZ"],
        ["3", "3eéèêEÉÈÊ"],
        ["4", "4aàâAÀÂ"],
        ["5", "5sgSG"],
        ["6", "6bdgBDG"],
        ["7", "7ltLT"],
        ["8", "8bB"],
        ["9", "9gbdGBD"],
        ["0", "0oôOÔ"],

        ["a", "aAàÀâÂáÁäÄāĀæÆ"],
        ["A", "AaÀàÂâÁáÄäĀāÆæ"],
        ["à", "aAàÀâÂáÁäÄāĀæÆ"],
        ["À", "AaÀàÂâÁáÄäĀāÆæ"],
        ["â", "aAàÀâÂáÁäÄāĀæÆ"],
        ["Â", "AaÀàÂâÁáÄäĀāÆæ"],

Modified graphspell-js/lexgraph_fr.js from [24e39bc231] to [0ffbdd29e0].

13
14
15
16
17
18
19


20
21
22
23
24
25
26
    ["bcp", "beaucoup"],
    ["ca", "ça"],
    ["cad", "c’est-à-dire"],
    ["cb", "combien|CB"],
    ["cdlt", "cordialement"],
    ["construirent", "construire|construisirent|construisent|construiront"],
    ["càd", "c’est-à-dire"],


    ["chui", "j’suis|je suis"],
    ["chuis", "j’suis|je suis"],
    ["dc", "de|donc"],
    ["done", "donc|donne"],
    ["email", "courriel|e-mail|émail"],
    ["emails", "courriels|e-mails"],
    ["ete", "êtes|été"],







>
>







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    ["bcp", "beaucoup"],
    ["ca", "ça"],
    ["cad", "c’est-à-dire"],
    ["cb", "combien|CB"],
    ["cdlt", "cordialement"],
    ["construirent", "construire|construisirent|construisent|construiront"],
    ["càd", "c’est-à-dire"],
    ["chai", "j’sais|je sais"],
    ["chais", "j’sais|je sais"],
    ["chui", "j’suis|je suis"],
    ["chuis", "j’suis|je suis"],
    ["dc", "de|donc"],
    ["done", "donc|donne"],
    ["email", "courriel|e-mail|émail"],
    ["emails", "courriels|e-mails"],
    ["ete", "êtes|été"],

Modified graphspell/char_player.py from [56f265c6d5] to [955184ee47].

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ")
aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ")  # letters that may be used twice successively


# Similar chars

d1to1 = {
    "1": "1liîLIÎ",
    "2": "2zZ",
    "3": "3eéèêEÉÈÊ",
    "4": "4aàâAÀÂ",
    "5": "5sgSG",
    "6": "6bdgBDG",
    "7": "7ltLT",
    "8": "8bB",
    "9": "9gbdGBD",
    "0": "0oôOÔ",

    "a": "aAàÀâÂáÁäÄāĀæÆ",
    "A": "AaÀàÂâÁáÄäĀāÆæ",
    "à": "aAàÀâÂáÁäÄāĀæÆ",
    "À": "AaÀàÂâÁáÄäĀāÆæ",
    "â": "aAàÀâÂáÁäÄāĀæÆ",
    "Â": "AaÀàÂâÁáÄäĀāÆæ",







|
|
|
|
|
|
|
|
|
|







51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
aConsonant = set("bcçdfghjklmnñpqrstvwxzBCÇDFGHJKLMNÑPQRSTVWXZ")
aDouble = set("bcdfjklmnprstzBCDFJKLMNPRSTZ")  # letters that may be used twice successively


# Similar chars

d1to1 = {
    "1": "1liîLIÎ",
    "2": "2zZ",
    "3": "3eéèêEÉÈÊ",
    "4": "4aàâAÀÂ",
    "5": "5sgSG",
    "6": "6bdgBDG",
    "7": "7ltLT",
    "8": "8bB",
    "9": "9gbdGBD",
    "0": "0oôOÔ",

    "a": "aAàÀâÂáÁäÄāĀæÆ",
    "A": "AaÀàÂâÁáÄäĀāÆæ",
    "à": "aAàÀâÂáÁäÄāĀæÆ",
    "À": "AaÀàÂâÁáÄäĀāÆæ",
    "â": "aAàÀâÂáÁäÄāĀæÆ",
    "Â": "AaÀàÂâÁáÄäĀāÆæ",

Modified graphspell/lexgraph_fr.py from [358150069c] to [6233a231f3].

20
21
22
23
24
25
26


27
28
29
30
31
32
33
    "bcp": "beaucoup",
    "ca": "ça",
    "cad": "c’est-à-dire",
    "cb": "combien|CB",
    "cdlt": "cordialement",
    "construirent": "construire|construisirent|construisent|construiront",
    "càd": "c’est-à-dire",


    "chui": "j’suis|je suis",
    "chuis": "j’suis|je suis",
    "done": "donc|donne",
    "dc": "de|donc",
    "email": "courriel|e-mail|émail",
    "emails": "courriels|e-mails",
    "ete": "êtes|été",







>
>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    "bcp": "beaucoup",
    "ca": "ça",
    "cad": "c’est-à-dire",
    "cb": "combien|CB",
    "cdlt": "cordialement",
    "construirent": "construire|construisirent|construisent|construiront",
    "càd": "c’est-à-dire",
    "chai": "j’sais|je sais",
    "chais": "j’sais|je sais",
    "chui": "j’suis|je suis",
    "chuis": "j’suis|je suis",
    "done": "donc|donne",
    "dc": "de|donc",
    "email": "courriel|e-mail|émail",
    "emails": "courriels|e-mails",
    "ete": "êtes|été",