fbp-language 1.1.7 → 1.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,7 +23,7 @@ Puis, dans le `package.json` de ton projet :
23
23
  "start": "fbp run lancer"
24
24
  },
25
25
  "dependencies": {
26
- "fbp-language": "^1.1.6"
26
+ "fbp-language": "^1.1.9"
27
27
  }
28
28
  }
29
29
  ```
@@ -55,6 +55,18 @@ lance()
55
55
 
56
56
  Les chemins déclarés dans `commandes.fbp` sont relatifs à la racine du projet.
57
57
 
58
+ ## Initialiser un projet et installer le support VS Code
59
+
60
+ Dans le dossier de ton projet, exécute :
61
+
62
+ ```bash
63
+ fbp -init
64
+ ```
65
+
66
+ La commande crée `commandes.fbp` et `scripts/main.fbp` sans écraser les fichiers existants. Elle installe également le support FBP fourni avec le package dans le dossier des extensions VS Code de l’utilisateur. Si tu utilises une instance distante ou un environnement sans dossier d’extensions accessible, l’installation peut nécessiter une configuration manuelle. Recharge ensuite VS Code. Pour l’icône FBP, sélectionne `FBP File Icons` dans **Préférences : Thème d’icônes de fichiers**.
67
+
68
+ Le support VS Code contient la reconnaissance des fichiers `.fbp`, la coloration syntaxique et le thème d’icônes. Il est livré dans le même dépôt et le même package npm ; aucune extension séparée à rechercher n’est nécessaire.
69
+
58
70
  ## Commandes CLI
59
71
 
60
72
  ```bash
@@ -62,6 +74,7 @@ fbp help
62
74
  fbp version
63
75
  fbp info
64
76
  fbp ping
77
+ fbp -init
65
78
  fbp run lancer
66
79
  fbp run-file scripts/main.fbp
67
80
  ```
@@ -115,6 +128,18 @@ Associe `lancer` à `scripts/main.fbp` dans `commandes.fbp`, puis exécute `npx
115
128
 
116
129
  FBP enregistre les commandes déclarées comme commandes slash globales de l'application Discord. Leur apparition peut prendre un peu de temps après le premier enregistrement. Les noms doivent contenir de 1 à 32 caractères parmi les lettres minuscules, chiffres, tirets et underscores.
117
130
 
131
+ ## Sélecteur de salon Discord (v1.1.8)
132
+
133
+ Une commande slash peut proposer un sélecteur de salon Discord. La valeur choisie est réutilisable dans la réponse avec `{{salon}}` :
134
+
135
+ ```fbp
136
+ discordConnexion()
137
+ discordCommande("configurer", "Salon sélectionné : {{salon}}")
138
+ discordOptionSalon("configurer", "salon", "Choisis un salon", true)
139
+ ```
140
+
141
+ Le dernier argument indique si l'option est obligatoire. La réponse affiche le nom du salon précédé de `#`. Cette option peut être ajoutée aux commandes texte ou aux commandes embed, comme les autres options slash.
142
+
118
143
  ## Limites actuelles
119
144
 
120
145
  FBP est encore un interpréteur de base. Les paramètres de fonction, les conditions, les boucles, les valeurs de retour et les expressions arithmétiques ne sont pas encore implémentés. La connexion Discord utilise un token stocké dans `.env`. Les commandes slash peuvent répondre avec un texte fixe ou un embed défini avec `discordCommandeEmbed(nom, titre, description, couleur)`. Ajoute des champs avec `discordChamp(nomCommande, nomChamp, valeur)`. Les valeurs des embeds sont actuellement fixes : la récupération dynamique des informations du serveur, les options, paramètres, permissions avancées et conditions ne sont pas encore implémentés.
@@ -221,3 +246,8 @@ discordOptionNombreLimites("note", "note", 0, 20)
221
246
  - `discordOptionNombreLimites(commande, option, minimum, maximum)` accepte des bornes numériques, y compris décimales.
222
247
  - Le minimum doit être inférieur ou égal au maximum.
223
248
  - Les limites s'appliquent à l'interface Discord. Une option avec des choix prédéfinis ne peut pas recevoir de limites.
249
+
250
+
251
+ ## Support VS Code
252
+
253
+ Le dossier `vscode-extension/` contient le manifeste d’extension, la grammaire TextMate, la configuration de langage et le thème d’icônes FBP. La commande `fbp -init` copie ce support dans le dossier d’extensions de VS Code. Le logo du thème d’icônes se trouve dans `vscode-extension/assets/fbp-logo.svg`.
Binary file
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 128" role="img" aria-labelledby="title">
2
+ <title id="title">FBP — { B }</title>
3
+ <g fill="currentColor" font-family="Arial, Helvetica, sans-serif" font-size="88" font-weight="600" text-anchor="middle">
4
+ <text x="48" y="94">{</text>
5
+ <text x="128" y="94">B</text>
6
+ <text x="208" y="94">}</text>
7
+ </g>
8
+ </svg>
package/dist/cli.js CHANGED
@@ -5,10 +5,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  };
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_os_1 = __importDefault(require("node:os"));
8
9
  const node_path_1 = __importDefault(require("node:path"));
9
10
  const compiler_1 = require("./compiler");
10
11
  const errors_1 = require("./errors");
11
- const VERSION = "1.1.7";
12
+ const VERSION = "1.1.9";
12
13
  function help() {
13
14
  console.log(`FBP — French Bot Programming
14
15
 
@@ -17,6 +18,8 @@ Utilisation :
17
18
  fbp version Affiche la version de FBP
18
19
  fbp info Affiche les informations du moteur
19
20
  fbp ping Vérifie que le CLI répond
21
+ fbp -init Prépare un projet FBP et le support VS Code
22
+ fbp init Alias de -init
20
23
  fbp run <commande> Exécute une commande de commandes.fbp
21
24
  fbp run-file <fichier> Exécute directement un fichier .fbp`);
22
25
  }
@@ -26,6 +29,59 @@ function ping() {
26
29
  console.log(`Node.js : ${process.version}`);
27
30
  console.log("Bot : aucune connexion externe n'est configurée par le CLI seul.");
28
31
  }
32
+ function initProject() {
33
+ const root = process.cwd();
34
+ const commandsPath = node_path_1.default.join(root, "commandes.fbp");
35
+ const mainDir = node_path_1.default.join(root, "scripts");
36
+ const mainPath = node_path_1.default.join(mainDir, "main.fbp");
37
+ node_fs_1.default.mkdirSync(mainDir, { recursive: true });
38
+ if (!node_fs_1.default.existsSync(commandsPath)) {
39
+ node_fs_1.default.writeFileSync(commandsPath, JSON.stringify({ lancer: "scripts/main.fbp" }, null, 2) + "\n", "utf8");
40
+ console.log("Créé : commandes.fbp");
41
+ }
42
+ else {
43
+ console.log("Conservé : commandes.fbp existe déjà.");
44
+ }
45
+ if (!node_fs_1.default.existsSync(mainPath)) {
46
+ node_fs_1.default.writeFileSync(mainPath, 'nom = "Mon projet"\n\nlance() {\n affiche("FBP fonctionne !")\n affiche("Projet :", nom)\n}\n\nlance()\n', "utf8");
47
+ console.log("Créé : scripts/main.fbp");
48
+ }
49
+ else {
50
+ console.log("Conservé : scripts/main.fbp existe déjà.");
51
+ }
52
+ installVscodeSupport();
53
+ console.log("\nProjet FBP initialisé. Lance « fbp run lancer » pour exécuter le programme.");
54
+ }
55
+ function installVscodeSupport() {
56
+ const bundledExtension = node_path_1.default.resolve(__dirname, "../vscode-extension");
57
+ const manifestPath = node_path_1.default.join(bundledExtension, "package.json");
58
+ if (!node_fs_1.default.existsSync(manifestPath)) {
59
+ console.log("Support VS Code non trouvé dans le package. La coloration et l'icône n'ont pas été installées.");
60
+ return;
61
+ }
62
+ const extensionRoot = process.env.VSCODE_AGENT_FOLDER
63
+ ? node_path_1.default.join(process.env.VSCODE_AGENT_FOLDER, "extensions")
64
+ : process.platform === "win32"
65
+ ? node_path_1.default.join(process.env.USERPROFILE || node_os_1.default.homedir(), ".vscode", "extensions")
66
+ : node_path_1.default.join(node_os_1.default.homedir(), ".vscode", "extensions");
67
+ const destination = node_path_1.default.join(extensionRoot, `gabyy1.fbp-language-${VERSION}`);
68
+ try {
69
+ node_fs_1.default.mkdirSync(extensionRoot, { recursive: true });
70
+ if (node_fs_1.default.existsSync(destination)) {
71
+ node_fs_1.default.rmSync(destination, { recursive: true, force: true });
72
+ }
73
+ node_fs_1.default.cpSync(bundledExtension, destination, { recursive: true });
74
+ console.log(`Support VS Code installé dans : ${destination}`);
75
+ console.log("Recharge la fenêtre VS Code pour activer la coloration FBP.");
76
+ console.log("Pour afficher l'icône personnalisée, sélectionne « FBP File Icons » dans le thème d'icônes de fichiers.");
77
+ }
78
+ catch (error) {
79
+ console.log("Installation automatique du support VS Code impossible.");
80
+ console.log("Vérifie les permissions du dossier des extensions VS Code.");
81
+ if (error instanceof Error)
82
+ console.log(error.message);
83
+ }
84
+ }
29
85
  function runCommand(name) {
30
86
  const configPath = node_path_1.default.resolve("commandes.fbp");
31
87
  if (!node_fs_1.default.existsSync(configPath)) {
@@ -71,6 +127,10 @@ function main() {
71
127
  case "ping":
72
128
  ping();
73
129
  break;
130
+ case "-init":
131
+ case "init":
132
+ initProject();
133
+ break;
74
134
  case "run":
75
135
  if (!args[0])
76
136
  throw new errors_1.FbpError("Indique le nom de la commande. Exemple : fbp run lancer");
package/dist/compiler.js CHANGED
@@ -251,7 +251,8 @@ class FbpCompiler {
251
251
  item.addChoices({ name: choice.name, value: choice.value });
252
252
  return item;
253
253
  }),
254
- booleen: () => builder.addBooleanOption(item => item.setName(option.name).setDescription(option.description).setRequired(option.required))
254
+ booleen: () => builder.addBooleanOption(item => item.setName(option.name).setDescription(option.description).setRequired(option.required)),
255
+ salon: () => builder.addChannelOption(item => item.setName(option.name).setDescription(option.description).setRequired(option.required))
255
256
  }[option.type];
256
257
  add();
257
258
  }
@@ -295,10 +296,14 @@ class FbpCompiler {
295
296
  const number = interaction.options.getInteger(option.name);
296
297
  value = number === null ? null : String(number);
297
298
  }
298
- else {
299
+ else if (option.type === "booleen") {
299
300
  const boolean = interaction.options.getBoolean(option.name);
300
301
  value = boolean === null ? null : String(boolean);
301
302
  }
303
+ else {
304
+ const channel = interaction.options.getChannel(option.name);
305
+ value = channel === null ? null : "#" + channel.name;
306
+ }
302
307
  if (value === null && option.required) {
303
308
  await interaction.reply({ content: "Option obligatoire indisponible : " + option.name, ephemeral: true });
304
309
  return;
@@ -435,9 +440,9 @@ class FbpCompiler {
435
440
  option.maxValue = maximum;
436
441
  return;
437
442
  }
438
- if (name === "discordOptionTexte" || name === "discordOptionNombre" || name === "discordOptionEntier" || name === "discordOptionBooleen") {
443
+ if (name === "discordOptionTexte" || name === "discordOptionNombre" || name === "discordOptionEntier" || name === "discordOptionBooleen" || name === "discordOptionSalon") {
439
444
  if (values.length < 3 || values.length > 4 || values.some(value => typeof value !== "string" && typeof value !== "boolean")) {
440
- throw new errors_1.FbpError("Utilisation : discordOptionTexte/Nombre/Entier/Booleen(nomCommande, nomOption, description, obligatoire).", undefined, line);
445
+ throw new errors_1.FbpError("Utilisation : discordOptionTexte/Nombre/Entier/Booleen/Salon(nomCommande, nomOption, description, obligatoire).", undefined, line);
441
446
  }
442
447
  const [commandName, optionName, description] = values;
443
448
  const required = values.length === 4 ? values[3] : false;
@@ -456,7 +461,7 @@ class FbpCompiler {
456
461
  throw new errors_1.FbpError("L'option « " + optionName + " » existe déjà pour cette commande.", undefined, line);
457
462
  if (options.length + (command.type === "embed" && command.userOption ? 1 : 0) >= 25)
458
463
  throw new errors_1.FbpError("Une commande slash Discord ne peut pas contenir plus de 25 options.", undefined, line);
459
- const type = name === "discordOptionTexte" ? "texte" : name === "discordOptionNombre" ? "nombre" : name === "discordOptionEntier" ? "entier" : "booleen";
464
+ const type = name === "discordOptionTexte" ? "texte" : name === "discordOptionNombre" ? "nombre" : name === "discordOptionEntier" ? "entier" : name === "discordOptionBooleen" ? "booleen" : "salon";
460
465
  options.push({ name: optionName, description, type, required });
461
466
  return;
462
467
  }
@@ -0,0 +1,21 @@
1
+ {
2
+ "brackets": [
3
+ ["{", "}"],
4
+ ["(", ")"],
5
+ ["[", "]"]
6
+ ],
7
+ "autoClosingPairs": [
8
+ ["{", "}"],
9
+ ["(", ")"],
10
+ ["[", "]"],
11
+ ["\"", "\""],
12
+ ["'", "'"]
13
+ ],
14
+ "surroundingPairs": [
15
+ ["{", "}"],
16
+ ["(", ")"],
17
+ ["[", "]"],
18
+ ["\"", "\""],
19
+ ["'", "'"]
20
+ ]
21
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "fbp-language",
3
3
  "displayName": "FBP - French Bot Programming",
4
- "description": "Langage FBP avec options slash Discord, limites numériques, choix prédéfinis et embeds dynamiques.",
5
- "version": "1.1.7",
4
+ "description": "Langage FBP avec compilateur, commandes Discord et support VS Code.",
5
+ "version": "1.1.9",
6
6
  "type": "commonjs",
7
7
  "main": "dist/compiler.js",
8
8
  "bin": {
@@ -10,7 +10,13 @@
10
10
  },
11
11
  "files": [
12
12
  "dist/",
13
- "README.md"
13
+ "README.md",
14
+ "syntaxes/",
15
+ "assets/",
16
+ "themes/",
17
+ "vscode-extension/",
18
+ "language-configuration.json",
19
+ "package.json"
14
20
  ],
15
21
  "repository": {
16
22
  "type": "git",
@@ -28,7 +34,8 @@
28
34
  "cli",
29
35
  "discord",
30
36
  "slash-commands",
31
- "bot"
37
+ "bot",
38
+ "vscode-extension"
32
39
  ],
33
40
  "scripts": {
34
41
  "build": "tsc -p tsconfig.json",
@@ -49,5 +56,34 @@
49
56
  "dependencies": {
50
57
  "discord.js": "^14.19.3",
51
58
  "dotenv": "^16.4.7"
59
+ },
60
+ "contributes": {
61
+ "languages": [
62
+ {
63
+ "id": "fbp",
64
+ "aliases": [
65
+ "FBP",
66
+ "fbp"
67
+ ],
68
+ "extensions": [
69
+ ".fbp"
70
+ ],
71
+ "configuration": "./language-configuration.json"
72
+ }
73
+ ],
74
+ "grammars": [
75
+ {
76
+ "language": "fbp",
77
+ "scopeName": "source.fbp",
78
+ "path": "./syntaxes/fbp.tmLanguage.json"
79
+ }
80
+ ],
81
+ "iconThemes": [
82
+ {
83
+ "id": "fbp-file-icons",
84
+ "label": "FBP File Icons",
85
+ "path": "./themes/fbp-icon-theme.json"
86
+ }
87
+ ]
52
88
  }
53
89
  }
@@ -0,0 +1,100 @@
1
+ {
2
+ "scopeName": "source.fbp",
3
+ "name": "FBP",
4
+ "patterns": [
5
+ {
6
+ "include": "#strings"
7
+ },
8
+ {
9
+ "include": "#numbers"
10
+ },
11
+ {
12
+ "include": "#keywords"
13
+ },
14
+ {
15
+ "include": "#booleans"
16
+ },
17
+ {
18
+ "include": "#function-declarations"
19
+ },
20
+ {
21
+ "include": "#function-calls"
22
+ },
23
+ {
24
+ "include": "#assignments"
25
+ },
26
+ {
27
+ "include": "#operators"
28
+ },
29
+ {
30
+ "include": "#punctuation"
31
+ }
32
+ ],
33
+ "repository": {
34
+ "strings": {
35
+ "name": "string.quoted.double.fbp",
36
+ "begin": "\"",
37
+ "beginCaptures": {
38
+ "0": {
39
+ "name": "punctuation.definition.string.begin.fbp"
40
+ }
41
+ },
42
+ "end": "\"",
43
+ "endCaptures": {
44
+ "0": {
45
+ "name": "punctuation.definition.string.end.fbp"
46
+ }
47
+ },
48
+ "patterns": [
49
+ {
50
+ "name": "constant.character.escape.fbp",
51
+ "match": "\\\\."
52
+ }
53
+ ]
54
+ },
55
+ "numbers": {
56
+ "name": "constant.numeric.fbp",
57
+ "match": "\\b\\d+(?:\\.\\d+)?\\b"
58
+ },
59
+ "keywords": {
60
+ "name": "keyword.control.fbp",
61
+ "match": "\\b(?:import|de)\\b"
62
+ },
63
+ "booleans": {
64
+ "name": "constant.language.boolean.fbp",
65
+ "match": "\\b(?:true|false)\\b"
66
+ },
67
+ "function-declarations": {
68
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?=\\(\\s*\\)\\s*\\{)",
69
+ "captures": {
70
+ "1": {
71
+ "name": "entity.name.function.fbp"
72
+ }
73
+ }
74
+ },
75
+ "function-calls": {
76
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?=\\()",
77
+ "captures": {
78
+ "1": {
79
+ "name": "support.function.fbp"
80
+ }
81
+ }
82
+ },
83
+ "assignments": {
84
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?==)",
85
+ "captures": {
86
+ "1": {
87
+ "name": "variable.other.assignment.fbp"
88
+ }
89
+ }
90
+ },
91
+ "operators": {
92
+ "name": "keyword.operator.fbp",
93
+ "match": "(?:=|\\+|\\-|\\*|/|==|!=|<=|>=)"
94
+ },
95
+ "punctuation": {
96
+ "name": "punctuation.section.fbp",
97
+ "match": "[{}()\\[\\],.]"
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "FBP Colors",
3
+ "type": "dark",
4
+ "tokenColors": [
5
+ {
6
+ "scope": [
7
+ "keyword.control.fbp"
8
+ ],
9
+ "settings": {
10
+ "foreground": "#C792EA",
11
+ "fontStyle": "bold"
12
+ }
13
+ },
14
+ {
15
+ "scope": [
16
+ "entity.name.function.fbp"
17
+ ],
18
+ "settings": {
19
+ "foreground": "#82AAFF",
20
+ "fontStyle": "bold"
21
+ }
22
+ },
23
+ {
24
+ "scope": [
25
+ "support.function.fbp"
26
+ ],
27
+ "settings": {
28
+ "foreground": "#89DDFF"
29
+ }
30
+ },
31
+ {
32
+ "scope": [
33
+ "string.quoted.double.fbp"
34
+ ],
35
+ "settings": {
36
+ "foreground": "#C3E88D"
37
+ }
38
+ },
39
+ {
40
+ "scope": [
41
+ "constant.numeric.fbp"
42
+ ],
43
+ "settings": {
44
+ "foreground": "#F78C6C"
45
+ }
46
+ },
47
+ {
48
+ "scope": [
49
+ "constant.language.boolean.fbp"
50
+ ],
51
+ "settings": {
52
+ "foreground": "#FF9CAC",
53
+ "fontStyle": "bold"
54
+ }
55
+ },
56
+ {
57
+ "scope": [
58
+ "variable.other.assignment.fbp"
59
+ ],
60
+ "settings": {
61
+ "foreground": "#F4B860"
62
+ }
63
+ },
64
+ {
65
+ "scope": [
66
+ "keyword.operator.fbp"
67
+ ],
68
+ "settings": {
69
+ "foreground": "#89DDFF"
70
+ }
71
+ },
72
+ {
73
+ "scope": [
74
+ "punctuation.section.fbp"
75
+ ],
76
+ "settings": {
77
+ "foreground": "#AAB3C5"
78
+ }
79
+ },
80
+ {
81
+ "scope": [
82
+ "constant.character.escape.fbp"
83
+ ],
84
+ "settings": {
85
+ "foreground": "#FFCB6B"
86
+ }
87
+ }
88
+ ]
89
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "vscode://schemas/icon-theme",
3
+ "iconDefinitions": {
4
+ "_fbp": {
5
+ "iconPath": "../assets/fbp-logo.svg"
6
+ }
7
+ },
8
+ "fileExtensions": {
9
+ "fbp": "_fbp"
10
+ }
11
+ }
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 128">
2
+ <title>FBP file icon</title>
3
+ <g fill="#718DB5" font-family="Arial, Helvetica, sans-serif" font-size="88" font-weight="600" text-anchor="middle">
4
+ <text x="48" y="94">{</text>
5
+ <text x="128" y="94">B</text>
6
+ <text x="208" y="94">}</text>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,21 @@
1
+ {
2
+ "brackets": [
3
+ ["{", "}"],
4
+ ["(", ")"],
5
+ ["[", "]"]
6
+ ],
7
+ "autoClosingPairs": [
8
+ ["{", "}"],
9
+ ["(", ")"],
10
+ ["[", "]"],
11
+ ["\"", "\""],
12
+ ["'", "'"]
13
+ ],
14
+ "surroundingPairs": [
15
+ ["{", "}"],
16
+ ["(", ")"],
17
+ ["[", "]"],
18
+ ["\"", "\""],
19
+ ["'", "'"]
20
+ ]
21
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "fbp-language",
3
+ "displayName": "FBP Language Support",
4
+ "description": "Coloration syntaxique, reconnaissance des fichiers .fbp et thème d'icônes FBP.",
5
+ "version": "1.1.9",
6
+ "publisher": "gabyy1",
7
+ "engines": {
8
+ "vscode": "^1.80.0"
9
+ },
10
+ "categories": [
11
+ "Programming Languages",
12
+ "Themes"
13
+ ],
14
+ "extensionKind": [
15
+ "workspace"
16
+ ],
17
+ "contributes": {
18
+ "languages": [
19
+ {
20
+ "id": "fbp",
21
+ "aliases": [
22
+ "FBP",
23
+ "fbp"
24
+ ],
25
+ "extensions": [
26
+ ".fbp"
27
+ ],
28
+ "configuration": "./language-configuration.json"
29
+ }
30
+ ],
31
+ "grammars": [
32
+ {
33
+ "language": "fbp",
34
+ "scopeName": "source.fbp",
35
+ "path": "./syntaxes/fbp.tmLanguage.json"
36
+ }
37
+ ],
38
+ "iconThemes": [
39
+ {
40
+ "id": "fbp-file-icons",
41
+ "label": "FBP File Icons",
42
+ "path": "./themes/fbp-icon-theme.json"
43
+ }
44
+ ]
45
+ }
46
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "scopeName": "source.fbp",
3
+ "name": "FBP",
4
+ "patterns": [
5
+ { "include": "#comments" },
6
+ { "include": "#strings" },
7
+ { "include": "#numbers" },
8
+ { "include": "#keywords" },
9
+ { "include": "#booleans" },
10
+ { "include": "#function-declarations" },
11
+ { "include": "#function-calls" },
12
+ { "include": "#assignments" },
13
+ { "include": "#operators" },
14
+ { "include": "#punctuation" }
15
+ ],
16
+ "repository": {
17
+ "comments": {
18
+ "patterns": [
19
+ { "name": "comment.line.double-slash.fbp", "match": "//.*$" },
20
+ { "name": "comment.line.number-sign.fbp", "match": "#.*$" }
21
+ ]
22
+ },
23
+ "strings": {
24
+ "name": "string.quoted.double.fbp",
25
+ "begin": "\"",
26
+ "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.fbp" } },
27
+ "end": "\"",
28
+ "endCaptures": { "0": { "name": "punctuation.definition.string.end.fbp" } },
29
+ "patterns": [{ "name": "constant.character.escape.fbp", "match": "\\\\." }]
30
+ },
31
+ "numbers": { "name": "constant.numeric.fbp", "match": "\\b\\d+(?:\\.\\d+)?\\b" },
32
+ "keywords": { "name": "keyword.control.fbp", "match": "\\b(?:import|de)\\b" },
33
+ "booleans": { "name": "constant.language.boolean.fbp", "match": "\\b(?:true|false)\\b" },
34
+ "function-declarations": {
35
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?=\\(\\s*\\)\\s*\\{)",
36
+ "captures": { "1": { "name": "entity.name.function.fbp" } }
37
+ },
38
+ "function-calls": {
39
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?=\\()",
40
+ "captures": { "1": { "name": "support.function.fbp" } }
41
+ },
42
+ "assignments": {
43
+ "match": "\\b([\\p{L}_][\\p{L}\\p{N}_]*)\\s*(?==)",
44
+ "captures": { "1": { "name": "variable.other.assignment.fbp" } }
45
+ },
46
+ "operators": { "name": "keyword.operator.fbp", "match": "(?:=|\\+|\\-|\\*|/|==|!=|<=|>=)" },
47
+ "punctuation": { "name": "punctuation.section.fbp", "match": "[{}()\\[\\],.]" }
48
+ }
49
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "vscode://schemas/icon-theme",
3
+ "iconDefinitions": {
4
+ "_fbp": {
5
+ "iconPath": "../assets/fbp-logo.svg"
6
+ }
7
+ },
8
+ "fileExtensions": {
9
+ "fbp": "_fbp"
10
+ }
11
+ }