turbo-editors/turbo-golopublic Fork 0
b2b07ec0fe8e8d54362f3a1a6f1b089e9198ebd8
Commits
Clone
git clone https://git.rickub.com/turbo-editors/turbo-golo.git
git clone ssh://git@rickub.com/turbo-editors/turbo-golo.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

languages.md · 294 lines · 19.3 KBmarkdown Blame HistoryRaw
📦 Turbo Golo d710c1b k33g yesterday1# Référence : langages colorés
2
3> Description neutre des fichiers que Turbo Golo colore, de la façon dont il décide, et de ce que chaque scanner reconnaît.
4
5## Reconnaissance
6
7L'**extension** d'un fichier décide dès qu'elle est l'une de celles-ci :
8
9| Extension | Langage |
10| --- | --- |
11| `.golo` | Golo |
12| `.toml` | TOML |
13| `.yaml`, `.yml` | YAML |
14| `.md`, `.markdown` | Markdown |
15| `.js`, `.mjs`, `.cjs` | JavaScript |
16| `.html`, `.htm` | HTML |
17| `.xml`, `.xsd`, `.xsl`, `.xslt`, `.svg`, `.plist`, `.csproj`, `.pom` | XML |
18| `.sh`, `.bash`, `.zsh` | Shell |
19| `.dockerfile`, `.containerfile` | Dockerfile |
20
21Les extensions sont comparées sans tenir compte de la casse, et seule la dernière compte : `notes.golo.md` est du Markdown, et `main.golo.backup` n'est pas du Golo.
22
23Un fichier dont l'extension ne décide rien est ensuite cherché par son **nom**. Seuls les fichiers sans extension utile en ont besoin :
24
25| Nom | Langage |
26| --- | --- |
27| `Dockerfile`, `Containerfile` | Dockerfile |
28
29Un nom correspond sur sa totalité ou sur la partie avant le premier point, sans tenir compte de la casse — `Dockerfile`, `dockerfile` et `Dockerfile.dev` sont donc tous reconnus, tandis que `Dockerfile.md` est du Markdown, parce que l'extension est consultée d'abord.
30
31Un fichier que ni l'une ni l'autre table ne réclame est lu par sa **première ligne**. Un shebang nommant `golo` en fait du Golo : `#` ouvre un commentaire en Golo, l'interpréteur lit donc la ligne comme tel, et un script installé sans son extension et lancé comme une commande est du Golo et rien d'autre. Un shebang nommant un shell — `sh`, `bash`, `zsh`, `dash` ou `ksh` — en fait un script shell. L'interpréteur est reconnu comme élément de chemin ou comme argument d'`env`.
32
33| Première ligne | Résultat |
34| --- | --- |
35| `#!/usr/bin/env golo` | Golo |
36| `#!/usr/local/bin/golo` | Golo |
37| `#!/bin/sh` | Shell |
38| `#!/usr/bin/env bash` | Shell |
39| `#!/usr/bin/env -S bash -e` | Shell |
40| `#!/usr/bin/env node` | Non coloré |
41| Tout ce qui ne commence pas par `#!` | Non coloré |
42
43L'ordre est fixe — extension, puis nom, puis première ligne — et le premier qui décide l'emporte.
44
45Tout le reste est affiché en texte brut. Ce n'est pas une erreur — ouvrir un PNG dans l'éditeur n'est pas une faute, c'est juste non coloré.
46
47## Classes
48
49Chaque scanner produit le même vocabulaire de classes, et chacune correspond à une clé de thème.
50
51| Classe | Clé de thème | Produite par |
52| --- | --- | --- |
53| `identifier` | `syntax.identifier` | Golo, TOML, JavaScript, shell, YAML, Dockerfile |
54| `keyword` | `syntax.keyword` | Golo, JavaScript, shell, HTML (doctype), XML, Dockerfile |
55| `type` | `syntax.type` | Golo (noms capitalisés et chemins de module), TOML (en-têtes de table), YAML (tags) |
56| `builtin` | `syntax.builtin` | Golo (les fonctions de l'interpréteur), JavaScript, shell (builtins et expansions), YAML (ancres et alias), Dockerfile (variables) |
57| `constant` | `syntax.constant` | Golo, TOML, JavaScript, shell, YAML, HTML et XML (entités) |
58| `function` | `syntax.function` | Golo, JavaScript, shell (la commande) |
59| `string` | `syntax.string` | tous |
60| `char` | `syntax.char` | Golo (`'c'`) |
61| `number` | `syntax.number` | Golo, TOML, JavaScript, shell, YAML, Dockerfile |
62| `comment` | `syntax.comment` | Golo, TOML, JavaScript, shell, HTML, YAML, XML, Dockerfile |
63| `operator` | `syntax.operator` | Golo, TOML, JavaScript, shell, HTML, YAML (en-têtes de scalaires bloc), XML, Dockerfile |
64| `punctuation` | `syntax.punctuation` | Golo, TOML, JavaScript, shell, Markdown, YAML, Dockerfile |
65| `heading` | `syntax.heading` | Markdown |
66| `tag` | `syntax.tag` | HTML, XML |
67| `attribute` | `syntax.attribute` | HTML, XML, Dockerfile (options) |
68| `emphasis` | `syntax.emphasis` | Markdown |
69| `link` | `syntax.link` | Markdown |
70
71Golo ne produit aucune portée `heading`, `tag`, `attribute`, `emphasis` ou `link`. Dans `turbo-classic`, `syntax.number` et `syntax.constant` sont tous deux magenta et `syntax.char` a le vert de `syntax.string`, si bien que `42` et `true` partagent une couleur là, et `'x'` et `"x"` aussi ; d'autres thèmes les séparent. Voir [écrire son propre thème](../how-to/write-a-theme.md) pour changer cela.
72
73## Golo
74
75Écrit à la main, dans `internal/gololang`, contre `lexer/lexer.go` et `token/token.go` de GoloScript. Ce que le lexer lit comme un token, le scanner le colore comme une portée.
76
77**Quatre constructions franchissent une ligne**, et sont portées à la ligne suivante exactement comme le lexer les lit : un commentaire bloc `----` jusqu'à son `----` fermant ; une chaîne `"…"` jusqu'à son guillemet fermant ; une chaîne multiligne `"""…"""` jusqu'à ses trois guillemets fermants ; un littéral de caractère `'…'` jusqu'à son apostrophe fermante. Aucune des quatre ne s'imbrique. Une chaîne non terminée colore donc le reste du fichier, jusqu'à un guillemet — ce que l'interpréteur lit comme telle.
78
79| Reconnu | Comme |
80| --- | --- |
81| `and`, `augment`, `augmentation`, `await`, `break`, `case`, `catch`, `continue`, `else`, `finally`, `for`, `foreach`, `function`, `if`, `import`, `in`, `is`, `isnt`, `let`, `local`, `match`, `module`, `not`, `oftype`, `or`, `orIfNull`, `otherwise`, `return`, `spawn`, `struct`, `then`, `throw`, `try`, `union`, `var`, `when`, `while`, `with` | mot-clé |
82| `true`, `false`, `null` | constante |
83| les 157 builtins de l'interpréteur — `println`, `print`, `str`, `len`, `list`, `map`, `set`, `array`, `vector`, `range`, `readFile`, `toJSON`, `fromJSON`, `httpGet`, `DynamicObject`, … | builtin |
84| tout autre nom commençant par une majuscule ASCII — `Point`, `Shape`, `Circle`, `Result_Failure`, `Some` | type |
85| le chemin pointé après `module` ou `import``hello.World`, `gololang.Errors`, `java.util.List` — en une seule portée | type |
86| le nom après `function``main` dans `function main = \|args\|` | fonction |
87| tout autre nom en minuscules immédiatement avant `(` | fonction |
88| tout autre nom : toute lettre ou marque Unicode, `_`, ou un emoji, puis des lettres, des chiffres et les mêmes — `x`, `été`, `名前`, `😀`, `🚀launch` | identifiant |
89| `"…"` avec les échappements `\n \t \r \\ \" \' \0 \xHH`, sur plusieurs lignes | chaîne |
90| `"""…"""`, sur plusieurs lignes, sans échappement | chaîne |
91| `'…'` avec les mêmes échappements, sur plusieurs lignes | caractère |
92| `42`, `3.14`, `1.5e-3`, `2E10`, `42L`, `3.14F`, `2.0f` | nombre |
93| `#` jusqu'à la fin de la ligne, shebang compris | commentaire |
94| `----``----`, sur plusieurs lignes | commentaire |
95| `..`, `...` | opérateur |
96| les suites de `+-*/%=<>!&\|^~?:` — dont `->`, `?:`, `==`, `!=`, `<=`, `>=` | opérateur |
97| `()[]{},;` et un `.` seul | ponctuation |
98| `$` dans `augment Shape$Circle` | ponctuation |
99
100**Un point rejoint un nombre seulement quand un chiffre le suit.** C'est le test du lexer lui-même, et c'est ce qui garde `1..3` comme un nombre et un intervalle plutôt que le double `1.` et un `.3` égaré.
101
102**Un exposant peut n'avoir aucun chiffre.** Le lexer lit `1e` comme un flottant et laisse le parseur se plaindre, `1e` est donc une seule portée de nombre.
103
104**Un nom capitalisé est un type par convention, pas par règle.** Golo vous laisse écrire `let Count = 1`, et il est coloré comme un type quand même. Les structs, les unions, les variantes et les cibles d'augmentation sont ce que les gens capitalisent, et la couleur suit les gens.
105
106**`Some`, `None`, `Ok` et `Err` sont des types, pas des constantes.** Ce sont les variantes d'unions ordinaires déclarées dans `gololang.Errors`, disponibles après un `import`, pas des builtins.
107
108**`DynamicObject` est un builtin, majuscule comprise.** Il est dans la table de l'interpréteur, et la table l'emporte sur la règle de casse.
109
110**Les noms peuvent contenir toute lettre Unicode, et des emoji.** Le `isLetter` du lexer admet les lettres, les marques, `_` et quatre blocs d'emoji (émoticônes, symboles et pictogrammes divers, symboles de transport et de cartes, symboles et pictogrammes supplémentaires) ; le scanner applique la même règle.
111
112**La coloration suit le lexer, pas le parseur.** Le parseur de GoloScript, en v0.1.1, refuse plusieurs tokens que son lexer lit : les suffixes `L`, `F` et `f`, un littéral de caractère `'c'`, l'intervalle `..`, `orIfNull`, `oftype` et `local function`. Ils sont colorés comme le lexer les lit, et le serveur de langage marque la ligne quand le parseur les refuse. `demos/syntax-tour/lexer-only.golo` en contient un de chaque.
113
114**Non reconnu**, chacun pour une raison énoncée :
115
116| Non reconnu | Parce que |
117| --- | --- |
118| `1_000` comme un seul nombre | Le lexer n'a pas de séparateur de chiffres : `_` commence un nom, c'est donc `1` puis `_000` |
119| `0xFF`, `0b1010`, `0o17` comme nombres | Le lexer n'a pas de préfixe de base : `0xFF` est `0` puis le nom `xFF` |
120| `.5` comme nombre | Le lexer exige un chiffre avant le point, c'est donc un point puis `5` |
121| `42l` comme long | Le lexer n'accepte que le `L` majuscule, c'est donc `42` et le nom `l` |
122| `---` comme commentaire | Quatre tirets ouvrent un commentaire bloc ; trois sont une suite d'opérateurs |
123| Un mot-clé après `:` comme nom de méthode | `obj: match()` garde `match` en mot-clé — le scanner ne suit pas ce qu'un deux-points introduit |
124| Un échappement dans `"""…"""` | Le lexer ajoute chaque rune jusqu'aux trois guillemets, `"""a\"""` se termine donc à son premier `"""` |
125| Un constructeur autrement que comme un type | Rien dans la syntaxe ne sépare `Circle(1.0)` d'un type appliqué à des arguments |
126| Une chaîne non terminée qui s'arrête à sa ligne | L'interpréteur lit jusqu'au guillemet fermant où qu'il soit, la couleur le suit donc — l'inverse de la décision de Turbo MoonBit, pour la raison inverse |
127| Si un nom est lié dans cette portée | Rien ici ne lit plus d'une ligne à la fois ; c'est la question du serveur de langage, et [F1 y répond](../how-to/ask-about-code.md) |
128
129## TOML
130
131| Reconnu | Comme |
132| --- | --- |
133| `# commentaire` | commentaire |
134| `[table]`, `[[tableau]]` | le nom comme type, les crochets comme ponctuation |
135| `clé =` | identifiant, puis opérateur |
136| `"basique"`, `'littérale'`, `"""multiligne"""`, `'''multiligne'''` | chaîne |
137| `true`, `false` | constante |
138| nombres, dates, heures, `inf`, `nan` | nombre |
139
140## YAML
141
142Un fichier compose, un manifeste Kubernetes et un workflow de CI sont tous cela : il n'y a pas de dialecte séparé, parce qu'un dialecte serait le schéma de quelqu'un d'autre à maintenir en phase.
143
144| Reconnu | Comme |
145| --- | --- |
146| `# commentaire` | commentaire |
147| `clé:` avant un espace ou la fin de ligne | la clé comme identifiant, le deux-points comme ponctuation |
148| `"citée": 1`, `'citée': 1` | la clé citée comme identifiant |
149| `- ` ouvrant un élément de séquence | ponctuation |
150| `"…"`, `'…'` | chaîne |
151| `true`, `false`, `yes`, `no`, `on`, `off`, `null` | constante, quelle que soit la casse |
152| nombres, dates et heures écrits sans guillemets | nombre |
153| `&ancre`, `*alias` | builtin |
154| `!!str`, `!Custom` | type |
155| `---`, `...` | toute la ligne comme ponctuation |
156| `{`, `}`, `[`, `]`, `,` | ponctuation |
157| `\|`, `>`, avec leurs indicateurs de troncature et d'indentation | l'en-tête comme opérateur, le corps comme chaîne |
158
159**Un deux-points n'est un séparateur que si un espace ou la fin de ligne le suit.** `image: nginx:1.27` est une clé et une valeur, et `url: http://example.com/x` est une clé et une URL — colorer les deux-points intérieurs comme séparateurs mettrait chaque tag d'image et chaque URL en trois couleurs.
160
161**L'étendue d'un scalaire bloc est décidée par l'indentation**, pas par un délimiteur. La première ligne de contenu après `|` ou `>` fixe l'indentation du bloc ; chaque ligne indentée au moins autant lui appartient, et la première qui ne l'est pas le termine. **Une ligne vide dans un bloc reste dans le bloc** : un scalaire littéral garde ses lignes vides, et terminer le bloc au premier saut de paragraphe couperait en deux un script shell dans un fichier de CI.
162
163**Un `#` a besoin d'un espace devant pour ouvrir un commentaire**, `colour: ff#00aa` est donc un seul scalaire.
164
165| Non reconnu | Parce que |
166| --- | --- |
167| Le schéma d'un fichier compose, d'un manifeste ou d'un workflow | Colorer `services:` autrement que n'importe quelle clé signifie porter le schéma de quelqu'un d'autre, et il vieillit le jour où ils ajoutent une clé |
168| Les flux multi-documents comme documents séparés | `---` est coloré, mais rien n'est réinitialisé ; rien dans la coloration ne dépend des frontières de documents |
169| Si un mot nu est une chaîne ou un nombre pour un parseur | `1.2.3` est une version pour un lecteur et une chaîne pour YAML ; le scanner colore ce à quoi cela ressemble |
170
171## Markdown
172
173| Reconnu | Comme |
174| --- | --- |
175| `# Titre``###### Titre` | toute la ligne comme titre |
176| `**gras**`, `__gras__`, `*italique*`, `_italique_` | emphase |
177| `` `code` `` | chaîne |
178| `[texte](cible)`, `![alt](src)` | le tout comme lien |
179| `- `, `* `, `+ `, `1. `, `1) ` | le marqueur comme ponctuation |
180| `>` | ponctuation |
181| `---`, `***`, `___` | ponctuation |
182| les clôtures ` ``` ` et `~~~` | tout le bloc, lignes d'ouverture et de fermeture comprises, comme chaîne |
183
184Un bloc clôturé est **d'une seule couleur quel que soit le langage annoncé** : ```` ```golo ```` ne colore pas son contenu comme du Golo. La suite de marqueurs qui ouvre un bloc doit être fermée par le même caractère, une clôture en accents graves n'est donc pas fermée par une en tildes. Une clôture non fermée colore jusqu'à la fin du fichier.
185
186La suite de marqueurs ouvrant une emphase doit être fermée par une suite de même longueur, `**gras**` est donc une portée plutôt que deux italiques.
187
188## JavaScript
189
190| Reconnu | Comme |
191| --- | --- |
192| `const`, `let`, `function`, `class`, `async`, `await`, `import`, `export`, … | mot-clé |
193| `true`, `false`, `null`, `undefined`, `NaN`, `Infinity`, `this` | constante |
194| `console`, `document`, `window`, `Array`, `Object`, `Promise`, `Math`, `JSON`, … | builtin |
195| un nom immédiatement avant `(` | fonction |
196| `"…"`, `'…'` | chaîne |
197| `` `` ``, interpolations comprises, sur plusieurs lignes | chaîne |
198| `//` jusqu'à la fin de ligne, `/* … */` sur plusieurs lignes | commentaire |
199| `42`, `3.14`, `0x1f`, `0b1010`, `0o777`, `1_000_000`, `1e6`, `10n` | nombre |
200| les suites de `+-*/%=<>!&|^~?:` | opérateur |
201| `()[]{},;.` | ponctuation |
202
203**Les littéraux d'expressions régulières ne sont pas reconnus.** Distinguer `/x/g` d'une division demande de savoir si le token précédent pouvait terminer une expression ; une mauvaise supposition colore le reste d'une ligne comme une chaîne, ce qui est pire que de laisser une regex de la couleur d'un opérateur.
204
205Les globales sont reconnues par leur nom, un fichier qui masque `Math` le voit donc toujours coloré comme builtin — la même règle que suivent ici les builtins de Golo.
206
207## HTML
208
209| Reconnu | Comme |
210| --- | --- |
211| `<tag`, `</tag`, `>`, `/>` | balise |
212| les noms d'attributs, dont `data-*`, `xlink:href`, `@click`, `v-bind.prop` | attribut |
213| `=` | opérateur |
214| `"…"`, `'…'` | chaîne |
215| `<!-- … -->`, sur plusieurs lignes | commentaire |
216| `&amp;`, `&#169;` | constante |
217| `<!DOCTYPE …>` et les autres déclarations | mot-clé |
218
219Le texte entre les balises n'est pas coloré. Un `&` nu sans `;` dans les 32 caractères est laissé tranquille, parce que c'est du texte légal.
220
221**Le contenu de `<script>` et `<style>` n'est pas coloré** comme du JavaScript et du CSS.
222
223## XML
224
225Son propre scanner plutôt que celui de HTML, pour une raison qui compte : CDATA. Tout l'intérêt de `<![CDATA[ … ]]>` est que son contenu n'est *pas* du balisage, et colorer les balises qu'il contient comme des balises est exactement à l'envers.
226
227| Reconnu | Comme |
228| --- | --- |
229| `<?xml version="1.0"?>` et les autres instructions de traitement | la cible et `?>` comme mot-clé, les paires entre elles comme attributs et chaînes |
230| `<!DOCTYPE …>` et les autres formes `<!` | mot-clé |
231| `<!-- … -->`, sur plusieurs lignes | commentaire |
232| `<![CDATA[ … ]]>`, sur plusieurs lignes | chaîne |
233| `<tag`, `</tag`, `>`, `/>` | balise |
234| `<ns:tag>`, `xsi:type` | le préfixe et le nom local en **une** portée |
235| les noms d'attributs | attribut |
236| `=` | opérateur |
237| `"…"`, `'…'` | chaîne |
238| `&amp;`, `&#169;` | constante |
239
240**Un commentaire et une section CDATA se ferment sur des délimiteurs différents**, et sont portés séparément : un `-->` dans une section CDATA ne la termine pas.
241
242**Un `&` nu sans point-virgule dans les 32 caractères est laissé tranquille**, parce que c'est du texte légal dans bien des documents et qu'avaler le reste de la ligne serait la plus grosse erreur.
243
244Le texte entre les balises n'est pas coloré.
245
246## Shell
247
248Vaut pour `sh`, `bash` et `zsh` : les mots-clés reconnus sont ceux qu'ils partagent.
249
250| Reconnu | Comme |
251| --- | --- |
252| `if`, `then`, `fi`, `for`, `while`, `case`, `esac`, `function`, `return`, … | mot-clé |
253| `true`, `false` | constante |
254| `echo`, `printf`, `export`, `local`, `read`, `cd`, `set`, `source`, … | builtin |
255| `$NAME`, `${…}`, `$(…)`, `$1`, `$?`, `$@` | builtin |
256| le **premier mot nu d'une ligne** | fonction |
257| chaque mot nu suivant, et `NAME` dans `NAME=valeur` | identifiant |
258| `'…'`, sans rien d'échappé ni de développé dedans | chaîne |
259| `"…"`, avec les expansions dedans colorées comme des expansions | chaîne |
260| `#` jusqu'à la fin de ligne | commentaire |
261
262`$(a $(b) c)` est une seule portée : l'imbrication est comptée. Une option comme `-euo` est un seul mot, pas un moins et un mot.
263
264**Les heredocs ne sont pas reconnus.** `<<EOF` et le texte qui suit sont colorés comme du shell ordinaire.
265
266## Dockerfile
267
268| Reconnu | Comme |
269| --- | --- |
270| `FROM`, `RUN`, `COPY`, `ADD`, `ARG`, `ENV`, `CMD`, `ENTRYPOINT`, `EXPOSE`, `LABEL`, `USER`, `VOLUME`, `WORKDIR`, `HEALTHCHECK`, `ONBUILD`, `SHELL`, `STOPSIGNAL`, `MAINTAINER` | mot-clé, quelle que soit la casse |
271| `AS`, `NONE` | mot-clé |
272| `# commentaire`, y compris les directives `# syntax=` et `# escape=` | commentaire |
273| `--from=builder`, `--chown=me:me` | le nom de l'option comme attribut |
274| `$NAME`, `${NAME}`, `${NAME:-default}` | builtin, en une portée jusqu'à l'accolade fermante |
275| `"…"`, `'…'` | chaîne |
276| un `\` final | opérateur |
277| les nombres | nombre |
278| les chemins et références d'images — `/usr/local/bin`, `golang:1.26-alpine` | identifiant, en **une** portée |
279
280**Seul le premier mot d'une ligne peut être une instruction**, et un mot qui n'en est pas une est un argument — ce qui garde le premier mot d'une ligne de continuation hors de la couleur des mots-clés.
281
282**Rien ne franchit une ligne.** Un `\` joint deux lignes pour Docker, mais chaque moitié se lit toujours comme une commande et est colorée seule.
283
284| Non reconnu | Parce que |
285| --- | --- |
286| Le shell dans un `RUN` | Il faudrait lancer le scanner shell sur une partie de ligne et reporter ses colonnes, et `RUN` peut contenir n'importe quel langage |
287| Les heredocs dans un `RUN` | La même raison que pour le scanner shell |
288| Quelle étape un `--from` nomme | Rien ici ne lit le reste du fichier |
289
290## Voir aussi
291
292- [Format des fichiers de thème](themes.md) — chaque clé vers laquelle ces classes résolvent
293- [Coloration et complétion](../explanation/colouring-and-completion.md) — pourquoi les scanners sont écrits ainsi
294- [Écrire son propre thème](../how-to/write-a-theme.md)