source: node_modules/highlight.js/lib/languages/reasonml.js

main
Last change on this file was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 7.0 KB
Line 
1/*
2Language: ReasonML
3Description: Reason lets you write simple, fast and quality type safe code while leveraging both the JavaScript & OCaml ecosystems.
4Website: https://reasonml.github.io
5Author: Gidi Meir Morris <oss@gidi.io>
6Category: functional
7*/
8function reasonml(hljs) {
9 function orReValues(ops) {
10 return ops
11 .map(function(op) {
12 return op
13 .split('')
14 .map(function(char) {
15 return '\\' + char;
16 })
17 .join('');
18 })
19 .join('|');
20 }
21
22 const RE_IDENT = '~?[a-z$_][0-9a-zA-Z$_]*';
23 const RE_MODULE_IDENT = '`?[A-Z$_][0-9a-zA-Z$_]*';
24
25 const RE_PARAM_TYPEPARAM = '\'?[a-z$_][0-9a-z$_]*';
26 const RE_PARAM_TYPE = '\\s*:\\s*[a-z$_][0-9a-z$_]*(\\(\\s*(' + RE_PARAM_TYPEPARAM + '\\s*(,' + RE_PARAM_TYPEPARAM + '\\s*)*)?\\))?';
27 const RE_PARAM = RE_IDENT + '(' + RE_PARAM_TYPE + '){0,2}';
28 const RE_OPERATOR = "(" + orReValues([
29 '||',
30 '++',
31 '**',
32 '+.',
33 '*',
34 '/',
35 '*.',
36 '/.',
37 '...'
38 ]) + "|\\|>|&&|==|===)";
39 const RE_OPERATOR_SPACED = "\\s+" + RE_OPERATOR + "\\s+";
40
41 const KEYWORDS = {
42 keyword:
43 'and as asr assert begin class constraint do done downto else end exception external ' +
44 'for fun function functor if in include inherit initializer ' +
45 'land lazy let lor lsl lsr lxor match method mod module mutable new nonrec ' +
46 'object of open or private rec sig struct then to try type val virtual when while with',
47 built_in:
48 'array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ',
49 literal:
50 'true false'
51 };
52
53 const RE_NUMBER = '\\b(0[xX][a-fA-F0-9_]+[Lln]?|' +
54 '0[oO][0-7_]+[Lln]?|' +
55 '0[bB][01_]+[Lln]?|' +
56 '[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)';
57
58 const NUMBER_MODE = {
59 className: 'number',
60 relevance: 0,
61 variants: [
62 {
63 begin: RE_NUMBER
64 },
65 {
66 begin: '\\(-' + RE_NUMBER + '\\)'
67 }
68 ]
69 };
70
71 const OPERATOR_MODE = {
72 className: 'operator',
73 relevance: 0,
74 begin: RE_OPERATOR
75 };
76 const LIST_CONTENTS_MODES = [
77 {
78 className: 'identifier',
79 relevance: 0,
80 begin: RE_IDENT
81 },
82 OPERATOR_MODE,
83 NUMBER_MODE
84 ];
85
86 const MODULE_ACCESS_CONTENTS = [
87 hljs.QUOTE_STRING_MODE,
88 OPERATOR_MODE,
89 {
90 className: 'module',
91 begin: "\\b" + RE_MODULE_IDENT,
92 returnBegin: true,
93 end: "\.",
94 contains: [
95 {
96 className: 'identifier',
97 begin: RE_MODULE_IDENT,
98 relevance: 0
99 }
100 ]
101 }
102 ];
103
104 const PARAMS_CONTENTS = [
105 {
106 className: 'module',
107 begin: "\\b" + RE_MODULE_IDENT,
108 returnBegin: true,
109 end: "\.",
110 relevance: 0,
111 contains: [
112 {
113 className: 'identifier',
114 begin: RE_MODULE_IDENT,
115 relevance: 0
116 }
117 ]
118 }
119 ];
120
121 const PARAMS_MODE = {
122 begin: RE_IDENT,
123 end: '(,|\\n|\\))',
124 relevance: 0,
125 contains: [
126 OPERATOR_MODE,
127 {
128 className: 'typing',
129 begin: ':',
130 end: '(,|\\n)',
131 returnBegin: true,
132 relevance: 0,
133 contains: PARAMS_CONTENTS
134 }
135 ]
136 };
137
138 const FUNCTION_BLOCK_MODE = {
139 className: 'function',
140 relevance: 0,
141 keywords: KEYWORDS,
142 variants: [
143 {
144 begin: '\\s(\\(\\.?.*?\\)|' + RE_IDENT + ')\\s*=>',
145 end: '\\s*=>',
146 returnBegin: true,
147 relevance: 0,
148 contains: [
149 {
150 className: 'params',
151 variants: [
152 {
153 begin: RE_IDENT
154 },
155 {
156 begin: RE_PARAM
157 },
158 {
159 begin: /\(\s*\)/
160 }
161 ]
162 }
163 ]
164 },
165 {
166 begin: '\\s\\(\\.?[^;\\|]*\\)\\s*=>',
167 end: '\\s=>',
168 returnBegin: true,
169 relevance: 0,
170 contains: [
171 {
172 className: 'params',
173 relevance: 0,
174 variants: [ PARAMS_MODE ]
175 }
176 ]
177 },
178 {
179 begin: '\\(\\.\\s' + RE_IDENT + '\\)\\s*=>'
180 }
181 ]
182 };
183 MODULE_ACCESS_CONTENTS.push(FUNCTION_BLOCK_MODE);
184
185 const CONSTRUCTOR_MODE = {
186 className: 'constructor',
187 begin: RE_MODULE_IDENT + '\\(',
188 end: '\\)',
189 illegal: '\\n',
190 keywords: KEYWORDS,
191 contains: [
192 hljs.QUOTE_STRING_MODE,
193 OPERATOR_MODE,
194 {
195 className: 'params',
196 begin: '\\b' + RE_IDENT
197 }
198 ]
199 };
200
201 const PATTERN_MATCH_BLOCK_MODE = {
202 className: 'pattern-match',
203 begin: '\\|',
204 returnBegin: true,
205 keywords: KEYWORDS,
206 end: '=>',
207 relevance: 0,
208 contains: [
209 CONSTRUCTOR_MODE,
210 OPERATOR_MODE,
211 {
212 relevance: 0,
213 className: 'constructor',
214 begin: RE_MODULE_IDENT
215 }
216 ]
217 };
218
219 const MODULE_ACCESS_MODE = {
220 className: 'module-access',
221 keywords: KEYWORDS,
222 returnBegin: true,
223 variants: [
224 {
225 begin: "\\b(" + RE_MODULE_IDENT + "\\.)+" + RE_IDENT
226 },
227 {
228 begin: "\\b(" + RE_MODULE_IDENT + "\\.)+\\(",
229 end: "\\)",
230 returnBegin: true,
231 contains: [
232 FUNCTION_BLOCK_MODE,
233 {
234 begin: '\\(',
235 end: '\\)',
236 skip: true
237 }
238 ].concat(MODULE_ACCESS_CONTENTS)
239 },
240 {
241 begin: "\\b(" + RE_MODULE_IDENT + "\\.)+\\{",
242 end: /\}/
243 }
244 ],
245 contains: MODULE_ACCESS_CONTENTS
246 };
247
248 PARAMS_CONTENTS.push(MODULE_ACCESS_MODE);
249
250 return {
251 name: 'ReasonML',
252 aliases: [ 're' ],
253 keywords: KEYWORDS,
254 illegal: '(:-|:=|\\$\\{|\\+=)',
255 contains: [
256 hljs.COMMENT('/\\*', '\\*/', {
257 illegal: '^(#,\\/\\/)'
258 }),
259 {
260 className: 'character',
261 begin: '\'(\\\\[^\']+|[^\'])\'',
262 illegal: '\\n',
263 relevance: 0
264 },
265 hljs.QUOTE_STRING_MODE,
266 {
267 className: 'literal',
268 begin: '\\(\\)',
269 relevance: 0
270 },
271 {
272 className: 'literal',
273 begin: '\\[\\|',
274 end: '\\|\\]',
275 relevance: 0,
276 contains: LIST_CONTENTS_MODES
277 },
278 {
279 className: 'literal',
280 begin: '\\[',
281 end: '\\]',
282 relevance: 0,
283 contains: LIST_CONTENTS_MODES
284 },
285 CONSTRUCTOR_MODE,
286 {
287 className: 'operator',
288 begin: RE_OPERATOR_SPACED,
289 illegal: '-->',
290 relevance: 0
291 },
292 NUMBER_MODE,
293 hljs.C_LINE_COMMENT_MODE,
294 PATTERN_MATCH_BLOCK_MODE,
295 FUNCTION_BLOCK_MODE,
296 {
297 className: 'module-def',
298 begin: "\\bmodule\\s+" + RE_IDENT + "\\s+" + RE_MODULE_IDENT + "\\s+=\\s+\\{",
299 end: /\}/,
300 returnBegin: true,
301 keywords: KEYWORDS,
302 relevance: 0,
303 contains: [
304 {
305 className: 'module',
306 relevance: 0,
307 begin: RE_MODULE_IDENT
308 },
309 {
310 begin: /\{/,
311 end: /\}/,
312 skip: true
313 }
314 ].concat(MODULE_ACCESS_CONTENTS)
315 },
316 MODULE_ACCESS_MODE
317 ]
318 };
319}
320
321module.exports = reasonml;
Note: See TracBrowser for help on using the repository browser.