mirror of
https://github.com/JKorf/CryptoExchange.Net
synced 2025-06-08 16:36:15 +00:00
285 lines
7.8 KiB
JavaScript
285 lines
7.8 KiB
JavaScript
/*
|
|
Language: JavaScript
|
|
Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
|
|
Category: common, scripting
|
|
Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
|
|
*/
|
|
|
|
import * as ECMAScript from "./lib/ecmascript";
|
|
import * as regex from "../lib/regex";
|
|
|
|
export default function(hljs) {
|
|
var IDENT_RE = ECMAScript.IDENT_RE;
|
|
var FRAGMENT = {
|
|
begin: '<>',
|
|
end: '</>'
|
|
};
|
|
var XML_TAG = {
|
|
begin: /<[A-Za-z0-9\\._:-]+/,
|
|
end: /\/[A-Za-z0-9\\._:-]+>|\/>/
|
|
};
|
|
var KEYWORDS = {
|
|
$pattern: ECMAScript.IDENT_RE,
|
|
keyword: ECMAScript.KEYWORDS.join(" "),
|
|
literal: ECMAScript.LITERALS.join(" "),
|
|
built_in: ECMAScript.BUILT_INS.join(" ")
|
|
};
|
|
var NUMBER = {
|
|
className: 'number',
|
|
variants: [
|
|
{ begin: '\\b(0[bB][01]+)n?' },
|
|
{ begin: '\\b(0[oO][0-7]+)n?' },
|
|
{ begin: hljs.C_NUMBER_RE + 'n?' }
|
|
],
|
|
relevance: 0
|
|
};
|
|
var SUBST = {
|
|
className: 'subst',
|
|
begin: '\\$\\{', end: '\\}',
|
|
keywords: KEYWORDS,
|
|
contains: [] // defined later
|
|
};
|
|
var HTML_TEMPLATE = {
|
|
begin: 'html`', end: '',
|
|
starts: {
|
|
end: '`', returnEnd: false,
|
|
contains: [
|
|
hljs.BACKSLASH_ESCAPE,
|
|
SUBST
|
|
],
|
|
subLanguage: 'xml',
|
|
}
|
|
};
|
|
var CSS_TEMPLATE = {
|
|
begin: 'css`', end: '',
|
|
starts: {
|
|
end: '`', returnEnd: false,
|
|
contains: [
|
|
hljs.BACKSLASH_ESCAPE,
|
|
SUBST
|
|
],
|
|
subLanguage: 'css',
|
|
}
|
|
};
|
|
var TEMPLATE_STRING = {
|
|
className: 'string',
|
|
begin: '`', end: '`',
|
|
contains: [
|
|
hljs.BACKSLASH_ESCAPE,
|
|
SUBST
|
|
]
|
|
};
|
|
SUBST.contains = [
|
|
hljs.APOS_STRING_MODE,
|
|
hljs.QUOTE_STRING_MODE,
|
|
HTML_TEMPLATE,
|
|
CSS_TEMPLATE,
|
|
TEMPLATE_STRING,
|
|
NUMBER,
|
|
hljs.REGEXP_MODE
|
|
];
|
|
var PARAMS_CONTAINS = SUBST.contains.concat([
|
|
// eat recursive parens in sub expressions
|
|
{ begin: /\(/, end: /\)/,
|
|
contains: ["self"].concat(SUBST.contains, [hljs.C_BLOCK_COMMENT_MODE, hljs.C_LINE_COMMENT_MODE])
|
|
},
|
|
hljs.C_BLOCK_COMMENT_MODE,
|
|
hljs.C_LINE_COMMENT_MODE
|
|
]);
|
|
var PARAMS = {
|
|
className: 'params',
|
|
begin: /\(/, end: /\)/,
|
|
excludeBegin: true,
|
|
excludeEnd: true,
|
|
contains: PARAMS_CONTAINS
|
|
};
|
|
|
|
return {
|
|
name: 'JavaScript',
|
|
aliases: ['js', 'jsx', 'mjs', 'cjs'],
|
|
keywords: KEYWORDS,
|
|
contains: [
|
|
hljs.SHEBANG({
|
|
binary: "node",
|
|
relevance: 5
|
|
}),
|
|
{
|
|
className: 'meta',
|
|
relevance: 10,
|
|
begin: /^\s*['"]use (strict|asm)['"]/
|
|
},
|
|
hljs.APOS_STRING_MODE,
|
|
hljs.QUOTE_STRING_MODE,
|
|
HTML_TEMPLATE,
|
|
CSS_TEMPLATE,
|
|
TEMPLATE_STRING,
|
|
hljs.C_LINE_COMMENT_MODE,
|
|
hljs.COMMENT(
|
|
'/\\*\\*',
|
|
'\\*/',
|
|
{
|
|
relevance : 0,
|
|
contains : [
|
|
{
|
|
className : 'doctag',
|
|
begin : '@[A-Za-z]+',
|
|
contains : [
|
|
{
|
|
className: 'type',
|
|
begin: '\\{',
|
|
end: '\\}',
|
|
relevance: 0
|
|
},
|
|
{
|
|
className: 'variable',
|
|
begin: IDENT_RE + '(?=\\s*(-)|$)',
|
|
endsParent: true,
|
|
relevance: 0
|
|
},
|
|
// eat spaces (not newlines) so we can find
|
|
// types or variables
|
|
{
|
|
begin: /(?=[^\n])\s/,
|
|
relevance: 0
|
|
},
|
|
]
|
|
}
|
|
]
|
|
}
|
|
),
|
|
hljs.C_BLOCK_COMMENT_MODE,
|
|
NUMBER,
|
|
{ // object attr container
|
|
begin: regex.concat(/[{,\n]\s*/,
|
|
// we need to look ahead to make sure that we actually have an
|
|
// attribute coming up so we don't steal a comma from a potential
|
|
// "value" container
|
|
//
|
|
// NOTE: this might not work how you think. We don't actually always
|
|
// enter this mode and stay. Instead it might merely match `,
|
|
// <comments up next>` and then immediately end after the , because it
|
|
// fails to find any actual attrs. But this still does the job because
|
|
// it prevents the value contain rule from grabbing this instead and
|
|
// prevening this rule from firing when we actually DO have keys.
|
|
regex.lookahead(regex.concat(
|
|
// we also need to allow for multiple possible comments inbetween
|
|
// the first key:value pairing
|
|
/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,
|
|
IDENT_RE + '\\s*:'))),
|
|
relevance: 0,
|
|
contains: [
|
|
{
|
|
className: 'attr',
|
|
begin: IDENT_RE + regex.lookahead('\\s*:'),
|
|
relevance: 0,
|
|
},
|
|
]
|
|
},
|
|
{ // "value" container
|
|
begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
|
|
keywords: 'return throw case',
|
|
contains: [
|
|
hljs.C_LINE_COMMENT_MODE,
|
|
hljs.C_BLOCK_COMMENT_MODE,
|
|
hljs.REGEXP_MODE,
|
|
{
|
|
className: 'function',
|
|
// we have to count the parens to make sure we actually have the
|
|
// correct bounding ( ) before the =>. There could be any number of
|
|
// sub-expressions inside also surrounded by parens.
|
|
begin: '(\\([^(]*' +
|
|
'(\\([^(]*' +
|
|
'(\\([^(]*' +
|
|
'\\))?' +
|
|
'\\))?' +
|
|
'\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>', returnBegin: true,
|
|
end: '\\s*=>',
|
|
contains: [
|
|
{
|
|
className: 'params',
|
|
variants: [
|
|
{
|
|
begin: hljs.UNDERSCORE_IDENT_RE
|
|
},
|
|
{
|
|
className: null,
|
|
begin: /\(\s*\)/,
|
|
skip: true
|
|
},
|
|
{
|
|
begin: /\(/, end: /\)/,
|
|
excludeBegin: true, excludeEnd: true,
|
|
keywords: KEYWORDS,
|
|
contains: PARAMS_CONTAINS
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{ // could be a comma delimited list of params to a function call
|
|
begin: /,/, relevance: 0,
|
|
},
|
|
{
|
|
className: '',
|
|
begin: /\s/,
|
|
end: /\s*/,
|
|
skip: true,
|
|
},
|
|
{ // JSX
|
|
variants: [
|
|
{ begin: FRAGMENT.begin, end: FRAGMENT.end },
|
|
{ begin: XML_TAG.begin, end: XML_TAG.end }
|
|
],
|
|
subLanguage: 'xml',
|
|
contains: [
|
|
{
|
|
begin: XML_TAG.begin, end: XML_TAG.end, skip: true,
|
|
contains: ['self']
|
|
}
|
|
]
|
|
},
|
|
],
|
|
relevance: 0
|
|
},
|
|
{
|
|
className: 'function',
|
|
beginKeywords: 'function', end: /\{/, excludeEnd: true,
|
|
contains: [
|
|
hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
|
|
PARAMS
|
|
],
|
|
illegal: /\[|%/
|
|
},
|
|
{
|
|
begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
|
|
},
|
|
|
|
hljs.METHOD_GUARD,
|
|
{ // ES6 class
|
|
className: 'class',
|
|
beginKeywords: 'class', end: /[{;=]/, excludeEnd: true,
|
|
illegal: /[:"\[\]]/,
|
|
contains: [
|
|
{beginKeywords: 'extends'},
|
|
hljs.UNDERSCORE_TITLE_MODE
|
|
]
|
|
},
|
|
{
|
|
beginKeywords: 'constructor', end: /\{/, excludeEnd: true
|
|
},
|
|
{
|
|
begin: '(get|set)\\s+(?=' + IDENT_RE + '\\()',
|
|
end: /{/,
|
|
keywords: "get set",
|
|
contains: [
|
|
hljs.inherit(hljs.TITLE_MODE, {begin: IDENT_RE}),
|
|
{ begin: /\(\)/ }, // eat to avoid empty params
|
|
PARAMS
|
|
]
|
|
|
|
}
|
|
],
|
|
illegal: /#(?!!)/
|
|
};
|
|
}
|