Grammalecte  Check-in [3075d93636]

Overview
Comment:[build][core][fr] option for case sensitivity
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr | core | build | rg
Files: files | file ages | folders
SHA3-256: 3075d9363626ab60eb11689dbb22e089d5699787154062ae9497d096ec4079c4
User & Date: olr on 2018-08-04 13:31:45
Other Links: branch diff | manifest | tags
Context
2018-08-04
13:57
[fr] immunité pour n’importe qui/quoi check-in: 7e04325c2e user: olr tags: fr, rg
13:31
[build][core][fr] option for case sensitivity check-in: 3075d93636 user: olr tags: fr, core, build, rg
12:36
[fr] conversion: regex rules -> graph rules check-in: 2807f678c2 user: olr tags: fr, rg
Changes

Modified compile_rules_graph.py from [656cd4bdbb] to [47c53113f4].

162
163
164
165
166
167
168
169

170
171
172
173
174
175
176
177
178
179
180
181


182
183
184
185
186
187
188
162
163
164
165
166
167
168

169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190







-
+












+
+







    m = re.match("/(\\w+)/", sAction)
    if m:
        sOption = m.group(1)
        sAction = sAction[m.end():].strip()
    if nPriority == -1:
        nPriority = dOptPriority.get(sOption, 4)
    # valid action?
    m = re.search(r"(?P<action>[-~=/%>])(?P<start>-?\d+\.?|)(?P<end>:\.?-?\d+|)>>", sAction)
    m = re.search(r"(?P<action>[-~=/%>])(?P<start>-?\d+\.?|)(?P<end>:\.?-?\d+|)(?P<casing>:|)>>", sAction)
    if not m:
        print(" # Error. No action found at: ", sActionId)
        return None
    # Condition
    sCondition = sAction[:m.start()].strip()
    if sCondition:
        sCondition = changeReferenceToken(sCondition, dPos)
        sCondition = prepareFunction(sCondition)
        dFUNCTIONS["_g_c_"+sActionId] = sCondition
        sCondition = "_g_c_"+sActionId
    else:
        sCondition = ""
    # Case sensitivity
    bCaseSensitivity = False if m.group("casing") == ":" else True
    # Action
    cAction = m.group("action")
    sAction = sAction[m.end():].strip()
    sAction = changeReferenceToken(sAction, dPos)
    # target
    cStartLimit = "<"
    cEndLimit = ">"
258
259
260
261
262
263
264
265

266
267
268
269
270
271
272
273
274

275
276
277
278
279
280
281
260
261
262
263
264
265
266

267
268
269
270
271
272
273
274
275

276
277
278
279
280
281
282
283







-
+








-
+







            sAction = prepareFunction(sAction)
            dFUNCTIONS["_g_s_"+sActionId] = sAction[1:]
            sAction = "=_g_s_"+sActionId
        elif sAction.startswith('"') and sAction.endswith('"'):
            sAction = sAction[1:-1]
        if not sMsg:
            print("# Error in action at line " + sActionId + ":  The message is empty.")
        return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction, cStartLimit, cEndLimit, nPriority, sMsg, sURL]
        return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction, cStartLimit, cEndLimit, bCaseSensitivity, nPriority, sMsg, sURL]
    elif cAction == "~":
        ## text processor
        if sAction[0:1] == "=":
            sAction = prepareFunction(sAction)
            dFUNCTIONS["_g_p_"+sActionId] = sAction[1:]
            sAction = "=_g_p_"+sActionId
        elif sAction.startswith('"') and sAction.endswith('"'):
            sAction = sAction[1:-1]
        return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction]
        return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction, bCaseSensitivity]
    elif cAction == "%" or cAction == "/":
        ## tags
        return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction]
    elif cAction == "=":
        ## disambiguator
        if sAction[0:1] == "=":
            sAction = sAction[1:]

Modified gc_core/py/lang_core/gc_engine.py from [102ec99edb] to [a7d5802c06].

770
771
772
773
774
775
776
777
778


779
780
781
782
783
784
785
786
787

788
789
790
791
792
793
794

795
796
797
798
799
800
801
802
803

804
805
806
807
808
809
810
770
771
772
773
774
775
776


777
778
779
780
781
782
783
784
785
786

787
788
789
790
791
792
793

794
795
796
797
798
799
800
801
802

803
804
805
806
807
808
809
810







-
-
+
+








-
+






-
+








-
+







        for sLineId, nextNodeKey in dNode.items():
            bCondMemo = None
            for sRuleId in dGraph[nextNodeKey]:
                try:
                    if bDebug:
                        print("  TRY:", sRuleId)
                    sOption, sFuncCond, cActionType, sWhat, *eAct = dRule[sRuleId]
                    # Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, nPriority, sMessage, sURL ]
                    # TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    # Suggestion    [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, sURL ]
                    # TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ]
                    # Disambiguator [ option, condition, "=", replacement/suggestion/action ]
                    # Sentence Tag  [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ]
                    # Test          [ option, condition, ">", "" ]
                    if not sOption or dOptions.get(sOption, False):
                        bCondMemo = not sFuncCond or globals()[sFuncCond](self.lToken, nTokenOffset, nLastToken, sCountry, bCondMemo, self.dTags, self.sSentence, self.sSentence0)
                        if bCondMemo:
                            if cActionType == "-":
                                # grammar error
                                iTokenStart, iTokenEnd, cStartLimit, cEndLimit, nPriority, sMessage, sURL = eAct
                                iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, sURL = eAct
                                nTokenErrorStart = nTokenOffset + iTokenStart  if iTokenStart > 0  else nLastToken + iTokenStart
                                if "bImmune" not in self.lToken[nTokenErrorStart]:
                                    nTokenErrorEnd = nTokenOffset + iTokenEnd  if iTokenEnd > 0  else nLastToken + iTokenEnd
                                    nErrorStart = self.nOffsetWithinParagraph + (self.lToken[nTokenErrorStart]["nStart"] if cStartLimit == "<"  else self.lToken[nTokenErrorStart]["nEnd"])
                                    nErrorEnd = self.nOffsetWithinParagraph + (self.lToken[nTokenErrorEnd]["nEnd"] if cEndLimit == ">"  else self.lToken[nTokenErrorEnd]["nStart"])
                                    if nErrorStart not in self.dError or nPriority > dPriority.get(nErrorStart, -1):
                                        self.dError[nErrorStart] = self._createError(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, True, sMessage, sURL, bShowRuleId, "notype", bContext)
                                        self.dError[nErrorStart] = self._createError(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, sMessage, sURL, bShowRuleId, "notype", bContext)
                                        dPriority[nErrorStart] = nPriority
                                        if bDebug:
                                            print("  NEW_ERROR:", self.dError[nErrorStart], "\n  ", dRule[sRuleId])
                            elif cActionType == "~":
                                # text processor
                                if bDebug:
                                    print("  TAG_PREPARE:\n  ", dRule[sRuleId])
                                nEndToken = (nTokenOffset + eAct[1])  if eAct[1]  else nLastToken
                                self._tagAndPrepareTokenForRewriting(sWhat, nTokenOffset + eAct[0], nEndToken, nTokenOffset, nLastToken, True, bDebug)
                                self._tagAndPrepareTokenForRewriting(sWhat, nTokenOffset + eAct[0], nEndToken, nTokenOffset, nLastToken, eAct[2], bDebug)
                                bChange = True
                            elif cActionType == "=":
                                # disambiguation
                                if bDebug:
                                    print("  DISAMBIGUATOR:\n  ", dRule[sRuleId])
                                globals()[sWhat](self.lToken, nTokenOffset)
                            elif cActionType == ">":
837
838
839
840
841
842
843
844

845
846
847
848
849
850
851
852
853

854
855
856
857
858
859
860
837
838
839
840
841
842
843

844
845
846
847
848
849
850
851
852

853
854
855
856
857
858
859
860







-
+








-
+







                            if bDebug:
                                print("  COND_BREAK")
                            break
                except Exception as e:
                    raise Exception(str(e), sLineId, sRuleId, self.sSentence)
        return bChange

    def _createError (self, sSugg, nTokenOffset, nLastToken, iFirstToken, nStart, nEnd, sLineId, sRuleId, bUppercase, sMsg, sURL, bShowRuleId, sOption, bContext):
    def _createError (self, sSugg, nTokenOffset, nLastToken, iFirstToken, nStart, nEnd, sLineId, sRuleId, bCaseSvty, sMsg, sURL, bShowRuleId, sOption, bContext):
        # suggestions
        if sSugg[0:1] == "=":
            sSugg = globals()[sSugg[1:]](self.lToken, nTokenOffset, nLastToken)
            lSugg = sSugg.split("|")  if sSugg  else []
        elif sSugg == "_":
            lSugg = []
        else:
            lSugg = self._expand(sSugg, nTokenOffset, nLastToken).split("|")
        if bUppercase and lSugg and self.lToken[iFirstToken]["sValue"][0:1].isupper():
        if bCaseSvty and lSugg and self.lToken[iFirstToken]["sValue"][0:1].isupper():
            lSugg = list(map(lambda s: s[0:1].upper()+s[1:], lSugg))
        # Message
        sMessage = globals()[sMsg[1:]](self.lToken, nTokenOffset)  if sMsg[0:1] == "="  else self._expand(sMsg, nTokenOffset, nLastToken)
        if bShowRuleId:
            sMessage += "  " + sLineId + " # " + sRuleId
        #
        if _bWriterError:
898
899
900
901
902
903
904
905

906
907
908
909
910
911
912
898
899
900
901
902
903
904

905
906
907
908
909
910
911
912







-
+







            if m.group(1)[0:1] == "-":
                sText = sText.replace(m.group(0), self.lToken[nLastToken+int(m.group(1))+1]["sValue"])
            else:
                sText = sText.replace(m.group(0), self.lToken[nTokenOffset+int(m.group(1))]["sValue"])
        #print(">", sText)
        return sText

    def _tagAndPrepareTokenForRewriting (self, sWhat, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bUppercase=True, bDebug=False):
    def _tagAndPrepareTokenForRewriting (self, sWhat, nTokenRewriteStart, nTokenRewriteEnd, nTokenOffset, nLastToken, bCaseSvty, bDebug):
        "text processor: rewrite tokens between <nTokenRewriteStart> and <nTokenRewriteEnd> position"
        if bDebug:
            print("   START:", nTokenRewriteStart, "END:", nTokenRewriteEnd)
        if sWhat == "*":
            # purge text
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lToken[nTokenRewriteStart]["bToRemove"] = True
931
932
933
934
935
936
937
938

939
940
941
942
943
944
945
931
932
933
934
935
936
937

938
939
940
941
942
943
944
945







-
+







                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["sNewValue"] = "_"
        else:
            if sWhat.startswith("="):
                sWhat = globals()[sWhat[1:]](self.lToken, nTokenOffset)
            else:
                sWhat = self._expand(sWhat, nTokenOffset, nLastToken)
            bUppercase = bUppercase and self.lToken[nTokenRewriteStart]["sValue"][0:1].isupper()
            bUppercase = bCaseSvty and self.lToken[nTokenRewriteStart]["sValue"][0:1].isupper()
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                # one token
                sWhat = sWhat + " " * (len(self.lToken[nTokenRewriteStart]["sValue"])-len(sWhat))
                if bUppercase:
                    sWhat = sWhat[0:1].upper() + sWhat[1:]
                self.lToken[nTokenRewriteStart]["sNewValue"] = sWhat
            else:

Modified gc_lang/fr/rules.grx from [783e7ff817] to [e4dcc6e445].

6367
6368
6369
6370
6371
6372
6373
6374

6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387

6388
6389
6390
6391
6392

6393
6394
6395
6396
6397

6398
6399
6400
6401
6402
6403
6404
6367
6368
6369
6370
6371
6372
6373

6374
6375
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386

6387
6388
6389
6390
6391

6392
6393
6394
6395
6396

6397
6398
6399
6400
6401
6402
6403
6404







-
+












-
+




-
+




-
+







!!
!!

# Les jours
__maj_jours_semaine__
    [*WORD|*NUM]    [Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche]
    ,               [Lundi|Mardi|Mercredi|Jeudi|Vendredi|Samedi|Dimanche]
        <<- /maj/ -2>> =\2.lower()
        <<- /maj/ -2:>> =\2.lower()
        # Pas de majuscule sur les jours de la semaine.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

TEST: Nous vous donnons rendez-vous {{Mercredi}} le 18.


# Les mois
__maj_mois__
    monarchie de Juillet
    révolution d’ Octobre
        <<- ~3>> !

    *WORD [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
        <<- /maj/ not morph(\1, ":M1") -2>> =\2.lower()
        <<- /maj/ not morph(\1, ":M1") -2:>> =\2.lower()
        # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

    [*NUM|*WORD_ELIDED] [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
    ,    [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
        <<- /maj/ -2>> =\2.lower()
        <<- /maj/ -2:>> =\2.lower()
        # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

    [1|2|3|4|5|6|7|8|9|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31] Mars
    en Mars
        <<- /maj/ -2>> mars
        <<- /maj/ -2:>> mars
        # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

TEST: 15 {{Septembre}}                                                  ->> septembre
TEST: 23 {{Messidor}}                                                   ->> messidor
TEST: ils viendront en {{Mars}}.                                        ->> mars
TEST: le comité d’éthique qui statuera dans les meilleurs délais sur la situation de Véronique Avril

6439
6440
6441
6442
6443
6444
6445
6446

6447
6448
6449
6450
6451
6452
6453
6439
6440
6441
6442
6443
6444
6445

6446
6447
6448
6449
6450
6451
6452
6453







-
+







# gentilés / ethnonymes
__maj_gentilés__
    océan Indien
    [îles|iles] Britanniques
        <<- ~2>> !

    *WORD [>afghane|>albanaise|>algérienne|>allemande|>américaine|>andorrane|>anglais|>angolaise|>arabe|>argentine|>arménienne|>australienne|>autrichienne|>asiatique|>azerbaïdjanaise|>bahamienne|>bangladaise|>bengladeshie|>barbadienne|>basque|>belge|>bélizienne|>béninoise|>bretonne|>bhoutanaise|>biélorusse|>birmane|>bolivienne|>bosnienne|>botswanaiso|>brésilienne|>britannique|>brunéiene|>bulgare|>burkinabé|>burundaise|>cambodgienne|>camerounaise|>canadienne|>capverdienne|>centrafricaine|>chilienne|>chinoise|>chypriote|>colombienne|>comorienne|>congolaise|>nord-coréenne|>corse|>costaricienne|>croate|>cubaine|>danoise|>djiboutienne|>dominicaine|>égyptienne|>émiratie|>équatorienne|>érythréenne|>estonienne|>espagnole|>étatsunienne|>états-unienne|>étasunienne|>éthiopienne|>fidjienne|>finlandaise|>formosane|>française|>gabonaise|>gambienne|>géorgienne|>ghanéenne|>grecque|>grenadienne|>guadeloupéenne|>guatémaltèque|>guinéenne|>équato-guinéenne|>guyanienne|>haïtienne|>honduriene|>hollandaise|>hongroise|>indienne|>indochinoise|>indonésienne|>irakienne|>italienne|>iranienne|>irlandaise|>islandaise|>israélienne|>ivoirienne|>jamaïcaine|>japonaise|>jordanienne|>kazakhe|>kényane|>kosovare|>koweïtienne|>laotienne|>lapone|>lettone|>libanaise|>libérienne|>libyenne|>liechtensteinoise|>lituanienne|>luxembourgeois|>macédonienne|>maghrébine|>malgache|>malaisienne|>malawite|>maldivienne|>malienne|>maltaise|>maorie|>marocaine|>martienne|>mauricienne|>mauritanienne|>mexicaine|>micronésienne|>moldave|>monégasque|>monténégrine|>mongole|>mozambicaine|>namibiene|>népalaise|>nicaraguayenne|>nigérienne|>nigériane|>néerlandaise|>norvégienne|>néo-zélandaise|>ougandaise|>ouzbèke|>pakistanaise|>palestinienne|>panaméenne|>paraguayenne|>perse|>péruvienne|>philippine|>polonaise|>polynésienne|>portugaise|>québécoise|>qatarie|>roumaine|>russe|>rwandaise|>saoudienne|>scandinave|>salvadorienne|>sénégalaise|>serbe|>singapourienne|>slovaque|>slovène|>somalienne|>soudanaise|>soviétique|>srilankaise|>suédoise|>suisse|>surinamaise|>syrienne|>sud-africaine|>sud-coréenne|>américaine|>tadjike|>tanzanienne|>tchadienne|>tchèque|>thaïlandaise|>togolaise|>tahitienne|>tunisiene|>turkmène|>turque|>taïwanaise|>ukrainienne|>uruguayenne|>vénézuélienne|>vietnamienne|>yéménite|>yougoslave|>zaïroise|>zambienne|>zimbabwéenne]
        <<- /maj/ \2.istitle() and morph(\1, ":N", ":(?:A|V0e|D|R|B)") -2>> =\2.lower()             # S’il s’agit d’un adjectif, ne mettez pas de majuscule.
        <<- /maj/ \2.istitle() and morph(\1, ":N", ":(?:A|V0e|D|R|B)") -2:>> =\2.lower()            # S’il s’agit d’un adjectif, ne mettez pas de majuscule.
        <<- /maj/ \2.islower() and not \2.startswith("canadienne") and
            ( value(\1, "|certains|certaines|ce|cet|cette|ces|des|les|nos|vos|leurs|quelques|plusieurs|chaque|une|aux|") or
            ( value(\1, "|un|") and not value(<1, "|dans|numéro|") and not after("(?:approximatif|correct|courant|parfait|facile|aisé|impeccable|incompréhensible)") ) )
        -2>> =\2.capitalize()                                                                       # S’il s’agit d’un gentilé, mettez une majuscule.

    [un|une|certains|certaines|ce|cet|cette|ces|le|la|les|l’|des|quelques|plusieurs|chaque] [>européenne|>parisienne|>lyonnaise|>marseillaise|>lilloise|>toulousaine|>nantaise|>strasbourgeoise|>montpelliéraine|>bordelaise|>bruxelloise|>montréalaise|>londonienne|>genévoise|>zurichoise|>bâloise|>berlinoise|>romaine]
        <<- /maj/ \2.islower() -2>> =\2.capitalize()                                                # S’il s’agit d’un gentilé, mettez une majuscule.
6464
6465
6466
6467
6468
6469
6470
6471

6472
6473
6474

6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490

6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6506

6507
6508
6509
6510
6511
6512
6513
6464
6465
6466
6467
6468
6469
6470

6471
6472
6473

6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489

6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505

6506
6507
6508
6509
6510
6511
6512
6513







-
+


-
+















-
+















-
+







TEST: l’océan Indien
TEST: Je leur explique dans un anglais que la fatigue m’empêche de bien prononcer.


# les langues
__maj_langues__
    [>parler|cours|>leçon|>apprendre|>étudier|>traduire|>enseigner|>professeure|>enseignante|>dictionnaire|>méthode] [le|de|du|l’|d’|que|qu’|qu] [Afrikaans|Albanais|Allemand|Alsacien|Anglais|Arabe|Aragonais|Arménien|Asturien|Basque|Bengali|Biélorusse|Birman|Bosniaque|Breton|Bulgare|Cantonais|Catalan|Cherokee|Chinois|Corse|Cornique|Coréen|Croate|Danois|Écossais|Espagnol|Espéranto|Estonien|Féroïen|Farsi|Finnois|Flamand|Français|Frison|Galicien|Gallois|Gaulois|Géorgien|Grec|Gujarati|Hakka|Hawaïen|Hébreu|Hindi|Hollandais|Hongrois|Javanais|Ido|Indonésien|Interlingua|Islandais|Italien|Irlandais|Japonais|Kazakh|Khmer|Kurde|Ladino|Laotien|Latin|Ligurien|Limbourgeois|Lituanien|Lombard|Luxembourgeois|Macédonien|Malais|Maldivien|Malgache|Maltais|Mandarin|Maori|Marathi|Marwari|Moldave|Mongol|Napolitain|Néerlandais|Norvégien|Occitan|Ourdou|Ouzbek|Persan|Peul|Piémontais|Polonais|Portugais|Provençal|Quichua|Romanche|Roumain|Russe|Sans[ck]rit|Sarde|Serbe|Sicilien|Sindhi|Slovaque|Slovène|Soudanais|Sorabe|Suédois|Swahili|Tagalog|Tahitien|Tamoul|Tatar|Tchèque|Thaï|Turc|Ukrainien|Vénitien|Vietnamien|Volapük|Wallon|Wou|Wu|Yiddish|Xhosa|Xiang|Zoulou]
        <<- /maj/ -3>> =\3.lower()                                                                  # Si vous parlez de la langue, pas de majuscule.
        <<- /maj/ -3:>> =\3.lower()                                                                 # Si vous parlez de la langue, pas de majuscule.

    en [Afrikaans|Albanais|Allemand|Alsacien|Anglais|Arabe|Aragonais|Arménien|Asturien|Basque|Bengali|Biélorusse|Birman|Bosniaque|Breton|Bulgare|Cantonais|Catalan|Cherokee|Chinois|Cornique|Coréen|Croate|Danois|Écossais|Espagnol|Espéranto|Estonien|Féroïen|Farsi|Finnois|Flamand|Français|Frison|Galicien|Gallois|Gaulois|Géorgien|Grec|Gujarati|Hakka|Hawaïen|Hébreu|Hindi|Hollandais|Hongrois|Javanais|Ido|Indonésien|Interlingua|Islandais|Italien|Irlandais|Japonais|Kazakh|Khmer|Kurde|Ladino|Laotien|Latin|Ligurien|Limbourgeois|Lituanien|Lombard|Luxembourgeois|Macédonien|Malais|Maldivien|Malgache|Maltais|Mandarin|Maori|Marathi|Marwari|Moldave|Mongol|Napolitain|Néerlandais|Norvégien|Occitan|Ourdou|Ouzbek|Persan|Peul|Piémontais|Polonais|Portugais|Provençal|Quichua|Romanche|Roumain|Russe|Sans[ck]rit|Sarde|Serbe|Sicilien|Sindhi|Slovaque|Slovène|Soudanais|Sorabe|Suédois|Swahili|Tagalog|Tahitien|Tamoul|Tatar|Tchèque|Thaï|Turc|Ukrainien|Vénitien|Vietnamien|Volapük|Wallon|Wou|Wu|Yiddish|Xhosa|Xiang|Zoulou]
        <<- /maj/ -2>> =\1.lower()                                                                  # Si vous parlez de la langue, pas de majuscule.
        <<- /maj/ -2:>> =\2.lower()                                                                  # Si vous parlez de la langue, pas de majuscule.

TEST: il ne parle qu’{{Allemand}}.
TEST: ta traduction en {{Russe}} est superbe.


# Moyen Âge
__maj_Moyen_Âge__
    [Moyen-Age|Moyen-Âge]
    [moyen-âge|moyen-age]
    moyen age
        <<- /maj/ ->> Moyen Âge                                     # Le “Moyen Âge”, l’époque médiévale.

    moyen âge
        <<- /maj/ \1.islower() and \2.islower() ->> Moyen Âge       # Le “Moyen Âge”, l’époque médiévale.

TEST: C’est le {{moyen age}}, chez ces ploucs.
TEST: C’est le {{moyen age}}, chez ces ploucs.          ->> Moyen Âge


# Église
__maj_Église__
    l’ église [adventiste|anglicane|copte|catholique|calviniste|épiscopalienne|jacobite|luthérienne|lutherienne|méthodiste|mormone|néo-apostolique|néoapostolique|orthodoxe|pentecôtiste|presbytérienne|protestante|réformée]
        <<- /maj/ \2.islower() -2>> Église                          # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.

    >homme d’ église
        <<- /maj/ \3.islower() -3>> Église                          # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.

    [>chef|>rite|>sacrement] de l’ église
        <<- /maj/ \3.islower() -4>> Église                          # Lorsqu’on parle de l’institution, une majuscule est requise. Pour un bâtiment, pas de majuscule.

    [*WORD|*WORD_ELIDED] [Église|Églises] [>baroque|>gothique|>romane|~^Saint-[A-ZÉÊ]]
    ,                    [Église|Églises] [>baroque|>gothique|>romane|~^Saint-[A-ZÉÊ]]
        <<- /maj/ -2>> église                                       # Pour un bâtiment, une minuscule est requise. La majuscule est pour l’institution.
        <<- /maj/ -2:>> église                                      # Pour un bâtiment, une minuscule est requise. La majuscule est pour l’institution.

TEST: L’{{église}} orthodoxe.                                           ->> Église
TEST: un homme d’{{église}}                                             ->> Église
TEST: les sacrements de l’{{église}}                                    ->> Église
TEST: Une {{Église}} baroque.                                           ->> église
TEST: L’{{Église}} Saint-Paul.                                          ->> église
TEST: Un homme d’{{église}}.                                            ->> Église
6528
6529
6530
6531
6532
6533
6534
6535

6536
6537
6538
6539
6540
6541
6542
6528
6529
6530
6531
6532
6533
6534

6535
6536
6537
6538
6539
6540
6541
6542







-
+








# Unités de mesure
__maj_unités__
    *NUM  [Mètre|Watt|Gramme|Seconde|Ampère|Kelvin|Mole|Candela|Candéla|Hertz|Henry|Newton|Pascal|Joule|Coulomb|Volt|Ohm|Farad|Tesla|Weber|Wéber|Radian|Stéradian|Lumen|Lux|Becquerel|Gray|Sievert|Siemens|Katal|Mètres|Watts|Grammes|Secondes|Ampères|Kelvins|Moles|Candelas|Candélas|Hertz|Henrys|Newtons|Pascals|Joules|Coulombs|Volts|Ohms|Farads|Teslas|Webers|Wébers|Radians|Stéradians|Lumens|Becquerels|Grays|Sieverts|Katals]
    @:B   [Mètre|Watt|Gramme|Seconde|Ampère|Kelvin|Mole|Candela|Candéla|Hertz|Henry|Newton|Pascal|Joule|Coulomb|Volt|Ohm|Farad|Tesla|Weber|Wéber|Radian|Stéradian|Lumen|Lux|Becquerel|Gray|Sievert|Siemens|Katal|Mètres|Watts|Grammes|Secondes|Ampères|Kelvins|Moles|Candelas|Candélas|Hertz|Henrys|Newtons|Pascals|Joules|Coulombs|Volts|Ohms|Farads|Teslas|Webers|Wébers|Radians|Stéradians|Lumens|Becquerels|Grays|Sieverts|Katals]
    *NUM  ~(?:Exa|P[ée]ta|Téra|Giga|Méga|Kilo|Hecto|Déc[ai]|Centi|Milli|Micro|Nano|Pico|Femto|Atto|Ze(?:pto|tta)|Yo(?:cto|etta))(?:mètre|watt|gramme|seconde|ampère|kelvin|mole|cand[eé]la|hertz|henry|newton|pascal|joule|coulomb|volt|ohm|farad|tesla|w[eé]ber|radian|stéradian|lumen|lux|becquerel|gray|sievert|siemens|katal)s?$
    @:B   ~(?:Exa|P[ée]ta|Téra|Giga|Méga|Kilo|Hecto|Déc[ai]|Centi|Milli|Micro|Nano|Pico|Femto|Atto|Ze(?:pto|tta)|Yo(?:cto|etta))(?:mètre|watt|gramme|seconde|ampère|kelvin|mole|cand[eé]la|hertz|henry|newton|pascal|joule|coulomb|volt|ohm|farad|tesla|w[eé]ber|radian|stéradian|lumen|lux|becquerel|gray|sievert|siemens|katal)s?$
        <<- /maj/ -2>> =\2.lower()                                  # Pas de majuscule sur les unités de mesure.|https://fr.wikipedia.org/wiki/Unit%C3%A9_de_mesure
        <<- /maj/ not \2.isupper() -2:>> =\2.lower()                # Pas de majuscule sur les unités de mesure.|https://fr.wikipedia.org/wiki/Unit%C3%A9_de_mesure

TEST: J’en veux 3 {{Mètres}}.
TEST: Elle en prendra vingt {{Grammes}}.



!!