Grammalecte  Check-in [15606b15a9]

Overview
Comment:[core][fr] improve formatNumber() suggestions
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | core
Files: files | file ages | folders
SHA3-256: 15606b15a93be6f814b4857ade075323ea7cd00e301f3667fe651937e37531f4
User & Date: olr on 2020-12-03 09:45:44
Other Links: manifest | tags
Context
2020-12-03
14:43
[fr] ajustements check-in: cd832d45da user: olr tags: fr, trunk
09:45
[core][fr] improve formatNumber() suggestions check-in: 15606b15a9 user: olr tags: core, fr, trunk
2020-12-02
15:27
[fx] init: disable console.log() at start check-in: cc8dde9c46 user: olr tags: fx, trunk
Changes

Modified gc_lang/fr/modules-js/gce_suggestions.js from [ab1e5374d0] to [9d19e0f955].

579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594

595
596
597
598
599
600
601
...
606
607
608
609
610
611
612

613
614
615
616
617
618
619
function suggLesLa (sWord) {
    if (gc_engine.oSpellChecker.getMorph(sWord).some(s  =>  s.includes(":p"))) {
        return "les|la";
    }
    return "la";
}

function formatNumber (sNumber) {
    let nLen = sNumber.length;
    if (nLen < 4 ) {
        return sNumber;
    }
    let sRes = "";
    if (!sNumber.includes(",")) {
        // Nombre entier
        sRes = _formatNumber(sNumber, 3);

        // binaire
        if (/^[01]+$/.test(sNumber)) {
            sRes += "|" + _formatNumber(sNumber, 4);
        }
        // numéros de téléphone
        if (nLen == 10) {
            if (sNumber.startsWith("0")) {
................................................................................
                sRes += "|" + sNumber.slice(0,3) + " " + sNumber.slice(3,6) + " " + sNumber.slice(6,8) + " " + sNumber.slice(8);     // téléphone suisse
            }
            sRes += "|" + sNumber.slice(0,4) + " " + sNumber.slice(4,7) + "-" + sNumber.slice(7);                                   // téléphone canadien ou américain
        } else if (nLen == 9 && sNumber.startsWith("0")) {
            sRes += "|" + sNumber.slice(0,3) + " " + sNumber.slice(3,5) + " " + sNumber.slice(5,7) + " " + sNumber.slice(7,9);       // fixe belge 1
            sRes += "|" + sNumber.slice(0,2) + " " + sNumber.slice(2,5) + " " + sNumber.slice(5,7) + " " + sNumber.slice(7,9);       // fixe belge 2
        }

    } else {
        // Nombre réel
        let [sInt, sFloat] = sNumber.split(",", 2);
        sRes = _formatNumber(sInt, 3) + "," + sFloat;
    }
    return sRes;
}







|








>







 







>







579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
...
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
function suggLesLa (sWord) {
    if (gc_engine.oSpellChecker.getMorph(sWord).some(s  =>  s.includes(":p"))) {
        return "les|la";
    }
    return "la";
}

function formatNumber (sNumber, bOnlySimpleFormat=false) {
    let nLen = sNumber.length;
    if (nLen < 4 ) {
        return sNumber;
    }
    let sRes = "";
    if (!sNumber.includes(",")) {
        // Nombre entier
        sRes = _formatNumber(sNumber, 3);
        if (!bOnlySimpleFormat) {
            // binaire
            if (/^[01]+$/.test(sNumber)) {
                sRes += "|" + _formatNumber(sNumber, 4);
            }
            // numéros de téléphone
            if (nLen == 10) {
                if (sNumber.startsWith("0")) {
................................................................................
                    sRes += "|" + sNumber.slice(0,3) + " " + sNumber.slice(3,6) + " " + sNumber.slice(6,8) + " " + sNumber.slice(8);     // téléphone suisse
                }
                sRes += "|" + sNumber.slice(0,4) + " " + sNumber.slice(4,7) + "-" + sNumber.slice(7);                                   // téléphone canadien ou américain
            } else if (nLen == 9 && sNumber.startsWith("0")) {
                sRes += "|" + sNumber.slice(0,3) + " " + sNumber.slice(3,5) + " " + sNumber.slice(5,7) + " " + sNumber.slice(7,9);       // fixe belge 1
                sRes += "|" + sNumber.slice(0,2) + " " + sNumber.slice(2,5) + " " + sNumber.slice(5,7) + " " + sNumber.slice(7,9);       // fixe belge 2
            }
        }
    } else {
        // Nombre réel
        let [sInt, sFloat] = sNumber.split(",", 2);
        sRes = _formatNumber(sInt, 3) + "," + sFloat;
    }
    return sRes;
}

Modified gc_lang/fr/modules/gce_suggestions.py from [48d9a59bcc] to [40d55e0743].

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

464
465
466
467
468
469
470
    if any( ":p" in sMorph  for sMorph in _oSpellChecker.getMorph(sWord) ):
        return "les|la"
    return "la"


_zBinary = re.compile("^[01]+$")

def formatNumber (sNumber):
    "add spaces or hyphens to big numbers"
    nLen = len(sNumber)
    if nLen < 4:
        return sNumber
    sRes = ""
    if "," not in sNumber:
        # nombre entier
        sRes = _formatNumber(sNumber, 3)

        # binaire
        if _zBinary.search(sNumber):
            sRes += "|" + _formatNumber(sNumber, 4)
        # numéros de téléphone
        if nLen == 10:
            if sNumber.startswith("0"):
                sRes += "|" + _formatNumber(sNumber, 2)                                                                 # téléphone français







|








>







448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
    if any( ":p" in sMorph  for sMorph in _oSpellChecker.getMorph(sWord) ):
        return "les|la"
    return "la"


_zBinary = re.compile("^[01]+$")

def formatNumber (sNumber, bOnlySimpleFormat=False):
    "add spaces or hyphens to big numbers"
    nLen = len(sNumber)
    if nLen < 4:
        return sNumber
    sRes = ""
    if "," not in sNumber:
        # nombre entier
        sRes = _formatNumber(sNumber, 3)
        if not bOnlySimpleFormat:
            # binaire
            if _zBinary.search(sNumber):
                sRes += "|" + _formatNumber(sNumber, 4)
            # numéros de téléphone
            if nLen == 10:
                if sNumber.startswith("0"):
                    sRes += "|" + _formatNumber(sNumber, 2)                                                                 # téléphone français

Modified gc_lang/fr/rules.grx from [514c0b60ab] to [b17dac5a68].

1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
....
1136
1137
1138
1139
1140
1141
1142

1143
1144
1145
1146
1147
1148
1149
....
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314

1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330

1331
1332
1333
1334
1335
1336
1337
.....
13226
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
.....
17420
17421
17422
17423
17424
17425
17426

17427
17428
17429
17430
17431
17432
17433
TEST: Succession : a{{;}} b.                                                ->> " ;"
TEST: C’est assez {{: }}parlez !                                            ->> ": "
TEST: {{» }}C’est ce qu’on croit savoir.                                    ->> "» |« "


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

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

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

TEST: Ça a duré {{3µs}}                                 ->> 3 µs
TEST: Ça a duré {{3,5 µs}}                              ->> 3,5 µs
TEST: il y en a {{3 m²}}                                ->> 3 m²
TEST: il a fait {{10%}}                                 ->> 10 %
TEST: Ça coûte {{13,4¥}}.                               ->> 13,4 ¥
................................................................................
TEST: il est monté à {{18 %}}                           ->> 18 %
TEST: une température de {{22,4 °C}}                    ->> 22,4 °C
TEST: il en veut {{18kg}}                               ->> 18 kg
TEST: il me le propose pour {{243 gCO2/kWh}}            ->> 243 gCO2/kWh
TEST: il me le propose pour {{243,4 gCO2/kWh}}          ->> 243,4 gCO2/kWh
TEST: {{40 MHz}}                                        ->> 40 MHz
TEST: {{100 Ah}}                                        ->> 100 Ah

TEST: en l’an 2000 Urgondorletroll eut une idée
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


__[s]/typo(typo_math)__
................................................................................
!!!! Grands nombres                                                                               !!
!!
!!

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


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

TEST: {{12345}}                                 ->> 12 345
TEST: {{123456}}                                ->> 123 456
TEST: {{1234567}}                               ->> 1 234 567
TEST: {{12345678}}                              ->> 12 345 678
TEST: {{023456789}}                             ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                            ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
TEST: {{12345678901}}                           ->> 12 345 678 901
TEST: {{112798931830912839}}                    ->> 112 798 931 830 912 839
TEST: {{2308393909}}                            ->> 2 308 393 909|2308 393-909
TEST: {{2024}},9                                ->> 2 024
TEST: {{4000}} Å                                ->> 4 000

TEST: {{3240}} µA                               ->> 3 240
TEST: 1111 0011,01 (binaire)


__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
        <<- option("num") ->> =\0.replace(".", " ")                                                 && Grands nombres : utilisez des espaces insécables plutôt que des points.
................................................................................
    >éclat [de|d’] [>voie|vois|voit]
    le son de [la|cette|quelle|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs] [>voie|vois|voit]
        <<- /conf/ --1>> voix       && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    à [>voie|vois|voit] [basse|haute|basses|hautes]
        <<- /conf/ -2>> voix        && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    [>entendre|>écouter|>déblayer] ?@:[WX]¿ $:D [>voie|vois|voit]
    >donner ?@:[WX]¿ [de|d’] la >voie
    >faire entendre [la|cette|ma|ta|sa|notre|nos|votre|vos|leur+s] [>voie|vois|voit]
        <<- /conf/ --1>> voix       && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    >avoir ?@:[WX]¿ [>voie|vois|voit] au chapitre
        <<- /conf/ --3>> voix       && Confusion. Locution “avoir voix au chapitre”.|https://fr.wiktionary.org/wiki/avoir_voix_au_chapitre

    ## voie
    sur la [bonne|mauvaise] voix
    en ?[si|très|trop]¿ [bonne|mauvaise] [voix|vois|voit]
    [du|au|le] long [de|d’] la [voix|vois|voit]
        <<- /conf/ --1>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    [>avancer|>cheminer|>marcher|>courir] ?@:[WX]¿ sur [la|cette|une|quelle] voix
    [>emprunter|>indiquer|>montrer|>parcourir] ?@:[WX]¿ [la|cette|une|quelle] voix
        <<- /conf/ --1>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    >ouvrir ?@:[WX]¿ la voix [à|au|aux|<end>|,]
        <<- /conf/ --2>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    en voix [de|d’] [achèvement|acquisition|décrépitude|développement|dissolution|disparition|extinction|guérison|obtention|rémission|résorption|rétablissement|spécialisation]
    par voix de >conséquence
................................................................................
    >épreuve [de|d’] force
    >erreur [de|d’] [calcul|jeunesse|jugement|positionnement]
    >erreur d’ [appréciation|interprétation|orthographe]
    >escalier [de|d’] secours
    >escroquerie à l’ assurance
    >espérance [de|d’] vie
    >espérance [de|d’] vie en bonne santé

    >état [de|d’] [âme|conservation|esprit|fait|service|urgence]
    >état d’ extrême urgence
    >état [de|d’] l’ art
    >étoile [de|d’] mer
    >étoile à neutrons
    >étui à cigarettes
    >examen d’ entrée







|





|





|







 







>







 







<
<
|

|
>



|












>







 







|
|













|







 







>







1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
....
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
....
1304
1305
1306
1307
1308
1309
1310


1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
.....
13227
13228
13229
13230
13231
13232
13233
13234
13235
13236
13237
13238
13239
13240
13241
13242
13243
13244
13245
13246
13247
13248
13249
13250
13251
13252
13253
13254
13255
13256
.....
17421
17422
17423
17424
17425
17426
17427
17428
17429
17430
17431
17432
17433
17434
17435
TEST: Succession : a{{;}} b.                                                ->> " ;"
TEST: C’est assez {{: }}parlez !                                            ->> ": "
TEST: {{» }}C’est ce qu’on croit savoir.                                    ->> "» |« "


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

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

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

TEST: Ça a duré {{3µs}}                                 ->> 3 µs
TEST: Ça a duré {{3,5 µs}}                              ->> 3,5 µs
TEST: il y en a {{3 m²}}                                ->> 3 m²
TEST: il a fait {{10%}}                                 ->> 10 %
TEST: Ça coûte {{13,4¥}}.                               ->> 13,4 ¥
................................................................................
TEST: il est monté à {{18 %}}                           ->> 18 %
TEST: une température de {{22,4 °C}}                    ->> 22,4 °C
TEST: il en veut {{18kg}}                               ->> 18 kg
TEST: il me le propose pour {{243 gCO2/kWh}}            ->> 243 gCO2/kWh
TEST: il me le propose pour {{243,4 gCO2/kWh}}          ->> 243,4 gCO2/kWh
TEST: {{40 MHz}}                                        ->> 40 MHz
TEST: {{100 Ah}}                                        ->> 100 Ah
TEST: {{1001 ans}}                                      ->> 1 001 ans
TEST: en l’an 2000 Urgondorletroll eut une idée
TEST: 1998 s’annonce grandiose.
TEST: il y en a 3,43 milliards.
TEST: je veux 200 euros.


__[s]/typo(typo_math)__
................................................................................
!!!! Grands nombres                                                                               !!
!!
!!

__[s]/num(num_grand_nombre_soudé)__
    \d\d\d\d+
        <<- not before("NF[  -]?(C|E|P|Q|X|Z|EN(?:[  -]ISO|)) *$") >>>


        <<- ((after("^(?:,[0-9]+[⁰¹²³⁴⁵⁶⁷⁸⁹]?|[⁰¹²³⁴⁵⁶⁷⁸⁹])") and not (re.search("^[01]+$", \0) and after("^,[01]+\\b")))
            or after("^[   ]*(?:[kcmµn]?(?:[slgJKΩ]|m[²³]?|Wh?|Hz|dB)|[%‰€$£¥Åℓhj]|min|°C|℃)(?![\\w’'])"))
        ->> =formatNumber(\0, True)                                                                 && Formatage des grands nombres.
        <<- __else__ and \0.__len__() > 4 ->> =formatNumber(\0)                                     && Formatage des grands nombres.

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

TEST: {{12345}}                                 ->> 12 345
TEST: {{123456}}                                ->> 123 456
TEST: {{1234567}}                               ->> 1 234 567
TEST: {{12345678}}                              ->> 12 345 678
TEST: {{023456789}}                             ->> 023 456 789|023 45 67 89|02 345 67 89
TEST: {{0234567890}}                            ->> 0 234 567 890|02 34 56 78 90|023 456 78 90|0234 567-890
TEST: {{12345678901}}                           ->> 12 345 678 901
TEST: {{112798931830912839}}                    ->> 112 798 931 830 912 839
TEST: {{2308393909}}                            ->> 2 308 393 909|2308 393-909
TEST: {{2024}},9                                ->> 2 024
TEST: {{4000}} Å                                ->> 4 000
TEST: {{10010}} €                               ->> 10 010
TEST: {{3240}} µA                               ->> 3 240
TEST: 1111 0011,01 (binaire)


__[s>(num_grand_nombre_avec_points)__
    \d\d?\d?(?:[.]\d\d\d)+(?![0-9])
        <<- option("num") ->> =\0.replace(".", " ")                                                 && Grands nombres : utilisez des espaces insécables plutôt que des points.
................................................................................
    >éclat [de|d’] [>voie|vois|voit]
    le son de [la|cette|quelle|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs] [>voie|vois|voit]
        <<- /conf/ --1>> voix       && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    à [>voie|vois|voit] [basse|haute|basses|hautes]
        <<- /conf/ -2>> voix        && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    [>entendre|>écouter] ?@:[WX]¿ $:D [>voie|vois|voit]
    [>donner|>redonner] ?@:[WX]¿ [de|d’] la >voie
    >faire entendre [la|cette|ma|ta|sa|notre|nos|votre|vos|leur+s] [>voie|vois|voit]
        <<- /conf/ --1>> voix       && Confusion. Pour évoquer un son humain, animal ou instrumental, écrivez “voix”.|https://fr.wiktionary.org/wiki/voix

    >avoir ?@:[WX]¿ [>voie|vois|voit] au chapitre
        <<- /conf/ --3>> voix       && Confusion. Locution “avoir voix au chapitre”.|https://fr.wiktionary.org/wiki/avoir_voix_au_chapitre

    ## voie
    sur la [bonne|mauvaise] voix
    en ?[si|très|trop]¿ [bonne|mauvaise] [voix|vois|voit]
    [du|au|le] long [de|d’] la [voix|vois|voit]
        <<- /conf/ --1>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    [>avancer|>cheminer|>marcher|>courir] ?@:[WX]¿ sur [la|cette|une|quelle] voix
    [>déblayer|>emprunter|>indiquer|>montrer|>parcourir] ?@:[WX]¿ [la|cette|une|quelle] voix
        <<- /conf/ --1>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    >ouvrir ?@:[WX]¿ la voix [à|au|aux|<end>|,]
        <<- /conf/ --2>> voie       && Confusion. La voix est un son humain, animal ou instrumental. Pour évoquer un chemin, écrivez “voie”.|https://fr.wiktionary.org/wiki/voie

    en voix [de|d’] [achèvement|acquisition|décrépitude|développement|dissolution|disparition|extinction|guérison|obtention|rémission|résorption|rétablissement|spécialisation]
    par voix de >conséquence
................................................................................
    >épreuve [de|d’] force
    >erreur [de|d’] [calcul|jeunesse|jugement|positionnement]
    >erreur d’ [appréciation|interprétation|orthographe]
    >escalier [de|d’] secours
    >escroquerie à l’ assurance
    >espérance [de|d’] vie
    >espérance [de|d’] vie en bonne santé
    >essence [de|d’] térébenthine
    >état [de|d’] [âme|conservation|esprit|fait|service|urgence]
    >état d’ extrême urgence
    >état [de|d’] l’ art
    >étoile [de|d’] mer
    >étoile à neutrons
    >étui à cigarettes
    >examen d’ entrée