You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
6.2 KiB
172 lines
6.2 KiB
Prism.languages.javascript = Prism.languages.extend('clike', { |
|
'class-name': [ |
|
Prism.languages.clike['class-name'], |
|
{ |
|
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/, |
|
lookbehind: true |
|
} |
|
], |
|
'keyword': [ |
|
{ |
|
pattern: /((?:^|\})\s*)catch\b/, |
|
lookbehind: true |
|
}, |
|
{ |
|
pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|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/, |
|
lookbehind: true |
|
}, |
|
], |
|
// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444) |
|
'function': /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, |
|
'number': { |
|
pattern: RegExp( |
|
/(^|[^\w$])/.source + |
|
'(?:' + |
|
( |
|
// constant |
|
/NaN|Infinity/.source + |
|
'|' + |
|
// binary integer |
|
/0[bB][01]+(?:_[01]+)*n?/.source + |
|
'|' + |
|
// octal integer |
|
/0[oO][0-7]+(?:_[0-7]+)*n?/.source + |
|
'|' + |
|
// hexadecimal integer |
|
/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + |
|
'|' + |
|
// decimal bigint |
|
/\d+(?:_\d+)*n/.source + |
|
'|' + |
|
// decimal number (integer or float) but no bigint |
|
/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source |
|
) + |
|
')' + |
|
/(?![\w$])/.source |
|
), |
|
lookbehind: true |
|
}, |
|
'operator': /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/ |
|
}); |
|
|
|
Prism.languages.javascript['class-name'][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/; |
|
|
|
Prism.languages.insertBefore('javascript', 'keyword', { |
|
'regex': { |
|
pattern: RegExp( |
|
// lookbehind |
|
// eslint-disable-next-line regexp/no-dupe-characters-character-class |
|
/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + |
|
// Regex pattern: |
|
// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character |
|
// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible |
|
// with the only syntax, so we have to define 2 different regex patterns. |
|
/\//.source + |
|
'(?:' + |
|
/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + |
|
'|' + |
|
// `v` flag syntax. This supports 3 levels of nested character classes. |
|
/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + |
|
')' + |
|
// lookahead |
|
/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source |
|
), |
|
lookbehind: true, |
|
greedy: true, |
|
inside: { |
|
'regex-source': { |
|
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/, |
|
lookbehind: true, |
|
alias: 'language-regex', |
|
inside: Prism.languages.regex |
|
}, |
|
'regex-delimiter': /^\/|\/$/, |
|
'regex-flags': /^[a-z]+$/, |
|
} |
|
}, |
|
// This must be declared before keyword because we use "function" inside the look-forward |
|
'function-variable': { |
|
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/, |
|
alias: 'function' |
|
}, |
|
'parameter': [ |
|
{ |
|
pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
}, |
|
{ |
|
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]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/, |
|
lookbehind: true, |
|
inside: Prism.languages.javascript |
|
} |
|
], |
|
'constant': /\b[A-Z](?:[A-Z_]|\dx?)*\b/ |
|
}); |
|
|
|
Prism.languages.insertBefore('javascript', 'string', { |
|
'hashbang': { |
|
pattern: /^#!.*/, |
|
greedy: true, |
|
alias: 'comment' |
|
}, |
|
'template-string': { |
|
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/, |
|
greedy: true, |
|
inside: { |
|
'template-punctuation': { |
|
pattern: /^`|`$/, |
|
alias: 'string' |
|
}, |
|
'interpolation': { |
|
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/, |
|
lookbehind: true, |
|
inside: { |
|
'interpolation-punctuation': { |
|
pattern: /^\$\{|\}$/, |
|
alias: 'punctuation' |
|
}, |
|
rest: Prism.languages.javascript |
|
} |
|
}, |
|
'string': /[\s\S]+/ |
|
} |
|
}, |
|
'string-property': { |
|
pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m, |
|
lookbehind: true, |
|
greedy: true, |
|
alias: 'property' |
|
} |
|
}); |
|
|
|
Prism.languages.insertBefore('javascript', 'operator', { |
|
'literal-property': { |
|
pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m, |
|
lookbehind: true, |
|
alias: 'property' |
|
}, |
|
}); |
|
|
|
if (Prism.languages.markup) { |
|
Prism.languages.markup.tag.addInlined('script', 'javascript'); |
|
|
|
// add attribute support for all DOM events. |
|
// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events |
|
Prism.languages.markup.tag.addAttribute( |
|
/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source, |
|
'javascript' |
|
); |
|
} |
|
|
|
Prism.languages.js = Prism.languages.javascript;
|
|
|