javascript.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. Language: JavaScript
  3. Category: common, scripting
  4. */
  5. function(hljs) {
  6. var IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
  7. var KEYWORDS = {
  8. keyword:
  9. 'in of if for while finally var new function do return void else break catch ' +
  10. 'instanceof with throw case default try this switch continue typeof delete ' +
  11. 'let yield const export super debugger as async await static ' +
  12. // ECMAScript 6 modules import
  13. 'import from as'
  14. ,
  15. literal:
  16. 'true false null undefined NaN Infinity',
  17. built_in:
  18. 'eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent ' +
  19. 'encodeURI encodeURIComponent escape unescape Object Function Boolean Error ' +
  20. 'EvalError InternalError RangeError ReferenceError StopIteration SyntaxError ' +
  21. 'TypeError URIError Number Math Date String RegExp Array Float32Array ' +
  22. 'Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array ' +
  23. 'Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require ' +
  24. 'module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect ' +
  25. 'Promise'
  26. };
  27. var EXPRESSIONS;
  28. var NUMBER = {
  29. className: 'number',
  30. variants: [
  31. { begin: '\\b(0[bB][01]+)' },
  32. { begin: '\\b(0[oO][0-7]+)' },
  33. { begin: hljs.C_NUMBER_RE }
  34. ],
  35. relevance: 0
  36. };
  37. var SUBST = {
  38. className: 'subst',
  39. begin: '\\$\\{', end: '\\}',
  40. keywords: KEYWORDS,
  41. contains: [] // defined later
  42. };
  43. var TEMPLATE_STRING = {
  44. className: 'string',
  45. begin: '`', end: '`',
  46. contains: [
  47. hljs.BACKSLASH_ESCAPE,
  48. SUBST
  49. ]
  50. };
  51. SUBST.contains = [
  52. hljs.APOS_STRING_MODE,
  53. hljs.QUOTE_STRING_MODE,
  54. TEMPLATE_STRING,
  55. NUMBER,
  56. hljs.REGEXP_MODE
  57. ]
  58. var PARAMS_CONTAINS = SUBST.contains.concat([
  59. hljs.C_BLOCK_COMMENT_MODE,
  60. hljs.C_LINE_COMMENT_MODE
  61. ]);
  62. return {
  63. aliases: ['js', 'jsx'],
  64. keywords: KEYWORDS,
  65. contains: [
  66. {
  67. className: 'meta',
  68. relevance: 10,
  69. begin: /^\s*['"]use (strict|asm)['"]/
  70. },
  71. {
  72. className: 'meta',
  73. begin: /^#!/, end: /$/
  74. },
  75. hljs.APOS_STRING_MODE,
  76. hljs.QUOTE_STRING_MODE,
  77. TEMPLATE_STRING,
  78. hljs.C_LINE_COMMENT_MODE,
  79. hljs.C_BLOCK_COMMENT_MODE,
  80. NUMBER,
  81. { // object attr container
  82. begin: /[{,]\s*/, relevance: 0,
  83. contains: [
  84. {
  85. begin: IDENT_RE + '\\s*:', returnBegin: true,
  86. relevance: 0,
  87. contains: [{className: 'attr', begin: IDENT_RE, relevance: 0}]
  88. }
  89. ]
  90. },
  91. { // "value" container
  92. begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
  93. keywords: 'return throw case',
  94. contains: [
  95. hljs.C_LINE_COMMENT_MODE,
  96. hljs.C_BLOCK_COMMENT_MODE,
  97. hljs.REGEXP_MODE,
  98. {
  99. className: 'function',
  100. begin: '(\\(.*?\\)|' + IDENT_RE + ')\\s*=>', returnBegin: true,
  101. end: '\\s*=>',
  102. contains: [
  103. {
  104. className: 'params',
  105. variants: [
  106. {
  107. begin: IDENT_RE
  108. },
  109. {
  110. begin: /\(\s*\)/,
  111. },
  112. {
  113. begin: /\(/, end: /\)/,
  114. excludeBegin: true, excludeEnd: true,
  115. keywords: KEYWORDS,
  116. contains: PARAMS_CONTAINS
  117. }
  118. ]
  119. }
  120. ]
  121. },
  122. { // E4X / JSX
  123. begin: /</, end: /(\/\w+|\w+\/)>/,
  124. subLanguage: 'xml',
  125. contains: [
  126. {begin: /<\w+\s*\/>/, skip: true},
  127. {
  128. begin: /<\w+/, end: /(\/\w+|\w+\/)>/, skip: true,
  129. contains: [
  130. {begin: /<\w+\s*\/>/, skip: true},
  131. 'self'
  132. ]
  133. }
  134. ]
  135. }
  136. ],
  137. relevance: 0
  138. },
  139. {
  140. className: 'function',
  141. beginKeywords: 'function', end: /\{/, excludeEnd: true,
  142. contains: [
  143. hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
  144. {
  145. className: 'params',
  146. begin: /\(/, end: /\)/,
  147. excludeBegin: true,
  148. excludeEnd: true,
  149. contains: PARAMS_CONTAINS
  150. }
  151. ],
  152. illegal: /\[|%/
  153. },
  154. {
  155. begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
  156. },
  157. hljs.METHOD_GUARD,
  158. { // ES6 class
  159. className: 'class',
  160. beginKeywords: 'class', end: /[{;=]/, excludeEnd: true,
  161. illegal: /[:"\[\]]/,
  162. contains: [
  163. {beginKeywords: 'extends'},
  164. hljs.UNDERSCORE_TITLE_MODE
  165. ]
  166. },
  167. {
  168. beginKeywords: 'constructor', end: /\{/, excludeEnd: true
  169. }
  170. ],
  171. illegal: /#(?!!)/
  172. };
  173. }