javascript.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. module.exports = function(hljs) {
  2. var IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
  3. var KEYWORDS = {
  4. keyword:
  5. 'in of if for while finally var new function do return void else break catch ' +
  6. 'instanceof with throw case default try this switch continue typeof delete ' +
  7. 'let yield const export super debugger as async await static ' +
  8. // ECMAScript 6 modules import
  9. 'import from as'
  10. ,
  11. literal:
  12. 'true false null undefined NaN Infinity',
  13. built_in:
  14. 'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +
  15. 'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +
  16. 'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +
  17. 'TypeError URIError Number Math Date String RegExp Array Float32Array ' +
  18. 'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +
  19. 'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +
  20. 'module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect ' +
  21. 'Promise'
  22. };
  23. var NUMBER = {
  24. className: 'number',
  25. variants: [
  26. { begin: '\\b(0[bB][01]+)n?' },
  27. { begin: '\\b(0[oO][0-7]+)n?' },
  28. { begin: hljs.C_NUMBER_RE + 'n?' }
  29. ],
  30. relevance: 0
  31. };
  32. var SUBST = {
  33. className: 'subst',
  34. begin: '\\$\\{', end: '\\}',
  35. keywords: KEYWORDS,
  36. contains: [] // defined later
  37. };
  38. var HTML_TEMPLATE = {
  39. begin: 'html`', end: '',
  40. starts: {
  41. end: '`', returnEnd: false,
  42. contains: [
  43. hljs.BACKSLASH_ESCAPE,
  44. SUBST
  45. ],
  46. subLanguage: 'xml',
  47. }
  48. };
  49. var CSS_TEMPLATE = {
  50. begin: 'css`', end: '',
  51. starts: {
  52. end: '`', returnEnd: false,
  53. contains: [
  54. hljs.BACKSLASH_ESCAPE,
  55. SUBST
  56. ],
  57. subLanguage: 'css',
  58. }
  59. };
  60. var TEMPLATE_STRING = {
  61. className: 'string',
  62. begin: '`', end: '`',
  63. contains: [
  64. hljs.BACKSLASH_ESCAPE,
  65. SUBST
  66. ]
  67. };
  68. SUBST.contains = [
  69. hljs.APOS_STRING_MODE,
  70. hljs.QUOTE_STRING_MODE,
  71. HTML_TEMPLATE,
  72. CSS_TEMPLATE,
  73. TEMPLATE_STRING,
  74. NUMBER,
  75. hljs.REGEXP_MODE
  76. ];
  77. var PARAMS_CONTAINS = SUBST.contains.concat([
  78. hljs.C_BLOCK_COMMENT_MODE,
  79. hljs.C_LINE_COMMENT_MODE
  80. ]);
  81. return {
  82. aliases: ['js', 'jsx', 'mjs', 'cjs'],
  83. keywords: KEYWORDS,
  84. contains: [
  85. {
  86. className: 'meta',
  87. relevance: 10,
  88. begin: /^\s*['"]use (strict|asm)['"]/
  89. },
  90. {
  91. className: 'meta',
  92. begin: /^#!/, end: /$/
  93. },
  94. hljs.APOS_STRING_MODE,
  95. hljs.QUOTE_STRING_MODE,
  96. HTML_TEMPLATE,
  97. CSS_TEMPLATE,
  98. TEMPLATE_STRING,
  99. hljs.C_LINE_COMMENT_MODE,
  100. hljs.COMMENT(
  101. '/\\*\\*',
  102. '\\*/',
  103. {
  104. relevance : 0,
  105. contains : [
  106. {
  107. className : 'doctag',
  108. begin : '@[A-Za-z]+',
  109. contains : [
  110. {
  111. className: 'type',
  112. begin: '\\{',
  113. end: '\\}',
  114. relevance: 0
  115. },
  116. {
  117. className: 'variable',
  118. begin: IDENT_RE + '(?=\\s*(-)|$)',
  119. endsParent: true,
  120. relevance: 0
  121. },
  122. // eat spaces (not newlines) so we can find
  123. // types or variables
  124. {
  125. begin: /(?=[^\n])\s/,
  126. relevance: 0
  127. },
  128. ]
  129. }
  130. ]
  131. }
  132. ),
  133. hljs.C_BLOCK_COMMENT_MODE,
  134. NUMBER,
  135. { // object attr container
  136. begin: /[{,\n]\s*/, relevance: 0,
  137. contains: [
  138. {
  139. begin: IDENT_RE + '\\s*:', returnBegin: true,
  140. relevance: 0,
  141. contains: [{className: 'attr', begin: IDENT_RE, relevance: 0}]
  142. }
  143. ]
  144. },
  145. { // "value" container
  146. begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
  147. keywords: 'return throw case',
  148. contains: [
  149. hljs.C_LINE_COMMENT_MODE,
  150. hljs.C_BLOCK_COMMENT_MODE,
  151. hljs.REGEXP_MODE,
  152. {
  153. className: 'function',
  154. begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>', returnBegin: true,
  155. end: '\\s*=>',
  156. contains: [
  157. {
  158. className: 'params',
  159. variants: [
  160. {
  161. begin: IDENT_RE
  162. },
  163. {
  164. begin: /\(\s*\)/,
  165. },
  166. {
  167. begin: /\(/, end: /\)/,
  168. excludeBegin: true, excludeEnd: true,
  169. keywords: KEYWORDS,
  170. contains: PARAMS_CONTAINS
  171. }
  172. ]
  173. }
  174. ]
  175. },
  176. {
  177. className: '',
  178. begin: /\s/,
  179. end: /\s*/,
  180. skip: true,
  181. },
  182. { // E4X / JSX
  183. begin: /</, end: /(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/,
  184. subLanguage: 'xml',
  185. contains: [
  186. { begin: /<[A-Za-z0-9\\._:-]+\s*\/>/, skip: true },
  187. {
  188. begin: /<[A-Za-z0-9\\._:-]+/, end: /(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/, skip: true,
  189. contains: [
  190. { begin: /<[A-Za-z0-9\\._:-]+\s*\/>/, skip: true },
  191. 'self'
  192. ]
  193. }
  194. ]
  195. }
  196. ],
  197. relevance: 0
  198. },
  199. {
  200. className: 'function',
  201. beginKeywords: 'function', end: /\{/, excludeEnd: true,
  202. contains: [
  203. hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
  204. {
  205. className: 'params',
  206. begin: /\(/, end: /\)/,
  207. excludeBegin: true,
  208. excludeEnd: true,
  209. contains: PARAMS_CONTAINS
  210. }
  211. ],
  212. illegal: /\[|%/
  213. },
  214. {
  215. begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
  216. },
  217. hljs.METHOD_GUARD,
  218. { // ES6 class
  219. className: 'class',
  220. beginKeywords: 'class', end: /[{;=]/, excludeEnd: true,
  221. illegal: /[:"\[\]]/,
  222. contains: [
  223. {beginKeywords: 'extends'},
  224. hljs.UNDERSCORE_TITLE_MODE
  225. ]
  226. },
  227. {
  228. beginKeywords: 'constructor get set', end: /\{/, excludeEnd: true
  229. }
  230. ],
  231. illegal: /#(?!!)/
  232. };
  233. };