javascript.js 7.3 KB

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