Index: compile_rules.py ================================================================== --- compile_rules.py +++ compile_rules.py @@ -56,34 +56,34 @@ def prepareFunction (s): "convert simple rule syntax to a string of Python code" s = s.replace("__also__", "bCondMemo") s = s.replace("__else__", "not bCondMemo") s = s.replace("sContext", "_sAppContext") - s = re.sub(r"isStart *\(\)", 'before("^ *$|, *$")', s) - s = re.sub(r"isRealStart *\(\)", 'before("^ *$")', s) - s = re.sub(r"isStart0 *\(\)", 'before0("^ *$|, *$")', s) - s = re.sub(r"isRealStart0 *\(\)", 'before0("^ *$")', s) - s = re.sub(r"isEnd *\(\)", 'after("^ *$|^,")', s) - s = re.sub(r"isRealEnd *\(\)", 'after("^ *$")', s) - s = re.sub(r"isEnd0 *\(\)", 'after0("^ *$|^,")', s) - s = re.sub(r"isRealEnd0 *\(\)", 'after0("^ *$")', s) - s = re.sub(r"(select|exclude)[(][\\](\d+)", '\\1(dTokenPos, m.start(\\2), m.group(\\2)', s) - s = re.sub(r"define[(][\\](\d+)", 'define(dTokenPos, m.start(\\1)', s) - s = re.sub(r"(morph|info)[(][\\](\d+)", '\\1((m.start(\\2), m.group(\\2))', s) - s = re.sub(r"(morph|info)[(]", '\\1(dTokenPos, ', s) - s = re.sub(r"(sugg\w+|switch\w+)\(@", '\\1(m.group(i[4])', s) - s = re.sub(r"word\(\s*1\b", 'nextword1(sSentence, m.end()', s) # word(1) - s = re.sub(r"word\(\s*-1\b", 'prevword1(sSentence, m.start()', s) # word(-1) - s = re.sub(r"word\(\s*(\d)", 'nextword(sSentence, m.end(), \\1', s) # word(n) - s = re.sub(r"word\(\s*-(\d)", 'prevword(sSentence, m.start(), \\1', s) # word(-n) - s = re.sub(r"before\(\s*", 'look(sSentence[:m.start()], ', s) # before(sSentence) - s = re.sub(r"after\(\s*", 'look(sSentence[m.end():], ', s) # after(sSentence) - s = re.sub(r"textarea\(\s*", 'look(sSentence, ', s) # textarea(sSentence) + s = re.sub(r"\bstart\(\)", 'before("^ *$|, *$")', s) + s = re.sub(r"\brealstart\(\)", 'before("^ *$")', s) + s = re.sub(r"\bstart0\(\)", 'before0("^ *$|, *$")', s) + s = re.sub(r"\brealstart0\(\)", 'before0("^ *$")', s) + s = re.sub(r"\bend\(\)", 'after("^ *$|^,")', s) + s = re.sub(r"\brealend\(\)", 'after("^ *$")', s) + s = re.sub(r"\bend0\(\)", 'after0("^ *$|^,")', s) + s = re.sub(r"\brealend0\(\)", 'after0("^ *$")', s) + s = re.sub(r"\b(select|exclude)[(][\\](\d+)", '\\1(dTokenPos, m.start(\\2), m.group(\\2)', s) + s = re.sub(r"\bdefine[(][\\](\d+)", 'define(dTokenPos, m.start(\\1)', s) + s = re.sub(r"\b(morph|info)[(][\\](\d+)", '\\1((m.start(\\2), m.group(\\2))', s) + s = re.sub(r"\b(morph|info)[(]", '\\1(dTokenPos, ', s) + s = re.sub(r"\b(sugg\w+|switch\w+)\(@", '\\1(m.group(i[4])', s) + s = re.sub(r"\bword\(\s*1\b", 'nextword1(sSentence, m.end()', s) # word(1) + s = re.sub(r"\bword\(\s*-1\b", 'prevword1(sSentence, m.start()', s) # word(-1) + s = re.sub(r"\bword\(\s*(\d)", 'nextword(sSentence, m.end(), \\1', s) # word(n) + s = re.sub(r"\bword\(\s*-(\d)", 'prevword(sSentence, m.start(), \\1', s) # word(-n) + s = re.sub(r"\bbefore\(\s*", 'look(sSentence[:m.start()], ', s) # before(sSentence) + s = re.sub(r"\bafter\(\s*", 'look(sSentence[m.end():], ', s) # after(sSentence) + s = re.sub(r"\btextarea\(\s*", 'look(sSentence, ', s) # textarea(sSentence) s = re.sub(r"/0", 'sSentence0[m.start():m.end()]', s) # /0 - s = re.sub(r"before0\(\s*", 'look(sSentence0[:m.start()], ', s) # before0(sSentence) - s = re.sub(r"after0\(\s*", 'look(sSentence0[m.end():], ', s) # after0(sSentence) - s = re.sub(r"textarea0\(\s*", 'look(sSentence0, ', s) # textarea0(sSentence) + s = re.sub(r"\bbefore0\(\s*", 'look(sSentence0[:m.start()], ', s) # before0(sSentence) + s = re.sub(r"\bafter0\(\s*", 'look(sSentence0[m.end():], ', s) # after0(sSentence) + s = re.sub(r"\btextarea0\(\s*", 'look(sSentence0, ', s) # textarea0(sSentence) s = re.sub(r"\bspell *[(]", '_oSpellChecker.isValid(', s) s = re.sub(r"[\\](\d+)", 'm.group(\\1)', s) return s Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -1116,18 +1116,18 @@ <<- __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. + <<- 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. + <<- 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 % @@ -1283,14 +1283,14 @@ TEST: C’est {{“}}compliqué. __[i]/typo(typo_guillemet_simple_ouvrant_non_fermé)__ (‘)\w\w[^’']+$ @@0 - <<- before(" $") or isStart() -1>> _ && Guillemet fermant introuvable dans la suite du paragraphe. + <<- before(" $") or start() -1>> _ && Guillemet fermant introuvable dans la suite du paragraphe. __[i]/typo(typo_guillemet_simple_fermant_non_ouvert)__ ^[^‘']+\w\w(’) @@$ - <<- after("^ ") or isEnd() -1>> _ && Guillemet ouvrant introuvable dans ce paragraphe. + <<- after("^ ") or end() -1>> _ && Guillemet ouvrant introuvable dans ce paragraphe. TEST: ce {{‘}}test ne finira jamais. TEST: ces actions ne représentent rien{{’}} pour moi. TEST: « Je suis là. @@ -8042,11 +8042,11 @@ à ?$:W¿ *WORD <<- /conf/ \-1.islower() and not value(\-1, "|coté|sont|") >>> <<- /conf/ morph(\-1, ":(?:V.......[_z][az].*:Q|V1.*:Ip:2p)", ":[MGWNY]") -1>> a && Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez “a”. - <<- /conf/ __also__ and morph(\-1, ":V1.*:(?:Ip:2p|Q)", "*") and not value(<1, "|il|elle|on|n’|les|l’|m’|t’|s’|d’|en|y|lui|nous|vous|leur|") + <<- /conf/ __also__ and morph(\-1, ":V1.*:(?:Ip:2p|Q)", ":N") and not value(<1, "|il|elle|on|n’|les|l’|m’|t’|s’|d’|en|y|lui|nous|vous|leur|") --1>> =suggVerbInfi(\-1) && Le verbe devrait être à l’infinitif. <<- /conf/ __else__ and morph(\-1, ":[123][sp]", "*") and not value(\-1, "|tord|tords|") >>> <<- /conf/ morph(\-1, ":V2.*:I[ps]:3s", "*") --1>> =suggVerbPpas(\-1, ":m:s") && Incohérence : “\1” est une préposition ; “\-1” est une forme verbale. <<- /conf/ __also__ -1>> a && Confusion probable : “à” est une préposition. Pour le verbe “avoir”, écrivez “a”. <<- /conf/ __else__ --1>> _ && Incohérence : “\1” est une préposition ; “\-1” est une forme verbale. @@ -11864,21 +11864,29 @@ TEST: collait au millimètre près à la réalité # prix / pris __conf_prix_pris!7__ + ## prix [à|a] n’importe [quel+s] pris + [à|a] bon pris quel [est|était|fut|serait|sera] [le|mon|ton|son|notre|votre|leur|leurs] pris à [quel+s] pris + >avoir son pris <<- /conf/ --1>> prix && Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix + au pris [de|d’] + [à|a] pris modique + <<- /conf/ -2>> prix && Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix + [à|a] pris [coûtant|coutant] <<- /conf/ ->> à prix coûtant && Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix [au|aux] pris [fort+s] <<- /conf/ ->> au prix fort && Confusion : pour évoquer la valeur d’une chose, écrivez “prix”.|https://fr.wiktionary.org/wiki/prix + ## pris prix à la gorge prix dans [la|une|cette] [tourmente|tempête|tornade] prix dans [la|une|cette] coulée de [boue|lave] prix dans l’ [orage|ouragan] prix dans les [flots|vagues|tempêtes|tornades|orages|ouragans] @@ -11886,15 +11894,16 @@ prix entre deux feux prix la main dans le sac prix dans [mes|tes|ses|nos|vos|leurs] bras <<- /conf/ -1>> pris && Confusion probable : le participe de prendre s’écrit “pris”.|https://fr.wiktionary.org/wiki/pris -TEST: réussir à n’importe quel {{pris}}. -TEST: quel est leur {{pris}} ? -TEST: {{prix}} par surprise, -TEST: vendre {{à pris coûtant}} -TEST: encore un jeu vendu en kit {{au pris fort}} +TEST: réussir à n’importe quel {{pris}}. ->> prix +TEST: quel est leur {{pris}} ? ->> prix +TEST: au {{pris}} de sa vie ->> prix +TEST: {{prix}} par surprise, ->> pris +TEST: vendre {{à pris coûtant}} ->> à prix coûtant +TEST: encore un jeu vendu en kit {{au pris fort}} ->> au prix fort # puits / puis __conf_puits_puis__ [des|ces|mes|tes|ses|nos|vos|leurs|quelques|ce|mon|du] puis @@ -14719,10 +14728,11 @@ depuis près [de|d’] *NUM {unit_mesure_plur_mas} depuis quelques {unit_mesure_plur_mas} en *NUM {unit_mesure_plur_mas} pendant [des|plusieurs|quelques|*NUM|$:B:e:p] {unit_mesure_plur_mas} pendant près [de|d’] [*NUM|$:B:e:p] {unit_mesure_plur_mas} + un ou deux {unit_mesure_plur_mas} plus [tôt|tard] <<- not morph(>1, ":A.*:[me]:[pi]") ~>> * au bout de [nombreuses|plusieurs|quelques] {unit_mesure_plur_fem} après [des|plusieurs|quelques|*NUM|$:B:e:p] {unit_mesure_plur_fem} après près [de|d’] [*NUM|$:B:e:p] {unit_mesure_plur_fem} @@ -14732,14 +14742,16 @@ depuis près [de|d’] *NUM {unit_mesure_plur_fem} depuis quelques {unit_mesure_plur_fem} en *NUM {unit_mesure_plur_fem} pendant [des|plusieurs|quelques|*NUM|$:B:e:p] {unit_mesure_plur_fem} pendant près [de|d’] [*NUM|$:B:e:p] {unit_mesure_plur_fem} + une ou deux {unit_mesure_plur_fem} plus [tôt|tard] <<- not morph(>1, ":A.*:[fe]:[pi]") ~>> * $:B:e:p {unit_mesure_plur} auparavant $:B:e:p {unit_mesure_plur} plus [tôt|tard] + $:B:e:p ou $:B:e:p {unit_mesure_plur} plus [tôt|tard] à quelques {unit_mesure_plur} près après [des|plusieurs|quelques|*NUM|$:B:e:p] {unit_mesure_plur} de bons et loyaux services après près [de|d’] [*NUM|$:B:e:p] {unit_mesure_plur} de bons et loyaux services au fil des {unit_mesure_plur} à venir dans les {unit_mesure_plur} à venir @@ -16806,10 +16818,13 @@ entre [eux|elles|nous|vous|iels] <<- not morph(<1, ":Ov|>(?:il|on|elle)|>d’") ~>> * entre [moi|toi|lui|elle|nous|vous|eux|elles] et [moi|toi|lui|elle|nous|vous|eux|elles] <<- ~>> * + + , entre [tous|toutes] , + <<- ~>> * juste à temps <<- not morph(<1, ":D") ~>> * haut [placé+ses] @@ -17609,10 +17624,11 @@ >sommier à lattes >sonnette d’ alarme >sortie [de|d’] secours >soue à >cochon >sourate [*NUM|$:B] ?,¿ verset [*NUM|$:B] + >sourire [de|d’] connivence >souvenir d’ enfance >star du x >station [de|d’] radio >sujet [de|d’] [prédilection|préoccupation] >suspension [de|d’] séance @@ -17698,10 +17714,12 @@ >ver [de|d’] terre >verre à pied >vêtement [de|d’] rechange >vidéo X >vie [de|d’] bohème + >violence [par|sur] personne dépositaire de l’ autorité publique + >violence [par|sur] personnes dépositaires de l’ autorité publique >virage à [*NUM|$:B:e:p] degrés virus d’ origine animale >vitamine [A|B|C|D|E|F] >voie [de|d’] [garage|recours|perdition] >vol à l’ étalage @@ -19191,10 +19209,11 @@ TEST: Ce ne sera pas tous les jours facile TEST: d’une tête plus petit que moi, il mesurait à peine um mètre cinquante TEST: triompher par la force, l’intelligence la violence ou la ruse TEST: une table en bois brut TEST: c’est à devenir fou, à se taper la tête contre les murs +TEST: quitte à en souffrir et fût-ce au prix de sa vie @@@@ @@@@ @@@@ @@ -20027,11 +20046,11 @@ TEST: C’est {{la}} {{champ de l’heur}}. __conf_champ_chant__ - [chan|>chant] de [>blé|>betterave|>fleur|>force|>lavande|maïs|mais|>tournesol|>tulipe|>vision] + [chan|>chant] de [>blé|>betterave|>coquelicot|>fleur|>force|>jonquille|>lavande|maïs|mais|>mine|>navet|>patate|>pavot|>pomme|>tournesol|>tabac|>théier|>thé|>tulipe|>vision] <<- /conf/ -1>> =\1.replace("nt", "mp").replace("NT", "MP") && Confusion probable. Un chant est ce qui se chante.|https://fr.wiktionary.org/wiki/champ [>tomber|>mourir|>décéder|>trépasser] [au|aux] [chan|>chant] d’ >honneur sur [le|les] [chan|>chant] d’ >honneur <<- /conf/ -3>> champ|champs && Confusion. Locution “champ d’honneur”.|https://fr.wiktionary.org/wiki/champ_d%E2%80%99honneur @@ -20054,11 +20073,11 @@ TEST: donnons-leur le {{chant}} libre et cessons de nous inquieter # colon / côlon __conf_côlon_colon__ - cancer du colon + >cancer du colon <<- /conf/ -3>> côlon && Confusion : le côlon est un segment du gros intestin, le colon colonise. TEST: Il a le cancer du {{colon}}. @@ -26372,11 +26391,11 @@ [les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines] *WORD des @:N.*:[pi] ?[ne|n’]¿ [me|m’|te|t’|se|s’|nous|vous] [le|la|l’|les|en|y] @[123]p [les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines] *WORD des @:N.*:[pi] ?[ne|n’]¿ [le|la|l’|les] [lui|leur|en|y] @[123]p [les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|certains|certaines] *WORD des @:N.*:[pi] ?[ne|n’]¿ [lui|leur|y] en @[123]p <<- morph(\3, ":N.*:[pi]") ~4:5>> * -#### isEndOfNG #### +#### end of NG #### # # @:[VR]¬:[NAP] # , @¬:[NA] # ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles] # ?,¿ [/_VCint_|/_VCimp_] @@ -31691,14 +31710,13 @@ TEST: Quand j’aurai soif et faim, je m’arrêterai. # Si suivi du conditionnel ou du subjonctif __vmode_si_sujet_conditionnel_subjonctif__ - [|,|(] si [j’|J’|t’|T’] @:[SK]¬:(?:G|V0|I) [|,|(] si @:(?:Os|M) @:[SK]¬:(?:G|V0|I) [|,|(] s’ [il|ils|iel|iels] @:[SK]¬:(?:G|V0|I) - <<- /vmode/ -4>> _ && Ce verbe ne devrait être ni au conditionnel, ni au subjonctif. + <<- /vmode/ --1>> _ && Ce verbe ne devrait être ni au conditionnel, ni au subjonctif. TEST: Si Pierre {{avancerait}} sa voiture de quelques mètres, ça nous permettrait de passer. TEST: s’ils ne {{mangeraient}} pas tous les jours, ils seraient moins gros. TEST: Si j’{{irais}} le faire @@ -31773,21 +31791,22 @@ TEST: s’ils {{auraient}} deviné la solution, ils auraient pas demandé ->> avaient TEST: si le patron {{aurait}} pensé la chose, on l’aurait su. ->> avait TEST: si les femmes {{auraient}} parlé, je l’aurais su. ->> avaient - # Quand/lorsque/puisque/pourquoi + indicatif __vmode_quand_lorsque_indicatif__ - [quand|lorsque|lorsqu’|puisque|puisqu’] @:(?:Os|M) @:V.*:S¬:[GI] + [quand|lorsque|lorsqu’|puisque|puisqu’] @:(?:Os|M) @:S¬:[GI] [quand|lorsque|lorsqu’|puisque|puisqu’] @:(?:Os|M) @:V0e.*:S - <<- /vmode/ -3>> =suggVerbMode(\3, ":I", \2) && Après « quand » ou « lorsque » ou « puisque », le verbe ne s’emploie pas au subjonctif mais à l’indicatif. + [quand|lorsque|lorsqu’|puisque|puisqu’] $:D¬:R $:N @:S¬:[GIA] + <<- /vmode/ --1>> =suggVerbMode(\-1, ":I", \-2) && Après « quand » ou « lorsque » ou « puisque », le verbe ne s’emploie pas au subjonctif mais à l’indicatif. TEST: quand elle {{rencontrât}} son créateur TEST: lorsqu’il y {{eût}} du grabuge, nous montâmes tous sur le pont. [|,|(] pourquoi @:(?:Os|M) @:V.*:S¬:[GI] + [|,|(] pourquoi $:D¬:R $:N @:V.*:S¬:[GIA] <<- /vmode/ --1>> =suggVerbMode(\-1, ":I", \-2) && Après « pourquoi », le verbe ne s’emploie pas au subjonctif mais à l’indicatif. TEST: quand elle {{rencontrât}} son créateur TEST: lorsqu’il y {{eût}} du grabuge, nous montâmes tous sur le pont. TEST: pourquoi Mélanie {{vienne}} à cette réception @@ -31796,26 +31815,25 @@ TEST: quels amis ils eussent trompés pour si peu ? # Dès que + indicatif __vmode_dès_que__ - dès [que|qu’] @:(?:Os|M) @:S¬:[IG] - <<- /vmode/ -4>> =suggVerbMode(\4, ":I", \3) && Après “dès que”, le verbe ne devrait pas être au subjonctif. + dès [que|qu’] @:(?:Os|M) @:S¬:[GI] + dès [que|qu’] $:D¬:R $:N @:S¬:[GIA] + <<- /vmode/ --1>> =suggVerbMode(\-1, ":I", \-2) && Après “dès que”, le verbe ne devrait pas être au subjonctif. # <<- morph(\1, ":(?:Os|M)", False) and morph(\2, ":K", False) -2>> =suggVerbMode(@, ":If", \1) && Ce verbe ne devrait pas être au conditionnel. #TEST: dès que je le {{verrais}} TEST: dès qu’il le {{voie}} +TEST: dès que l’homme le {{voie}} TEST: donnant à entendre qu’il avait l’intention de violer Laura dès qu’il en aurait l’occasion # indicatif nécessaire __vmode_sujet_indicatif__ - [je|tu|il|ils|elle|elles|on|nous|vous|iel|iels] @:S¬:[GIK]|V0a.*:Sq - <<- /vmode/ -3>> =suggVerbMode(\3, ":I", \2) && Ce verbe ne devrait pas être au subjonctif. - - j’ @:S¬:[GIK]|V0a.*:Sq:1s - <<- /vmode/ -3>> =suggVerbMode(\3, ":I", "je") && Ce verbe ne devrait pas être au subjonctif. + [je|j’|tu|il|ils|elle|elles|on|nous|vous|iel|iels] @:S¬:[GIK]|V0a.*:Sq + <<- /vmode/ --1>> =suggVerbMode(\-1, ":I", \-2) && Ce verbe ne devrait pas être au subjonctif. TEST: Il {{ait}} parti. TEST: Il en {{conclue}} qu’il a eu raison. TEST: j’en {{aie}} marre TEST: j’{{aie}} faim Index: misc/grammalecte.sublime-syntax ================================================================== --- misc/grammalecte.sublime-syntax +++ misc/grammalecte.sublime-syntax @@ -58,11 +58,11 @@ scope: keyword.python - match: '\b(?:True|False|None)\b' scope: constant.language - - match: '\b(?:spell|morph(?:VC|0|2|)|stem|tag|value|space|textarea0?\w*|before0?\w*|after0?\w*|word|option|define(?:from|)|select|exclude|setmeta|analyse|tag(?:after|before)|apposition|is[A-Z]\w+|agreement|rewrite|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b' + - match: '\b(?:spell|morph(?:VC|0|2|)|stem|tag|value|space|textarea0?\w*|before0?\w*|after0?\w*|start0?|end0?|word|option|define(?:from|)|select|exclude|setmeta|analyse|tag(?:after|before)|apposition|is[A-Z]\w+|agreement|rewrite|checkD\w+|getD\w+|has[A-Z]\w+|sugg[A-Z]\w+|switch[A-Z]\w+|ceOrCet|formatN\w+|mbUnit)\b' scope: entity.name.function - match: '\b(?:replace|endswith|startswith|search|upper|lower|capitalize|strip|rstrip|is(?:alpha|upper|lower|digit|title))\b' scope: support.function