Skip to content

Commit ecd344d

Browse files
committed
0.1.4.1
1 parent e4aa91e commit ecd344d

File tree

1 file changed

+343
-0
lines changed

1 file changed

+343
-0
lines changed

monaco monarch Highlighter.js

Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
// This is the code for a custom Syntax Highlighter and for Snippets for the Minecraft Script programming language.
2+
// Editor library used: Microsoft Monaco
3+
4+
monaco.languages.register({ id: 'mcscript' });
5+
monaco.languages.register({ id: 'mcfunction' });
6+
7+
// Register a tokens provider for the language
8+
monaco.languages.setMonarchTokensProvider('mcscript', {
9+
entitys: ["@a","@p","@s","@r","@e"],
10+
tokenizer: {
11+
root: [
12+
// [/[a-zA-Z_\x80-\xFF][\w\x80-\xFF]*/, {
13+
// cases: { '@entitys': 'entity'} }],
14+
[/\/(?:advancement|ban|banlist|data|clear|clone|debug|defaultgamemode|deop|difficulty|effect|execute|experience|fill|function|gamemode|gamerule|give|help|kick|kill|list|locate|me|msg|op|pardon|pardon-ip|particle|playsound|publish|recipe|reload|replaceitem|save-all|save-off|save-on|say|scoreboard|seed|setblock|setidletimeout|setworldspawn|spawnpoint|spreadplayers|stop|stopsound|summon|tag|team|teleport|tell|tellraw|time|title|trigger|w|weather|whitelist|worldborder|xp)\b\s/, "command"],
15+
[/\s*\/\/.*/, "comment"],
16+
[/(\=|\+\=|\-\=|\*\=|\/\=|\%\=|\+\+|\-\-|\*|\/|\+|\-|\%|\>|\<|\>\=|\<\=)/, "operator"],
17+
[/"(?:[^\\]|\\.)*?"/, "string"],
18+
[/'(?:[^\\]|\\.)*?'/, "string"],
19+
[/(\s*#file:|\s*#extend:)(\s+)([\w\d$\/\._-]*)/, "operator"],
20+
[/\s*#.*/, "comment"],
21+
[/\b[0-9\.\-]+\b/, "number"],
22+
[/(?:area_effect_cloud|armor_stand|arrow|bat|blaze|boat|cave_spider|chest_minecart|chicken|cod_mob|commandblock_minecart|cow|creeper|dolphin|donkey|dragon_fireball|drowned|drowned|egg|elder_guardian|ender_crystal|ender_dragon|ender_pearl|enderman|endermite|evocation_fangs|evocation_illager|eye_of_ender_signal|falling_block|fireball|fireworks_rocket|furnace_minecart|ghast|giant|guardian|hopper_minecart|horse|husk|illusion_illager|item|item_frame|leash_knot|lightning_bolt|llama|llama_spit|magma_cube|minecart|mooshroom|mule|ocelot|painting|parrot|phantom|pig|polar_bear|potion|puffer_fish|rabbit|salmon_mob|sheep|shulker|shulker_bullet|silverfish|skeleton|skeleton_horse|slime|small_fireball|snowball|snowman|spawner_minecart|spectral_arrow|spider|squid|stray|tnt|tnt_minecart|trident|tropical_fish|turtle|vex|villager|villager_golem|vindication_illager|witch|wither|wither_skeleton|wither_skull|wolf|xp_bottle|xp_orb|zombie|zombie_horse|zombie_pigman|zombie_villager)\b/, "property"],
23+
[/(?:if|~|then|else|true|false|as|at|asat|positioned|align|dimension|rotated|anchored|while|do|forEach|for|raycast|stop|continue|switch|case|default|var|bool|boolean|tag|score|const)\b\s/, "keyword"],
24+
[/(?:grant|revoke|start|stop|set|add|remove|merge|entity|block|nbt|gamemode|level|dx|dy|dz|distance|x_rotation|y_rotation|limit|tag|type|sort|scores)\b\s/, "keyword2"],
25+
[/(modal)(\s+)([\w\d$\/\._-]*)/, "keyword"],
26+
[/(\$[\w\-]*)/, "variable"],
27+
[/([a-zA-Z0-9]+)(?=\s*\(.*)/, "variable"],
28+
]
29+
}
30+
});
31+
monaco.languages.setLanguageConfiguration('mcscript', {
32+
brackets: [
33+
["{","}"],
34+
["(",")"],
35+
["[","]"],
36+
],
37+
comments: {
38+
lineComment: "//",
39+
},
40+
folding: {
41+
offSide: true
42+
}
43+
})
44+
monaco.languages.setMonarchTokensProvider('mcfunction', {
45+
tokenizer: {
46+
root: [
47+
// [/[a-zA-Z_\x80-\xFF][\w\x80-\xFF]*/, {
48+
// cases: { '@entitys': 'entity'} }],
49+
[/(?:advancement|ban|banlist|data|clear|clone|debug|defaultgamemode|deop|difficulty|effect|execute|experience|fill|function|gamemode|gamerule|give|help|kick|kill|list|locate|pardon|pardon-ip|particle|playsound|publish|recipe|reload|replaceitem|save-all|save-off|save-on|say|scoreboard|seed|setblock|setidletimeout|setworldspawn|spawnpoint|spreadplayers|stop|stopsound|summon|tag|team|teleport|tell|tellraw|time|title|trigger|weather|whitelist|worldborder)\b\s/, "command"],
50+
[/(\=|\+\=|\-\=|\*\=|\/\=|\%\=|\+\+|\-\-|\*|\/|\+|\-|\%|\>|\<|\>\=|\<\=)/, "operator"],
51+
[/"(?:[^\\]|\\.)*?"/, "string"],
52+
[/'(?:[^\\]|\\.)*?'/, "string"],
53+
[/(\s*#file:|\s*#extend:)(\s+)([\w\d$\/\._-]*)/, "operator"],
54+
[/\s*\/\/.*/, "comment"],
55+
[/\s*#.*/, "comment"],
56+
[/\b[0-9\.\-]+\b/, "number"],
57+
[/(?:area_effect_cloud|armor_stand|arrow|bat|blaze|boat|cave_spider|chest_minecart|chicken|cod_mob|commandblock_minecart|cow|creeper|dolphin|donkey|dragon_fireball|drowned|drowned|egg|elder_guardian|ender_crystal|ender_dragon|ender_pearl|enderman|endermite|evocation_fangs|evocation_illager|eye_of_ender_signal|falling_block|fireball|fireworks_rocket|furnace_minecart|ghast|giant|guardian|hopper_minecart|horse|husk|illusion_illager|item|item_frame|leash_knot|lightning_bolt|llama|llama_spit|magma_cube|minecart|mooshroom|mule|ocelot|painting|parrot|phantom|pig|polar_bear|potion|puffer_fish|rabbit|salmon_mob|sheep|shulker|shulker_bullet|silverfish|skeleton|skeleton_horse|slime|small_fireball|snowball|snowman|spawner_minecart|spectral_arrow|spider|squid|stray|tnt|tnt_minecart|trident|tropical_fish|turtle|vex|villager|villager_golem|vindication_illager|witch|wither|wither_skeleton|wither_skull|wolf|xp_bottle|xp_orb|zombie|zombie_horse|zombie_pigman|zombie_villager)\b/, "property"],
58+
[/(?:if|~|then|else|true|false|as|at|asat|positioned|align|dimension|rotated|anchored|while|do|forEach|for|raycast|stop|continue|switch|case|default|var|bool|boolean|tag|score|const)\b\s/, "keyword"],
59+
[/(?:grant|revoke|start|stop|set|add|remove|merge)/, "keyword2"],
60+
[/(?:entity|block|nbt|gamemode|level|dx|dy|dz|distance|x_rotation|y_rotation|limit|tag|type|sort|scores)=/, "keyword2"],
61+
[/(modal)(\s+)([\w\d$\/\._-]*)/, "keyword"],
62+
[/(\$[\w\-]*)/, "variable"],
63+
[/([a-zA-Z0-9]+)(?=\s*\(.*)/, "variable"],
64+
]
65+
}
66+
});
67+
68+
// Define a new theme that constains only rules that match this language
69+
monaco.editor.defineTheme('mcfunction', {
70+
base: 'vs-dark',
71+
inherit: true,
72+
rules: [
73+
{ token: 'command', foreground: 'FF4500' },
74+
{ token: 'number', foreground: '02ABFD' },
75+
{ token: 'comment', foreground: '6F6F6F' },
76+
{ token: 'operator', foreground: 'FF5B5B' },
77+
{ token: 'keyword', foreground: 'FF8040' },
78+
{ token: 'keyword2', foreground: '209CDF' },
79+
{ token: 'entity', foreground: 'FF5B5B' },
80+
{ token: 'string', foreground: '8ED200' },
81+
{ token: 'property', foreground: '8FB900' },
82+
]
83+
});
84+
85+
// Register a completion item provider for the new language
86+
monaco.languages.registerCompletionItemProvider('mcscript', {
87+
provideCompletionItems: () => {
88+
return [
89+
{
90+
label: 'file',
91+
kind: monaco.languages.CompletionItemKind.Snippet,
92+
insertText: {
93+
value: '#file: ./${1:filename}',
94+
},
95+
documentation: 'add a new file'
96+
},
97+
{
98+
label: 'ifelse',
99+
kind: monaco.languages.CompletionItemKind.Snippet,
100+
insertText: {
101+
value: [
102+
'if (${1:condition}) {',
103+
'\t$0',
104+
'} else {',
105+
'\t',
106+
'}'
107+
].join('\n')
108+
},
109+
documentation: 'If-Else Statement'
110+
},{
111+
label: 'as',
112+
kind: monaco.languages.CompletionItemKind.Snippet,
113+
insertText: {
114+
value: [
115+
'as (${1:entity}) {',
116+
'\t$0',
117+
'}'
118+
].join('\n')
119+
},
120+
documentation: 'as execute subcommand group'
121+
},{
122+
label: 'at',
123+
kind: monaco.languages.CompletionItemKind.Snippet,
124+
insertText: {
125+
value: [
126+
'at (${1:entity}) {',
127+
'\t$0',
128+
'}'
129+
].join('\n')
130+
},
131+
documentation: 'at execute subcommand group'
132+
},{
133+
label: 'positioned',
134+
kind: monaco.languages.CompletionItemKind.Snippet,
135+
insertText: {
136+
value: [
137+
'positioned (${1:string}) {',
138+
'\t$0',
139+
'}'
140+
].join('\n')
141+
},
142+
documentation: 'positioned execute subcommand group'
143+
},{
144+
label: 'align',
145+
kind: monaco.languages.CompletionItemKind.Snippet,
146+
insertText: {
147+
value: [
148+
'align (${1:string}) {',
149+
'\t$0',
150+
'}'
151+
].join('\n')
152+
},
153+
documentation: 'align execute subcommand group'
154+
},{
155+
label: 'rotated',
156+
kind: monaco.languages.CompletionItemKind.Snippet,
157+
insertText: {
158+
value: [
159+
'rotated (${1:string}) {',
160+
'\t$0',
161+
'}'
162+
].join('\n')
163+
},
164+
documentation: 'rotated execute subcommand group'
165+
},{
166+
label: 'dimension',
167+
kind: monaco.languages.CompletionItemKind.Snippet,
168+
insertText: {
169+
value: [
170+
'dimension (${1:string}) {',
171+
'\t$0',
172+
'}'
173+
].join('\n')
174+
},
175+
documentation: 'in execute subcommand group'
176+
},{
177+
label: 'anchored',
178+
kind: monaco.languages.CompletionItemKind.Snippet,
179+
insertText: {
180+
value: [
181+
'anchored (${1:string}) {',
182+
'\t$0',
183+
'}'
184+
].join('\n')
185+
},
186+
documentation: 'anchored execute subcommand group'
187+
},{
188+
label: 'asat',
189+
kind: monaco.languages.CompletionItemKind.Snippet,
190+
insertText: {
191+
value: [
192+
'asat (${1:entity}) {',
193+
'\t$0',
194+
'}'
195+
].join('\n')
196+
},
197+
documentation: 'as at @s execute subcommand group'
198+
},{
199+
label: 'if',
200+
kind: monaco.languages.CompletionItemKind.Snippet,
201+
insertText: {
202+
value: [
203+
'if (${1:condition}) {',
204+
'\t$0',
205+
'}'
206+
].join('\n')
207+
},
208+
documentation: 'If Statement. Insert a condition'
209+
},
210+
{
211+
label: 'switch',
212+
kind: monaco.languages.CompletionItemKind.Snippet,
213+
insertText: {
214+
value: [
215+
'switch (${1:variable}) {',
216+
'\tcase ${2:value}: {',
217+
'\t\t$0',
218+
'\t}',
219+
'}'
220+
].join('\n')
221+
},
222+
documentation: `switch([var_name]){
223+
case <=|<|==|>|>= [other_var]|[number] {
224+
[actions]
225+
},
226+
default(optional) {
227+
[default actions]
228+
}
229+
}`
230+
},{
231+
label: 'case',
232+
kind: monaco.languages.CompletionItemKind.Snippet,
233+
insertText: {
234+
value: [
235+
'case ${1:value}: {',
236+
'\t$0',
237+
'}',
238+
].join('\n')
239+
},
240+
documentation: `
241+
case <=|<|==|>|>= [other_var]|[number] {
242+
[actions]
243+
},
244+
`
245+
},{
246+
label: 'for-loop',
247+
kind: monaco.languages.CompletionItemKind.Snippet,
248+
insertText: {
249+
value: [
250+
'for(${1:from},${2:to}) {',
251+
'\t$0',
252+
'}',
253+
].join('\n')
254+
},
255+
documentation: `The simple for loop.
256+
for(from, to, [varname]){
257+
258+
}
259+
`
260+
},{
261+
label: 'while',
262+
kind: monaco.languages.CompletionItemKind.Snippet,
263+
insertText: {
264+
value: [
265+
'while(${1:condition}) {',
266+
'\t$0',
267+
'}',
268+
].join('\n')
269+
},
270+
documentation: `A simple loop.
271+
while(condition){
272+
273+
}
274+
`
275+
},{
276+
label: 'do-while',
277+
kind: monaco.languages.CompletionItemKind.Snippet,
278+
insertText: {
279+
value: [
280+
'do {',
281+
'\t$0',
282+
'} while(${1:condition})',
283+
].join('\n')
284+
},
285+
documentation: `A simple do-while loop.
286+
do {
287+
288+
} while(condition)
289+
`
290+
},{
291+
label: 'modal',
292+
kind: monaco.languages.CompletionItemKind.Snippet,
293+
insertText: {
294+
value: [
295+
'modal ${1:name} (${2:arguments}) {',
296+
'\t$0',
297+
'}',
298+
].join('\n')
299+
},
300+
documentation: `Modal. Like a function or method`
301+
},{
302+
label: 'forEach',
303+
kind: monaco.languages.CompletionItemKind.Snippet,
304+
insertText: {
305+
value: [
306+
'forEach(var ${1:varname} = ${2:startValue}; ${1:varname} ${3:condition}; ${1:varname}++) {',
307+
'\t$0',
308+
'}',
309+
].join('\n')
310+
},
311+
documentation: `The more advanced forEach loop to count in a loop.
312+
forEach(var [var_name] = [start value]; [var_name] ==|>|<|<=|>=|!= [other_var]|[number]; [varname]++){
313+
314+
}
315+
`
316+
},{
317+
label: 'raycast',
318+
kind: monaco.languages.CompletionItemKind.Snippet,
319+
insertText: {
320+
value: [
321+
'raycast {',
322+
'\t$0',
323+
'}',
324+
].join('\n')
325+
},
326+
documentation: `A very simple raycast method`
327+
},{
328+
label: 'raycast-advanced',
329+
kind: monaco.languages.CompletionItemKind.Snippet,
330+
insertText: {
331+
value: [
332+
'raycast(${1:distance}, ${2:blocks}, ${3:target}) {',
333+
'\t$0',
334+
'},{',
335+
'\t$0',
336+
'}',
337+
].join('\n')
338+
},
339+
documentation: `A very simple raycast method`
340+
},
341+
]
342+
}
343+
});

0 commit comments

Comments
 (0)