UNPKG

3.25 kBJavaScriptView Raw
1/*
2 Language: Groovy
3 Author: Guillaume Laforge <glaforge@gmail.com>
4 Description: Groovy programming language implementation inspired from Vsevolod's Java mode
5 Website: https://groovy-lang.org
6 */
7
8function variants(variants, obj = {}) {
9 obj.variants = variants;
10 return obj;
11}
12
13function 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 // eat up @'s in emails to prevent them to be recognized as doctags
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 // groovy specific keywords
77 'def as in assert trait ' +
78 // common keywords with Java
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 // highlight map keys and named parameters as attrs
111 className: 'attr',
112 begin: IDENT_RE + '[ \t]*:',
113 relevance: 0
114 },
115 {
116 // catch middle element of the ternary operator
117 // to avoid highlight it as a label, named parameter, or map key
118 begin: /\?/,
119 end: /:/,
120 relevance: 0,
121 contains: [
122 COMMENT,
123 STRING,
124 REGEXP,
125 NUMBER,
126 'self'
127 ]
128 },
129 {
130 // highlight labeled statements
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
142export { groovy as default };