xref: /expo/docs/components/base/languages/groovy.ts (revision bb8f4f99)
1export function installGroovy(Prism: any) {
2  Prism.languages.groovy = Prism.languages.extend('clike', {
3    string: [
4      {
5        pattern: /("""|''')(?:[^\\]|\\[\s\S])*?\1|\$\/(?:\$\/\$|[\s\S])*?\/\$/,
6        greedy: true,
7      },
8      {
9        // TODO: Slash strings (e.g. /foo/) can contain line breaks but this will cause a lot of trouble with
10        // simple division (see JS regex), so find a fix maybe?
11        pattern: /(["'/])(?:\\.|(?!\1)[^\\\r\n])*\1/,
12        greedy: true,
13      },
14    ],
15    keyword: /\b(?:as|def|in|abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,
16    number: /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?[\d]+)?)[glidf]?\b/i,
17    operator: {
18      pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
19      lookbehind: true,
20    },
21    punctuation: /\.+|[{}[\];(),.:$]/,
22  });
23
24  Prism.languages.insertBefore('groovy', 'string', {
25    shebang: {
26      pattern: /#!.+/,
27      alias: 'comment',
28    },
29  });
30
31  Prism.languages.insertBefore('groovy', 'punctuation', {
32    'spock-block': /\b(?:setup|given|when|then|and|cleanup|expect|where):/,
33  });
34
35  Prism.languages.insertBefore('groovy', 'function', {
36    annotation: {
37      pattern: /(^|[^.])@\w+/,
38      lookbehind: true,
39      alias: 'punctuation',
40    },
41  });
42
43  // Handle string interpolation
44  Prism.hooks.add('wrap', function(env: any) {
45    if (env.language === 'groovy' && env.type === 'string') {
46      var delimiter = env.content[0];
47
48      if (delimiter !== "'") {
49        var pattern = /([^\\])(?:\$(?:\{.*?\}|[\w.]+))/;
50        if (delimiter === '$') {
51          pattern = /([^$])(?:\$(?:\{.*?\}|[\w.]+))/;
52        }
53
54        // To prevent double HTML-encoding we have to decode env.content first
55        env.content = env.content.replace(/&lt;/g, '<').replace(/&amp;/g, '&');
56
57        env.content = Prism.highlight(env.content, {
58          expression: {
59            pattern,
60            lookbehind: true,
61            inside: Prism.languages.groovy,
62          },
63        });
64
65        env.classes.push(delimiter === '/' ? 'regex' : 'gstring');
66      }
67    }
68  });
69}
70