1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 | function variants(variants, obj = {}) {
|
9 | obj.variants = variants;
|
10 | return obj;
|
11 | }
|
12 |
|
13 | function groovy(hljs) {
|
14 | const regex = hljs.regex;
|
15 | const IDENT_RE = '[A-Za-z0-9_$]+';
|
16 | const COMMENT = variants([
|
17 | hljs.C_LINE_COMMENT_MODE,
|
18 | hljs.C_BLOCK_COMMENT_MODE,
|
19 | hljs.COMMENT(
|
20 | '/\\*\\*',
|
21 | '\\*/',
|
22 | {
|
23 | relevance: 0,
|
24 | contains: [
|
25 | {
|
26 |
|
27 | begin: /\w+@/,
|
28 | relevance: 0
|
29 | },
|
30 | {
|
31 | className: 'doctag',
|
32 | begin: '@[A-Za-z]+'
|
33 | }
|
34 | ]
|
35 | }
|
36 | )
|
37 | ]);
|
38 | const REGEXP = {
|
39 | className: 'regexp',
|
40 | begin: /~?\/[^\/\n]+\//,
|
41 | contains: [ hljs.BACKSLASH_ESCAPE ]
|
42 | };
|
43 | const NUMBER = variants([
|
44 | hljs.BINARY_NUMBER_MODE,
|
45 | hljs.C_NUMBER_MODE
|
46 | ]);
|
47 | const STRING = variants([
|
48 | {
|
49 | begin: /"""/,
|
50 | end: /"""/
|
51 | },
|
52 | {
|
53 | begin: /'''/,
|
54 | end: /'''/
|
55 | },
|
56 | {
|
57 | begin: "\\$/",
|
58 | end: "/\\$",
|
59 | relevance: 10
|
60 | },
|
61 | hljs.APOS_STRING_MODE,
|
62 | hljs.QUOTE_STRING_MODE
|
63 | ],
|
64 | {
|
65 | className: "string"
|
66 | }
|
67 | );
|
68 |
|
69 | return {
|
70 | name: 'Groovy',
|
71 | keywords: {
|
72 | built_in: 'this super',
|
73 | literal: 'true false null',
|
74 | keyword:
|
75 | 'byte short char int long boolean float double void ' +
|
76 |
|
77 | 'def as in assert trait ' +
|
78 |
|
79 | 'abstract static volatile transient public private protected synchronized final ' +
|
80 | 'class interface enum if else for while switch case break default continue ' +
|
81 | 'throw throws try catch finally implements extends new import package return instanceof'
|
82 | },
|
83 | contains: [
|
84 | hljs.SHEBANG({
|
85 | binary: "groovy",
|
86 | relevance: 10
|
87 | }),
|
88 | COMMENT,
|
89 | STRING,
|
90 | REGEXP,
|
91 | NUMBER,
|
92 | {
|
93 | className: 'class',
|
94 | beginKeywords: 'class interface trait enum',
|
95 | end: /\{/,
|
96 | illegal: ':',
|
97 | contains: [
|
98 | {
|
99 | beginKeywords: 'extends implements'
|
100 | },
|
101 | hljs.UNDERSCORE_TITLE_MODE
|
102 | ]
|
103 | },
|
104 | {
|
105 | className: 'meta',
|
106 | begin: '@[A-Za-z]+',
|
107 | relevance: 0
|
108 | },
|
109 | {
|
110 |
|
111 | className: 'attr',
|
112 | begin: IDENT_RE + '[ \t]*:',
|
113 | relevance: 0
|
114 | },
|
115 | {
|
116 |
|
117 |
|
118 | begin: /\?/,
|
119 | end: /:/,
|
120 | relevance: 0,
|
121 | contains: [
|
122 | COMMENT,
|
123 | STRING,
|
124 | REGEXP,
|
125 | NUMBER,
|
126 | 'self'
|
127 | ]
|
128 | },
|
129 | {
|
130 |
|
131 | className: 'symbol',
|
132 | begin: '^[ \t]*' + regex.lookahead(IDENT_RE + ':'),
|
133 | excludeBegin: true,
|
134 | end: IDENT_RE + ':',
|
135 | relevance: 0
|
136 | }
|
137 | ],
|
138 | illegal: /#|<\//
|
139 | };
|
140 | }
|
141 |
|
142 | export { groovy as default };
|