Grammalecte  Check-in [1c5bdb25b6]

Overview
Comment:merge trunk
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | gcerw
Files: files | file ages | folders
SHA3-256: 1c5bdb25b6914cab0ae4458c074041f57891d47c12b781f957ee5199bf19d6e8
User & Date: olr on 2020-04-06 13:15:56
Other Links: branch diff | manifest | tags
Context
2020-04-06
18:24
[core][py] remove lexicographer from gc engine check-in: e1254b8ae2 user: olr tags: core, gcerw
13:15
merge trunk check-in: 1c5bdb25b6 user: olr tags: gcerw
12:43
[fr] ajustements check-in: 749f9374be user: olr tags: fr, trunk
2020-04-05
08:39
[core][cli][graphsell][lo][py] move lexicographer from gc engine to graphspell check-in: ba3c939f60 user: olr tags: cli, core, gcerw, graphspell, lo
Changes

Modified doc/build.md from [775996ca4c] to [2cc4d3d6c1].


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
..
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71


# How to build Grammalecte

## Required ##

For building:

* Python 3.7+
* NodeJS
  * npm
  * web-ext : `https://developer.mozilla.org/fr/Add-ons/WebExtensions/Getting_started_with_web-ext`

For testing:

* Firefox Developper
* Firefox Nightly
* Thunderbird


## Commands ##

**Build a language**

`make.py LANG`
................................................................................
> Install the LibreOffice extension.

`-fx --firefox`

> Launch Firefox Developper.
> Unit tests can be launched from the menu (Tests section).

`-we --webext`

> Launch Firefox Nightly.
> Unit tests can be launched from the menu (Tests section).

`-tb --thunderbird`

> Launch Thunderbird.
>







|
|
|
|



|
<
|







 







|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

17
18
19
20
21
22
23
24
..
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# Building Grammalecte

# How to build Grammalecte

## Required ##

For building:

* Python 3.7+ > [download](https://www.python.org/)
* NodeJS > [download](https://nodejs.org/)
  * npm (should be installed with NodeJS)
  * web-ext > [instructions](https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/)

For testing:

* Firefox Developer > [download](https://www.mozilla.org/en-US/firefox/developer/)

* Thunderbird > [download](https://www.thunderbird.net/)


## Commands ##

**Build a language**

`make.py LANG`
................................................................................
> Install the LibreOffice extension.

`-fx --firefox`

> Launch Firefox Developper.
> Unit tests can be launched from the menu (Tests section).

`-fxn --firefox_nightly`

> Launch Firefox Nightly.
> Unit tests can be launched from the menu (Tests section).

`-tb --thunderbird`

> Launch Thunderbird.

Modified gc_lang/fr/build.py from [bc942a4468] to [5f4b392f44].

49
50
51
52
53
54
55
56

57

58


59
60
61
62
63
64
65
66
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    _copyGrammalecteJSPackageInZipFile(hZip, sLang)
    for spf in ["LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    dVars = _createOptionsForThunderbird(dVars)
    helpers.addFolderToZipAndFileFile(hZip, "gc_lang/"+sLang+"/mailext", "", dVars, True)
    hZip.close()
    spExtension = dVars['win_tb_debug_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_debug_extension_path']

    file_util.copy_file(spfZip, spExtension + "/" + dVars['tb_identifier']+ ".xpi")  # Filename for TB is just <identifier.xpi>

    spExtension = dVars['win_tb_beta_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_beta_extension_path']


    file_util.copy_file(spfZip, spExtension + "/" + dVars['tb_identifier']+ ".xpi")  # Filename for TB is just <identifier.xpi>


def _createOptionsForThunderbird (dVars):
    dVars['sXULTabs'] = ""
    dVars['sXULTabPanels'] = ""
    # dialog options
    for sSection, lOpt in dVars['lStructOpt']:







|
>
|
>
|
>
>
|







49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    hZip = zipfile.ZipFile(spfZip, mode='w', compression=zipfile.ZIP_DEFLATED)
    _copyGrammalecteJSPackageInZipFile(hZip, sLang)
    for spf in ["LICENSE.txt", "LICENSE.fr.txt"]:
        hZip.write(spf)
    dVars = _createOptionsForThunderbird(dVars)
    helpers.addFolderToZipAndFileFile(hZip, "gc_lang/"+sLang+"/mailext", "", dVars, True)
    hZip.close()
    #spExtension = dVars['win_tb_debug_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_debug_extension_path']
    #if os.path.isdir(spExtension):
    #    file_util.copy_file(spfZip, spExtension + "/" + dVars['tb_identifier']+ ".xpi")  # Filename for TB is just <identifier.xpi>
    #    print(f"TB extension copied in <{spExtension}>")
    #spExtension = dVars['win_tb_beta_extension_path']  if platform.system() == "Windows"  else dVars['linux_tb_beta_extension_path']
    #if os.path.isdir(spExtension):
    #    print(f"TB extension copied in <{spExtension}>")
    #    file_util.copy_file(spfZip, spExtension + "/" + dVars['tb_identifier']+ ".xpi")  # Filename for TB is just <identifier.xpi>


def _createOptionsForThunderbird (dVars):
    dVars['sXULTabs'] = ""
    dVars['sXULTabPanels'] = ""
    # dialog options
    for sSection, lOpt in dVars['lStructOpt']:

Modified gc_lang/fr/config.ini from [200e658429] to [9df20b99dc].

55
56
57
58
59
60
61

62
63
64
65
66
67
68
# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
win_tb_path = C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe
win_tb_beta_path = C:\Program Files\Thunderbird Daily\thunderbird.exe
linux_tb_path = /usr/bin/thunderbird
linux_tb_beta_path = /usr/bin/thunderbird

win_tb_debug_extension_path = D:\_temp\tb-debug.profile\extensions
linux_tb_debug_extension_path = ~/tb-debug.profile/extensions
win_tb_beta_extension_path = D:\_temp\tb-beta.profile\extensions
linux_tb_beta_extension_path = ~/tb-beta.profile/extensions
# Set Thunderbird folder in your PATH variable
# Create a local profile:
#     	thunderbird -CreateProfile "debug _build\tb-debug.profile"







>







55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Thunderbird
tb_identifier = French-GC-TB@grammalecte.net
tb_name = Grammalecte [fr]
win_tb_path = C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe
win_tb_beta_path = C:\Program Files\Thunderbird Daily\thunderbird.exe
linux_tb_path = /usr/bin/thunderbird
linux_tb_beta_path = /usr/bin/thunderbird
# useless now
win_tb_debug_extension_path = D:\_temp\tb-debug.profile\extensions
linux_tb_debug_extension_path = ~/tb-debug.profile/extensions
win_tb_beta_extension_path = D:\_temp\tb-beta.profile\extensions
linux_tb_beta_extension_path = ~/tb-beta.profile/extensions
# Set Thunderbird folder in your PATH variable
# Create a local profile:
#     	thunderbird -CreateProfile "debug _build\tb-debug.profile"

Modified gc_lang/fr/rules.grx from [b2eeefb17a] to [21c94a6458].

1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008



2009
2010
2011
2012
2013
2014
2015
....
8122
8123
8124
8125
8126
8127
8128

8129
8130
8131
8132
8133
8134
8135
8136
....
8199
8200
8201
8202
8203
8204
8205


8206
8207
8208
8209
8210
8211
8212
....
8742
8743
8744
8745
8746
8747
8748
8749
8750
8751
8752
8753
8754
8755
8756
....
9644
9645
9646
9647
9648
9649
9650



9651
9652
9653
9654
9655
9656
9657
.....
11215
11216
11217
11218
11219
11220
11221
11222
11223
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266



11267
11268
11269
11270
11271
11272
11273

11274
11275
11276
11277
11278
11279
11280
.....
12114
12115
12116
12117
12118
12119
12120
12121
12122
12123
12124
12125
12126
12127
12128
12129
.....
12514
12515
12516
12517
12518
12519
12520
12521
12522
12523
12524
12525
12526
12527
12528
.....
12686
12687
12688
12689
12690
12691
12692
12693
12694
12695
12696
12697
12698
12699
12700
12701
12702
12703
.....
12736
12737
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
.....
13306
13307
13308
13309
13310
13311
13312
13313
13314
13315
13316
13317
13318
13319
13320
13321
13322
13323
13324
13325
13326
13327
.....
13430
13431
13432
13433
13434
13435
13436

13437
13438
13439
13440
13441
13442
13443
.....
13465
13466
13467
13468
13469
13470
13471

13472
13473
13474
13475
13476
13477
13478
.....
13499
13500
13501
13502
13503
13504
13505
13506
13507
13508
13509
13510
13511
13512
13513
.....
13764
13765
13766
13767
13768
13769
13770

13771
13772
13773
13774
13775
13776
13777
13778
13779
13780
13781

13782
13783
13784
13785
13786
13787
13788
.....
18211
18212
18213
18214
18215
18216
18217
18218
18219
18220
18221
18222
18223
18224
18225
18226
18227
18228
.....
18880
18881
18882
18883
18884
18885
18886



18887
18888
18889
18890
18891
18892
18893
18894
18895
18896

18897
18898
18899
18900
18901
18902
18903
.....
18992
18993
18994
18995
18996
18997
18998












18999
19000
19001
19002
19003
19004
19005
.....
19081
19082
19083
19084
19085
19086
19087
19088
19089
19090
19091

19092











19093
19094
19095
19096
19097
19098
19099
.....
25080
25081
25082
25083
25084
25085
25086
25087
25088
25089
25090
25091
25092
25093
25094
25095

    en tant que  *WORD
        <<- =>> exclude(\4, ":[123][sp]")

    en peine
        <<- =>> exclude(\2, ":V")

    par  *WORD
        <<- =>> exclude(\2, ":[123][sp]")

    nombre  [de|d’|des]  [@:[NA]|<end>|,]
        <<- not morph(<1, ":D") >>>
        <<- morph(<1, ":A.*:[me]:[si]") =>> add_morph(\1, [">nombre/:G:D"])
        <<- __else__ =>> define(\1, [">nombre/:G:D"])




    plein  [de|d’]  @:[AN]
        <<- not morph(<1, ":D.*:m|>(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> =define(\1, [":G"])

    source [de|d’]
        <<- morph(<1, ">(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> define(\1, [":LV"])

    tout feu ?,¿ tout >flamme
................................................................................

    des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|nous|vous|on|ceux|celles|celui|celle]
        <<- /conf/ not \1.isupper() and not \2.isupper() -1>> de|dès                                # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
        <<- /conf/ __also__ and hasSimil(\2, ":[NA].*:[pi]") -2>> =suggSimil(\2, ":[NA].*:[pi]", True)      # Confusion probable. Pour la préposition, écrivez “dès” ou “de”.

    des ~^\d{2,5}$  [<end>|,]
    des ~^\d{2,5}$  @:¬:[NA].*:[ip]|>(?:à|et|ou)/

        <<- /conf/ not value(<1, "|%|") and not morph(<1, ":B|>(?:pourcent|barre|seuil)/") -1>> dès # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] *NUM ans
    [dés|des] $:B ans
    [dés|des] un an
        <<- /conf/ not morph(<1, ":R|>(?:approcher|anniversaire|cap|célébration|commémoration|occasion|passage|programme|terme|classe|autour|celui|ceux|celle|celles)/") and not value(>1, "|de|du|des|d’|")
            and not before("% +$")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s
................................................................................
TEST: sous le seuil des 10 %
TEST: notre revue des 24 et 25 décembre
TEST: J’ai des X230.
TEST: Pour les enfants placés, l’angoisse du passage des 18 ans
TEST: C’est la fin des 35 heures.
TEST: 98 % des 18‑29 ans considéraient cela comme évident
TEST: Gagnez trois dés lors d’un test




# diagnostic / diagnotique // pronostic / pronostique // public / publique
__conf_diagnostic_pronostique__
    [ce|un|du|mon|notre|votre|quel] [diagnostique|pronostique|publique]
        <<- /conf/ -2>> =\2.replace("que", "c").replace("QUE", "C")                                 # Confusion probable. Le nom s’écrit avec un “c”.

................................................................................
        <<- /conf/ -2>> =\1.replace("û", "u")                                                       # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

TEST: Très {{jeûne}}, elle a su qu’elle ne voulait pas d’une vie ordinaire.


# la / l’a
__conf_il_elle_on_la_l_a_vconj__
    [il|elle|on]  ?[nous|vous]¿  l’  a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\-1, ":[123][sp]", ":[GQ]") --3:-2>> la                # Confusion probable. Pour un pronom objet féminin, écrivez “la”.

    [ne|me|te|se]  l’ a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\4, ":[123][sp]", ":[GQ]") -2:3>> la                   # Confusion probable. Pour un pronom objet féminin, écrivez “la”.

    ne  [nous|vous]  l’ a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\5, ":[123][sp]", ":[GQ]") -3:4>> la                   # Confusion probable. Pour un pronom objet féminin, écrivez “la”.
................................................................................
TEST: quel {{puis}} artésien ?
TEST: de quel {{puis}} quantique parles-tu ?
TEST: {{Puis de potentiel}} harmonique
TEST: Beaucoup d’abord, ensuite plusieurs puis quelques-uns seulement.
TEST: Il faut discrètement en creuser plusieurs puis arrêter aussitôt.
TEST: Il vient tel quel puis semble avoir des doutes.
TEST: avec un puis plusieurs autres.





# quand / quant / qu’en
__conf_quant_quand_qu_en__
    quand à
        <<- /conf/ not morph(<1, ">(?:arriver|venir|à|revenir|partir|repartir|aller|de)/") and not after("^ +[mts]on tour[, ]")
        -1>> quant                                                          # Confusion probable. Quand = à quel moment. Quant à = à propos de.|https://fr.wiktionary.org/wiki/quant_%C3%A0
................................................................................
!!
!!
!!!! Adverbes de négation                                                                         !!
!!
!!

__neg_ne_manquant__
    [<start>|,|(]  je             [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> ne \3                                                                        # Ne … \5 : il manque l’adverbe de négation.

    [<start>|,|(]  [je|j’]        [en|y]                                                  @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             [en|y]                                                  @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   [en|y]                                                  @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           [en|y]                                                  @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           [en|y]                                                  @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    [en|y]                                                  @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> n’\3                                                                         # Ne … \5 : il manque l’adverbe de négation.

    [<start>|,|(]  je             [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:3p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  je             [le|la|l’|les]                  [lui|leur|en|y]         @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             [le|la|l’|les]                  [lui|leur|en|y]         @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   [le|la|l’|les]                  [lui|leur|en|y]         @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           [le|la|l’|les]                  [lui|leur|en|y]         @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           [le|la|l’|les]                  [lui|leur|en|y]         @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    [le|la|l’|les]                  [lui|leur|en|y]         @:3p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  je             [lui|leur]                      en                      @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             [lui|leur]                      en                      @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   [lui|leur]                      en                      @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           [lui|leur]                      en                      @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           [lui|leur]                      en                      @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    [lui|leur]                      en                      @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> ne \3                                                                        # Ne … \6 : il manque l’adverbe de négation.

    [<start>|,|(]  [je|j’]        @:1s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu             @:2s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on]   @:3s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous           @:1p¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous           @:2p¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles]    @:3p¬:Ov    [pas|rien|jamais|guère|point]
        <<- /neg/ morph(\3, ">[aâeéêiîoôuœæ]") -3>> n’\3                                            # Ne … \4 : il manque l’adverbe de négation.
        <<- /neg/ __else__ -3>> ne \3                                                               # Ne … \4 : il manque l’adverbe de négation.




TEST: __neg__ On {{a}} pas compris.
TEST: __neg__ Il {{part}} pas encore.
TEST: __neg__ On {{vous}} a pas compris.
TEST: __neg__ On {{en}} a pas.
TEST: __neg__ Il {{y}} a jamais d’eau.
TEST: __neg__ je {{deviendrai}} pas hargneux.
TEST: __neg__ il {{le}} lui donne pas souvent.



!!
!!
!!!! Infinitif                                                                                    !!
!!
!!
................................................................................
    d’ ici ?[là|peu]¿
    d’ ici peu de temps
    d’ ici quelques [secondes|minutes|heures|jours|mois|trimestres|semestres|années|décennies|siècles|millénaires]
    d’ intérêt général
    d’ ordinaire
    d’ origine [inconnue|douteuse|plébéienne|aristocratique]
    d’ ordre général
    d’ où qu’ [il|elle|on] vienne
    d’ où qu’ [ils|elles] viennent
    d’ ouest en est
    d’ [ors|ores] et déjà
    d’ un autre côté
    d’ un [bout|jour] à l’ autre
    d’ un côté comme [de|d’] l’ autre
    d’ un commun accord
    d’ un pas [alerte|mesuré]
................................................................................
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle [de|d’] vie
    jusqu’ à ce que mort s’ ensuive
    jusqu’ à ce que [j’|il|elle|on] en sache plus
    jusqu’ à ce que tu en saches plus
    jusqu’ à ce que nous en sachions plus
    jusqu’ à ce que vous en sachiez plus
    jusqu’ à ce que [ils|elles] en sachent plus
    jusque-là
    ?[de|d’]¿ là
    ?[de|d’]¿ là-bas
    ?[de|d’]¿ là-haut
    ?[de|d’]¿ là-dedans
    ?[de|d’]¿ là-dehors
    ?[de|d’]¿ là-derrière
................................................................................
    primo
    quand bien même
    quand bon [me|te|lui|nous|vous|leur] [semble|semblera|semblait]
    quant à [ça|cela|ceci]
    que [ça|ceci|cela] [me|te|lui|leur|nous|vous] plaise ou non
    que je [le|l’] veuille ou non
    que tu [le|l’] veuilles ou non
    qu’ [il|elle|on] [le|l’] veuille ou non
    que vous [le|l’] vouliez ou non
    que nous [le|l’] voulions ou non
    qu’ [ils|elles] [le|l’] veuillent ou non
    qu’ à cela ne tienne
    quel qu’ en soit [le|l’] [moyen|prix|danger]
    quel qu’ en soit [le|l’] risque ?financier¿
    quelle qu’ en soit la [cause|raison]
    quelque [part|temps]
    quelquefois
    quelques fois
................................................................................
    sans pour autant y prendre [garde|goût|gout]
    sans [me|te|lui|nous|vous|leur|y] prêter attention
    sans [que|qu’] je [le|l’] [sache|susse]
    sans [que|qu’] tu [le|l’] [saches|susses]
    sans [que|qu’] [il|elle|on|$:M] [le|l’] [sache|sût]
    sans [que|qu’] nous [le|l’] [sachions|sussions]
    sans [que|qu’] vous [le|l’] [sachiez|sussiez]
    sans [que|qu’] [ils|elles] [le|l’] [sachent|sussent]
    sans queue ni tête
    sans raison apparente
    sans vouloir [me|m’|te|t’|lui|nous|vous|leur] manquer de respect
    sans y [parvenir|réussir|réfléchir|songer|penser]
    sans y [réfléchir|songer|penser] à [deux|2] fois
    sans y faire attention
    sans y prendre [garde|goût|gout|ombrage]
................................................................................
    [plus|aussi]        @:[AW]      les [uns|unes] que les autres
        <<- ~3:0>> *

    pour  autant  [que|qu’]  [je|il|elle|on]  le  sache
    pour  autant  [que|qu’]  tu               le  saches
    pour  autant  [que|qu’]  nous             le  sachions
    pour  autant  [que|qu’]  vous             le  sachiez
    pour  autant  [que|qu’]  [ils|elles]      le  sachent
        <<- ~>> *

    pour  autant  [que|qu’]  [je|il|elle|on]  sache      [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  tu               saches     [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  nous             sachions   [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  vous             sachiez    [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  [ils|elles]      sachent    [,|@¬:Y|<end>]
        <<- ~1:5>> *

    pour cette raison [que|qu’]
        <<- ~1:3>> *

    pour les uns    @:¬:[AQ].*:[me]:[pi]
    pour les autres @:¬:[AQ].*:[pi]
................................................................................
    >cellule [de|d’] détention provisoire
    >centre d’ éducation [populaire|surveillée]
    >centre [de|d’] rétention ?[préventive|administrative]¿
    >chair à [pâté|>canon]
    >chair [de|d’] poule
    >chambre à [coucher|gaz]
    >chambre [de|d’] [agriculture|hôte|hôtel|hôtes|commerce|compensation|décompression|dégrisement]

    [>chariot|>charriot] à [bagages|roulettes]
    >chasse à courre
    >chasse à l’ homme
    >chasse d’ eau
    >chasseur [de|d’] primes
    >chemin [de|d’] [traverse|fer]
    >chemise [de|d’] nuit
................................................................................
    >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]

    >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
................................................................................
    >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 bord
    >élément à charge
    >emploi du temps
    >enterrement [de|d’] vie [de|d’] garçon
    >enterrement [de|d’] vie [de|d’] jeune fille
    >entrée [de|d’] service
    >épée à deux mains
    >épingle à cravate
................................................................................
    >vecteur [>accélération|>position|>rotation|>vitesse]
    >véhicule [de|d’] location
    >vente à domicile
    >vente aux enchères
    >vérification [de|d’] routine
    vernis à ongles
    >verre à pied

    >voie [de|d’] [recours|perdition]
    >vol à l’ étalage
    >vol à la [sauvette|tire]
    >vol à main armée
    >volée [de|d’] bois vert
    >voiture [de|d’] location
    >zone [de|d’] confort
    >zone [de|d’] transit ?principal¿
        <<- ~2:0>> *
        <<- =>> =select(\1, ":N")


    [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
................................................................................

    vous            ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferrez       $:Y
        <<- /conf/ not morph(<1, ":R") --2>> ferez                                                  # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    vous            ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferriez      $:Y
        <<- /conf/ not morph(<1, ":R") --2>> ferez                                                  # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    [ils|elles]     ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferront      $:Y
        <<- /conf/ not morph(<1, ":R") --2>> feront                                                 # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    [ils|elles]     ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferraient    $:Y
        <<- /conf/ not morph(<1, ":R") --2>> feraient                                               # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

TEST: nous vous {{ferrons}} apparaître au générique
TEST: nous vous {{ferrions}} prendre
TEST: vous les {{ferrez}} pendre demain
TEST: vous nous {{ferriez}} mourir de rire
TEST: ils le {{ferront}} crever à petit feu
................................................................................

    >coup de [>pâte|pat]
        <<- /conf/ -3>> patte                                   # Confusion. Une pâte est une matière pâteuse. Pour désigner le membre d’un animal, écrivez “patte”.

    >retomber sur [mes|tes|ses|ces|nos|vos|leur|leurs] [>pâte|pat]
        <<- /conf/ --1>> pattes                                 # Confusion. Une pâte est une matière pâteuse. Pour désigner le membre d’un animal, écrivez “patte”.




TEST: Prépare la {{patte}} à tarte.
TEST: Ils mangent souvent des {{pattes}} au thon.
TEST: Des {{pattes}} alimentaires.
TEST: Elles ont acheté de la {{patte}} à tartiner.
TEST: La {{patte}} à pizza est plus épaisse que la pâte à crêpes.
TEST: Elle adore la {{patte}} d’amande.
TEST: Il est comme un coq en {{pattes}} là.
TEST: Elle n’a jamais mis la main à la {{patte}}.
TEST: donne-moi un coup de {{pâte}}
TEST: elle retombe toujours sur ses {{pâtes}}.



# péché / pêcher
__conf_péché_pêcher2__
    >pêcher par excès [de|d’]
    >pêcher par [insuffisance|omission|orgueil]
        <<- /conf/ -1>> pécher                                  # Confusion : pêcher (capturer des poissons) ≠ pécher (faire un écart de conduite).|https://fr.wiktionary.org/wiki/p%C3%A9cher
................................................................................
TEST: la petite anecdote {{peu}} nous nuire.
TEST: l’école primaire {{peu}} espérer recevoir de nouveaux moyens cette année
TEST: un sale voyou {{peu}} {{marquer}}
TEST: une petite personne {{peu}} {{inspirer}}
TEST: mon meilleur ami {{peu}} {{remarquer}} par les profs
TEST: L’ouvrage décrit très peu les divers modes d’actions.














# peut-être / peut être
__conf_peut_être2__
    *WORD peut être
        <<- /conf/ space_after(\2, 1, 1) and morph(\1, ":V", ":[NAQGM]") -2:3>> peut-être           # Confusion probable. Pour dire “possiblement”, écrivez “peut-être”.

    <start> peut être
................................................................................
        <<- /conf/ --1>> puits
        # Confusion. Si vous parlez d’un trou fait pour puiser quelque chose (ou pour amener quelque chose), écrivez “puits”.|https://fr.wiktionary.org/wiki/puits

TEST: Forage de son {{puis}} prévu demain
TEST: Creuser un {{puis}}, pas si compliqué


# qu’à / cas
__conf_qu_à_cas__
    [je|tu|il|elle|on|nous|vous|ils|elles|iel|iels] ?n’¿ >avoir  [ca|cas]  @:(?:Ov|Y)
        <<- /conf/ --2>> qu’à                                   # Confusion. Écrivez “qu’à”, c’est-à-dire la contraction de “que” suivi de la préposition verbale “à”.













TEST: tu n’as {{cas}} prendre le train


# quand même / comme même
__conf_quand_même__
    comme même [<end>|,]
    comme même @:(?:Os|C)
................................................................................
    <start>  si  nous  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":1p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si nous avions perdu, nous aurions recommencé. »

    <start>  si  vous  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  si  vous  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":2p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si vous aviez perdu, vous auriez recommencé. »

    <start>  [si|s’]  [ils|elles]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  [si|s’]  [ils|elles]  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":3p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si elles avaient perdu, elles auraient recommencé. »

    <start>  si  [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur]  @:[NA].*:[si]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  si  [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur]  @:[NA].*:[si]  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\5, ":K") -5>> =suggVerbTense(\5, ":Iq", ":3s")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « S’il avait perdu, il aurait recommencé. »

    <start>  si  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines]  @:[NA].*:[pi]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K







|
|






>
>
>







 







>
|







 







>
>







 







|







 







>
>
>







 







|
|
|
|
|
|


|
|
|
|
|
|


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


|
|
|
|
|
|



>
>
>
|
|
|
|
|
|
|
>







 







|
|







 







|







 







|


|







 







|







 







|






|







 







>







 







>







 







|







 







>











>







 







|


|







 







>
>
>










>







 







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







 







|

|
|
>

>
>
>
>
>
>
>
>
>
>
>







 







|
|







1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
....
8125
8126
8127
8128
8129
8130
8131
8132
8133
8134
8135
8136
8137
8138
8139
8140
....
8203
8204
8205
8206
8207
8208
8209
8210
8211
8212
8213
8214
8215
8216
8217
8218
....
8748
8749
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8760
8761
8762
....
9650
9651
9652
9653
9654
9655
9656
9657
9658
9659
9660
9661
9662
9663
9664
9665
9666
.....
11224
11225
11226
11227
11228
11229
11230
11231
11232
11233
11234
11235
11236
11237
11238
11239
11240
11241
11242
11243
11244
11245
11246
11247
11248
11249
11250
11251
11252
11253
11254
11255
11256
11257
11258
11259
11260
11261
11262
11263
11264
11265
11266
11267
11268
11269
11270
11271
11272
11273
11274
11275
11276
11277
11278
11279
11280
11281
11282
11283
11284
11285
11286
11287
11288
11289
11290
11291
11292
11293
.....
12127
12128
12129
12130
12131
12132
12133
12134
12135
12136
12137
12138
12139
12140
12141
12142
.....
12527
12528
12529
12530
12531
12532
12533
12534
12535
12536
12537
12538
12539
12540
12541
.....
12699
12700
12701
12702
12703
12704
12705
12706
12707
12708
12709
12710
12711
12712
12713
12714
12715
12716
.....
12749
12750
12751
12752
12753
12754
12755
12756
12757
12758
12759
12760
12761
12762
12763
.....
13319
13320
13321
13322
13323
13324
13325
13326
13327
13328
13329
13330
13331
13332
13333
13334
13335
13336
13337
13338
13339
13340
.....
13443
13444
13445
13446
13447
13448
13449
13450
13451
13452
13453
13454
13455
13456
13457
.....
13479
13480
13481
13482
13483
13484
13485
13486
13487
13488
13489
13490
13491
13492
13493
.....
13514
13515
13516
13517
13518
13519
13520
13521
13522
13523
13524
13525
13526
13527
13528
.....
13779
13780
13781
13782
13783
13784
13785
13786
13787
13788
13789
13790
13791
13792
13793
13794
13795
13796
13797
13798
13799
13800
13801
13802
13803
13804
13805
.....
18228
18229
18230
18231
18232
18233
18234
18235
18236
18237
18238
18239
18240
18241
18242
18243
18244
18245
.....
18897
18898
18899
18900
18901
18902
18903
18904
18905
18906
18907
18908
18909
18910
18911
18912
18913
18914
18915
18916
18917
18918
18919
18920
18921
18922
18923
18924
.....
19013
19014
19015
19016
19017
19018
19019
19020
19021
19022
19023
19024
19025
19026
19027
19028
19029
19030
19031
19032
19033
19034
19035
19036
19037
19038
.....
19114
19115
19116
19117
19118
19119
19120
19121
19122
19123
19124
19125
19126
19127
19128
19129
19130
19131
19132
19133
19134
19135
19136
19137
19138
19139
19140
19141
19142
19143
19144
.....
25125
25126
25127
25128
25129
25130
25131
25132
25133
25134
25135
25136
25137
25138
25139
25140

    en tant que  *WORD
        <<- =>> exclude(\4, ":[123][sp]")

    en peine
        <<- =>> exclude(\2, ":V")

    m’ [dame|sieur]
        <<- ~>> ␣

    nombre  [de|d’|des]  [@:[NA]|<end>|,]
        <<- not morph(<1, ":D") >>>
        <<- morph(<1, ":A.*:[me]:[si]") =>> add_morph(\1, [">nombre/:G:D"])
        <<- __else__ =>> define(\1, [">nombre/:G:D"])

    par  *WORD
        <<- =>> exclude(\2, ":[123][sp]")

    plein  [de|d’]  @:[AN]
        <<- not morph(<1, ":D.*:m|>(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> =define(\1, [":G"])

    source [de|d’]
        <<- morph(<1, ">(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> define(\1, [":LV"])

    tout feu ?,¿ tout >flamme
................................................................................

    des [ces|des|les|mes|ses|tes|nos|vos|ce|cet|cette|ma|ta|sa|mon|je|tu|il|ils|nous|vous|on|ceux|celles|celui|celle]
        <<- /conf/ not \1.isupper() and not \2.isupper() -1>> de|dès                                # Incohérence : les mots “\1” et “\2” ne devraient pas se succéder.
        <<- /conf/ __also__ and hasSimil(\2, ":[NA].*:[pi]") -2>> =suggSimil(\2, ":[NA].*:[pi]", True)      # Confusion probable. Pour la préposition, écrivez “dès” ou “de”.

    des ~^\d{2,5}$  [<end>|,]
    des ~^\d{2,5}$  @:¬:[NA].*:[ip]|>(?:à|et|ou)/
        <<- /conf/ not value(<1, "|%|") and not morph(<1, ":B|>(?:pourcent|barre|seuil|aucun|plusieurs|certaine?s|une?)/")
        -1>> dès # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    [dés|des] *NUM ans
    [dés|des] $:B ans
    [dés|des] un an
        <<- /conf/ not morph(<1, ":R|>(?:approcher|anniversaire|cap|célébration|commémoration|occasion|passage|programme|terme|classe|autour|celui|ceux|celle|celles)/") and not value(>1, "|de|du|des|d’|")
            and not before("% +$")
        -1>> dès                                                                                    # Confusion probable. Pour la préposition, écrivez “dès”.|https://fr.wiktionary.org/wiki/pr%C3%A8s
................................................................................
TEST: sous le seuil des 10 %
TEST: notre revue des 24 et 25 décembre
TEST: J’ai des X230.
TEST: Pour les enfants placés, l’angoisse du passage des 18 ans
TEST: C’est la fin des 35 heures.
TEST: 98 % des 18‑29 ans considéraient cela comme évident
TEST: Gagnez trois dés lors d’un test
TEST: aucun des 19 peuples concernés n’en veut
TEST: un des 18 sera bientôt là.


# diagnostic / diagnotique // pronostic / pronostique // public / publique
__conf_diagnostic_pronostique__
    [ce|un|du|mon|notre|votre|quel] [diagnostique|pronostique|publique]
        <<- /conf/ -2>> =\2.replace("que", "c").replace("QUE", "C")                                 # Confusion probable. Le nom s’écrit avec un “c”.

................................................................................
        <<- /conf/ -2>> =\1.replace("û", "u")                                                       # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

TEST: Très {{jeûne}}, elle a su qu’elle ne voulait pas d’une vie ordinaire.


# la / l’a
__conf_il_elle_on_la_l_a_vconj__
    [il|elle|on|iel]  ?[nous|vous]¿  l’  a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\-1, ":[123][sp]", ":[GQ]") --3:-2>> la                # Confusion probable. Pour un pronom objet féminin, écrivez “la”.

    [ne|me|te|se]  l’ a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\4, ":[123][sp]", ":[GQ]") -2:3>> la                   # Confusion probable. Pour un pronom objet féminin, écrivez “la”.

    ne  [nous|vous]  l’ a  ~^[bcdfghjklmnpqrstvwxz]
        <<- /conf/ morph(\5, ":[123][sp]", ":[GQ]") -3:4>> la                   # Confusion probable. Pour un pronom objet féminin, écrivez “la”.
................................................................................
TEST: quel {{puis}} artésien ?
TEST: de quel {{puis}} quantique parles-tu ?
TEST: {{Puis de potentiel}} harmonique
TEST: Beaucoup d’abord, ensuite plusieurs puis quelques-uns seulement.
TEST: Il faut discrètement en creuser plusieurs puis arrêter aussitôt.
TEST: Il vient tel quel puis semble avoir des doutes.
TEST: avec un puis plusieurs autres.





# quand / quant / qu’en
__conf_quant_quand_qu_en__
    quand à
        <<- /conf/ not morph(<1, ">(?:arriver|venir|à|revenir|partir|repartir|aller|de)/") and not after("^ +[mts]on tour[, ]")
        -1>> quant                                                          # Confusion probable. Quand = à quel moment. Quant à = à propos de.|https://fr.wiktionary.org/wiki/quant_%C3%A0
................................................................................
!!
!!
!!!! Adverbes de négation                                                                         !!
!!
!!

__neg_ne_manquant__
    [<start>|,|(]  je               [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] [le|la|l’|les|me|m’|te|t’|se|s’|nous|vous|lui|leur]     @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> ne \3                                                                        # Ne … \5 : il manque l’adverbe de négation.

    [<start>|,|(]  [je|j’]          [en|y]                                                  @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               [en|y]                                                  @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] [en|y]                                                  @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             [en|y]                                                  @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             [en|y]                                                  @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] [en|y]                                                  @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> n’\3                                                                         # Ne … \5 : il manque l’adverbe de négation.

    [<start>|,|(]  je               [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] [me|m’|te|t’|se|s’|nous|vous]   [le|la|l’|les|en|y]     @:3p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  je               [le|la|l’|les]                  [lui|leur|en|y]         @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               [le|la|l’|les]                  [lui|leur|en|y]         @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] [le|la|l’|les]                  [lui|leur|en|y]         @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             [le|la|l’|les]                  [lui|leur|en|y]         @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             [le|la|l’|les]                  [lui|leur|en|y]         @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] [le|la|l’|les]                  [lui|leur|en|y]         @:3p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  je               [lui|leur]                      en                      @:1s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               [lui|leur]                      en                      @:2s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] [lui|leur]                      en                      @:3s¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             [lui|leur]                      en                      @:1p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             [lui|leur]                      en                      @:2p¬:Ov  [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] [lui|leur]                      en                      @:3p¬:Ov  [pas|rien|jamais|guère|point]
        <<- /neg/ -3>> ne \3                                                                        # Ne … \6 : il manque l’adverbe de négation.

    [<start>|,|(]  [je|j’]          @:1s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  tu               @:2s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  [il|elle|on|iel] @:3s¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  nous             @:1p¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  vous             @:2p¬:Ov    [pas|rien|jamais|guère|point]
    [<start>|,|(]  [ils|elles|iels] @:3p¬:Ov    [pas|rien|jamais|guère|point]
        <<- /neg/ morph(\3, ">[aâeéêiîoôuœæ]") -3>> n’\3                                            # Ne … \4 : il manque l’adverbe de négation.
        <<- /neg/ __else__ -3>> ne \3                                                               # Ne … \4 : il manque l’adverbe de négation.

    [<start>|,|(]  [je|tu|il|elle|on|iel|nous|vous|ils|elles|iels]  >avoir  qu’  à
        <<- /neg/ -3>> n’\3                                                                         # Locution “n’avoir qu’à” : il manque l’adverbe de négation.

TEST: __neg__ On {{a}} pas compris.                     ->> n’a
TEST: __neg__ Il {{part}} pas encore.                   ->> ne part
TEST: __neg__ On {{vous}} a pas compris.                ->> ne vous
TEST: __neg__ On {{en}} a pas.                          ->> n’en
TEST: __neg__ Il {{y}} a jamais d’eau.                  ->> n’y
TEST: __neg__ je {{deviendrai}} pas hargneux.           ->> ne deviendrai
TEST: __neg__ il {{le}} lui donne pas souvent.          ->> ne le
TEST: __neg__ il {{a}} qu’à venir demain                ->> n’a


!!
!!
!!!! Infinitif                                                                                    !!
!!
!!
................................................................................
    d’ ici ?[là|peu]¿
    d’ ici peu de temps
    d’ ici quelques [secondes|minutes|heures|jours|mois|trimestres|semestres|années|décennies|siècles|millénaires]
    d’ intérêt général
    d’ ordinaire
    d’ origine [inconnue|douteuse|plébéienne|aristocratique]
    d’ ordre général
    d’ où qu’ [il|elle|on|iel] vienne
    d’ où qu’ [ils|elles|iels] viennent
    d’ ouest en est
    d’ [ors|ores] et déjà
    d’ un autre côté
    d’ un [bout|jour] à l’ autre
    d’ un côté comme [de|d’] l’ autre
    d’ un commun accord
    d’ un pas [alerte|mesuré]
................................................................................
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle
    jusqu’ à [mon|ton|son|notre|votre|leur] dernier souffle [de|d’] vie
    jusqu’ à ce que mort s’ ensuive
    jusqu’ à ce que [j’|il|elle|on] en sache plus
    jusqu’ à ce que tu en saches plus
    jusqu’ à ce que nous en sachions plus
    jusqu’ à ce que vous en sachiez plus
    jusqu’ à ce que [ils|elles|iels] en sachent plus
    jusque-là
    ?[de|d’]¿ là
    ?[de|d’]¿ là-bas
    ?[de|d’]¿ là-haut
    ?[de|d’]¿ là-dedans
    ?[de|d’]¿ là-dehors
    ?[de|d’]¿ là-derrière
................................................................................
    primo
    quand bien même
    quand bon [me|te|lui|nous|vous|leur] [semble|semblera|semblait]
    quant à [ça|cela|ceci]
    que [ça|ceci|cela] [me|te|lui|leur|nous|vous] plaise ou non
    que je [le|l’] veuille ou non
    que tu [le|l’] veuilles ou non
    qu’ [il|elle|on|iel] [le|l’] veuille ou non
    que vous [le|l’] vouliez ou non
    que nous [le|l’] voulions ou non
    qu’ [ils|elles|iels] [le|l’] veuillent ou non
    qu’ à cela ne tienne
    quel qu’ en soit [le|l’] [moyen|prix|danger]
    quel qu’ en soit [le|l’] risque ?financier¿
    quelle qu’ en soit la [cause|raison]
    quelque [part|temps]
    quelquefois
    quelques fois
................................................................................
    sans pour autant y prendre [garde|goût|gout]
    sans [me|te|lui|nous|vous|leur|y] prêter attention
    sans [que|qu’] je [le|l’] [sache|susse]
    sans [que|qu’] tu [le|l’] [saches|susses]
    sans [que|qu’] [il|elle|on|$:M] [le|l’] [sache|sût]
    sans [que|qu’] nous [le|l’] [sachions|sussions]
    sans [que|qu’] vous [le|l’] [sachiez|sussiez]
    sans [que|qu’] [ils|elles|iels] [le|l’] [sachent|sussent]
    sans queue ni tête
    sans raison apparente
    sans vouloir [me|m’|te|t’|lui|nous|vous|leur] manquer de respect
    sans y [parvenir|réussir|réfléchir|songer|penser]
    sans y [réfléchir|songer|penser] à [deux|2] fois
    sans y faire attention
    sans y prendre [garde|goût|gout|ombrage]
................................................................................
    [plus|aussi]        @:[AW]      les [uns|unes] que les autres
        <<- ~3:0>> *

    pour  autant  [que|qu’]  [je|il|elle|on]  le  sache
    pour  autant  [que|qu’]  tu               le  saches
    pour  autant  [que|qu’]  nous             le  sachions
    pour  autant  [que|qu’]  vous             le  sachiez
    pour  autant  [que|qu’]  [ils|elles|iels]      le  sachent
        <<- ~>> *

    pour  autant  [que|qu’]  [je|il|elle|on]  sache      [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  tu               saches     [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  nous             sachions   [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  vous             sachiez    [,|@¬:Y|<end>]
    pour  autant  [que|qu’]  [ils|elles|iels]      sachent    [,|@¬:Y|<end>]
        <<- ~1:5>> *

    pour cette raison [que|qu’]
        <<- ~1:3>> *

    pour les uns    @:¬:[AQ].*:[me]:[pi]
    pour les autres @:¬:[AQ].*:[pi]
................................................................................
    >cellule [de|d’] détention provisoire
    >centre d’ éducation [populaire|surveillée]
    >centre [de|d’] rétention ?[préventive|administrative]¿
    >chair à [pâté|>canon]
    >chair [de|d’] poule
    >chambre à [coucher|gaz]
    >chambre [de|d’] [agriculture|hôte|hôtel|hôtes|commerce|compensation|décompression|dégrisement]
    >chantier [de|d’] construction
    [>chariot|>charriot] à [bagages|roulettes]
    >chasse à courre
    >chasse à l’ homme
    >chasse d’ eau
    >chasseur [de|d’] primes
    >chemin [de|d’] [traverse|fer]
    >chemise [de|d’] nuit
................................................................................
    >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
................................................................................
    >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
    >enterrement [de|d’] vie [de|d’] garçon
    >enterrement [de|d’] vie [de|d’] jeune fille
    >entrée [de|d’] service
    >épée à deux mains
    >épingle à cravate
................................................................................
    >vecteur [>accélération|>position|>rotation|>vitesse]
    >véhicule [de|d’] location
    >vente à domicile
    >vente aux enchères
    >vérification [de|d’] routine
    vernis à ongles
    >verre à pied
    >virage à [*NUM|:B] degrés
    >voie [de|d’] [recours|perdition]
    >vol à l’ étalage
    >vol à la [sauvette|tire]
    >vol à main armée
    >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
................................................................................

    vous            ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferrez       $:Y
        <<- /conf/ not morph(<1, ":R") --2>> ferez                                                  # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    vous            ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferriez      $:Y
        <<- /conf/ not morph(<1, ":R") --2>> ferez                                                  # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    [ils|elles|iels]     ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferront      $:Y
        <<- /conf/ not morph(<1, ":R") --2>> feront                                                 # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

    [ils|elles|iels]     ?[ne|n’]¿  ?[nous|vous|les|le|la|l’]¿  ferraient    $:Y
        <<- /conf/ not morph(<1, ":R") --2>> feraient                                               # Confusion probable. Vous confondez le verbe “ferrer” avec le verbe “faire”.

TEST: nous vous {{ferrons}} apparaître au générique
TEST: nous vous {{ferrions}} prendre
TEST: vous les {{ferrez}} pendre demain
TEST: vous nous {{ferriez}} mourir de rire
TEST: ils le {{ferront}} crever à petit feu
................................................................................

    >coup de [>pâte|pat]
        <<- /conf/ -3>> patte                                   # Confusion. Une pâte est une matière pâteuse. Pour désigner le membre d’un animal, écrivez “patte”.

    >retomber sur [mes|tes|ses|ces|nos|vos|leur|leurs] [>pâte|pat]
        <<- /conf/ --1>> pattes                                 # Confusion. Une pâte est une matière pâteuse. Pour désigner le membre d’un animal, écrivez “patte”.

    >court sur [>pâte|pat]
        <<- /conf/ --1>> pattes                                 # Confusion. Une pâte est une matière pâteuse. Pour désigner le membre d’un animal, écrivez “patte”.

TEST: Prépare la {{patte}} à tarte.
TEST: Ils mangent souvent des {{pattes}} au thon.
TEST: Des {{pattes}} alimentaires.
TEST: Elles ont acheté de la {{patte}} à tartiner.
TEST: La {{patte}} à pizza est plus épaisse que la pâte à crêpes.
TEST: Elle adore la {{patte}} d’amande.
TEST: Il est comme un coq en {{pattes}} là.
TEST: Elle n’a jamais mis la main à la {{patte}}.
TEST: donne-moi un coup de {{pâte}}
TEST: elle retombe toujours sur ses {{pâtes}}.
TEST: il est court sur {{pâtes}}


# péché / pêcher
__conf_péché_pêcher2__
    >pêcher par excès [de|d’]
    >pêcher par [insuffisance|omission|orgueil]
        <<- /conf/ -1>> pécher                                  # Confusion : pêcher (capturer des poissons) ≠ pécher (faire un écart de conduite).|https://fr.wiktionary.org/wiki/p%C3%A9cher
................................................................................
TEST: la petite anecdote {{peu}} nous nuire.
TEST: l’école primaire {{peu}} espérer recevoir de nouveaux moyens cette année
TEST: un sale voyou {{peu}} {{marquer}}
TEST: une petite personne {{peu}} {{inspirer}}
TEST: mon meilleur ami {{peu}} {{remarquer}} par les profs
TEST: L’ouvrage décrit très peu les divers modes d’actions.


__conf_qui_peu_vinfi__
    qui  peu  [ne|n’|me|m’|te|t’|se|s’]
    qui  peu  [le|la|l’|les|en|nous|vous|lui|leur|y]  $:Y
    qui  peu  [nous|vous]     [le|la|l’|les|en|y]     $:Y
    qui  peu  [le|la|l’|les]  [lui|leur|en|y]         $:Y
    qui  peu  [lui|leur|y]    en                      $:Y
    qui  peu  $:Y
        <<- /conf/ -2>> peut                            # Confusion : le verbe pouvoir à la 3ᵉ personne du singulier s’écrit “peut”.

TEST: c’est tout le système qui {{peu}} vaciller            ->> peut


# peut-être / peut être
__conf_peut_être2__
    *WORD peut être
        <<- /conf/ space_after(\2, 1, 1) and morph(\1, ":V", ":[NAQGM]") -2:3>> peut-être           # Confusion probable. Pour dire “possiblement”, écrivez “peut-être”.

    <start> peut être
................................................................................
        <<- /conf/ --1>> puits
        # Confusion. Si vous parlez d’un trou fait pour puiser quelque chose (ou pour amener quelque chose), écrivez “puits”.|https://fr.wiktionary.org/wiki/puits

TEST: Forage de son {{puis}} prévu demain
TEST: Creuser un {{puis}}, pas si compliqué


# qu’à / cas / ca
__conf_qu_à_cas__
    n’  >avoir  [cas|qua|ca]
        <<- /conf/ --1>> qu’à
        # Confusion. Locution : “n’avoir qu’à…” équivalente à “il suffit de…”. L’ensemble “qu’à” est la contraction de “que” suivi de la préposition verbale “à”.|https://fr.wiktionary.org/wiki/n%E2%80%99avoir_qu%E2%80%99%C3%A0

    >avoir  [cas|qua|ca]  [ne|n’|me|m’|te|t’|se|s’]
    >avoir  [cas|qua|ca]  [le|la|l’|les|en|nous|vous|lui|leur|y]  $:Y
    >avoir  [cas|qua|ca]  [nous|vous]     [le|la|l’|les|en|y]     $:Y
    >avoir  [cas|qua|ca]  [le|la|l’|les]  [lui|leur|en|y]         $:Y
    >avoir  [cas|qua|ca]  [lui|leur|y]    en                      $:Y
    >avoir  [cas|qua|ca]  $:Y
        <<- /conf/ not value(<1, "|n’|") -2>> qu’à
        # Confusion. Locution : “n’avoir qu’à…” équivalente à “il suffit de…”. L’ensemble “qu’à” est la contraction de “que” suivi de la préposition verbale “à”.|https://fr.wiktionary.org/wiki/n%E2%80%99avoir_qu%E2%80%99%C3%A0

TEST: elles n’ont {{ca}} nous laisser tranquilles           ->> qu’à
TEST: ils ont {{qua}} s’en prendre à eux-mêmes              ->> qu’à
TEST: tu n’as {{cas}} prendre le train


# quand même / comme même
__conf_quand_même__
    comme même [<end>|,]
    comme même @:(?:Os|C)
................................................................................
    <start>  si  nous  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":1p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si nous avions perdu, nous aurions recommencé. »

    <start>  si  vous  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  si  vous  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":2p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si vous aviez perdu, vous auriez recommencé. »

    <start>  [si|s’]  [ils|elles|iels]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  [si|s’]  [ils|elles|iels]  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\4, ":K") -4>> =suggVerbTense(\4, ":Iq", ":3p")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « Si elles avaient perdu, elles auraient recommencé. »

    <start>  si  [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur]  @:[NA].*:[si]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
    <start>  si  [le|la|l’|un|une|ce|cet|cette|mon|ton|son|notre|votre|leur]  @:[NA].*:[si]  >avoir  $:Q  $:D  $:N  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K
        <<- /vmode/ morph(\5, ":K") -5>> =suggVerbTense(\5, ":Iq", ":3s")                           # N’utilisez pas le conditionnel, mais l’imparfait. Exemple : « S’il avait perdu, il aurait recommencé. »

    <start>  si  [les|des|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines]  @:[NA].*:[pi]  >avoir  $:Q  ?,¿  [je|j’|tu|il|on|elle|nous|ce|vous|ils|elles|iel|iels]  $:K

Modified helpers.py from [871d0d4238] to [9aa31c58b5].

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

88
89
90
91
92
93
94
    "make an empty folder or erase its content if not empty"
    if not os.path.exists(sp):
        os.makedirs(sp, exist_ok=True)
    else:
        eraseFolder(sp)


def copyFolderContent (spSrc, spDst):
    "copy folder content from src to dst"
    try:
        shutil.copytree(spSrc, spDst)
    except OSError as e:
        if e.errno == errno.ENOTDIR:
            shutil.copy(spSrc, spDst)
        else:
            raise


def moveFolderContent (spSrc, spDst, sPrefix="", bLog=False):
    "move folder content from <spSrc> to <spDst>: if files already exist in <spDst>, they are replaced. (not recursive)"
    try:






        for sf in os.listdir(spSrc):
            spfSrc = os.path.join(spSrc, sf)
            if os.path.isfile(spfSrc):
                spfDst = os.path.join(spDst, sPrefix + sf)
                shutil.move(spfSrc, spfDst)
                if bLog:
                    print("file <" + spfSrc + "> moved to <"+spfDst+">")
    except:
        raise



def fileFile (spf, dVars):
    "return file <spf> as a text filed with variables from <dVars>"
    return Template(open(spf, "r", encoding="utf-8").read()).safe_substitute(dVars)









|







|





>
>
>
>
>
>







|
|
>







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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
    "make an empty folder or erase its content if not empty"
    if not os.path.exists(sp):
        os.makedirs(sp, exist_ok=True)
    else:
        eraseFolder(sp)


def copyFolder (spSrc, spDst):
    "copy folder content from src to dst"
    try:
        shutil.copytree(spSrc, spDst)
    except OSError as e:
        if e.errno == errno.ENOTDIR:
            shutil.copy(spSrc, spDst)
        else:
            print("Error while copying folder <"+spSrc+"> to <"+spDst+">.")


def moveFolderContent (spSrc, spDst, sPrefix="", bLog=False):
    "move folder content from <spSrc> to <spDst>: if files already exist in <spDst>, they are replaced. (not recursive)"
    try:
        if not os.path.isdir(spSrc):
            print("Folder <"+spSrc+"> not found. Can’t move files.")
            return
        if not os.path.isdir(spDst):
            print("Folder <"+spDst+"> not found. Can’t move files.")
            return
        for sf in os.listdir(spSrc):
            spfSrc = os.path.join(spSrc, sf)
            if os.path.isfile(spfSrc):
                spfDst = os.path.join(spDst, sPrefix + sf)
                shutil.move(spfSrc, spfDst)
                if bLog:
                    print("file <" + spfSrc + "> moved to <"+spfDst+">")
    except Error as e:
        print("Error while moving folder <"+spSrc+"> to <"+spDst+">.")
        print(e)


def fileFile (spf, dVars):
    "return file <spf> as a text filed with variables from <dVars>"
    return Template(open(spf, "r", encoding="utf-8").read()).safe_substitute(dVars)