]> luflow.net public git repositories - flow-web.git/blob - static/highlight/languages/csharp.js
Initial commit.
[flow-web.git] / static / highlight / languages / csharp.js
1 /*! `csharp` grammar compiled for Highlight.js 11.11.1 */
2 (function(){
3 var hljsGrammar = (function () {
4 'use strict';
5
6 /*
7 Language: C#
8 Author: Jason Diamond <jason@diamond.name>
9 Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>
10 Website: https://docs.microsoft.com/dotnet/csharp/
11 Category: common
12 */
13
14 /** @type LanguageFn */
15 function csharp(hljs) {
16 const BUILT_IN_KEYWORDS = [
17 'bool',
18 'byte',
19 'char',
20 'decimal',
21 'delegate',
22 'double',
23 'dynamic',
24 'enum',
25 'float',
26 'int',
27 'long',
28 'nint',
29 'nuint',
30 'object',
31 'sbyte',
32 'short',
33 'string',
34 'ulong',
35 'uint',
36 'ushort'
37 ];
38 const FUNCTION_MODIFIERS = [
39 'public',
40 'private',
41 'protected',
42 'static',
43 'internal',
44 'protected',
45 'abstract',
46 'async',
47 'extern',
48 'override',
49 'unsafe',
50 'virtual',
51 'new',
52 'sealed',
53 'partial'
54 ];
55 const LITERAL_KEYWORDS = [
56 'default',
57 'false',
58 'null',
59 'true'
60 ];
61 const NORMAL_KEYWORDS = [
62 'abstract',
63 'as',
64 'base',
65 'break',
66 'case',
67 'catch',
68 'class',
69 'const',
70 'continue',
71 'do',
72 'else',
73 'event',
74 'explicit',
75 'extern',
76 'finally',
77 'fixed',
78 'for',
79 'foreach',
80 'goto',
81 'if',
82 'implicit',
83 'in',
84 'interface',
85 'internal',
86 'is',
87 'lock',
88 'namespace',
89 'new',
90 'operator',
91 'out',
92 'override',
93 'params',
94 'private',
95 'protected',
96 'public',
97 'readonly',
98 'record',
99 'ref',
100 'return',
101 'scoped',
102 'sealed',
103 'sizeof',
104 'stackalloc',
105 'static',
106 'struct',
107 'switch',
108 'this',
109 'throw',
110 'try',
111 'typeof',
112 'unchecked',
113 'unsafe',
114 'using',
115 'virtual',
116 'void',
117 'volatile',
118 'while'
119 ];
120 const CONTEXTUAL_KEYWORDS = [
121 'add',
122 'alias',
123 'and',
124 'ascending',
125 'args',
126 'async',
127 'await',
128 'by',
129 'descending',
130 'dynamic',
131 'equals',
132 'file',
133 'from',
134 'get',
135 'global',
136 'group',
137 'init',
138 'into',
139 'join',
140 'let',
141 'nameof',
142 'not',
143 'notnull',
144 'on',
145 'or',
146 'orderby',
147 'partial',
148 'record',
149 'remove',
150 'required',
151 'scoped',
152 'select',
153 'set',
154 'unmanaged',
155 'value|0',
156 'var',
157 'when',
158 'where',
159 'with',
160 'yield'
161 ];
162
163 const KEYWORDS = {
164 keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS),
165 built_in: BUILT_IN_KEYWORDS,
166 literal: LITERAL_KEYWORDS
167 };
168 const TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, { begin: '[a-zA-Z](\\.?\\w)*' });
169 const NUMBERS = {
170 className: 'number',
171 variants: [
172 { begin: '\\b(0b[01\']+)' },
173 { begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
174 { begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
175 ],
176 relevance: 0
177 };
178 const RAW_STRING = {
179 className: 'string',
180 begin: /"""("*)(?!")(.|\n)*?"""\1/,
181 relevance: 1
182 };
183 const VERBATIM_STRING = {
184 className: 'string',
185 begin: '@"',
186 end: '"',
187 contains: [ { begin: '""' } ]
188 };
189 const VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, { illegal: /\n/ });
190 const SUBST = {
191 className: 'subst',
192 begin: /\{/,
193 end: /\}/,
194 keywords: KEYWORDS
195 };
196 const SUBST_NO_LF = hljs.inherit(SUBST, { illegal: /\n/ });
197 const INTERPOLATED_STRING = {
198 className: 'string',
199 begin: /\$"/,
200 end: '"',
201 illegal: /\n/,
202 contains: [
203 { begin: /\{\{/ },
204 { begin: /\}\}/ },
205 hljs.BACKSLASH_ESCAPE,
206 SUBST_NO_LF
207 ]
208 };
209 const INTERPOLATED_VERBATIM_STRING = {
210 className: 'string',
211 begin: /\$@"/,
212 end: '"',
213 contains: [
214 { begin: /\{\{/ },
215 { begin: /\}\}/ },
216 { begin: '""' },
217 SUBST
218 ]
219 };
220 const INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
221 illegal: /\n/,
222 contains: [
223 { begin: /\{\{/ },
224 { begin: /\}\}/ },
225 { begin: '""' },
226 SUBST_NO_LF
227 ]
228 });
229 SUBST.contains = [
230 INTERPOLATED_VERBATIM_STRING,
231 INTERPOLATED_STRING,
232 VERBATIM_STRING,
233 hljs.APOS_STRING_MODE,
234 hljs.QUOTE_STRING_MODE,
235 NUMBERS,
236 hljs.C_BLOCK_COMMENT_MODE
237 ];
238 SUBST_NO_LF.contains = [
239 INTERPOLATED_VERBATIM_STRING_NO_LF,
240 INTERPOLATED_STRING,
241 VERBATIM_STRING_NO_LF,
242 hljs.APOS_STRING_MODE,
243 hljs.QUOTE_STRING_MODE,
244 NUMBERS,
245 hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, { illegal: /\n/ })
246 ];
247 const STRING = { variants: [
248 RAW_STRING,
249 INTERPOLATED_VERBATIM_STRING,
250 INTERPOLATED_STRING,
251 VERBATIM_STRING,
252 hljs.APOS_STRING_MODE,
253 hljs.QUOTE_STRING_MODE
254 ] };
255
256 const GENERIC_MODIFIER = {
257 begin: "<",
258 end: ">",
259 contains: [
260 { beginKeywords: "in out" },
261 TITLE_MODE
262 ]
263 };
264 const TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
265 const AT_IDENTIFIER = {
266 // prevents expressions like `@class` from incorrect flagging
267 // `class` as a keyword
268 begin: "@" + hljs.IDENT_RE,
269 relevance: 0
270 };
271
272 return {
273 name: 'C#',
274 aliases: [
275 'cs',
276 'c#'
277 ],
278 keywords: KEYWORDS,
279 illegal: /::/,
280 contains: [
281 hljs.COMMENT(
282 '///',
283 '$',
284 {
285 returnBegin: true,
286 contains: [
287 {
288 className: 'doctag',
289 variants: [
290 {
291 begin: '///',
292 relevance: 0
293 },
294 { begin: '<!--|-->' },
295 {
296 begin: '</?',
297 end: '>'
298 }
299 ]
300 }
301 ]
302 }
303 ),
304 hljs.C_LINE_COMMENT_MODE,
305 hljs.C_BLOCK_COMMENT_MODE,
306 {
307 className: 'meta',
308 begin: '#',
309 end: '$',
310 keywords: { keyword: 'if else elif endif define undef warning error line region endregion pragma checksum' }
311 },
312 STRING,
313 NUMBERS,
314 {
315 beginKeywords: 'class interface',
316 relevance: 0,
317 end: /[{;=]/,
318 illegal: /[^\s:,]/,
319 contains: [
320 { beginKeywords: "where class" },
321 TITLE_MODE,
322 GENERIC_MODIFIER,
323 hljs.C_LINE_COMMENT_MODE,
324 hljs.C_BLOCK_COMMENT_MODE
325 ]
326 },
327 {
328 beginKeywords: 'namespace',
329 relevance: 0,
330 end: /[{;=]/,
331 illegal: /[^\s:]/,
332 contains: [
333 TITLE_MODE,
334 hljs.C_LINE_COMMENT_MODE,
335 hljs.C_BLOCK_COMMENT_MODE
336 ]
337 },
338 {
339 beginKeywords: 'record',
340 relevance: 0,
341 end: /[{;=]/,
342 illegal: /[^\s:]/,
343 contains: [
344 TITLE_MODE,
345 GENERIC_MODIFIER,
346 hljs.C_LINE_COMMENT_MODE,
347 hljs.C_BLOCK_COMMENT_MODE
348 ]
349 },
350 {
351 // [Attributes("")]
352 className: 'meta',
353 begin: '^\\s*\\[(?=[\\w])',
354 excludeBegin: true,
355 end: '\\]',
356 excludeEnd: true,
357 contains: [
358 {
359 className: 'string',
360 begin: /"/,
361 end: /"/
362 }
363 ]
364 },
365 {
366 // Expression keywords prevent 'keyword Name(...)' from being
367 // recognized as a function definition
368 beginKeywords: 'new return throw await else',
369 relevance: 0
370 },
371 {
372 className: 'function',
373 begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
374 returnBegin: true,
375 end: /\s*[{;=]/,
376 excludeEnd: true,
377 keywords: KEYWORDS,
378 contains: [
379 // prevents these from being highlighted `title`
380 {
381 beginKeywords: FUNCTION_MODIFIERS.join(" "),
382 relevance: 0
383 },
384 {
385 begin: hljs.IDENT_RE + '\\s*(<[^=]+>\\s*)?\\(',
386 returnBegin: true,
387 contains: [
388 hljs.TITLE_MODE,
389 GENERIC_MODIFIER
390 ],
391 relevance: 0
392 },
393 { match: /\(\)/ },
394 {
395 className: 'params',
396 begin: /\(/,
397 end: /\)/,
398 excludeBegin: true,
399 excludeEnd: true,
400 keywords: KEYWORDS,
401 relevance: 0,
402 contains: [
403 STRING,
404 NUMBERS,
405 hljs.C_BLOCK_COMMENT_MODE
406 ]
407 },
408 hljs.C_LINE_COMMENT_MODE,
409 hljs.C_BLOCK_COMMENT_MODE
410 ]
411 },
412 AT_IDENTIFIER
413 ]
414 };
415 }
416
417 return csharp;
418
419 })();
420
421 hljs.registerLanguage('csharp', hljsGrammar);
422 })();