prism-javascript.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. Prism.languages.javascript = Prism.languages.extend('clike', {
  2. 'class-name': [
  3. Prism.languages.clike['class-name'],
  4. {
  5. pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,
  6. lookbehind: true
  7. }
  8. ],
  9. 'keyword': [
  10. {
  11. pattern: /((?:^|})\s*)(?:catch|finally)\b/,
  12. lookbehind: true
  13. },
  14. {
  15. pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
  16. lookbehind: true
  17. },
  18. ],
  19. 'number': /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,
  20. // Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
  21. 'function': /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
  22. 'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
  23. });
  24. Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/;
  25. Prism.languages.insertBefore('javascript', 'keyword', {
  26. 'regex': {
  27. pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,
  28. lookbehind: true,
  29. greedy: true,
  30. inside: {
  31. 'regex-source': {
  32. pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
  33. lookbehind: true,
  34. alias: 'language-regex',
  35. inside: Prism.languages.regex
  36. },
  37. 'regex-flags': /[a-z]+$/,
  38. 'regex-delimiter': /^\/|\/$/
  39. }
  40. },
  41. // This must be declared before keyword because we use "function" inside the look-forward
  42. 'function-variable': {
  43. pattern: /#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,
  44. alias: 'function'
  45. },
  46. 'parameter': [
  47. {
  48. pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,
  49. lookbehind: true,
  50. inside: Prism.languages.javascript
  51. },
  52. {
  53. pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,
  54. inside: Prism.languages.javascript
  55. },
  56. {
  57. pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,
  58. lookbehind: true,
  59. inside: Prism.languages.javascript
  60. },
  61. {
  62. pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,
  63. lookbehind: true,
  64. inside: Prism.languages.javascript
  65. }
  66. ],
  67. 'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/
  68. });
  69. Prism.languages.insertBefore('javascript', 'string', {
  70. 'template-string': {
  71. pattern: /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,
  72. greedy: true,
  73. inside: {
  74. 'template-punctuation': {
  75. pattern: /^`|`$/,
  76. alias: 'string'
  77. },
  78. 'interpolation': {
  79. pattern: /((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,
  80. lookbehind: true,
  81. inside: {
  82. 'interpolation-punctuation': {
  83. pattern: /^\${|}$/,
  84. alias: 'punctuation'
  85. },
  86. rest: Prism.languages.javascript
  87. }
  88. },
  89. 'string': /[\s\S]+/
  90. }
  91. }
  92. });
  93. if (Prism.languages.markup) {
  94. Prism.languages.markup.tag.addInlined('script', 'javascript');
  95. }
  96. Prism.languages.js = Prism.languages.javascript;