175 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @param {string} value
 | |
|  * @returns {RegExp}
 | |
|  * */
 | |
| 
 | |
| /**
 | |
|  * @param {RegExp | string } re
 | |
|  * @returns {string}
 | |
|  */
 | |
| function source(re) {
 | |
|   if (!re) return null;
 | |
|   if (typeof re === "string") return re;
 | |
| 
 | |
|   return re.source;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @param {RegExp | string } re
 | |
|  * @returns {string}
 | |
|  */
 | |
| function lookahead(re) {
 | |
|   return concat('(?=', re, ')');
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * @param {...(RegExp | string) } args
 | |
|  * @returns {string}
 | |
|  */
 | |
| function concat(...args) {
 | |
|   const joined = args.map((x) => source(x)).join("");
 | |
|   return joined;
 | |
| }
 | |
| 
 | |
| /*
 | |
|  Language: Groovy
 | |
|  Author: Guillaume Laforge <glaforge@gmail.com>
 | |
|  Description: Groovy programming language implementation inspired from Vsevolod's Java mode
 | |
|  Website: https://groovy-lang.org
 | |
|  */
 | |
| 
 | |
| function variants(variants, obj = {}) {
 | |
|   obj.variants = variants;
 | |
|   return obj;
 | |
| }
 | |
| 
 | |
| function groovy(hljs) {
 | |
|   const IDENT_RE = '[A-Za-z0-9_$]+';
 | |
|   const COMMENT = variants([
 | |
|     hljs.C_LINE_COMMENT_MODE,
 | |
|     hljs.C_BLOCK_COMMENT_MODE,
 | |
|     hljs.COMMENT(
 | |
|       '/\\*\\*',
 | |
|       '\\*/',
 | |
|       {
 | |
|         relevance: 0,
 | |
|         contains: [
 | |
|           {
 | |
|             // eat up @'s in emails to prevent them to be recognized as doctags
 | |
|             begin: /\w+@/,
 | |
|             relevance: 0
 | |
|           },
 | |
|           {
 | |
|             className: 'doctag',
 | |
|             begin: '@[A-Za-z]+'
 | |
|           }
 | |
|         ]
 | |
|       }
 | |
|     )
 | |
|   ]);
 | |
|   const REGEXP = {
 | |
|     className: 'regexp',
 | |
|     begin: /~?\/[^\/\n]+\//,
 | |
|     contains: [ hljs.BACKSLASH_ESCAPE ]
 | |
|   };
 | |
|   const NUMBER = variants([
 | |
|     hljs.BINARY_NUMBER_MODE,
 | |
|     hljs.C_NUMBER_MODE
 | |
|   ]);
 | |
|   const STRING = variants([
 | |
|     {
 | |
|       begin: /"""/,
 | |
|       end: /"""/
 | |
|     },
 | |
|     {
 | |
|       begin: /'''/,
 | |
|       end: /'''/
 | |
|     },
 | |
|     {
 | |
|       begin: "\\$/",
 | |
|       end: "/\\$",
 | |
|       relevance: 10
 | |
|     },
 | |
|     hljs.APOS_STRING_MODE,
 | |
|     hljs.QUOTE_STRING_MODE
 | |
|   ],
 | |
|   {
 | |
|     className: "string"
 | |
|   }
 | |
|   );
 | |
| 
 | |
|   return {
 | |
|     name: 'Groovy',
 | |
|     keywords: {
 | |
|       built_in: 'this super',
 | |
|       literal: 'true false null',
 | |
|       keyword:
 | |
|             'byte short char int long boolean float double void ' +
 | |
|             // groovy specific keywords
 | |
|             'def as in assert trait ' +
 | |
|             // common keywords with Java
 | |
|             'abstract static volatile transient public private protected synchronized final ' +
 | |
|             'class interface enum if else for while switch case break default continue ' +
 | |
|             'throw throws try catch finally implements extends new import package return instanceof'
 | |
|     },
 | |
|     contains: [
 | |
|       hljs.SHEBANG({
 | |
|         binary: "groovy",
 | |
|         relevance: 10
 | |
|       }),
 | |
|       COMMENT,
 | |
|       STRING,
 | |
|       REGEXP,
 | |
|       NUMBER,
 | |
|       {
 | |
|         className: 'class',
 | |
|         beginKeywords: 'class interface trait enum',
 | |
|         end: /\{/,
 | |
|         illegal: ':',
 | |
|         contains: [
 | |
|           {
 | |
|             beginKeywords: 'extends implements'
 | |
|           },
 | |
|           hljs.UNDERSCORE_TITLE_MODE
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         className: 'meta',
 | |
|         begin: '@[A-Za-z]+',
 | |
|         relevance: 0
 | |
|       },
 | |
|       {
 | |
|         // highlight map keys and named parameters as attrs
 | |
|         className: 'attr',
 | |
|         begin: IDENT_RE + '[ \t]*:',
 | |
|         relevance: 0
 | |
|       },
 | |
|       {
 | |
|         // catch middle element of the ternary operator
 | |
|         // to avoid highlight it as a label, named parameter, or map key
 | |
|         begin: /\?/,
 | |
|         end: /:/,
 | |
|         relevance: 0,
 | |
|         contains: [
 | |
|           COMMENT,
 | |
|           STRING,
 | |
|           REGEXP,
 | |
|           NUMBER,
 | |
|           'self'
 | |
|         ]
 | |
|       },
 | |
|       {
 | |
|         // highlight labeled statements
 | |
|         className: 'symbol',
 | |
|         begin: '^[ \t]*' + lookahead(IDENT_RE + ':'),
 | |
|         excludeBegin: true,
 | |
|         end: IDENT_RE + ':',
 | |
|         relevance: 0
 | |
|       }
 | |
|     ],
 | |
|     illegal: /#|<\//
 | |
|   };
 | |
| }
 | |
| 
 | |
| module.exports = groovy;
 |