mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-09-18 14:32:03 +09:00
Hello world
First open source release of Campfire 🎉
This commit is contained in:
Vendored
Vendored
+2
File diff suppressed because one or more lines are too long
+2597
File diff suppressed because it is too large
Load Diff
Vendored
+391
@@ -0,0 +1,391 @@
|
||||
/*
|
||||
Language: Bash
|
||||
Author: vah <vahtenberg@gmail.com>
|
||||
Contributrors: Benjamin Pannell <contact@sierrasoftworks.com>
|
||||
Website: https://www.gnu.org/software/bash/
|
||||
Category: common
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function bash(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const VAR = {};
|
||||
const BRACED_VAR = {
|
||||
begin: /\$\{/,
|
||||
end: /\}/,
|
||||
contains: [
|
||||
"self",
|
||||
{
|
||||
begin: /:-/,
|
||||
contains: [ VAR ]
|
||||
} // default values
|
||||
]
|
||||
};
|
||||
Object.assign(VAR, {
|
||||
className: 'variable',
|
||||
variants: [
|
||||
{ begin: regex.concat(/\$[\w\d#@][\w\d_]*/,
|
||||
// negative look-ahead tries to avoid matching patterns that are not
|
||||
// Perl at all like $ident$, @ident@, etc.
|
||||
`(?![\\w\\d])(?![$])`) },
|
||||
BRACED_VAR
|
||||
]
|
||||
});
|
||||
|
||||
const SUBST = {
|
||||
className: 'subst',
|
||||
begin: /\$\(/,
|
||||
end: /\)/,
|
||||
contains: [ hljs.BACKSLASH_ESCAPE ]
|
||||
};
|
||||
const HERE_DOC = {
|
||||
begin: /<<-?\s*(?=\w+)/,
|
||||
starts: { contains: [
|
||||
hljs.END_SAME_AS_BEGIN({
|
||||
begin: /(\w+)/,
|
||||
end: /(\w+)/,
|
||||
className: 'string'
|
||||
})
|
||||
] }
|
||||
};
|
||||
const QUOTE_STRING = {
|
||||
className: 'string',
|
||||
begin: /"/,
|
||||
end: /"/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
VAR,
|
||||
SUBST
|
||||
]
|
||||
};
|
||||
SUBST.contains.push(QUOTE_STRING);
|
||||
const ESCAPED_QUOTE = {
|
||||
match: /\\"/
|
||||
};
|
||||
const APOS_STRING = {
|
||||
className: 'string',
|
||||
begin: /'/,
|
||||
end: /'/
|
||||
};
|
||||
const ESCAPED_APOS = {
|
||||
match: /\\'/
|
||||
};
|
||||
const ARITHMETIC = {
|
||||
begin: /\$?\(\(/,
|
||||
end: /\)\)/,
|
||||
contains: [
|
||||
{
|
||||
begin: /\d+#[0-9a-f]+/,
|
||||
className: "number"
|
||||
},
|
||||
hljs.NUMBER_MODE,
|
||||
VAR
|
||||
]
|
||||
};
|
||||
const SH_LIKE_SHELLS = [
|
||||
"fish",
|
||||
"bash",
|
||||
"zsh",
|
||||
"sh",
|
||||
"csh",
|
||||
"ksh",
|
||||
"tcsh",
|
||||
"dash",
|
||||
"scsh",
|
||||
];
|
||||
const KNOWN_SHEBANG = hljs.SHEBANG({
|
||||
binary: `(${SH_LIKE_SHELLS.join("|")})`,
|
||||
relevance: 10
|
||||
});
|
||||
const FUNCTION = {
|
||||
className: 'function',
|
||||
begin: /\w[\w\d_]*\s*\(\s*\)\s*\{/,
|
||||
returnBegin: true,
|
||||
contains: [ hljs.inherit(hljs.TITLE_MODE, { begin: /\w[\w\d_]*/ }) ],
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
const KEYWORDS = [
|
||||
"if",
|
||||
"then",
|
||||
"else",
|
||||
"elif",
|
||||
"fi",
|
||||
"for",
|
||||
"while",
|
||||
"until",
|
||||
"in",
|
||||
"do",
|
||||
"done",
|
||||
"case",
|
||||
"esac",
|
||||
"function",
|
||||
"select"
|
||||
];
|
||||
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false"
|
||||
];
|
||||
|
||||
// to consume paths to prevent keyword matches inside them
|
||||
const PATH_MODE = { match: /(\/[a-z._-]+)+/ };
|
||||
|
||||
// http://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html
|
||||
const SHELL_BUILT_INS = [
|
||||
"break",
|
||||
"cd",
|
||||
"continue",
|
||||
"eval",
|
||||
"exec",
|
||||
"exit",
|
||||
"export",
|
||||
"getopts",
|
||||
"hash",
|
||||
"pwd",
|
||||
"readonly",
|
||||
"return",
|
||||
"shift",
|
||||
"test",
|
||||
"times",
|
||||
"trap",
|
||||
"umask",
|
||||
"unset"
|
||||
];
|
||||
|
||||
const BASH_BUILT_INS = [
|
||||
"alias",
|
||||
"bind",
|
||||
"builtin",
|
||||
"caller",
|
||||
"command",
|
||||
"declare",
|
||||
"echo",
|
||||
"enable",
|
||||
"help",
|
||||
"let",
|
||||
"local",
|
||||
"logout",
|
||||
"mapfile",
|
||||
"printf",
|
||||
"read",
|
||||
"readarray",
|
||||
"source",
|
||||
"type",
|
||||
"typeset",
|
||||
"ulimit",
|
||||
"unalias"
|
||||
];
|
||||
|
||||
const ZSH_BUILT_INS = [
|
||||
"autoload",
|
||||
"bg",
|
||||
"bindkey",
|
||||
"bye",
|
||||
"cap",
|
||||
"chdir",
|
||||
"clone",
|
||||
"comparguments",
|
||||
"compcall",
|
||||
"compctl",
|
||||
"compdescribe",
|
||||
"compfiles",
|
||||
"compgroups",
|
||||
"compquote",
|
||||
"comptags",
|
||||
"comptry",
|
||||
"compvalues",
|
||||
"dirs",
|
||||
"disable",
|
||||
"disown",
|
||||
"echotc",
|
||||
"echoti",
|
||||
"emulate",
|
||||
"fc",
|
||||
"fg",
|
||||
"float",
|
||||
"functions",
|
||||
"getcap",
|
||||
"getln",
|
||||
"history",
|
||||
"integer",
|
||||
"jobs",
|
||||
"kill",
|
||||
"limit",
|
||||
"log",
|
||||
"noglob",
|
||||
"popd",
|
||||
"print",
|
||||
"pushd",
|
||||
"pushln",
|
||||
"rehash",
|
||||
"sched",
|
||||
"setcap",
|
||||
"setopt",
|
||||
"stat",
|
||||
"suspend",
|
||||
"ttyctl",
|
||||
"unfunction",
|
||||
"unhash",
|
||||
"unlimit",
|
||||
"unsetopt",
|
||||
"vared",
|
||||
"wait",
|
||||
"whence",
|
||||
"where",
|
||||
"which",
|
||||
"zcompile",
|
||||
"zformat",
|
||||
"zftp",
|
||||
"zle",
|
||||
"zmodload",
|
||||
"zparseopts",
|
||||
"zprof",
|
||||
"zpty",
|
||||
"zregexparse",
|
||||
"zsocket",
|
||||
"zstyle",
|
||||
"ztcp"
|
||||
];
|
||||
|
||||
const GNU_CORE_UTILS = [
|
||||
"chcon",
|
||||
"chgrp",
|
||||
"chown",
|
||||
"chmod",
|
||||
"cp",
|
||||
"dd",
|
||||
"df",
|
||||
"dir",
|
||||
"dircolors",
|
||||
"ln",
|
||||
"ls",
|
||||
"mkdir",
|
||||
"mkfifo",
|
||||
"mknod",
|
||||
"mktemp",
|
||||
"mv",
|
||||
"realpath",
|
||||
"rm",
|
||||
"rmdir",
|
||||
"shred",
|
||||
"sync",
|
||||
"touch",
|
||||
"truncate",
|
||||
"vdir",
|
||||
"b2sum",
|
||||
"base32",
|
||||
"base64",
|
||||
"cat",
|
||||
"cksum",
|
||||
"comm",
|
||||
"csplit",
|
||||
"cut",
|
||||
"expand",
|
||||
"fmt",
|
||||
"fold",
|
||||
"head",
|
||||
"join",
|
||||
"md5sum",
|
||||
"nl",
|
||||
"numfmt",
|
||||
"od",
|
||||
"paste",
|
||||
"ptx",
|
||||
"pr",
|
||||
"sha1sum",
|
||||
"sha224sum",
|
||||
"sha256sum",
|
||||
"sha384sum",
|
||||
"sha512sum",
|
||||
"shuf",
|
||||
"sort",
|
||||
"split",
|
||||
"sum",
|
||||
"tac",
|
||||
"tail",
|
||||
"tr",
|
||||
"tsort",
|
||||
"unexpand",
|
||||
"uniq",
|
||||
"wc",
|
||||
"arch",
|
||||
"basename",
|
||||
"chroot",
|
||||
"date",
|
||||
"dirname",
|
||||
"du",
|
||||
"echo",
|
||||
"env",
|
||||
"expr",
|
||||
"factor",
|
||||
// "false", // keyword literal already
|
||||
"groups",
|
||||
"hostid",
|
||||
"id",
|
||||
"link",
|
||||
"logname",
|
||||
"nice",
|
||||
"nohup",
|
||||
"nproc",
|
||||
"pathchk",
|
||||
"pinky",
|
||||
"printenv",
|
||||
"printf",
|
||||
"pwd",
|
||||
"readlink",
|
||||
"runcon",
|
||||
"seq",
|
||||
"sleep",
|
||||
"stat",
|
||||
"stdbuf",
|
||||
"stty",
|
||||
"tee",
|
||||
"test",
|
||||
"timeout",
|
||||
// "true", // keyword literal already
|
||||
"tty",
|
||||
"uname",
|
||||
"unlink",
|
||||
"uptime",
|
||||
"users",
|
||||
"who",
|
||||
"whoami",
|
||||
"yes"
|
||||
];
|
||||
|
||||
return {
|
||||
name: 'Bash',
|
||||
aliases: [ 'sh' ],
|
||||
keywords: {
|
||||
$pattern: /\b[a-z][a-z0-9._-]+\b/,
|
||||
keyword: KEYWORDS,
|
||||
literal: LITERALS,
|
||||
built_in: [
|
||||
...SHELL_BUILT_INS,
|
||||
...BASH_BUILT_INS,
|
||||
// Shell modifiers
|
||||
"set",
|
||||
"shopt",
|
||||
...ZSH_BUILT_INS,
|
||||
...GNU_CORE_UTILS
|
||||
]
|
||||
},
|
||||
contains: [
|
||||
KNOWN_SHEBANG, // to catch known shells and boost relevancy
|
||||
hljs.SHEBANG(), // to catch unknown shells but still highlight the shebang
|
||||
FUNCTION,
|
||||
ARITHMETIC,
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
HERE_DOC,
|
||||
PATH_MODE,
|
||||
QUOTE_STRING,
|
||||
ESCAPED_QUOTE,
|
||||
APOS_STRING,
|
||||
ESCAPED_APOS,
|
||||
VAR
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default bash;
|
||||
Vendored
+738
@@ -0,0 +1,738 @@
|
||||
const MODES = (hljs) => {
|
||||
return {
|
||||
IMPORTANT: {
|
||||
scope: 'meta',
|
||||
begin: '!important'
|
||||
},
|
||||
BLOCK_COMMENT: hljs.C_BLOCK_COMMENT_MODE,
|
||||
HEXCOLOR: {
|
||||
scope: 'number',
|
||||
begin: /#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/
|
||||
},
|
||||
FUNCTION_DISPATCH: {
|
||||
className: "built_in",
|
||||
begin: /[\w-]+(?=\()/
|
||||
},
|
||||
ATTRIBUTE_SELECTOR_MODE: {
|
||||
scope: 'selector-attr',
|
||||
begin: /\[/,
|
||||
end: /\]/,
|
||||
illegal: '$',
|
||||
contains: [
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE
|
||||
]
|
||||
},
|
||||
CSS_NUMBER_MODE: {
|
||||
scope: 'number',
|
||||
begin: hljs.NUMBER_RE + '(' +
|
||||
'%|em|ex|ch|rem' +
|
||||
'|vw|vh|vmin|vmax' +
|
||||
'|cm|mm|in|pt|pc|px' +
|
||||
'|deg|grad|rad|turn' +
|
||||
'|s|ms' +
|
||||
'|Hz|kHz' +
|
||||
'|dpi|dpcm|dppx' +
|
||||
')?',
|
||||
relevance: 0
|
||||
},
|
||||
CSS_VARIABLE: {
|
||||
className: "attr",
|
||||
begin: /--[A-Za-z_][A-Za-z0-9_-]*/
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const TAGS = [
|
||||
'a',
|
||||
'abbr',
|
||||
'address',
|
||||
'article',
|
||||
'aside',
|
||||
'audio',
|
||||
'b',
|
||||
'blockquote',
|
||||
'body',
|
||||
'button',
|
||||
'canvas',
|
||||
'caption',
|
||||
'cite',
|
||||
'code',
|
||||
'dd',
|
||||
'del',
|
||||
'details',
|
||||
'dfn',
|
||||
'div',
|
||||
'dl',
|
||||
'dt',
|
||||
'em',
|
||||
'fieldset',
|
||||
'figcaption',
|
||||
'figure',
|
||||
'footer',
|
||||
'form',
|
||||
'h1',
|
||||
'h2',
|
||||
'h3',
|
||||
'h4',
|
||||
'h5',
|
||||
'h6',
|
||||
'header',
|
||||
'hgroup',
|
||||
'html',
|
||||
'i',
|
||||
'iframe',
|
||||
'img',
|
||||
'input',
|
||||
'ins',
|
||||
'kbd',
|
||||
'label',
|
||||
'legend',
|
||||
'li',
|
||||
'main',
|
||||
'mark',
|
||||
'menu',
|
||||
'nav',
|
||||
'object',
|
||||
'ol',
|
||||
'p',
|
||||
'q',
|
||||
'quote',
|
||||
'samp',
|
||||
'section',
|
||||
'span',
|
||||
'strong',
|
||||
'summary',
|
||||
'sup',
|
||||
'table',
|
||||
'tbody',
|
||||
'td',
|
||||
'textarea',
|
||||
'tfoot',
|
||||
'th',
|
||||
'thead',
|
||||
'time',
|
||||
'tr',
|
||||
'ul',
|
||||
'var',
|
||||
'video'
|
||||
];
|
||||
|
||||
const MEDIA_FEATURES = [
|
||||
'any-hover',
|
||||
'any-pointer',
|
||||
'aspect-ratio',
|
||||
'color',
|
||||
'color-gamut',
|
||||
'color-index',
|
||||
'device-aspect-ratio',
|
||||
'device-height',
|
||||
'device-width',
|
||||
'display-mode',
|
||||
'forced-colors',
|
||||
'grid',
|
||||
'height',
|
||||
'hover',
|
||||
'inverted-colors',
|
||||
'monochrome',
|
||||
'orientation',
|
||||
'overflow-block',
|
||||
'overflow-inline',
|
||||
'pointer',
|
||||
'prefers-color-scheme',
|
||||
'prefers-contrast',
|
||||
'prefers-reduced-motion',
|
||||
'prefers-reduced-transparency',
|
||||
'resolution',
|
||||
'scan',
|
||||
'scripting',
|
||||
'update',
|
||||
'width',
|
||||
// TODO: find a better solution?
|
||||
'min-width',
|
||||
'max-width',
|
||||
'min-height',
|
||||
'max-height'
|
||||
];
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-classes
|
||||
const PSEUDO_CLASSES = [
|
||||
'active',
|
||||
'any-link',
|
||||
'blank',
|
||||
'checked',
|
||||
'current',
|
||||
'default',
|
||||
'defined',
|
||||
'dir', // dir()
|
||||
'disabled',
|
||||
'drop',
|
||||
'empty',
|
||||
'enabled',
|
||||
'first',
|
||||
'first-child',
|
||||
'first-of-type',
|
||||
'fullscreen',
|
||||
'future',
|
||||
'focus',
|
||||
'focus-visible',
|
||||
'focus-within',
|
||||
'has', // has()
|
||||
'host', // host or host()
|
||||
'host-context', // host-context()
|
||||
'hover',
|
||||
'indeterminate',
|
||||
'in-range',
|
||||
'invalid',
|
||||
'is', // is()
|
||||
'lang', // lang()
|
||||
'last-child',
|
||||
'last-of-type',
|
||||
'left',
|
||||
'link',
|
||||
'local-link',
|
||||
'not', // not()
|
||||
'nth-child', // nth-child()
|
||||
'nth-col', // nth-col()
|
||||
'nth-last-child', // nth-last-child()
|
||||
'nth-last-col', // nth-last-col()
|
||||
'nth-last-of-type', //nth-last-of-type()
|
||||
'nth-of-type', //nth-of-type()
|
||||
'only-child',
|
||||
'only-of-type',
|
||||
'optional',
|
||||
'out-of-range',
|
||||
'past',
|
||||
'placeholder-shown',
|
||||
'read-only',
|
||||
'read-write',
|
||||
'required',
|
||||
'right',
|
||||
'root',
|
||||
'scope',
|
||||
'target',
|
||||
'target-within',
|
||||
'user-invalid',
|
||||
'valid',
|
||||
'visited',
|
||||
'where' // where()
|
||||
];
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements
|
||||
const PSEUDO_ELEMENTS = [
|
||||
'after',
|
||||
'backdrop',
|
||||
'before',
|
||||
'cue',
|
||||
'cue-region',
|
||||
'first-letter',
|
||||
'first-line',
|
||||
'grammar-error',
|
||||
'marker',
|
||||
'part',
|
||||
'placeholder',
|
||||
'selection',
|
||||
'slotted',
|
||||
'spelling-error'
|
||||
];
|
||||
|
||||
const ATTRIBUTES = [
|
||||
'align-content',
|
||||
'align-items',
|
||||
'align-self',
|
||||
'all',
|
||||
'animation',
|
||||
'animation-delay',
|
||||
'animation-direction',
|
||||
'animation-duration',
|
||||
'animation-fill-mode',
|
||||
'animation-iteration-count',
|
||||
'animation-name',
|
||||
'animation-play-state',
|
||||
'animation-timing-function',
|
||||
'backface-visibility',
|
||||
'background',
|
||||
'background-attachment',
|
||||
'background-blend-mode',
|
||||
'background-clip',
|
||||
'background-color',
|
||||
'background-image',
|
||||
'background-origin',
|
||||
'background-position',
|
||||
'background-repeat',
|
||||
'background-size',
|
||||
'block-size',
|
||||
'border',
|
||||
'border-block',
|
||||
'border-block-color',
|
||||
'border-block-end',
|
||||
'border-block-end-color',
|
||||
'border-block-end-style',
|
||||
'border-block-end-width',
|
||||
'border-block-start',
|
||||
'border-block-start-color',
|
||||
'border-block-start-style',
|
||||
'border-block-start-width',
|
||||
'border-block-style',
|
||||
'border-block-width',
|
||||
'border-bottom',
|
||||
'border-bottom-color',
|
||||
'border-bottom-left-radius',
|
||||
'border-bottom-right-radius',
|
||||
'border-bottom-style',
|
||||
'border-bottom-width',
|
||||
'border-collapse',
|
||||
'border-color',
|
||||
'border-image',
|
||||
'border-image-outset',
|
||||
'border-image-repeat',
|
||||
'border-image-slice',
|
||||
'border-image-source',
|
||||
'border-image-width',
|
||||
'border-inline',
|
||||
'border-inline-color',
|
||||
'border-inline-end',
|
||||
'border-inline-end-color',
|
||||
'border-inline-end-style',
|
||||
'border-inline-end-width',
|
||||
'border-inline-start',
|
||||
'border-inline-start-color',
|
||||
'border-inline-start-style',
|
||||
'border-inline-start-width',
|
||||
'border-inline-style',
|
||||
'border-inline-width',
|
||||
'border-left',
|
||||
'border-left-color',
|
||||
'border-left-style',
|
||||
'border-left-width',
|
||||
'border-radius',
|
||||
'border-right',
|
||||
'border-right-color',
|
||||
'border-right-style',
|
||||
'border-right-width',
|
||||
'border-spacing',
|
||||
'border-style',
|
||||
'border-top',
|
||||
'border-top-color',
|
||||
'border-top-left-radius',
|
||||
'border-top-right-radius',
|
||||
'border-top-style',
|
||||
'border-top-width',
|
||||
'border-width',
|
||||
'bottom',
|
||||
'box-decoration-break',
|
||||
'box-shadow',
|
||||
'box-sizing',
|
||||
'break-after',
|
||||
'break-before',
|
||||
'break-inside',
|
||||
'caption-side',
|
||||
'caret-color',
|
||||
'clear',
|
||||
'clip',
|
||||
'clip-path',
|
||||
'clip-rule',
|
||||
'color',
|
||||
'column-count',
|
||||
'column-fill',
|
||||
'column-gap',
|
||||
'column-rule',
|
||||
'column-rule-color',
|
||||
'column-rule-style',
|
||||
'column-rule-width',
|
||||
'column-span',
|
||||
'column-width',
|
||||
'columns',
|
||||
'contain',
|
||||
'content',
|
||||
'content-visibility',
|
||||
'counter-increment',
|
||||
'counter-reset',
|
||||
'cue',
|
||||
'cue-after',
|
||||
'cue-before',
|
||||
'cursor',
|
||||
'direction',
|
||||
'display',
|
||||
'empty-cells',
|
||||
'filter',
|
||||
'flex',
|
||||
'flex-basis',
|
||||
'flex-direction',
|
||||
'flex-flow',
|
||||
'flex-grow',
|
||||
'flex-shrink',
|
||||
'flex-wrap',
|
||||
'float',
|
||||
'flow',
|
||||
'font',
|
||||
'font-display',
|
||||
'font-family',
|
||||
'font-feature-settings',
|
||||
'font-kerning',
|
||||
'font-language-override',
|
||||
'font-size',
|
||||
'font-size-adjust',
|
||||
'font-smoothing',
|
||||
'font-stretch',
|
||||
'font-style',
|
||||
'font-synthesis',
|
||||
'font-variant',
|
||||
'font-variant-caps',
|
||||
'font-variant-east-asian',
|
||||
'font-variant-ligatures',
|
||||
'font-variant-numeric',
|
||||
'font-variant-position',
|
||||
'font-variation-settings',
|
||||
'font-weight',
|
||||
'gap',
|
||||
'glyph-orientation-vertical',
|
||||
'grid',
|
||||
'grid-area',
|
||||
'grid-auto-columns',
|
||||
'grid-auto-flow',
|
||||
'grid-auto-rows',
|
||||
'grid-column',
|
||||
'grid-column-end',
|
||||
'grid-column-start',
|
||||
'grid-gap',
|
||||
'grid-row',
|
||||
'grid-row-end',
|
||||
'grid-row-start',
|
||||
'grid-template',
|
||||
'grid-template-areas',
|
||||
'grid-template-columns',
|
||||
'grid-template-rows',
|
||||
'hanging-punctuation',
|
||||
'height',
|
||||
'hyphens',
|
||||
'icon',
|
||||
'image-orientation',
|
||||
'image-rendering',
|
||||
'image-resolution',
|
||||
'ime-mode',
|
||||
'inline-size',
|
||||
'isolation',
|
||||
'justify-content',
|
||||
'left',
|
||||
'letter-spacing',
|
||||
'line-break',
|
||||
'line-height',
|
||||
'list-style',
|
||||
'list-style-image',
|
||||
'list-style-position',
|
||||
'list-style-type',
|
||||
'margin',
|
||||
'margin-block',
|
||||
'margin-block-end',
|
||||
'margin-block-start',
|
||||
'margin-bottom',
|
||||
'margin-inline',
|
||||
'margin-inline-end',
|
||||
'margin-inline-start',
|
||||
'margin-left',
|
||||
'margin-right',
|
||||
'margin-top',
|
||||
'marks',
|
||||
'mask',
|
||||
'mask-border',
|
||||
'mask-border-mode',
|
||||
'mask-border-outset',
|
||||
'mask-border-repeat',
|
||||
'mask-border-slice',
|
||||
'mask-border-source',
|
||||
'mask-border-width',
|
||||
'mask-clip',
|
||||
'mask-composite',
|
||||
'mask-image',
|
||||
'mask-mode',
|
||||
'mask-origin',
|
||||
'mask-position',
|
||||
'mask-repeat',
|
||||
'mask-size',
|
||||
'mask-type',
|
||||
'max-block-size',
|
||||
'max-height',
|
||||
'max-inline-size',
|
||||
'max-width',
|
||||
'min-block-size',
|
||||
'min-height',
|
||||
'min-inline-size',
|
||||
'min-width',
|
||||
'mix-blend-mode',
|
||||
'nav-down',
|
||||
'nav-index',
|
||||
'nav-left',
|
||||
'nav-right',
|
||||
'nav-up',
|
||||
'none',
|
||||
'normal',
|
||||
'object-fit',
|
||||
'object-position',
|
||||
'opacity',
|
||||
'order',
|
||||
'orphans',
|
||||
'outline',
|
||||
'outline-color',
|
||||
'outline-offset',
|
||||
'outline-style',
|
||||
'outline-width',
|
||||
'overflow',
|
||||
'overflow-wrap',
|
||||
'overflow-x',
|
||||
'overflow-y',
|
||||
'padding',
|
||||
'padding-block',
|
||||
'padding-block-end',
|
||||
'padding-block-start',
|
||||
'padding-bottom',
|
||||
'padding-inline',
|
||||
'padding-inline-end',
|
||||
'padding-inline-start',
|
||||
'padding-left',
|
||||
'padding-right',
|
||||
'padding-top',
|
||||
'page-break-after',
|
||||
'page-break-before',
|
||||
'page-break-inside',
|
||||
'pause',
|
||||
'pause-after',
|
||||
'pause-before',
|
||||
'perspective',
|
||||
'perspective-origin',
|
||||
'pointer-events',
|
||||
'position',
|
||||
'quotes',
|
||||
'resize',
|
||||
'rest',
|
||||
'rest-after',
|
||||
'rest-before',
|
||||
'right',
|
||||
'row-gap',
|
||||
'scroll-margin',
|
||||
'scroll-margin-block',
|
||||
'scroll-margin-block-end',
|
||||
'scroll-margin-block-start',
|
||||
'scroll-margin-bottom',
|
||||
'scroll-margin-inline',
|
||||
'scroll-margin-inline-end',
|
||||
'scroll-margin-inline-start',
|
||||
'scroll-margin-left',
|
||||
'scroll-margin-right',
|
||||
'scroll-margin-top',
|
||||
'scroll-padding',
|
||||
'scroll-padding-block',
|
||||
'scroll-padding-block-end',
|
||||
'scroll-padding-block-start',
|
||||
'scroll-padding-bottom',
|
||||
'scroll-padding-inline',
|
||||
'scroll-padding-inline-end',
|
||||
'scroll-padding-inline-start',
|
||||
'scroll-padding-left',
|
||||
'scroll-padding-right',
|
||||
'scroll-padding-top',
|
||||
'scroll-snap-align',
|
||||
'scroll-snap-stop',
|
||||
'scroll-snap-type',
|
||||
'scrollbar-color',
|
||||
'scrollbar-gutter',
|
||||
'scrollbar-width',
|
||||
'shape-image-threshold',
|
||||
'shape-margin',
|
||||
'shape-outside',
|
||||
'speak',
|
||||
'speak-as',
|
||||
'src', // @font-face
|
||||
'tab-size',
|
||||
'table-layout',
|
||||
'text-align',
|
||||
'text-align-all',
|
||||
'text-align-last',
|
||||
'text-combine-upright',
|
||||
'text-decoration',
|
||||
'text-decoration-color',
|
||||
'text-decoration-line',
|
||||
'text-decoration-style',
|
||||
'text-emphasis',
|
||||
'text-emphasis-color',
|
||||
'text-emphasis-position',
|
||||
'text-emphasis-style',
|
||||
'text-indent',
|
||||
'text-justify',
|
||||
'text-orientation',
|
||||
'text-overflow',
|
||||
'text-rendering',
|
||||
'text-shadow',
|
||||
'text-transform',
|
||||
'text-underline-position',
|
||||
'top',
|
||||
'transform',
|
||||
'transform-box',
|
||||
'transform-origin',
|
||||
'transform-style',
|
||||
'transition',
|
||||
'transition-delay',
|
||||
'transition-duration',
|
||||
'transition-property',
|
||||
'transition-timing-function',
|
||||
'unicode-bidi',
|
||||
'vertical-align',
|
||||
'visibility',
|
||||
'voice-balance',
|
||||
'voice-duration',
|
||||
'voice-family',
|
||||
'voice-pitch',
|
||||
'voice-range',
|
||||
'voice-rate',
|
||||
'voice-stress',
|
||||
'voice-volume',
|
||||
'white-space',
|
||||
'widows',
|
||||
'width',
|
||||
'will-change',
|
||||
'word-break',
|
||||
'word-spacing',
|
||||
'word-wrap',
|
||||
'writing-mode',
|
||||
'z-index'
|
||||
// reverse makes sure longer attributes `font-weight` are matched fully
|
||||
// instead of getting false positives on say `font`
|
||||
].reverse();
|
||||
|
||||
/*
|
||||
Language: CSS
|
||||
Category: common, css, web
|
||||
Website: https://developer.mozilla.org/en-US/docs/Web/CSS
|
||||
*/
|
||||
|
||||
|
||||
/** @type LanguageFn */
|
||||
function css(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const modes = MODES(hljs);
|
||||
const VENDOR_PREFIX = { begin: /-(webkit|moz|ms|o)-(?=[a-z])/ };
|
||||
const AT_MODIFIERS = "and or not only";
|
||||
const AT_PROPERTY_RE = /@-?\w[\w]*(-\w+)*/; // @-webkit-keyframes
|
||||
const IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*';
|
||||
const STRINGS = [
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE
|
||||
];
|
||||
|
||||
return {
|
||||
name: 'CSS',
|
||||
case_insensitive: true,
|
||||
illegal: /[=|'\$]/,
|
||||
keywords: { keyframePosition: "from to" },
|
||||
classNameAliases: {
|
||||
// for visual continuity with `tag {}` and because we
|
||||
// don't have a great class for this?
|
||||
keyframePosition: "selector-tag" },
|
||||
contains: [
|
||||
modes.BLOCK_COMMENT,
|
||||
VENDOR_PREFIX,
|
||||
// to recognize keyframe 40% etc which are outside the scope of our
|
||||
// attribute value mode
|
||||
modes.CSS_NUMBER_MODE,
|
||||
{
|
||||
className: 'selector-id',
|
||||
begin: /#[A-Za-z0-9_-]+/,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'selector-class',
|
||||
begin: '\\.' + IDENT_RE,
|
||||
relevance: 0
|
||||
},
|
||||
modes.ATTRIBUTE_SELECTOR_MODE,
|
||||
{
|
||||
className: 'selector-pseudo',
|
||||
variants: [
|
||||
{ begin: ':(' + PSEUDO_CLASSES.join('|') + ')' },
|
||||
{ begin: ':(:)?(' + PSEUDO_ELEMENTS.join('|') + ')' }
|
||||
]
|
||||
},
|
||||
// we may actually need this (12/2020)
|
||||
// { // pseudo-selector params
|
||||
// begin: /\(/,
|
||||
// end: /\)/,
|
||||
// contains: [ hljs.CSS_NUMBER_MODE ]
|
||||
// },
|
||||
modes.CSS_VARIABLE,
|
||||
{
|
||||
className: 'attribute',
|
||||
begin: '\\b(' + ATTRIBUTES.join('|') + ')\\b'
|
||||
},
|
||||
// attribute values
|
||||
{
|
||||
begin: /:/,
|
||||
end: /[;}{]/,
|
||||
contains: [
|
||||
modes.BLOCK_COMMENT,
|
||||
modes.HEXCOLOR,
|
||||
modes.IMPORTANT,
|
||||
modes.CSS_NUMBER_MODE,
|
||||
...STRINGS,
|
||||
// needed to highlight these as strings and to avoid issues with
|
||||
// illegal characters that might be inside urls that would tigger the
|
||||
// languages illegal stack
|
||||
{
|
||||
begin: /(url|data-uri)\(/,
|
||||
end: /\)/,
|
||||
relevance: 0, // from keywords
|
||||
keywords: { built_in: "url data-uri" },
|
||||
contains: [
|
||||
...STRINGS,
|
||||
{
|
||||
className: "string",
|
||||
// any character other than `)` as in `url()` will be the start
|
||||
// of a string, which ends with `)` (from the parent mode)
|
||||
begin: /[^)]/,
|
||||
endsWithParent: true,
|
||||
excludeEnd: true
|
||||
}
|
||||
]
|
||||
},
|
||||
modes.FUNCTION_DISPATCH
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: regex.lookahead(/@/),
|
||||
end: '[{;]',
|
||||
relevance: 0,
|
||||
illegal: /:/, // break on Less variables @var: ...
|
||||
contains: [
|
||||
{
|
||||
className: 'keyword',
|
||||
begin: AT_PROPERTY_RE
|
||||
},
|
||||
{
|
||||
begin: /\s/,
|
||||
endsWithParent: true,
|
||||
excludeEnd: true,
|
||||
relevance: 0,
|
||||
keywords: {
|
||||
$pattern: /[a-z-]+/,
|
||||
keyword: AT_MODIFIERS,
|
||||
attribute: MEDIA_FEATURES.join(" ")
|
||||
},
|
||||
contains: [
|
||||
{
|
||||
begin: /[a-z-]+(?=:)/,
|
||||
className: "attribute"
|
||||
},
|
||||
...STRINGS,
|
||||
modes.CSS_NUMBER_MODE
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'selector-tag',
|
||||
begin: '\\b(' + TAGS.join('|') + ')\\b'
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default css;
|
||||
Vendored
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
Language: Diff
|
||||
Description: Unified and context diff
|
||||
Author: Vasily Polovnyov <vast@whiteants.net>
|
||||
Website: https://www.gnu.org/software/diffutils/
|
||||
Category: common
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function diff(hljs) {
|
||||
const regex = hljs.regex;
|
||||
return {
|
||||
name: 'Diff',
|
||||
aliases: [ 'patch' ],
|
||||
contains: [
|
||||
{
|
||||
className: 'meta',
|
||||
relevance: 10,
|
||||
match: regex.either(
|
||||
/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,
|
||||
/^\*\*\* +\d+,\d+ +\*\*\*\*$/,
|
||||
/^--- +\d+,\d+ +----$/
|
||||
)
|
||||
},
|
||||
{
|
||||
className: 'comment',
|
||||
variants: [
|
||||
{
|
||||
begin: regex.either(
|
||||
/Index: /,
|
||||
/^index/,
|
||||
/={3,}/,
|
||||
/^-{3}/,
|
||||
/^\*{3} /,
|
||||
/^\+{3}/,
|
||||
/^diff --git/
|
||||
),
|
||||
end: /$/
|
||||
},
|
||||
{ match: /^\*{15}$/ }
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'addition',
|
||||
begin: /^\+/,
|
||||
end: /$/
|
||||
},
|
||||
{
|
||||
className: 'deletion',
|
||||
begin: /^-/,
|
||||
end: /$/
|
||||
},
|
||||
{
|
||||
className: 'addition',
|
||||
begin: /^!/,
|
||||
end: /$/
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default diff;
|
||||
Vendored
+141
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
Language: Go
|
||||
Author: Stephan Kountso aka StepLg <steplg@gmail.com>
|
||||
Contributors: Evgeny Stepanischev <imbolk@gmail.com>
|
||||
Description: Google go language (golang). For info about language
|
||||
Website: http://golang.org/
|
||||
Category: common, system
|
||||
*/
|
||||
|
||||
function go(hljs) {
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false",
|
||||
"iota",
|
||||
"nil"
|
||||
];
|
||||
const BUILT_INS = [
|
||||
"append",
|
||||
"cap",
|
||||
"close",
|
||||
"complex",
|
||||
"copy",
|
||||
"imag",
|
||||
"len",
|
||||
"make",
|
||||
"new",
|
||||
"panic",
|
||||
"print",
|
||||
"println",
|
||||
"real",
|
||||
"recover",
|
||||
"delete"
|
||||
];
|
||||
const TYPES = [
|
||||
"bool",
|
||||
"byte",
|
||||
"complex64",
|
||||
"complex128",
|
||||
"error",
|
||||
"float32",
|
||||
"float64",
|
||||
"int8",
|
||||
"int16",
|
||||
"int32",
|
||||
"int64",
|
||||
"string",
|
||||
"uint8",
|
||||
"uint16",
|
||||
"uint32",
|
||||
"uint64",
|
||||
"int",
|
||||
"uint",
|
||||
"uintptr",
|
||||
"rune"
|
||||
];
|
||||
const KWS = [
|
||||
"break",
|
||||
"case",
|
||||
"chan",
|
||||
"const",
|
||||
"continue",
|
||||
"default",
|
||||
"defer",
|
||||
"else",
|
||||
"fallthrough",
|
||||
"for",
|
||||
"func",
|
||||
"go",
|
||||
"goto",
|
||||
"if",
|
||||
"import",
|
||||
"interface",
|
||||
"map",
|
||||
"package",
|
||||
"range",
|
||||
"return",
|
||||
"select",
|
||||
"struct",
|
||||
"switch",
|
||||
"type",
|
||||
"var",
|
||||
];
|
||||
const KEYWORDS = {
|
||||
keyword: KWS,
|
||||
type: TYPES,
|
||||
literal: LITERALS,
|
||||
built_in: BUILT_INS
|
||||
};
|
||||
return {
|
||||
name: 'Go',
|
||||
aliases: [ 'golang' ],
|
||||
keywords: KEYWORDS,
|
||||
illegal: '</',
|
||||
contains: [
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
{
|
||||
className: 'string',
|
||||
variants: [
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
hljs.APOS_STRING_MODE,
|
||||
{
|
||||
begin: '`',
|
||||
end: '`'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'number',
|
||||
variants: [
|
||||
{
|
||||
begin: hljs.C_NUMBER_RE + '[i]',
|
||||
relevance: 1
|
||||
},
|
||||
hljs.C_NUMBER_MODE
|
||||
]
|
||||
},
|
||||
{ begin: /:=/ // relevance booster
|
||||
},
|
||||
{
|
||||
className: 'function',
|
||||
beginKeywords: 'func',
|
||||
end: '\\s*(\\{|$)',
|
||||
excludeEnd: true,
|
||||
contains: [
|
||||
hljs.TITLE_MODE,
|
||||
{
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
endsParent: true,
|
||||
keywords: KEYWORDS,
|
||||
illegal: /["']/
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default go;
|
||||
Vendored
+289
@@ -0,0 +1,289 @@
|
||||
// https://docs.oracle.com/javase/specs/jls/se15/html/jls-3.html#jls-3.10
|
||||
var decimalDigits = '[0-9](_*[0-9])*';
|
||||
var frac = `\\.(${decimalDigits})`;
|
||||
var hexDigits = '[0-9a-fA-F](_*[0-9a-fA-F])*';
|
||||
var NUMERIC = {
|
||||
className: 'number',
|
||||
variants: [
|
||||
// DecimalFloatingPointLiteral
|
||||
// including ExponentPart
|
||||
{ begin: `(\\b(${decimalDigits})((${frac})|\\.)?|(${frac}))` +
|
||||
`[eE][+-]?(${decimalDigits})[fFdD]?\\b` },
|
||||
// excluding ExponentPart
|
||||
{ begin: `\\b(${decimalDigits})((${frac})[fFdD]?\\b|\\.([fFdD]\\b)?)` },
|
||||
{ begin: `(${frac})[fFdD]?\\b` },
|
||||
{ begin: `\\b(${decimalDigits})[fFdD]\\b` },
|
||||
|
||||
// HexadecimalFloatingPointLiteral
|
||||
{ begin: `\\b0[xX]((${hexDigits})\\.?|(${hexDigits})?\\.(${hexDigits}))` +
|
||||
`[pP][+-]?(${decimalDigits})[fFdD]?\\b` },
|
||||
|
||||
// DecimalIntegerLiteral
|
||||
{ begin: '\\b(0|[1-9](_*[0-9])*)[lL]?\\b' },
|
||||
|
||||
// HexIntegerLiteral
|
||||
{ begin: `\\b0[xX](${hexDigits})[lL]?\\b` },
|
||||
|
||||
// OctalIntegerLiteral
|
||||
{ begin: '\\b0(_*[0-7])*[lL]?\\b' },
|
||||
|
||||
// BinaryIntegerLiteral
|
||||
{ begin: '\\b0[bB][01](_*[01])*[lL]?\\b' },
|
||||
],
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
/*
|
||||
Language: Java
|
||||
Author: Vsevolod Solovyov <vsevolod.solovyov@gmail.com>
|
||||
Category: common, enterprise
|
||||
Website: https://www.java.com/
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Allows recursive regex expressions to a given depth
|
||||
*
|
||||
* ie: recurRegex("(abc~~~)", /~~~/g, 2) becomes:
|
||||
* (abc(abc(abc)))
|
||||
*
|
||||
* @param {string} re
|
||||
* @param {RegExp} substitution (should be a g mode regex)
|
||||
* @param {number} depth
|
||||
* @returns {string}``
|
||||
*/
|
||||
function recurRegex(re, substitution, depth) {
|
||||
if (depth === -1) return "";
|
||||
|
||||
return re.replace(substitution, _ => {
|
||||
return recurRegex(re, substitution, depth - 1);
|
||||
});
|
||||
}
|
||||
|
||||
/** @type LanguageFn */
|
||||
function java(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const JAVA_IDENT_RE = '[\u00C0-\u02B8a-zA-Z_$][\u00C0-\u02B8a-zA-Z_$0-9]*';
|
||||
const GENERIC_IDENT_RE = JAVA_IDENT_RE
|
||||
+ recurRegex('(?:<' + JAVA_IDENT_RE + '~~~(?:\\s*,\\s*' + JAVA_IDENT_RE + '~~~)*>)?', /~~~/g, 2);
|
||||
const MAIN_KEYWORDS = [
|
||||
'synchronized',
|
||||
'abstract',
|
||||
'private',
|
||||
'var',
|
||||
'static',
|
||||
'if',
|
||||
'const ',
|
||||
'for',
|
||||
'while',
|
||||
'strictfp',
|
||||
'finally',
|
||||
'protected',
|
||||
'import',
|
||||
'native',
|
||||
'final',
|
||||
'void',
|
||||
'enum',
|
||||
'else',
|
||||
'break',
|
||||
'transient',
|
||||
'catch',
|
||||
'instanceof',
|
||||
'volatile',
|
||||
'case',
|
||||
'assert',
|
||||
'package',
|
||||
'default',
|
||||
'public',
|
||||
'try',
|
||||
'switch',
|
||||
'continue',
|
||||
'throws',
|
||||
'protected',
|
||||
'public',
|
||||
'private',
|
||||
'module',
|
||||
'requires',
|
||||
'exports',
|
||||
'do',
|
||||
'sealed',
|
||||
'yield',
|
||||
'permits'
|
||||
];
|
||||
|
||||
const BUILT_INS = [
|
||||
'super',
|
||||
'this'
|
||||
];
|
||||
|
||||
const LITERALS = [
|
||||
'false',
|
||||
'true',
|
||||
'null'
|
||||
];
|
||||
|
||||
const TYPES = [
|
||||
'char',
|
||||
'boolean',
|
||||
'long',
|
||||
'float',
|
||||
'int',
|
||||
'byte',
|
||||
'short',
|
||||
'double'
|
||||
];
|
||||
|
||||
const KEYWORDS = {
|
||||
keyword: MAIN_KEYWORDS,
|
||||
literal: LITERALS,
|
||||
type: TYPES,
|
||||
built_in: BUILT_INS
|
||||
};
|
||||
|
||||
const ANNOTATION = {
|
||||
className: 'meta',
|
||||
begin: '@' + JAVA_IDENT_RE,
|
||||
contains: [
|
||||
{
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
contains: [ "self" ] // allow nested () inside our annotation
|
||||
}
|
||||
]
|
||||
};
|
||||
const PARAMS = {
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
keywords: KEYWORDS,
|
||||
relevance: 0,
|
||||
contains: [ hljs.C_BLOCK_COMMENT_MODE ],
|
||||
endsParent: true
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'Java',
|
||||
aliases: [ 'jsp' ],
|
||||
keywords: KEYWORDS,
|
||||
illegal: /<\/|#/,
|
||||
contains: [
|
||||
hljs.COMMENT(
|
||||
'/\\*\\*',
|
||||
'\\*/',
|
||||
{
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
// eat up @'s in emails to prevent them to be recognized as doctags
|
||||
begin: /\w+@/,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'doctag',
|
||||
begin: '@[A-Za-z]+'
|
||||
}
|
||||
]
|
||||
}
|
||||
),
|
||||
// relevance boost
|
||||
{
|
||||
begin: /import java\.[a-z]+\./,
|
||||
keywords: "import",
|
||||
relevance: 2
|
||||
},
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
{
|
||||
begin: /"""/,
|
||||
end: /"""/,
|
||||
className: "string",
|
||||
contains: [ hljs.BACKSLASH_ESCAPE ]
|
||||
},
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
{
|
||||
match: [
|
||||
/\b(?:class|interface|enum|extends|implements|new)/,
|
||||
/\s+/,
|
||||
JAVA_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.class"
|
||||
}
|
||||
},
|
||||
{
|
||||
// Exceptions for hyphenated keywords
|
||||
match: /non-sealed/,
|
||||
scope: "keyword"
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
regex.concat(/(?!else)/, JAVA_IDENT_RE),
|
||||
/\s+/,
|
||||
JAVA_IDENT_RE,
|
||||
/\s+/,
|
||||
/=(?!=)/
|
||||
],
|
||||
className: {
|
||||
1: "type",
|
||||
3: "variable",
|
||||
5: "operator"
|
||||
}
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
/record/,
|
||||
/\s+/,
|
||||
JAVA_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.class"
|
||||
},
|
||||
contains: [
|
||||
PARAMS,
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
// Expression keywords prevent 'keyword Name(...)' from being
|
||||
// recognized as a function definition
|
||||
beginKeywords: 'new throw return else',
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
'(?:' + GENERIC_IDENT_RE + '\\s+)',
|
||||
hljs.UNDERSCORE_IDENT_RE,
|
||||
/\s*(?=\()/
|
||||
],
|
||||
className: { 2: "title.function" },
|
||||
keywords: KEYWORDS,
|
||||
contains: [
|
||||
{
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
keywords: KEYWORDS,
|
||||
relevance: 0,
|
||||
contains: [
|
||||
ANNOTATION,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
NUMERIC,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
NUMERIC,
|
||||
ANNOTATION
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default java;
|
||||
+766
@@ -0,0 +1,766 @@
|
||||
const IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*';
|
||||
const KEYWORDS = [
|
||||
"as", // for exports
|
||||
"in",
|
||||
"of",
|
||||
"if",
|
||||
"for",
|
||||
"while",
|
||||
"finally",
|
||||
"var",
|
||||
"new",
|
||||
"function",
|
||||
"do",
|
||||
"return",
|
||||
"void",
|
||||
"else",
|
||||
"break",
|
||||
"catch",
|
||||
"instanceof",
|
||||
"with",
|
||||
"throw",
|
||||
"case",
|
||||
"default",
|
||||
"try",
|
||||
"switch",
|
||||
"continue",
|
||||
"typeof",
|
||||
"delete",
|
||||
"let",
|
||||
"yield",
|
||||
"const",
|
||||
"class",
|
||||
// JS handles these with a special rule
|
||||
// "get",
|
||||
// "set",
|
||||
"debugger",
|
||||
"async",
|
||||
"await",
|
||||
"static",
|
||||
"import",
|
||||
"from",
|
||||
"export",
|
||||
"extends"
|
||||
];
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false",
|
||||
"null",
|
||||
"undefined",
|
||||
"NaN",
|
||||
"Infinity"
|
||||
];
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
|
||||
const TYPES = [
|
||||
// Fundamental objects
|
||||
"Object",
|
||||
"Function",
|
||||
"Boolean",
|
||||
"Symbol",
|
||||
// numbers and dates
|
||||
"Math",
|
||||
"Date",
|
||||
"Number",
|
||||
"BigInt",
|
||||
// text
|
||||
"String",
|
||||
"RegExp",
|
||||
// Indexed collections
|
||||
"Array",
|
||||
"Float32Array",
|
||||
"Float64Array",
|
||||
"Int8Array",
|
||||
"Uint8Array",
|
||||
"Uint8ClampedArray",
|
||||
"Int16Array",
|
||||
"Int32Array",
|
||||
"Uint16Array",
|
||||
"Uint32Array",
|
||||
"BigInt64Array",
|
||||
"BigUint64Array",
|
||||
// Keyed collections
|
||||
"Set",
|
||||
"Map",
|
||||
"WeakSet",
|
||||
"WeakMap",
|
||||
// Structured data
|
||||
"ArrayBuffer",
|
||||
"SharedArrayBuffer",
|
||||
"Atomics",
|
||||
"DataView",
|
||||
"JSON",
|
||||
// Control abstraction objects
|
||||
"Promise",
|
||||
"Generator",
|
||||
"GeneratorFunction",
|
||||
"AsyncFunction",
|
||||
// Reflection
|
||||
"Reflect",
|
||||
"Proxy",
|
||||
// Internationalization
|
||||
"Intl",
|
||||
// WebAssembly
|
||||
"WebAssembly"
|
||||
];
|
||||
|
||||
const ERROR_TYPES = [
|
||||
"Error",
|
||||
"EvalError",
|
||||
"InternalError",
|
||||
"RangeError",
|
||||
"ReferenceError",
|
||||
"SyntaxError",
|
||||
"TypeError",
|
||||
"URIError"
|
||||
];
|
||||
|
||||
const BUILT_IN_GLOBALS = [
|
||||
"setInterval",
|
||||
"setTimeout",
|
||||
"clearInterval",
|
||||
"clearTimeout",
|
||||
|
||||
"require",
|
||||
"exports",
|
||||
|
||||
"eval",
|
||||
"isFinite",
|
||||
"isNaN",
|
||||
"parseFloat",
|
||||
"parseInt",
|
||||
"decodeURI",
|
||||
"decodeURIComponent",
|
||||
"encodeURI",
|
||||
"encodeURIComponent",
|
||||
"escape",
|
||||
"unescape"
|
||||
];
|
||||
|
||||
const BUILT_IN_VARIABLES = [
|
||||
"arguments",
|
||||
"this",
|
||||
"super",
|
||||
"console",
|
||||
"window",
|
||||
"document",
|
||||
"localStorage",
|
||||
"sessionStorage",
|
||||
"module",
|
||||
"global" // Node.js
|
||||
];
|
||||
|
||||
const BUILT_INS = [].concat(
|
||||
BUILT_IN_GLOBALS,
|
||||
TYPES,
|
||||
ERROR_TYPES
|
||||
);
|
||||
|
||||
/*
|
||||
Language: JavaScript
|
||||
Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
|
||||
Category: common, scripting, web
|
||||
Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
|
||||
*/
|
||||
|
||||
|
||||
/** @type LanguageFn */
|
||||
function javascript(hljs) {
|
||||
const regex = hljs.regex;
|
||||
/**
|
||||
* Takes a string like "<Booger" and checks to see
|
||||
* if we can find a matching "</Booger" later in the
|
||||
* content.
|
||||
* @param {RegExpMatchArray} match
|
||||
* @param {{after:number}} param1
|
||||
*/
|
||||
const hasClosingTag = (match, { after }) => {
|
||||
const tag = "</" + match[0].slice(1);
|
||||
const pos = match.input.indexOf(tag, after);
|
||||
return pos !== -1;
|
||||
};
|
||||
|
||||
const IDENT_RE$1 = IDENT_RE;
|
||||
const FRAGMENT = {
|
||||
begin: '<>',
|
||||
end: '</>'
|
||||
};
|
||||
// to avoid some special cases inside isTrulyOpeningTag
|
||||
const XML_SELF_CLOSING = /<[A-Za-z0-9\\._:-]+\s*\/>/;
|
||||
const XML_TAG = {
|
||||
begin: /<[A-Za-z0-9\\._:-]+/,
|
||||
end: /\/[A-Za-z0-9\\._:-]+>|\/>/,
|
||||
/**
|
||||
* @param {RegExpMatchArray} match
|
||||
* @param {CallbackResponse} response
|
||||
*/
|
||||
isTrulyOpeningTag: (match, response) => {
|
||||
const afterMatchIndex = match[0].length + match.index;
|
||||
const nextChar = match.input[afterMatchIndex];
|
||||
if (
|
||||
// HTML should not include another raw `<` inside a tag
|
||||
// nested type?
|
||||
// `<Array<Array<number>>`, etc.
|
||||
nextChar === "<" ||
|
||||
// the , gives away that this is not HTML
|
||||
// `<T, A extends keyof T, V>`
|
||||
nextChar === ","
|
||||
) {
|
||||
response.ignoreMatch();
|
||||
return;
|
||||
}
|
||||
|
||||
// `<something>`
|
||||
// Quite possibly a tag, lets look for a matching closing tag...
|
||||
if (nextChar === ">") {
|
||||
// if we cannot find a matching closing tag, then we
|
||||
// will ignore it
|
||||
if (!hasClosingTag(match, { after: afterMatchIndex })) {
|
||||
response.ignoreMatch();
|
||||
}
|
||||
}
|
||||
|
||||
// `<blah />` (self-closing)
|
||||
// handled by simpleSelfClosing rule
|
||||
|
||||
let m;
|
||||
const afterMatch = match.input.substring(afterMatchIndex);
|
||||
|
||||
// some more template typing stuff
|
||||
// <T = any>(key?: string) => Modify<
|
||||
if ((m = afterMatch.match(/^\s*=/))) {
|
||||
response.ignoreMatch();
|
||||
return;
|
||||
}
|
||||
|
||||
// `<From extends string>`
|
||||
// technically this could be HTML, but it smells like a type
|
||||
// NOTE: This is ugh, but added specifically for https://github.com/highlightjs/highlight.js/issues/3276
|
||||
if ((m = afterMatch.match(/^\s+extends\s+/))) {
|
||||
if (m.index === 0) {
|
||||
response.ignoreMatch();
|
||||
// eslint-disable-next-line no-useless-return
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
const KEYWORDS$1 = {
|
||||
$pattern: IDENT_RE,
|
||||
keyword: KEYWORDS,
|
||||
literal: LITERALS,
|
||||
built_in: BUILT_INS,
|
||||
"variable.language": BUILT_IN_VARIABLES
|
||||
};
|
||||
|
||||
// https://tc39.es/ecma262/#sec-literals-numeric-literals
|
||||
const decimalDigits = '[0-9](_?[0-9])*';
|
||||
const frac = `\\.(${decimalDigits})`;
|
||||
// DecimalIntegerLiteral, including Annex B NonOctalDecimalIntegerLiteral
|
||||
// https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
|
||||
const decimalInteger = `0|[1-9](_?[0-9])*|0[0-7]*[89][0-9]*`;
|
||||
const NUMBER = {
|
||||
className: 'number',
|
||||
variants: [
|
||||
// DecimalLiteral
|
||||
{ begin: `(\\b(${decimalInteger})((${frac})|\\.)?|(${frac}))` +
|
||||
`[eE][+-]?(${decimalDigits})\\b` },
|
||||
{ begin: `\\b(${decimalInteger})\\b((${frac})\\b|\\.)?|(${frac})\\b` },
|
||||
|
||||
// DecimalBigIntegerLiteral
|
||||
{ begin: `\\b(0|[1-9](_?[0-9])*)n\\b` },
|
||||
|
||||
// NonDecimalIntegerLiteral
|
||||
{ begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*n?\\b" },
|
||||
{ begin: "\\b0[bB][0-1](_?[0-1])*n?\\b" },
|
||||
{ begin: "\\b0[oO][0-7](_?[0-7])*n?\\b" },
|
||||
|
||||
// LegacyOctalIntegerLiteral (does not include underscore separators)
|
||||
// https://tc39.es/ecma262/#sec-additional-syntax-numeric-literals
|
||||
{ begin: "\\b0[0-7]+n?\\b" },
|
||||
],
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
const SUBST = {
|
||||
className: 'subst',
|
||||
begin: '\\$\\{',
|
||||
end: '\\}',
|
||||
keywords: KEYWORDS$1,
|
||||
contains: [] // defined later
|
||||
};
|
||||
const HTML_TEMPLATE = {
|
||||
begin: 'html`',
|
||||
end: '',
|
||||
starts: {
|
||||
end: '`',
|
||||
returnEnd: false,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
],
|
||||
subLanguage: 'xml'
|
||||
}
|
||||
};
|
||||
const CSS_TEMPLATE = {
|
||||
begin: 'css`',
|
||||
end: '',
|
||||
starts: {
|
||||
end: '`',
|
||||
returnEnd: false,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
],
|
||||
subLanguage: 'css'
|
||||
}
|
||||
};
|
||||
const GRAPHQL_TEMPLATE = {
|
||||
begin: 'gql`',
|
||||
end: '',
|
||||
starts: {
|
||||
end: '`',
|
||||
returnEnd: false,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
],
|
||||
subLanguage: 'graphql'
|
||||
}
|
||||
};
|
||||
const TEMPLATE_STRING = {
|
||||
className: 'string',
|
||||
begin: '`',
|
||||
end: '`',
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
]
|
||||
};
|
||||
const JSDOC_COMMENT = hljs.COMMENT(
|
||||
/\/\*\*(?!\/)/,
|
||||
'\\*/',
|
||||
{
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
begin: '(?=@[A-Za-z]+)',
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
className: 'doctag',
|
||||
begin: '@[A-Za-z]+'
|
||||
},
|
||||
{
|
||||
className: 'type',
|
||||
begin: '\\{',
|
||||
end: '\\}',
|
||||
excludeEnd: true,
|
||||
excludeBegin: true,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'variable',
|
||||
begin: IDENT_RE$1 + '(?=\\s*(-)|$)',
|
||||
endsParent: true,
|
||||
relevance: 0
|
||||
},
|
||||
// eat spaces (not newlines) so we can find
|
||||
// types or variables
|
||||
{
|
||||
begin: /(?=[^\n])\s/,
|
||||
relevance: 0
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
);
|
||||
const COMMENT = {
|
||||
className: "comment",
|
||||
variants: [
|
||||
JSDOC_COMMENT,
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
hljs.C_LINE_COMMENT_MODE
|
||||
]
|
||||
};
|
||||
const SUBST_INTERNALS = [
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
HTML_TEMPLATE,
|
||||
CSS_TEMPLATE,
|
||||
GRAPHQL_TEMPLATE,
|
||||
TEMPLATE_STRING,
|
||||
// Skip numbers when they are part of a variable name
|
||||
{ match: /\$\d+/ },
|
||||
NUMBER,
|
||||
// This is intentional:
|
||||
// See https://github.com/highlightjs/highlight.js/issues/3288
|
||||
// hljs.REGEXP_MODE
|
||||
];
|
||||
SUBST.contains = SUBST_INTERNALS
|
||||
.concat({
|
||||
// we need to pair up {} inside our subst to prevent
|
||||
// it from ending too early by matching another }
|
||||
begin: /\{/,
|
||||
end: /\}/,
|
||||
keywords: KEYWORDS$1,
|
||||
contains: [
|
||||
"self"
|
||||
].concat(SUBST_INTERNALS)
|
||||
});
|
||||
const SUBST_AND_COMMENTS = [].concat(COMMENT, SUBST.contains);
|
||||
const PARAMS_CONTAINS = SUBST_AND_COMMENTS.concat([
|
||||
// eat recursive parens in sub expressions
|
||||
{
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
keywords: KEYWORDS$1,
|
||||
contains: ["self"].concat(SUBST_AND_COMMENTS)
|
||||
}
|
||||
]);
|
||||
const PARAMS = {
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
excludeBegin: true,
|
||||
excludeEnd: true,
|
||||
keywords: KEYWORDS$1,
|
||||
contains: PARAMS_CONTAINS
|
||||
};
|
||||
|
||||
// ES6 classes
|
||||
const CLASS_OR_EXTENDS = {
|
||||
variants: [
|
||||
// class Car extends vehicle
|
||||
{
|
||||
match: [
|
||||
/class/,
|
||||
/\s+/,
|
||||
IDENT_RE$1,
|
||||
/\s+/,
|
||||
/extends/,
|
||||
/\s+/,
|
||||
regex.concat(IDENT_RE$1, "(", regex.concat(/\./, IDENT_RE$1), ")*")
|
||||
],
|
||||
scope: {
|
||||
1: "keyword",
|
||||
3: "title.class",
|
||||
5: "keyword",
|
||||
7: "title.class.inherited"
|
||||
}
|
||||
},
|
||||
// class Car
|
||||
{
|
||||
match: [
|
||||
/class/,
|
||||
/\s+/,
|
||||
IDENT_RE$1
|
||||
],
|
||||
scope: {
|
||||
1: "keyword",
|
||||
3: "title.class"
|
||||
}
|
||||
},
|
||||
|
||||
]
|
||||
};
|
||||
|
||||
const CLASS_REFERENCE = {
|
||||
relevance: 0,
|
||||
match:
|
||||
regex.either(
|
||||
// Hard coded exceptions
|
||||
/\bJSON/,
|
||||
// Float32Array, OutT
|
||||
/\b[A-Z][a-z]+([A-Z][a-z]*|\d)*/,
|
||||
// CSSFactory, CSSFactoryT
|
||||
/\b[A-Z]{2,}([A-Z][a-z]+|\d)+([A-Z][a-z]*)*/,
|
||||
// FPs, FPsT
|
||||
/\b[A-Z]{2,}[a-z]+([A-Z][a-z]+|\d)*([A-Z][a-z]*)*/,
|
||||
// P
|
||||
// single letters are not highlighted
|
||||
// BLAH
|
||||
// this will be flagged as a UPPER_CASE_CONSTANT instead
|
||||
),
|
||||
className: "title.class",
|
||||
keywords: {
|
||||
_: [
|
||||
// se we still get relevance credit for JS library classes
|
||||
...TYPES,
|
||||
...ERROR_TYPES
|
||||
]
|
||||
}
|
||||
};
|
||||
|
||||
const USE_STRICT = {
|
||||
label: "use_strict",
|
||||
className: 'meta',
|
||||
relevance: 10,
|
||||
begin: /^\s*['"]use (strict|asm)['"]/
|
||||
};
|
||||
|
||||
const FUNCTION_DEFINITION = {
|
||||
variants: [
|
||||
{
|
||||
match: [
|
||||
/function/,
|
||||
/\s+/,
|
||||
IDENT_RE$1,
|
||||
/(?=\s*\()/
|
||||
]
|
||||
},
|
||||
// anonymous function
|
||||
{
|
||||
match: [
|
||||
/function/,
|
||||
/\s*(?=\()/
|
||||
]
|
||||
}
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
},
|
||||
label: "func.def",
|
||||
contains: [ PARAMS ],
|
||||
illegal: /%/
|
||||
};
|
||||
|
||||
const UPPER_CASE_CONSTANT = {
|
||||
relevance: 0,
|
||||
match: /\b[A-Z][A-Z_0-9]+\b/,
|
||||
className: "variable.constant"
|
||||
};
|
||||
|
||||
function noneOf(list) {
|
||||
return regex.concat("(?!", list.join("|"), ")");
|
||||
}
|
||||
|
||||
const FUNCTION_CALL = {
|
||||
match: regex.concat(
|
||||
/\b/,
|
||||
noneOf([
|
||||
...BUILT_IN_GLOBALS,
|
||||
"super",
|
||||
"import"
|
||||
]),
|
||||
IDENT_RE$1, regex.lookahead(/\(/)),
|
||||
className: "title.function",
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
const PROPERTY_ACCESS = {
|
||||
begin: regex.concat(/\./, regex.lookahead(
|
||||
regex.concat(IDENT_RE$1, /(?![0-9A-Za-z$_(])/)
|
||||
)),
|
||||
end: IDENT_RE$1,
|
||||
excludeBegin: true,
|
||||
keywords: "prototype",
|
||||
className: "property",
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
const GETTER_OR_SETTER = {
|
||||
match: [
|
||||
/get|set/,
|
||||
/\s+/,
|
||||
IDENT_RE$1,
|
||||
/(?=\()/
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
},
|
||||
contains: [
|
||||
{ // eat to avoid empty params
|
||||
begin: /\(\)/
|
||||
},
|
||||
PARAMS
|
||||
]
|
||||
};
|
||||
|
||||
const FUNC_LEAD_IN_RE = '(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>';
|
||||
|
||||
const FUNCTION_VARIABLE = {
|
||||
match: [
|
||||
/const|var|let/, /\s+/,
|
||||
IDENT_RE$1, /\s*/,
|
||||
/=\s*/,
|
||||
/(async\s*)?/, // async is optional
|
||||
regex.lookahead(FUNC_LEAD_IN_RE)
|
||||
],
|
||||
keywords: "async",
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
},
|
||||
contains: [
|
||||
PARAMS
|
||||
]
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'JavaScript',
|
||||
aliases: ['js', 'jsx', 'mjs', 'cjs'],
|
||||
keywords: KEYWORDS$1,
|
||||
// this will be extended by TypeScript
|
||||
exports: { PARAMS_CONTAINS, CLASS_REFERENCE },
|
||||
illegal: /#(?![$_A-z])/,
|
||||
contains: [
|
||||
hljs.SHEBANG({
|
||||
label: "shebang",
|
||||
binary: "node",
|
||||
relevance: 5
|
||||
}),
|
||||
USE_STRICT,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
HTML_TEMPLATE,
|
||||
CSS_TEMPLATE,
|
||||
GRAPHQL_TEMPLATE,
|
||||
TEMPLATE_STRING,
|
||||
COMMENT,
|
||||
// Skip numbers when they are part of a variable name
|
||||
{ match: /\$\d+/ },
|
||||
NUMBER,
|
||||
CLASS_REFERENCE,
|
||||
{
|
||||
className: 'attr',
|
||||
begin: IDENT_RE$1 + regex.lookahead(':'),
|
||||
relevance: 0
|
||||
},
|
||||
FUNCTION_VARIABLE,
|
||||
{ // "value" container
|
||||
begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
|
||||
keywords: 'return throw case',
|
||||
relevance: 0,
|
||||
contains: [
|
||||
COMMENT,
|
||||
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: FUNC_LEAD_IN_RE,
|
||||
returnBegin: true,
|
||||
end: '\\s*=>',
|
||||
contains: [
|
||||
{
|
||||
className: 'params',
|
||||
variants: [
|
||||
{
|
||||
begin: hljs.UNDERSCORE_IDENT_RE,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: null,
|
||||
begin: /\(\s*\)/,
|
||||
skip: true
|
||||
},
|
||||
{
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
excludeBegin: true,
|
||||
excludeEnd: true,
|
||||
keywords: KEYWORDS$1,
|
||||
contains: PARAMS_CONTAINS
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{ // could be a comma delimited list of params to a function call
|
||||
begin: /,/,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
match: /\s+/,
|
||||
relevance: 0
|
||||
},
|
||||
{ // JSX
|
||||
variants: [
|
||||
{ begin: FRAGMENT.begin, end: FRAGMENT.end },
|
||||
{ match: XML_SELF_CLOSING },
|
||||
{
|
||||
begin: XML_TAG.begin,
|
||||
// we carefully check the opening tag to see if it truly
|
||||
// is a tag and not a false positive
|
||||
'on:begin': XML_TAG.isTrulyOpeningTag,
|
||||
end: XML_TAG.end
|
||||
}
|
||||
],
|
||||
subLanguage: 'xml',
|
||||
contains: [
|
||||
{
|
||||
begin: XML_TAG.begin,
|
||||
end: XML_TAG.end,
|
||||
skip: true,
|
||||
contains: ['self']
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
},
|
||||
FUNCTION_DEFINITION,
|
||||
{
|
||||
// prevent this from getting swallowed up by function
|
||||
// since they appear "function like"
|
||||
beginKeywords: "while if switch catch for"
|
||||
},
|
||||
{
|
||||
// we have to count the parens to make sure we actually have the correct
|
||||
// bounding ( ). There could be any number of sub-expressions inside
|
||||
// also surrounded by parens.
|
||||
begin: '\\b(?!function)' + hljs.UNDERSCORE_IDENT_RE +
|
||||
'\\(' + // first parens
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)\\s*\\{', // end parens
|
||||
returnBegin:true,
|
||||
label: "func.def",
|
||||
contains: [
|
||||
PARAMS,
|
||||
hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1, className: "title.function" })
|
||||
]
|
||||
},
|
||||
// catch ... so it won't trigger the property rule below
|
||||
{
|
||||
match: /\.\.\./,
|
||||
relevance: 0
|
||||
},
|
||||
PROPERTY_ACCESS,
|
||||
// hack: prevents detection of keywords in some circumstances
|
||||
// .keyword()
|
||||
// $keyword = x
|
||||
{
|
||||
match: '\\$' + IDENT_RE$1,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
match: [ /\bconstructor(?=\s*\()/ ],
|
||||
className: { 1: "title.function" },
|
||||
contains: [ PARAMS ]
|
||||
},
|
||||
FUNCTION_CALL,
|
||||
UPPER_CASE_CONSTANT,
|
||||
CLASS_OR_EXTENDS,
|
||||
GETTER_OR_SETTER,
|
||||
{
|
||||
match: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default javascript;
|
||||
Vendored
+53
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
Language: JSON
|
||||
Description: JSON (JavaScript Object Notation) is a lightweight data-interchange format.
|
||||
Author: Ivan Sagalaev <maniac@softwaremaniacs.org>
|
||||
Website: http://www.json.org
|
||||
Category: common, protocols, web
|
||||
*/
|
||||
|
||||
function json(hljs) {
|
||||
const ATTRIBUTE = {
|
||||
className: 'attr',
|
||||
begin: /"(\\.|[^\\"\r\n])*"(?=\s*:)/,
|
||||
relevance: 1.01
|
||||
};
|
||||
const PUNCTUATION = {
|
||||
match: /[{}[\],:]/,
|
||||
className: "punctuation",
|
||||
relevance: 0
|
||||
};
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false",
|
||||
"null"
|
||||
];
|
||||
// NOTE: normally we would rely on `keywords` for this but using a mode here allows us
|
||||
// - to use the very tight `illegal: \S` rule later to flag any other character
|
||||
// - as illegal indicating that despite looking like JSON we do not truly have
|
||||
// - JSON and thus improve false-positively greatly since JSON will try and claim
|
||||
// - all sorts of JSON looking stuff
|
||||
const LITERALS_MODE = {
|
||||
scope: "literal",
|
||||
beginKeywords: LITERALS.join(" "),
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'JSON',
|
||||
keywords:{
|
||||
literal: LITERALS,
|
||||
},
|
||||
contains: [
|
||||
ATTRIBUTE,
|
||||
PUNCTUATION,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
LITERALS_MODE,
|
||||
hljs.C_NUMBER_MODE,
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
],
|
||||
illegal: '\\S'
|
||||
};
|
||||
}
|
||||
|
||||
export default json;
|
||||
+434
@@ -0,0 +1,434 @@
|
||||
/*
|
||||
Language: Python
|
||||
Description: Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.
|
||||
Website: https://www.python.org
|
||||
Category: common
|
||||
*/
|
||||
|
||||
function python(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const IDENT_RE = /[\p{XID_Start}_]\p{XID_Continue}*/u;
|
||||
const RESERVED_WORDS = [
|
||||
'and',
|
||||
'as',
|
||||
'assert',
|
||||
'async',
|
||||
'await',
|
||||
'break',
|
||||
'case',
|
||||
'class',
|
||||
'continue',
|
||||
'def',
|
||||
'del',
|
||||
'elif',
|
||||
'else',
|
||||
'except',
|
||||
'finally',
|
||||
'for',
|
||||
'from',
|
||||
'global',
|
||||
'if',
|
||||
'import',
|
||||
'in',
|
||||
'is',
|
||||
'lambda',
|
||||
'match',
|
||||
'nonlocal|10',
|
||||
'not',
|
||||
'or',
|
||||
'pass',
|
||||
'raise',
|
||||
'return',
|
||||
'try',
|
||||
'while',
|
||||
'with',
|
||||
'yield'
|
||||
];
|
||||
|
||||
const BUILT_INS = [
|
||||
'__import__',
|
||||
'abs',
|
||||
'all',
|
||||
'any',
|
||||
'ascii',
|
||||
'bin',
|
||||
'bool',
|
||||
'breakpoint',
|
||||
'bytearray',
|
||||
'bytes',
|
||||
'callable',
|
||||
'chr',
|
||||
'classmethod',
|
||||
'compile',
|
||||
'complex',
|
||||
'delattr',
|
||||
'dict',
|
||||
'dir',
|
||||
'divmod',
|
||||
'enumerate',
|
||||
'eval',
|
||||
'exec',
|
||||
'filter',
|
||||
'float',
|
||||
'format',
|
||||
'frozenset',
|
||||
'getattr',
|
||||
'globals',
|
||||
'hasattr',
|
||||
'hash',
|
||||
'help',
|
||||
'hex',
|
||||
'id',
|
||||
'input',
|
||||
'int',
|
||||
'isinstance',
|
||||
'issubclass',
|
||||
'iter',
|
||||
'len',
|
||||
'list',
|
||||
'locals',
|
||||
'map',
|
||||
'max',
|
||||
'memoryview',
|
||||
'min',
|
||||
'next',
|
||||
'object',
|
||||
'oct',
|
||||
'open',
|
||||
'ord',
|
||||
'pow',
|
||||
'print',
|
||||
'property',
|
||||
'range',
|
||||
'repr',
|
||||
'reversed',
|
||||
'round',
|
||||
'set',
|
||||
'setattr',
|
||||
'slice',
|
||||
'sorted',
|
||||
'staticmethod',
|
||||
'str',
|
||||
'sum',
|
||||
'super',
|
||||
'tuple',
|
||||
'type',
|
||||
'vars',
|
||||
'zip'
|
||||
];
|
||||
|
||||
const LITERALS = [
|
||||
'__debug__',
|
||||
'Ellipsis',
|
||||
'False',
|
||||
'None',
|
||||
'NotImplemented',
|
||||
'True'
|
||||
];
|
||||
|
||||
// https://docs.python.org/3/library/typing.html
|
||||
// TODO: Could these be supplemented by a CamelCase matcher in certain
|
||||
// contexts, leaving these remaining only for relevance hinting?
|
||||
const TYPES = [
|
||||
"Any",
|
||||
"Callable",
|
||||
"Coroutine",
|
||||
"Dict",
|
||||
"List",
|
||||
"Literal",
|
||||
"Generic",
|
||||
"Optional",
|
||||
"Sequence",
|
||||
"Set",
|
||||
"Tuple",
|
||||
"Type",
|
||||
"Union"
|
||||
];
|
||||
|
||||
const KEYWORDS = {
|
||||
$pattern: /[A-Za-z]\w+|__\w+__/,
|
||||
keyword: RESERVED_WORDS,
|
||||
built_in: BUILT_INS,
|
||||
literal: LITERALS,
|
||||
type: TYPES
|
||||
};
|
||||
|
||||
const PROMPT = {
|
||||
className: 'meta',
|
||||
begin: /^(>>>|\.\.\.) /
|
||||
};
|
||||
|
||||
const SUBST = {
|
||||
className: 'subst',
|
||||
begin: /\{/,
|
||||
end: /\}/,
|
||||
keywords: KEYWORDS,
|
||||
illegal: /#/
|
||||
};
|
||||
|
||||
const LITERAL_BRACKET = {
|
||||
begin: /\{\{/,
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
const STRING = {
|
||||
className: 'string',
|
||||
contains: [ hljs.BACKSLASH_ESCAPE ],
|
||||
variants: [
|
||||
{
|
||||
begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,
|
||||
end: /'''/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
PROMPT
|
||||
],
|
||||
relevance: 10
|
||||
},
|
||||
{
|
||||
begin: /([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,
|
||||
end: /"""/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
PROMPT
|
||||
],
|
||||
relevance: 10
|
||||
},
|
||||
{
|
||||
begin: /([fF][rR]|[rR][fF]|[fF])'''/,
|
||||
end: /'''/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
PROMPT,
|
||||
LITERAL_BRACKET,
|
||||
SUBST
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /([fF][rR]|[rR][fF]|[fF])"""/,
|
||||
end: /"""/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
PROMPT,
|
||||
LITERAL_BRACKET,
|
||||
SUBST
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /([uU]|[rR])'/,
|
||||
end: /'/,
|
||||
relevance: 10
|
||||
},
|
||||
{
|
||||
begin: /([uU]|[rR])"/,
|
||||
end: /"/,
|
||||
relevance: 10
|
||||
},
|
||||
{
|
||||
begin: /([bB]|[bB][rR]|[rR][bB])'/,
|
||||
end: /'/
|
||||
},
|
||||
{
|
||||
begin: /([bB]|[bB][rR]|[rR][bB])"/,
|
||||
end: /"/
|
||||
},
|
||||
{
|
||||
begin: /([fF][rR]|[rR][fF]|[fF])'/,
|
||||
end: /'/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
LITERAL_BRACKET,
|
||||
SUBST
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /([fF][rR]|[rR][fF]|[fF])"/,
|
||||
end: /"/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
LITERAL_BRACKET,
|
||||
SUBST
|
||||
]
|
||||
},
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE
|
||||
]
|
||||
};
|
||||
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#numeric-literals
|
||||
const digitpart = '[0-9](_?[0-9])*';
|
||||
const pointfloat = `(\\b(${digitpart}))?\\.(${digitpart})|\\b(${digitpart})\\.`;
|
||||
// Whitespace after a number (or any lexical token) is needed only if its absence
|
||||
// would change the tokenization
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#whitespace-between-tokens
|
||||
// We deviate slightly, requiring a word boundary or a keyword
|
||||
// to avoid accidentally recognizing *prefixes* (e.g., `0` in `0x41` or `08` or `0__1`)
|
||||
const lookahead = `\\b|${RESERVED_WORDS.join('|')}`;
|
||||
const NUMBER = {
|
||||
className: 'number',
|
||||
relevance: 0,
|
||||
variants: [
|
||||
// exponentfloat, pointfloat
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#floating-point-literals
|
||||
// optionally imaginary
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
|
||||
// Note: no leading \b because floats can start with a decimal point
|
||||
// and we don't want to mishandle e.g. `fn(.5)`,
|
||||
// no trailing \b for pointfloat because it can end with a decimal point
|
||||
// and we don't want to mishandle e.g. `0..hex()`; this should be safe
|
||||
// because both MUST contain a decimal point and so cannot be confused with
|
||||
// the interior part of an identifier
|
||||
{
|
||||
begin: `(\\b(${digitpart})|(${pointfloat}))[eE][+-]?(${digitpart})[jJ]?(?=${lookahead})`
|
||||
},
|
||||
{
|
||||
begin: `(${pointfloat})[jJ]?`
|
||||
},
|
||||
|
||||
// decinteger, bininteger, octinteger, hexinteger
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#integer-literals
|
||||
// optionally "long" in Python 2
|
||||
// https://docs.python.org/2.7/reference/lexical_analysis.html#integer-and-long-integer-literals
|
||||
// decinteger is optionally imaginary
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
|
||||
{
|
||||
begin: `\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${lookahead})`
|
||||
},
|
||||
{
|
||||
begin: `\\b0[bB](_?[01])+[lL]?(?=${lookahead})`
|
||||
},
|
||||
{
|
||||
begin: `\\b0[oO](_?[0-7])+[lL]?(?=${lookahead})`
|
||||
},
|
||||
{
|
||||
begin: `\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${lookahead})`
|
||||
},
|
||||
|
||||
// imagnumber (digitpart-based)
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
|
||||
{
|
||||
begin: `\\b(${digitpart})[jJ](?=${lookahead})`
|
||||
}
|
||||
]
|
||||
};
|
||||
const COMMENT_TYPE = {
|
||||
className: "comment",
|
||||
begin: regex.lookahead(/# type:/),
|
||||
end: /$/,
|
||||
keywords: KEYWORDS,
|
||||
contains: [
|
||||
{ // prevent keywords from coloring `type`
|
||||
begin: /# type:/
|
||||
},
|
||||
// comment within a datatype comment includes no keywords
|
||||
{
|
||||
begin: /#/,
|
||||
end: /\b\B/,
|
||||
endsWithParent: true
|
||||
}
|
||||
]
|
||||
};
|
||||
const PARAMS = {
|
||||
className: 'params',
|
||||
variants: [
|
||||
// Exclude params in functions without params
|
||||
{
|
||||
className: "",
|
||||
begin: /\(\s*\)/,
|
||||
skip: true
|
||||
},
|
||||
{
|
||||
begin: /\(/,
|
||||
end: /\)/,
|
||||
excludeBegin: true,
|
||||
excludeEnd: true,
|
||||
keywords: KEYWORDS,
|
||||
contains: [
|
||||
'self',
|
||||
PROMPT,
|
||||
NUMBER,
|
||||
STRING,
|
||||
hljs.HASH_COMMENT_MODE
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
SUBST.contains = [
|
||||
STRING,
|
||||
NUMBER,
|
||||
PROMPT
|
||||
];
|
||||
|
||||
return {
|
||||
name: 'Python',
|
||||
aliases: [
|
||||
'py',
|
||||
'gyp',
|
||||
'ipython'
|
||||
],
|
||||
unicodeRegex: true,
|
||||
keywords: KEYWORDS,
|
||||
illegal: /(<\/|\?)|=>/,
|
||||
contains: [
|
||||
PROMPT,
|
||||
NUMBER,
|
||||
{
|
||||
// very common convention
|
||||
begin: /\bself\b/
|
||||
},
|
||||
{
|
||||
// eat "if" prior to string so that it won't accidentally be
|
||||
// labeled as an f-string
|
||||
beginKeywords: "if",
|
||||
relevance: 0
|
||||
},
|
||||
STRING,
|
||||
COMMENT_TYPE,
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
{
|
||||
match: [
|
||||
/\bdef/, /\s+/,
|
||||
IDENT_RE,
|
||||
],
|
||||
scope: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
},
|
||||
contains: [ PARAMS ]
|
||||
},
|
||||
{
|
||||
variants: [
|
||||
{
|
||||
match: [
|
||||
/\bclass/, /\s+/,
|
||||
IDENT_RE, /\s*/,
|
||||
/\(\s*/, IDENT_RE,/\s*\)/
|
||||
],
|
||||
},
|
||||
{
|
||||
match: [
|
||||
/\bclass/, /\s+/,
|
||||
IDENT_RE
|
||||
],
|
||||
}
|
||||
],
|
||||
scope: {
|
||||
1: "keyword",
|
||||
3: "title.class",
|
||||
6: "title.class.inherited",
|
||||
}
|
||||
},
|
||||
{
|
||||
className: 'meta',
|
||||
begin: /^[\t ]*@/,
|
||||
end: /(?=#)|$/,
|
||||
contains: [
|
||||
NUMBER,
|
||||
PARAMS,
|
||||
STRING
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default python;
|
||||
Vendored
+448
@@ -0,0 +1,448 @@
|
||||
/*
|
||||
Language: Ruby
|
||||
Description: Ruby is a dynamic, open source programming language with a focus on simplicity and productivity.
|
||||
Website: https://www.ruby-lang.org/
|
||||
Author: Anton Kovalyov <anton@kovalyov.net>
|
||||
Contributors: Peter Leonov <gojpeg@yandex.ru>, Vasily Polovnyov <vast@whiteants.net>, Loren Segal <lsegal@soen.ca>, Pascal Hurni <phi@ruby-reactive.org>, Cedric Sohrauer <sohrauer@googlemail.com>
|
||||
Category: common
|
||||
*/
|
||||
|
||||
function ruby(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const RUBY_METHOD_RE = '([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)';
|
||||
// TODO: move concepts like CAMEL_CASE into `modes.js`
|
||||
const CLASS_NAME_RE = regex.either(
|
||||
/\b([A-Z]+[a-z0-9]+)+/,
|
||||
// ends in caps
|
||||
/\b([A-Z]+[a-z0-9]+)+[A-Z]+/,
|
||||
)
|
||||
;
|
||||
const CLASS_NAME_WITH_NAMESPACE_RE = regex.concat(CLASS_NAME_RE, /(::\w+)*/);
|
||||
// very popular ruby built-ins that one might even assume
|
||||
// are actual keywords (despite that not being the case)
|
||||
const PSEUDO_KWS = [
|
||||
"include",
|
||||
"extend",
|
||||
"prepend",
|
||||
"public",
|
||||
"private",
|
||||
"protected",
|
||||
"raise",
|
||||
"throw"
|
||||
];
|
||||
const RUBY_KEYWORDS = {
|
||||
"variable.constant": [
|
||||
"__FILE__",
|
||||
"__LINE__",
|
||||
"__ENCODING__"
|
||||
],
|
||||
"variable.language": [
|
||||
"self",
|
||||
"super",
|
||||
],
|
||||
keyword: [
|
||||
"alias",
|
||||
"and",
|
||||
"begin",
|
||||
"BEGIN",
|
||||
"break",
|
||||
"case",
|
||||
"class",
|
||||
"defined",
|
||||
"do",
|
||||
"else",
|
||||
"elsif",
|
||||
"end",
|
||||
"END",
|
||||
"ensure",
|
||||
"for",
|
||||
"if",
|
||||
"in",
|
||||
"module",
|
||||
"next",
|
||||
"not",
|
||||
"or",
|
||||
"redo",
|
||||
"require",
|
||||
"rescue",
|
||||
"retry",
|
||||
"return",
|
||||
"then",
|
||||
"undef",
|
||||
"unless",
|
||||
"until",
|
||||
"when",
|
||||
"while",
|
||||
"yield",
|
||||
...PSEUDO_KWS
|
||||
],
|
||||
built_in: [
|
||||
"proc",
|
||||
"lambda",
|
||||
"attr_accessor",
|
||||
"attr_reader",
|
||||
"attr_writer",
|
||||
"define_method",
|
||||
"private_constant",
|
||||
"module_function"
|
||||
],
|
||||
literal: [
|
||||
"true",
|
||||
"false",
|
||||
"nil"
|
||||
]
|
||||
};
|
||||
const YARDOCTAG = {
|
||||
className: 'doctag',
|
||||
begin: '@[A-Za-z]+'
|
||||
};
|
||||
const IRB_OBJECT = {
|
||||
begin: '#<',
|
||||
end: '>'
|
||||
};
|
||||
const COMMENT_MODES = [
|
||||
hljs.COMMENT(
|
||||
'#',
|
||||
'$',
|
||||
{ contains: [ YARDOCTAG ] }
|
||||
),
|
||||
hljs.COMMENT(
|
||||
'^=begin',
|
||||
'^=end',
|
||||
{
|
||||
contains: [ YARDOCTAG ],
|
||||
relevance: 10
|
||||
}
|
||||
),
|
||||
hljs.COMMENT('^__END__', hljs.MATCH_NOTHING_RE)
|
||||
];
|
||||
const SUBST = {
|
||||
className: 'subst',
|
||||
begin: /#\{/,
|
||||
end: /\}/,
|
||||
keywords: RUBY_KEYWORDS
|
||||
};
|
||||
const STRING = {
|
||||
className: 'string',
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
],
|
||||
variants: [
|
||||
{
|
||||
begin: /'/,
|
||||
end: /'/
|
||||
},
|
||||
{
|
||||
begin: /"/,
|
||||
end: /"/
|
||||
},
|
||||
{
|
||||
begin: /`/,
|
||||
end: /`/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?\(/,
|
||||
end: /\)/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?\[/,
|
||||
end: /\]/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?\{/,
|
||||
end: /\}/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?</,
|
||||
end: />/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?\//,
|
||||
end: /\//
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?%/,
|
||||
end: /%/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?-/,
|
||||
end: /-/
|
||||
},
|
||||
{
|
||||
begin: /%[qQwWx]?\|/,
|
||||
end: /\|/
|
||||
},
|
||||
// in the following expressions, \B in the beginning suppresses recognition of ?-sequences
|
||||
// where ? is the last character of a preceding identifier, as in: `func?4`
|
||||
{ begin: /\B\?(\\\d{1,3})/ },
|
||||
{ begin: /\B\?(\\x[A-Fa-f0-9]{1,2})/ },
|
||||
{ begin: /\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/ },
|
||||
{ begin: /\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/ },
|
||||
{ begin: /\B\?\\(c|C-)[\x20-\x7e]/ },
|
||||
{ begin: /\B\?\\?\S/ },
|
||||
// heredocs
|
||||
{
|
||||
// this guard makes sure that we have an entire heredoc and not a false
|
||||
// positive (auto-detect, etc.)
|
||||
begin: regex.concat(
|
||||
/<<[-~]?'?/,
|
||||
regex.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)
|
||||
),
|
||||
contains: [
|
||||
hljs.END_SAME_AS_BEGIN({
|
||||
begin: /(\w+)/,
|
||||
end: /(\w+)/,
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
]
|
||||
})
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
// Ruby syntax is underdocumented, but this grammar seems to be accurate
|
||||
// as of version 2.7.2 (confirmed with (irb and `Ripper.sexp(...)`)
|
||||
// https://docs.ruby-lang.org/en/2.7.0/doc/syntax/literals_rdoc.html#label-Numbers
|
||||
const decimal = '[1-9](_?[0-9])*|0';
|
||||
const digits = '[0-9](_?[0-9])*';
|
||||
const NUMBER = {
|
||||
className: 'number',
|
||||
relevance: 0,
|
||||
variants: [
|
||||
// decimal integer/float, optionally exponential or rational, optionally imaginary
|
||||
{ begin: `\\b(${decimal})(\\.(${digits}))?([eE][+-]?(${digits})|r)?i?\\b` },
|
||||
|
||||
// explicit decimal/binary/octal/hexadecimal integer,
|
||||
// optionally rational and/or imaginary
|
||||
{ begin: "\\b0[dD][0-9](_?[0-9])*r?i?\\b" },
|
||||
{ begin: "\\b0[bB][0-1](_?[0-1])*r?i?\\b" },
|
||||
{ begin: "\\b0[oO][0-7](_?[0-7])*r?i?\\b" },
|
||||
{ begin: "\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b" },
|
||||
|
||||
// 0-prefixed implicit octal integer, optionally rational and/or imaginary
|
||||
{ begin: "\\b0(_?[0-7])+r?i?\\b" }
|
||||
]
|
||||
};
|
||||
|
||||
const PARAMS = {
|
||||
variants: [
|
||||
{
|
||||
match: /\(\)/,
|
||||
},
|
||||
{
|
||||
className: 'params',
|
||||
begin: /\(/,
|
||||
end: /(?=\))/,
|
||||
excludeBegin: true,
|
||||
endsParent: true,
|
||||
keywords: RUBY_KEYWORDS,
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
const INCLUDE_EXTEND = {
|
||||
match: [
|
||||
/(include|extend)\s+/,
|
||||
CLASS_NAME_WITH_NAMESPACE_RE
|
||||
],
|
||||
scope: {
|
||||
2: "title.class"
|
||||
},
|
||||
keywords: RUBY_KEYWORDS
|
||||
};
|
||||
|
||||
const CLASS_DEFINITION = {
|
||||
variants: [
|
||||
{
|
||||
match: [
|
||||
/class\s+/,
|
||||
CLASS_NAME_WITH_NAMESPACE_RE,
|
||||
/\s+<\s+/,
|
||||
CLASS_NAME_WITH_NAMESPACE_RE
|
||||
]
|
||||
},
|
||||
{
|
||||
match: [
|
||||
/\b(class|module)\s+/,
|
||||
CLASS_NAME_WITH_NAMESPACE_RE
|
||||
]
|
||||
}
|
||||
],
|
||||
scope: {
|
||||
2: "title.class",
|
||||
4: "title.class.inherited"
|
||||
},
|
||||
keywords: RUBY_KEYWORDS
|
||||
};
|
||||
|
||||
const UPPER_CASE_CONSTANT = {
|
||||
relevance: 0,
|
||||
match: /\b[A-Z][A-Z_0-9]+\b/,
|
||||
className: "variable.constant"
|
||||
};
|
||||
|
||||
const METHOD_DEFINITION = {
|
||||
match: [
|
||||
/def/, /\s+/,
|
||||
RUBY_METHOD_RE
|
||||
],
|
||||
scope: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
},
|
||||
contains: [
|
||||
PARAMS
|
||||
]
|
||||
};
|
||||
|
||||
const OBJECT_CREATION = {
|
||||
relevance: 0,
|
||||
match: [
|
||||
CLASS_NAME_WITH_NAMESPACE_RE,
|
||||
/\.new[. (]/
|
||||
],
|
||||
scope: {
|
||||
1: "title.class"
|
||||
}
|
||||
};
|
||||
|
||||
// CamelCase
|
||||
const CLASS_REFERENCE = {
|
||||
relevance: 0,
|
||||
match: CLASS_NAME_RE,
|
||||
scope: "title.class"
|
||||
};
|
||||
|
||||
const RUBY_DEFAULT_CONTAINS = [
|
||||
STRING,
|
||||
CLASS_DEFINITION,
|
||||
INCLUDE_EXTEND,
|
||||
OBJECT_CREATION,
|
||||
UPPER_CASE_CONSTANT,
|
||||
CLASS_REFERENCE,
|
||||
METHOD_DEFINITION,
|
||||
{
|
||||
// swallow namespace qualifiers before symbols
|
||||
begin: hljs.IDENT_RE + '::' },
|
||||
{
|
||||
className: 'symbol',
|
||||
begin: hljs.UNDERSCORE_IDENT_RE + '(!|\\?)?:',
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'symbol',
|
||||
begin: ':(?!\\s)',
|
||||
contains: [
|
||||
STRING,
|
||||
{ begin: RUBY_METHOD_RE }
|
||||
],
|
||||
relevance: 0
|
||||
},
|
||||
NUMBER,
|
||||
{
|
||||
// negative-look forward attempts to prevent false matches like:
|
||||
// @ident@ or $ident$ that might indicate this is not ruby at all
|
||||
className: "variable",
|
||||
begin: '(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])' + `(?![A-Za-z])(?![@$?'])`
|
||||
},
|
||||
{
|
||||
className: 'params',
|
||||
begin: /\|/,
|
||||
end: /\|/,
|
||||
excludeBegin: true,
|
||||
excludeEnd: true,
|
||||
relevance: 0, // this could be a lot of things (in other languages) other than params
|
||||
keywords: RUBY_KEYWORDS
|
||||
},
|
||||
{ // regexp container
|
||||
begin: '(' + hljs.RE_STARTERS_RE + '|unless)\\s*',
|
||||
keywords: 'unless',
|
||||
contains: [
|
||||
{
|
||||
className: 'regexp',
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
],
|
||||
illegal: /\n/,
|
||||
variants: [
|
||||
{
|
||||
begin: '/',
|
||||
end: '/[a-z]*'
|
||||
},
|
||||
{
|
||||
begin: /%r\{/,
|
||||
end: /\}[a-z]*/
|
||||
},
|
||||
{
|
||||
begin: '%r\\(',
|
||||
end: '\\)[a-z]*'
|
||||
},
|
||||
{
|
||||
begin: '%r!',
|
||||
end: '![a-z]*'
|
||||
},
|
||||
{
|
||||
begin: '%r\\[',
|
||||
end: '\\][a-z]*'
|
||||
}
|
||||
]
|
||||
}
|
||||
].concat(IRB_OBJECT, COMMENT_MODES),
|
||||
relevance: 0
|
||||
}
|
||||
].concat(IRB_OBJECT, COMMENT_MODES);
|
||||
|
||||
SUBST.contains = RUBY_DEFAULT_CONTAINS;
|
||||
PARAMS.contains = RUBY_DEFAULT_CONTAINS;
|
||||
|
||||
// >>
|
||||
// ?>
|
||||
const SIMPLE_PROMPT = "[>?]>";
|
||||
// irb(main):001:0>
|
||||
const DEFAULT_PROMPT = "[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]";
|
||||
const RVM_PROMPT = "(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>";
|
||||
|
||||
const IRB_DEFAULT = [
|
||||
{
|
||||
begin: /^\s*=>/,
|
||||
starts: {
|
||||
end: '$',
|
||||
contains: RUBY_DEFAULT_CONTAINS
|
||||
}
|
||||
},
|
||||
{
|
||||
className: 'meta.prompt',
|
||||
begin: '^(' + SIMPLE_PROMPT + "|" + DEFAULT_PROMPT + '|' + RVM_PROMPT + ')(?=[ ])',
|
||||
starts: {
|
||||
end: '$',
|
||||
keywords: RUBY_KEYWORDS,
|
||||
contains: RUBY_DEFAULT_CONTAINS
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
COMMENT_MODES.unshift(IRB_OBJECT);
|
||||
|
||||
return {
|
||||
name: 'Ruby',
|
||||
aliases: [
|
||||
'rb',
|
||||
'gemspec',
|
||||
'podspec',
|
||||
'thor',
|
||||
'irb'
|
||||
],
|
||||
keywords: RUBY_KEYWORDS,
|
||||
illegal: /\/\*/,
|
||||
contains: [ hljs.SHEBANG({ binary: "ruby" }) ]
|
||||
.concat(IRB_DEFAULT)
|
||||
.concat(COMMENT_MODES)
|
||||
.concat(RUBY_DEFAULT_CONTAINS)
|
||||
};
|
||||
}
|
||||
|
||||
export default ruby;
|
||||
Vendored
+305
@@ -0,0 +1,305 @@
|
||||
/*
|
||||
Language: Rust
|
||||
Author: Andrey Vlasovskikh <andrey.vlasovskikh@gmail.com>
|
||||
Contributors: Roman Shmatov <romanshmatov@gmail.com>, Kasper Andersen <kma_untrusted@protonmail.com>
|
||||
Website: https://www.rust-lang.org
|
||||
Category: common, system
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function rust(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const FUNCTION_INVOKE = {
|
||||
className: "title.function.invoke",
|
||||
relevance: 0,
|
||||
begin: regex.concat(
|
||||
/\b/,
|
||||
/(?!let|for|while|if|else|match\b)/,
|
||||
hljs.IDENT_RE,
|
||||
regex.lookahead(/\s*\(/))
|
||||
};
|
||||
const NUMBER_SUFFIX = '([ui](8|16|32|64|128|size)|f(32|64))\?';
|
||||
const KEYWORDS = [
|
||||
"abstract",
|
||||
"as",
|
||||
"async",
|
||||
"await",
|
||||
"become",
|
||||
"box",
|
||||
"break",
|
||||
"const",
|
||||
"continue",
|
||||
"crate",
|
||||
"do",
|
||||
"dyn",
|
||||
"else",
|
||||
"enum",
|
||||
"extern",
|
||||
"false",
|
||||
"final",
|
||||
"fn",
|
||||
"for",
|
||||
"if",
|
||||
"impl",
|
||||
"in",
|
||||
"let",
|
||||
"loop",
|
||||
"macro",
|
||||
"match",
|
||||
"mod",
|
||||
"move",
|
||||
"mut",
|
||||
"override",
|
||||
"priv",
|
||||
"pub",
|
||||
"ref",
|
||||
"return",
|
||||
"self",
|
||||
"Self",
|
||||
"static",
|
||||
"struct",
|
||||
"super",
|
||||
"trait",
|
||||
"true",
|
||||
"try",
|
||||
"type",
|
||||
"typeof",
|
||||
"unsafe",
|
||||
"unsized",
|
||||
"use",
|
||||
"virtual",
|
||||
"where",
|
||||
"while",
|
||||
"yield"
|
||||
];
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false",
|
||||
"Some",
|
||||
"None",
|
||||
"Ok",
|
||||
"Err"
|
||||
];
|
||||
const BUILTINS = [
|
||||
// functions
|
||||
'drop ',
|
||||
// traits
|
||||
"Copy",
|
||||
"Send",
|
||||
"Sized",
|
||||
"Sync",
|
||||
"Drop",
|
||||
"Fn",
|
||||
"FnMut",
|
||||
"FnOnce",
|
||||
"ToOwned",
|
||||
"Clone",
|
||||
"Debug",
|
||||
"PartialEq",
|
||||
"PartialOrd",
|
||||
"Eq",
|
||||
"Ord",
|
||||
"AsRef",
|
||||
"AsMut",
|
||||
"Into",
|
||||
"From",
|
||||
"Default",
|
||||
"Iterator",
|
||||
"Extend",
|
||||
"IntoIterator",
|
||||
"DoubleEndedIterator",
|
||||
"ExactSizeIterator",
|
||||
"SliceConcatExt",
|
||||
"ToString",
|
||||
// macros
|
||||
"assert!",
|
||||
"assert_eq!",
|
||||
"bitflags!",
|
||||
"bytes!",
|
||||
"cfg!",
|
||||
"col!",
|
||||
"concat!",
|
||||
"concat_idents!",
|
||||
"debug_assert!",
|
||||
"debug_assert_eq!",
|
||||
"env!",
|
||||
"eprintln!",
|
||||
"panic!",
|
||||
"file!",
|
||||
"format!",
|
||||
"format_args!",
|
||||
"include_bytes!",
|
||||
"include_str!",
|
||||
"line!",
|
||||
"local_data_key!",
|
||||
"module_path!",
|
||||
"option_env!",
|
||||
"print!",
|
||||
"println!",
|
||||
"select!",
|
||||
"stringify!",
|
||||
"try!",
|
||||
"unimplemented!",
|
||||
"unreachable!",
|
||||
"vec!",
|
||||
"write!",
|
||||
"writeln!",
|
||||
"macro_rules!",
|
||||
"assert_ne!",
|
||||
"debug_assert_ne!"
|
||||
];
|
||||
const TYPES = [
|
||||
"i8",
|
||||
"i16",
|
||||
"i32",
|
||||
"i64",
|
||||
"i128",
|
||||
"isize",
|
||||
"u8",
|
||||
"u16",
|
||||
"u32",
|
||||
"u64",
|
||||
"u128",
|
||||
"usize",
|
||||
"f32",
|
||||
"f64",
|
||||
"str",
|
||||
"char",
|
||||
"bool",
|
||||
"Box",
|
||||
"Option",
|
||||
"Result",
|
||||
"String",
|
||||
"Vec"
|
||||
];
|
||||
return {
|
||||
name: 'Rust',
|
||||
aliases: [ 'rs' ],
|
||||
keywords: {
|
||||
$pattern: hljs.IDENT_RE + '!?',
|
||||
type: TYPES,
|
||||
keyword: KEYWORDS,
|
||||
literal: LITERALS,
|
||||
built_in: BUILTINS
|
||||
},
|
||||
illegal: '</',
|
||||
contains: [
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.COMMENT('/\\*', '\\*/', { contains: [ 'self' ] }),
|
||||
hljs.inherit(hljs.QUOTE_STRING_MODE, {
|
||||
begin: /b?"/,
|
||||
illegal: null
|
||||
}),
|
||||
{
|
||||
className: 'string',
|
||||
variants: [
|
||||
{ begin: /b?r(#*)"(.|\n)*?"\1(?!#)/ },
|
||||
{ begin: /b?'\\?(x\w{2}|u\w{4}|U\w{8}|.)'/ }
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'symbol',
|
||||
begin: /'[a-zA-Z_][a-zA-Z0-9_]*/
|
||||
},
|
||||
{
|
||||
className: 'number',
|
||||
variants: [
|
||||
{ begin: '\\b0b([01_]+)' + NUMBER_SUFFIX },
|
||||
{ begin: '\\b0o([0-7_]+)' + NUMBER_SUFFIX },
|
||||
{ begin: '\\b0x([A-Fa-f0-9_]+)' + NUMBER_SUFFIX },
|
||||
{ begin: '\\b(\\d[\\d_]*(\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)'
|
||||
+ NUMBER_SUFFIX }
|
||||
],
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
/fn/,
|
||||
/\s+/,
|
||||
hljs.UNDERSCORE_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.function"
|
||||
}
|
||||
},
|
||||
{
|
||||
className: 'meta',
|
||||
begin: '#!?\\[',
|
||||
end: '\\]',
|
||||
contains: [
|
||||
{
|
||||
className: 'string',
|
||||
begin: /"/,
|
||||
end: /"/
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
/let/,
|
||||
/\s+/,
|
||||
/(?:mut\s+)?/,
|
||||
hljs.UNDERSCORE_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "keyword",
|
||||
4: "variable"
|
||||
}
|
||||
},
|
||||
// must come before impl/for rule later
|
||||
{
|
||||
begin: [
|
||||
/for/,
|
||||
/\s+/,
|
||||
hljs.UNDERSCORE_IDENT_RE,
|
||||
/\s+/,
|
||||
/in/
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "variable",
|
||||
5: "keyword"
|
||||
}
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
/type/,
|
||||
/\s+/,
|
||||
hljs.UNDERSCORE_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.class"
|
||||
}
|
||||
},
|
||||
{
|
||||
begin: [
|
||||
/(?:trait|enum|struct|union|impl|for)/,
|
||||
/\s+/,
|
||||
hljs.UNDERSCORE_IDENT_RE
|
||||
],
|
||||
className: {
|
||||
1: "keyword",
|
||||
3: "title.class"
|
||||
}
|
||||
},
|
||||
{
|
||||
begin: hljs.IDENT_RE + '::',
|
||||
keywords: {
|
||||
keyword: "Self",
|
||||
built_in: BUILTINS,
|
||||
type: TYPES
|
||||
}
|
||||
},
|
||||
{
|
||||
className: "punctuation",
|
||||
begin: '->'
|
||||
},
|
||||
FUNCTION_INVOKE
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default rust;
|
||||
Vendored
+682
@@ -0,0 +1,682 @@
|
||||
/*
|
||||
Language: SQL
|
||||
Website: https://en.wikipedia.org/wiki/SQL
|
||||
Category: common, database
|
||||
*/
|
||||
|
||||
/*
|
||||
|
||||
Goals:
|
||||
|
||||
SQL is intended to highlight basic/common SQL keywords and expressions
|
||||
|
||||
- If pretty much every single SQL server includes supports, then it's a canidate.
|
||||
- It is NOT intended to include tons of vendor specific keywords (Oracle, MySQL,
|
||||
PostgreSQL) although the list of data types is purposely a bit more expansive.
|
||||
- For more specific SQL grammars please see:
|
||||
- PostgreSQL and PL/pgSQL - core
|
||||
- T-SQL - https://github.com/highlightjs/highlightjs-tsql
|
||||
- sql_more (core)
|
||||
|
||||
*/
|
||||
|
||||
function sql(hljs) {
|
||||
const regex = hljs.regex;
|
||||
const COMMENT_MODE = hljs.COMMENT('--', '$');
|
||||
const STRING = {
|
||||
className: 'string',
|
||||
variants: [
|
||||
{
|
||||
begin: /'/,
|
||||
end: /'/,
|
||||
contains: [ { begin: /''/ } ]
|
||||
}
|
||||
]
|
||||
};
|
||||
const QUOTED_IDENTIFIER = {
|
||||
begin: /"/,
|
||||
end: /"/,
|
||||
contains: [ { begin: /""/ } ]
|
||||
};
|
||||
|
||||
const LITERALS = [
|
||||
"true",
|
||||
"false",
|
||||
// Not sure it's correct to call NULL literal, and clauses like IS [NOT] NULL look strange that way.
|
||||
// "null",
|
||||
"unknown"
|
||||
];
|
||||
|
||||
const MULTI_WORD_TYPES = [
|
||||
"double precision",
|
||||
"large object",
|
||||
"with timezone",
|
||||
"without timezone"
|
||||
];
|
||||
|
||||
const TYPES = [
|
||||
'bigint',
|
||||
'binary',
|
||||
'blob',
|
||||
'boolean',
|
||||
'char',
|
||||
'character',
|
||||
'clob',
|
||||
'date',
|
||||
'dec',
|
||||
'decfloat',
|
||||
'decimal',
|
||||
'float',
|
||||
'int',
|
||||
'integer',
|
||||
'interval',
|
||||
'nchar',
|
||||
'nclob',
|
||||
'national',
|
||||
'numeric',
|
||||
'real',
|
||||
'row',
|
||||
'smallint',
|
||||
'time',
|
||||
'timestamp',
|
||||
'varchar',
|
||||
'varying', // modifier (character varying)
|
||||
'varbinary'
|
||||
];
|
||||
|
||||
const NON_RESERVED_WORDS = [
|
||||
"add",
|
||||
"asc",
|
||||
"collation",
|
||||
"desc",
|
||||
"final",
|
||||
"first",
|
||||
"last",
|
||||
"view"
|
||||
];
|
||||
|
||||
// https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#reserved-word
|
||||
const RESERVED_WORDS = [
|
||||
"abs",
|
||||
"acos",
|
||||
"all",
|
||||
"allocate",
|
||||
"alter",
|
||||
"and",
|
||||
"any",
|
||||
"are",
|
||||
"array",
|
||||
"array_agg",
|
||||
"array_max_cardinality",
|
||||
"as",
|
||||
"asensitive",
|
||||
"asin",
|
||||
"asymmetric",
|
||||
"at",
|
||||
"atan",
|
||||
"atomic",
|
||||
"authorization",
|
||||
"avg",
|
||||
"begin",
|
||||
"begin_frame",
|
||||
"begin_partition",
|
||||
"between",
|
||||
"bigint",
|
||||
"binary",
|
||||
"blob",
|
||||
"boolean",
|
||||
"both",
|
||||
"by",
|
||||
"call",
|
||||
"called",
|
||||
"cardinality",
|
||||
"cascaded",
|
||||
"case",
|
||||
"cast",
|
||||
"ceil",
|
||||
"ceiling",
|
||||
"char",
|
||||
"char_length",
|
||||
"character",
|
||||
"character_length",
|
||||
"check",
|
||||
"classifier",
|
||||
"clob",
|
||||
"close",
|
||||
"coalesce",
|
||||
"collate",
|
||||
"collect",
|
||||
"column",
|
||||
"commit",
|
||||
"condition",
|
||||
"connect",
|
||||
"constraint",
|
||||
"contains",
|
||||
"convert",
|
||||
"copy",
|
||||
"corr",
|
||||
"corresponding",
|
||||
"cos",
|
||||
"cosh",
|
||||
"count",
|
||||
"covar_pop",
|
||||
"covar_samp",
|
||||
"create",
|
||||
"cross",
|
||||
"cube",
|
||||
"cume_dist",
|
||||
"current",
|
||||
"current_catalog",
|
||||
"current_date",
|
||||
"current_default_transform_group",
|
||||
"current_path",
|
||||
"current_role",
|
||||
"current_row",
|
||||
"current_schema",
|
||||
"current_time",
|
||||
"current_timestamp",
|
||||
"current_path",
|
||||
"current_role",
|
||||
"current_transform_group_for_type",
|
||||
"current_user",
|
||||
"cursor",
|
||||
"cycle",
|
||||
"date",
|
||||
"day",
|
||||
"deallocate",
|
||||
"dec",
|
||||
"decimal",
|
||||
"decfloat",
|
||||
"declare",
|
||||
"default",
|
||||
"define",
|
||||
"delete",
|
||||
"dense_rank",
|
||||
"deref",
|
||||
"describe",
|
||||
"deterministic",
|
||||
"disconnect",
|
||||
"distinct",
|
||||
"double",
|
||||
"drop",
|
||||
"dynamic",
|
||||
"each",
|
||||
"element",
|
||||
"else",
|
||||
"empty",
|
||||
"end",
|
||||
"end_frame",
|
||||
"end_partition",
|
||||
"end-exec",
|
||||
"equals",
|
||||
"escape",
|
||||
"every",
|
||||
"except",
|
||||
"exec",
|
||||
"execute",
|
||||
"exists",
|
||||
"exp",
|
||||
"external",
|
||||
"extract",
|
||||
"false",
|
||||
"fetch",
|
||||
"filter",
|
||||
"first_value",
|
||||
"float",
|
||||
"floor",
|
||||
"for",
|
||||
"foreign",
|
||||
"frame_row",
|
||||
"free",
|
||||
"from",
|
||||
"full",
|
||||
"function",
|
||||
"fusion",
|
||||
"get",
|
||||
"global",
|
||||
"grant",
|
||||
"group",
|
||||
"grouping",
|
||||
"groups",
|
||||
"having",
|
||||
"hold",
|
||||
"hour",
|
||||
"identity",
|
||||
"in",
|
||||
"indicator",
|
||||
"initial",
|
||||
"inner",
|
||||
"inout",
|
||||
"insensitive",
|
||||
"insert",
|
||||
"int",
|
||||
"integer",
|
||||
"intersect",
|
||||
"intersection",
|
||||
"interval",
|
||||
"into",
|
||||
"is",
|
||||
"join",
|
||||
"json_array",
|
||||
"json_arrayagg",
|
||||
"json_exists",
|
||||
"json_object",
|
||||
"json_objectagg",
|
||||
"json_query",
|
||||
"json_table",
|
||||
"json_table_primitive",
|
||||
"json_value",
|
||||
"lag",
|
||||
"language",
|
||||
"large",
|
||||
"last_value",
|
||||
"lateral",
|
||||
"lead",
|
||||
"leading",
|
||||
"left",
|
||||
"like",
|
||||
"like_regex",
|
||||
"listagg",
|
||||
"ln",
|
||||
"local",
|
||||
"localtime",
|
||||
"localtimestamp",
|
||||
"log",
|
||||
"log10",
|
||||
"lower",
|
||||
"match",
|
||||
"match_number",
|
||||
"match_recognize",
|
||||
"matches",
|
||||
"max",
|
||||
"member",
|
||||
"merge",
|
||||
"method",
|
||||
"min",
|
||||
"minute",
|
||||
"mod",
|
||||
"modifies",
|
||||
"module",
|
||||
"month",
|
||||
"multiset",
|
||||
"national",
|
||||
"natural",
|
||||
"nchar",
|
||||
"nclob",
|
||||
"new",
|
||||
"no",
|
||||
"none",
|
||||
"normalize",
|
||||
"not",
|
||||
"nth_value",
|
||||
"ntile",
|
||||
"null",
|
||||
"nullif",
|
||||
"numeric",
|
||||
"octet_length",
|
||||
"occurrences_regex",
|
||||
"of",
|
||||
"offset",
|
||||
"old",
|
||||
"omit",
|
||||
"on",
|
||||
"one",
|
||||
"only",
|
||||
"open",
|
||||
"or",
|
||||
"order",
|
||||
"out",
|
||||
"outer",
|
||||
"over",
|
||||
"overlaps",
|
||||
"overlay",
|
||||
"parameter",
|
||||
"partition",
|
||||
"pattern",
|
||||
"per",
|
||||
"percent",
|
||||
"percent_rank",
|
||||
"percentile_cont",
|
||||
"percentile_disc",
|
||||
"period",
|
||||
"portion",
|
||||
"position",
|
||||
"position_regex",
|
||||
"power",
|
||||
"precedes",
|
||||
"precision",
|
||||
"prepare",
|
||||
"primary",
|
||||
"procedure",
|
||||
"ptf",
|
||||
"range",
|
||||
"rank",
|
||||
"reads",
|
||||
"real",
|
||||
"recursive",
|
||||
"ref",
|
||||
"references",
|
||||
"referencing",
|
||||
"regr_avgx",
|
||||
"regr_avgy",
|
||||
"regr_count",
|
||||
"regr_intercept",
|
||||
"regr_r2",
|
||||
"regr_slope",
|
||||
"regr_sxx",
|
||||
"regr_sxy",
|
||||
"regr_syy",
|
||||
"release",
|
||||
"result",
|
||||
"return",
|
||||
"returns",
|
||||
"revoke",
|
||||
"right",
|
||||
"rollback",
|
||||
"rollup",
|
||||
"row",
|
||||
"row_number",
|
||||
"rows",
|
||||
"running",
|
||||
"savepoint",
|
||||
"scope",
|
||||
"scroll",
|
||||
"search",
|
||||
"second",
|
||||
"seek",
|
||||
"select",
|
||||
"sensitive",
|
||||
"session_user",
|
||||
"set",
|
||||
"show",
|
||||
"similar",
|
||||
"sin",
|
||||
"sinh",
|
||||
"skip",
|
||||
"smallint",
|
||||
"some",
|
||||
"specific",
|
||||
"specifictype",
|
||||
"sql",
|
||||
"sqlexception",
|
||||
"sqlstate",
|
||||
"sqlwarning",
|
||||
"sqrt",
|
||||
"start",
|
||||
"static",
|
||||
"stddev_pop",
|
||||
"stddev_samp",
|
||||
"submultiset",
|
||||
"subset",
|
||||
"substring",
|
||||
"substring_regex",
|
||||
"succeeds",
|
||||
"sum",
|
||||
"symmetric",
|
||||
"system",
|
||||
"system_time",
|
||||
"system_user",
|
||||
"table",
|
||||
"tablesample",
|
||||
"tan",
|
||||
"tanh",
|
||||
"then",
|
||||
"time",
|
||||
"timestamp",
|
||||
"timezone_hour",
|
||||
"timezone_minute",
|
||||
"to",
|
||||
"trailing",
|
||||
"translate",
|
||||
"translate_regex",
|
||||
"translation",
|
||||
"treat",
|
||||
"trigger",
|
||||
"trim",
|
||||
"trim_array",
|
||||
"true",
|
||||
"truncate",
|
||||
"uescape",
|
||||
"union",
|
||||
"unique",
|
||||
"unknown",
|
||||
"unnest",
|
||||
"update",
|
||||
"upper",
|
||||
"user",
|
||||
"using",
|
||||
"value",
|
||||
"values",
|
||||
"value_of",
|
||||
"var_pop",
|
||||
"var_samp",
|
||||
"varbinary",
|
||||
"varchar",
|
||||
"varying",
|
||||
"versioning",
|
||||
"when",
|
||||
"whenever",
|
||||
"where",
|
||||
"width_bucket",
|
||||
"window",
|
||||
"with",
|
||||
"within",
|
||||
"without",
|
||||
"year",
|
||||
];
|
||||
|
||||
// these are reserved words we have identified to be functions
|
||||
// and should only be highlighted in a dispatch-like context
|
||||
// ie, array_agg(...), etc.
|
||||
const RESERVED_FUNCTIONS = [
|
||||
"abs",
|
||||
"acos",
|
||||
"array_agg",
|
||||
"asin",
|
||||
"atan",
|
||||
"avg",
|
||||
"cast",
|
||||
"ceil",
|
||||
"ceiling",
|
||||
"coalesce",
|
||||
"corr",
|
||||
"cos",
|
||||
"cosh",
|
||||
"count",
|
||||
"covar_pop",
|
||||
"covar_samp",
|
||||
"cume_dist",
|
||||
"dense_rank",
|
||||
"deref",
|
||||
"element",
|
||||
"exp",
|
||||
"extract",
|
||||
"first_value",
|
||||
"floor",
|
||||
"json_array",
|
||||
"json_arrayagg",
|
||||
"json_exists",
|
||||
"json_object",
|
||||
"json_objectagg",
|
||||
"json_query",
|
||||
"json_table",
|
||||
"json_table_primitive",
|
||||
"json_value",
|
||||
"lag",
|
||||
"last_value",
|
||||
"lead",
|
||||
"listagg",
|
||||
"ln",
|
||||
"log",
|
||||
"log10",
|
||||
"lower",
|
||||
"max",
|
||||
"min",
|
||||
"mod",
|
||||
"nth_value",
|
||||
"ntile",
|
||||
"nullif",
|
||||
"percent_rank",
|
||||
"percentile_cont",
|
||||
"percentile_disc",
|
||||
"position",
|
||||
"position_regex",
|
||||
"power",
|
||||
"rank",
|
||||
"regr_avgx",
|
||||
"regr_avgy",
|
||||
"regr_count",
|
||||
"regr_intercept",
|
||||
"regr_r2",
|
||||
"regr_slope",
|
||||
"regr_sxx",
|
||||
"regr_sxy",
|
||||
"regr_syy",
|
||||
"row_number",
|
||||
"sin",
|
||||
"sinh",
|
||||
"sqrt",
|
||||
"stddev_pop",
|
||||
"stddev_samp",
|
||||
"substring",
|
||||
"substring_regex",
|
||||
"sum",
|
||||
"tan",
|
||||
"tanh",
|
||||
"translate",
|
||||
"translate_regex",
|
||||
"treat",
|
||||
"trim",
|
||||
"trim_array",
|
||||
"unnest",
|
||||
"upper",
|
||||
"value_of",
|
||||
"var_pop",
|
||||
"var_samp",
|
||||
"width_bucket",
|
||||
];
|
||||
|
||||
// these functions can
|
||||
const POSSIBLE_WITHOUT_PARENS = [
|
||||
"current_catalog",
|
||||
"current_date",
|
||||
"current_default_transform_group",
|
||||
"current_path",
|
||||
"current_role",
|
||||
"current_schema",
|
||||
"current_transform_group_for_type",
|
||||
"current_user",
|
||||
"session_user",
|
||||
"system_time",
|
||||
"system_user",
|
||||
"current_time",
|
||||
"localtime",
|
||||
"current_timestamp",
|
||||
"localtimestamp"
|
||||
];
|
||||
|
||||
// those exist to boost relevance making these very
|
||||
// "SQL like" keyword combos worth +1 extra relevance
|
||||
const COMBOS = [
|
||||
"create table",
|
||||
"insert into",
|
||||
"primary key",
|
||||
"foreign key",
|
||||
"not null",
|
||||
"alter table",
|
||||
"add constraint",
|
||||
"grouping sets",
|
||||
"on overflow",
|
||||
"character set",
|
||||
"respect nulls",
|
||||
"ignore nulls",
|
||||
"nulls first",
|
||||
"nulls last",
|
||||
"depth first",
|
||||
"breadth first"
|
||||
];
|
||||
|
||||
const FUNCTIONS = RESERVED_FUNCTIONS;
|
||||
|
||||
const KEYWORDS = [
|
||||
...RESERVED_WORDS,
|
||||
...NON_RESERVED_WORDS
|
||||
].filter((keyword) => {
|
||||
return !RESERVED_FUNCTIONS.includes(keyword);
|
||||
});
|
||||
|
||||
const VARIABLE = {
|
||||
className: "variable",
|
||||
begin: /@[a-z0-9][a-z0-9_]*/,
|
||||
};
|
||||
|
||||
const OPERATOR = {
|
||||
className: "operator",
|
||||
begin: /[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/,
|
||||
relevance: 0,
|
||||
};
|
||||
|
||||
const FUNCTION_CALL = {
|
||||
begin: regex.concat(/\b/, regex.either(...FUNCTIONS), /\s*\(/),
|
||||
relevance: 0,
|
||||
keywords: { built_in: FUNCTIONS }
|
||||
};
|
||||
|
||||
// keywords with less than 3 letters are reduced in relevancy
|
||||
function reduceRelevancy(list, {
|
||||
exceptions, when
|
||||
} = {}) {
|
||||
const qualifyFn = when;
|
||||
exceptions = exceptions || [];
|
||||
return list.map((item) => {
|
||||
if (item.match(/\|\d+$/) || exceptions.includes(item)) {
|
||||
return item;
|
||||
} else if (qualifyFn(item)) {
|
||||
return `${item}|0`;
|
||||
} else {
|
||||
return item;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
name: 'SQL',
|
||||
case_insensitive: true,
|
||||
// does not include {} or HTML tags `</`
|
||||
illegal: /[{}]|<\//,
|
||||
keywords: {
|
||||
$pattern: /\b[\w\.]+/,
|
||||
keyword:
|
||||
reduceRelevancy(KEYWORDS, { when: (x) => x.length < 3 }),
|
||||
literal: LITERALS,
|
||||
type: TYPES,
|
||||
built_in: POSSIBLE_WITHOUT_PARENS
|
||||
},
|
||||
contains: [
|
||||
{
|
||||
begin: regex.either(...COMBOS),
|
||||
relevance: 0,
|
||||
keywords: {
|
||||
$pattern: /[\w\.]+/,
|
||||
keyword: KEYWORDS.concat(COMBOS),
|
||||
literal: LITERALS,
|
||||
type: TYPES
|
||||
},
|
||||
},
|
||||
{
|
||||
className: "type",
|
||||
begin: regex.either(...MULTI_WORD_TYPES)
|
||||
},
|
||||
FUNCTION_CALL,
|
||||
VARIABLE,
|
||||
STRING,
|
||||
QUOTED_IDENTIFIER,
|
||||
hljs.C_NUMBER_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
COMMENT_MODE,
|
||||
OPERATOR
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default sql;
|
||||
Vendored
+241
@@ -0,0 +1,241 @@
|
||||
/*
|
||||
Language: HTML, XML
|
||||
Website: https://www.w3.org/XML/
|
||||
Category: common, web
|
||||
Audit: 2020
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function xml(hljs) {
|
||||
const regex = hljs.regex;
|
||||
// XML names can have the following additional letters: https://www.w3.org/TR/xml/#NT-NameChar
|
||||
// OTHER_NAME_CHARS = /[:\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]/;
|
||||
// Element names start with NAME_START_CHAR followed by optional other Unicode letters, ASCII digits, hyphens, underscores, and periods
|
||||
// const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/);;
|
||||
// const XML_IDENT_RE = /[A-Z_a-z:\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]+/;
|
||||
// const TAG_NAME_RE = regex.concat(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/, regex.optional(/[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*:/), /[A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*/);
|
||||
// however, to cater for performance and more Unicode support rely simply on the Unicode letter class
|
||||
const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u);
|
||||
const XML_IDENT_RE = /[\p{L}0-9._:-]+/u;
|
||||
const XML_ENTITIES = {
|
||||
className: 'symbol',
|
||||
begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/
|
||||
};
|
||||
const XML_META_KEYWORDS = {
|
||||
begin: /\s/,
|
||||
contains: [
|
||||
{
|
||||
className: 'keyword',
|
||||
begin: /#?[a-z_][a-z1-9_-]+/,
|
||||
illegal: /\n/
|
||||
}
|
||||
]
|
||||
};
|
||||
const XML_META_PAR_KEYWORDS = hljs.inherit(XML_META_KEYWORDS, {
|
||||
begin: /\(/,
|
||||
end: /\)/
|
||||
});
|
||||
const APOS_META_STRING_MODE = hljs.inherit(hljs.APOS_STRING_MODE, { className: 'string' });
|
||||
const QUOTE_META_STRING_MODE = hljs.inherit(hljs.QUOTE_STRING_MODE, { className: 'string' });
|
||||
const TAG_INTERNALS = {
|
||||
endsWithParent: true,
|
||||
illegal: /</,
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
className: 'attr',
|
||||
begin: XML_IDENT_RE,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
begin: /=\s*/,
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
className: 'string',
|
||||
endsParent: true,
|
||||
variants: [
|
||||
{
|
||||
begin: /"/,
|
||||
end: /"/,
|
||||
contains: [ XML_ENTITIES ]
|
||||
},
|
||||
{
|
||||
begin: /'/,
|
||||
end: /'/,
|
||||
contains: [ XML_ENTITIES ]
|
||||
},
|
||||
{ begin: /[^\s"'=<>`]+/ }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
return {
|
||||
name: 'HTML, XML',
|
||||
aliases: [
|
||||
'html',
|
||||
'xhtml',
|
||||
'rss',
|
||||
'atom',
|
||||
'xjb',
|
||||
'xsd',
|
||||
'xsl',
|
||||
'plist',
|
||||
'wsf',
|
||||
'svg'
|
||||
],
|
||||
case_insensitive: true,
|
||||
unicodeRegex: true,
|
||||
contains: [
|
||||
{
|
||||
className: 'meta',
|
||||
begin: /<![a-z]/,
|
||||
end: />/,
|
||||
relevance: 10,
|
||||
contains: [
|
||||
XML_META_KEYWORDS,
|
||||
QUOTE_META_STRING_MODE,
|
||||
APOS_META_STRING_MODE,
|
||||
XML_META_PAR_KEYWORDS,
|
||||
{
|
||||
begin: /\[/,
|
||||
end: /\]/,
|
||||
contains: [
|
||||
{
|
||||
className: 'meta',
|
||||
begin: /<![a-z]/,
|
||||
end: />/,
|
||||
contains: [
|
||||
XML_META_KEYWORDS,
|
||||
XML_META_PAR_KEYWORDS,
|
||||
QUOTE_META_STRING_MODE,
|
||||
APOS_META_STRING_MODE
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
hljs.COMMENT(
|
||||
/<!--/,
|
||||
/-->/,
|
||||
{ relevance: 10 }
|
||||
),
|
||||
{
|
||||
begin: /<!\[CDATA\[/,
|
||||
end: /\]\]>/,
|
||||
relevance: 10
|
||||
},
|
||||
XML_ENTITIES,
|
||||
// xml processing instructions
|
||||
{
|
||||
className: 'meta',
|
||||
end: /\?>/,
|
||||
variants: [
|
||||
{
|
||||
begin: /<\?xml/,
|
||||
relevance: 10,
|
||||
contains: [
|
||||
QUOTE_META_STRING_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /<\?[a-z][a-z0-9]+/,
|
||||
}
|
||||
]
|
||||
|
||||
},
|
||||
{
|
||||
className: 'tag',
|
||||
/*
|
||||
The lookahead pattern (?=...) ensures that 'begin' only matches
|
||||
'<style' as a single word, followed by a whitespace or an
|
||||
ending bracket.
|
||||
*/
|
||||
begin: /<style(?=\s|>)/,
|
||||
end: />/,
|
||||
keywords: { name: 'style' },
|
||||
contains: [ TAG_INTERNALS ],
|
||||
starts: {
|
||||
end: /<\/style>/,
|
||||
returnEnd: true,
|
||||
subLanguage: [
|
||||
'css',
|
||||
'xml'
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
className: 'tag',
|
||||
// See the comment in the <style tag about the lookahead pattern
|
||||
begin: /<script(?=\s|>)/,
|
||||
end: />/,
|
||||
keywords: { name: 'script' },
|
||||
contains: [ TAG_INTERNALS ],
|
||||
starts: {
|
||||
end: /<\/script>/,
|
||||
returnEnd: true,
|
||||
subLanguage: [
|
||||
'javascript',
|
||||
'handlebars',
|
||||
'xml'
|
||||
]
|
||||
}
|
||||
},
|
||||
// we need this for now for jSX
|
||||
{
|
||||
className: 'tag',
|
||||
begin: /<>|<\/>/
|
||||
},
|
||||
// open tag
|
||||
{
|
||||
className: 'tag',
|
||||
begin: regex.concat(
|
||||
/</,
|
||||
regex.lookahead(regex.concat(
|
||||
TAG_NAME_RE,
|
||||
// <tag/>
|
||||
// <tag>
|
||||
// <tag ...
|
||||
regex.either(/\/>/, />/, /\s/)
|
||||
))
|
||||
),
|
||||
end: /\/?>/,
|
||||
contains: [
|
||||
{
|
||||
className: 'name',
|
||||
begin: TAG_NAME_RE,
|
||||
relevance: 0,
|
||||
starts: TAG_INTERNALS
|
||||
}
|
||||
]
|
||||
},
|
||||
// close tag
|
||||
{
|
||||
className: 'tag',
|
||||
begin: regex.concat(
|
||||
/<\//,
|
||||
regex.lookahead(regex.concat(
|
||||
TAG_NAME_RE, />/
|
||||
))
|
||||
),
|
||||
contains: [
|
||||
{
|
||||
className: 'name',
|
||||
begin: TAG_NAME_RE,
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
begin: />/,
|
||||
relevance: 0,
|
||||
endsParent: true
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
export default xml;
|
||||
Vendored
+6
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user