groovy.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  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. function variants(variants, obj = {}) {
  8. obj.variants = variants;
  9. return obj;
  10. }
  11. function groovy(hljs) {
  12. const regex = hljs.regex;
  13. const IDENT_RE = '[A-Za-z0-9_$]+';
  14. const COMMENT = variants([
  15. hljs.C_LINE_COMMENT_MODE,
  16. hljs.C_BLOCK_COMMENT_MODE,
  17. hljs.COMMENT(
  18. '/\\*\\*',
  19. '\\*/',
  20. {
  21. relevance: 0,
  22. contains: [
  23. {
  24. // eat up @'s in emails to prevent them to be recognized as doctags
  25. begin: /\w+@/,
  26. relevance: 0
  27. },
  28. {
  29. className: 'doctag',
  30. begin: '@[A-Za-z]+'
  31. }
  32. ]
  33. }
  34. )
  35. ]);
  36. const REGEXP = {
  37. className: 'regexp',
  38. begin: /~?\/[^\/\n]+\//,
  39. contains: [ hljs.BACKSLASH_ESCAPE ]
  40. };
  41. const NUMBER = variants([
  42. hljs.BINARY_NUMBER_MODE,
  43. hljs.C_NUMBER_MODE
  44. ]);
  45. const STRING = variants([
  46. {
  47. begin: /"""/,
  48. end: /"""/
  49. },
  50. {
  51. begin: /'''/,
  52. end: /'''/
  53. },
  54. {
  55. begin: "\\$/",
  56. end: "/\\$",
  57. relevance: 10
  58. },
  59. hljs.APOS_STRING_MODE,
  60. hljs.QUOTE_STRING_MODE
  61. ],
  62. { className: "string" }
  63. );
  64. const CLASS_DEFINITION = {
  65. match: [
  66. /(class|interface|trait|enum|extends|implements)/,
  67. /\s+/,
  68. hljs.UNDERSCORE_IDENT_RE
  69. ],
  70. scope: {
  71. 1: "keyword",
  72. 3: "title.class",
  73. }
  74. };
  75. const TYPES = [
  76. "byte",
  77. "short",
  78. "char",
  79. "int",
  80. "long",
  81. "boolean",
  82. "float",
  83. "double",
  84. "void"
  85. ];
  86. const KEYWORDS = [
  87. // groovy specific keywords
  88. "def",
  89. "as",
  90. "in",
  91. "assert",
  92. "trait",
  93. // common keywords with Java
  94. "abstract",
  95. "static",
  96. "volatile",
  97. "transient",
  98. "public",
  99. "private",
  100. "protected",
  101. "synchronized",
  102. "final",
  103. "class",
  104. "interface",
  105. "enum",
  106. "if",
  107. "else",
  108. "for",
  109. "while",
  110. "switch",
  111. "case",
  112. "break",
  113. "default",
  114. "continue",
  115. "throw",
  116. "throws",
  117. "try",
  118. "catch",
  119. "finally",
  120. "implements",
  121. "extends",
  122. "new",
  123. "import",
  124. "package",
  125. "return",
  126. "instanceof"
  127. ];
  128. return {
  129. name: 'Groovy',
  130. keywords: {
  131. "variable.language": 'this super',
  132. literal: 'true false null',
  133. type: TYPES,
  134. keyword: KEYWORDS
  135. },
  136. contains: [
  137. hljs.SHEBANG({
  138. binary: "groovy",
  139. relevance: 10
  140. }),
  141. COMMENT,
  142. STRING,
  143. REGEXP,
  144. NUMBER,
  145. CLASS_DEFINITION,
  146. {
  147. className: 'meta',
  148. begin: '@[A-Za-z]+',
  149. relevance: 0
  150. },
  151. {
  152. // highlight map keys and named parameters as attrs
  153. className: 'attr',
  154. begin: IDENT_RE + '[ \t]*:',
  155. relevance: 0
  156. },
  157. {
  158. // catch middle element of the ternary operator
  159. // to avoid highlight it as a label, named parameter, or map key
  160. begin: /\?/,
  161. end: /:/,
  162. relevance: 0,
  163. contains: [
  164. COMMENT,
  165. STRING,
  166. REGEXP,
  167. NUMBER,
  168. 'self'
  169. ]
  170. },
  171. {
  172. // highlight labeled statements
  173. className: 'symbol',
  174. begin: '^[ \t]*' + regex.lookahead(IDENT_RE + ':'),
  175. excludeBegin: true,
  176. end: IDENT_RE + ':',
  177. relevance: 0
  178. }
  179. ],
  180. illegal: /#|<\//
  181. };
  182. }
  183. export { groovy as default };