mirror of
https://github.com/microsoft/playwright.git
synced 2024-08-17 08:00:23 +03:00
chore: bundle small build of highlight.js (#4907)
This follows the "build from source" configuration (https://highlightjs.org/usage/#source) and reduces the footprint from 2mb to 100kb.
This commit is contained in:
parent
6b3dcb01aa
commit
f672033e11
@ -5,6 +5,7 @@ src/generated/*
|
||||
src/server/chromium/protocol.ts
|
||||
src/server/firefox/protocol.ts
|
||||
src/server/webkit/protocol.ts
|
||||
src/third_party/
|
||||
/types/*
|
||||
/index.d.ts
|
||||
utils/generate_types/overrides.d.ts
|
||||
|
5
package-lock.json
generated
5
package-lock.json
generated
@ -4042,11 +4042,6 @@
|
||||
"minimalistic-assert": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"highlight.js": {
|
||||
"version": "10.4.1",
|
||||
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.1.tgz",
|
||||
"integrity": "sha512-yR5lWvNz7c85OhVAEAeFhVCc/GV4C30Fjzc/rCP0aCWzc1UUOPUk55dK/qdwTZHBvMZo+eZ2jpk62ndX/xMFlg=="
|
||||
},
|
||||
"hmac-drbg": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
||||
|
@ -42,7 +42,6 @@
|
||||
"commander": "^6.1.0",
|
||||
"debug": "^4.1.1",
|
||||
"extract-zip": "^2.0.1",
|
||||
"highlight.js": "^10.1.2",
|
||||
"https-proxy-agent": "^5.0.0",
|
||||
"jpeg-js": "^0.4.2",
|
||||
"mime": "^2.4.6",
|
||||
|
@ -17,7 +17,7 @@
|
||||
import * as fs from 'fs';
|
||||
import * as querystring from 'querystring';
|
||||
import { Writable } from 'stream';
|
||||
import { highlight } from 'highlight.js';
|
||||
import * as hljs from '../../third_party/highlightjs/highlightjs';
|
||||
import { CodeGeneratorOutput } from './codeGenerator';
|
||||
|
||||
export class OutputMultiplexer implements CodeGeneratorOutput {
|
||||
@ -73,7 +73,7 @@ export class TerminalOutput implements CodeGeneratorOutput {
|
||||
}
|
||||
|
||||
private _highlight(text: string) {
|
||||
let highlightedCode = highlight(this._language, text).value;
|
||||
let highlightedCode = hljs.highlight(this._language, text).value;
|
||||
highlightedCode = querystring.unescape(highlightedCode);
|
||||
highlightedCode = highlightedCode.replace(/<span class="hljs-keyword">/g, '\x1b[38;5;205m');
|
||||
highlightedCode = highlightedCode.replace(/<span class="hljs-built_in">/g, '\x1b[38;5;220m');
|
||||
|
4
src/third_party/highlightjs/README.md
vendored
Normal file
4
src/third_party/highlightjs/README.md
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
# Highlight.js
|
||||
|
||||
This is a small build of [highlight.js](https://github.com/highlightjs/highlight.js).
|
||||
Pick a [stable release](https://github.com/highlightjs/highlight.js/releases) revision and use `roll.sh` to update.
|
29
src/third_party/highlightjs/highlightjs/LICENSE
vendored
Normal file
29
src/third_party/highlightjs/highlightjs/LICENSE
vendored
Normal file
@ -0,0 +1,29 @@
|
||||
BSD 3-Clause License
|
||||
|
||||
Copyright (c) 2006, Ivan Sagalaev.
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice, this
|
||||
list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the name of the copyright holder nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2378
src/third_party/highlightjs/highlightjs/core.js
vendored
Normal file
2378
src/third_party/highlightjs/highlightjs/core.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2
src/third_party/highlightjs/highlightjs/highlight.js
vendored
Normal file
2
src/third_party/highlightjs/highlightjs/highlight.js
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
// This file has been deprecated in favor of core.js
|
||||
var hljs = require('./core');
|
251
src/third_party/highlightjs/highlightjs/index.d.ts
vendored
Normal file
251
src/third_party/highlightjs/highlightjs/index.d.ts
vendored
Normal file
@ -0,0 +1,251 @@
|
||||
/* eslint-disable no-unused-vars */
|
||||
/* eslint-disable no-use-before-define */
|
||||
// For TS consumers who use Node and don't have dom in their tsconfig lib, import the necessary types here.
|
||||
/// <reference lib="dom" />
|
||||
|
||||
/* Public API */
|
||||
|
||||
// eslint-disable-next-line
|
||||
declare const hljs : HLJSApi;
|
||||
|
||||
type HLJSApi = PublicApi & ModesAPI
|
||||
|
||||
interface VuePlugin {
|
||||
install: (vue: any) => void
|
||||
}
|
||||
|
||||
interface PublicApi {
|
||||
highlight: (languageName: string, code: string, ignoreIllegals?: boolean, continuation?: Mode) => HighlightResult
|
||||
highlightAuto: (code: string, languageSubset?: string[]) => AutoHighlightResult
|
||||
fixMarkup: (html: string) => string
|
||||
highlightBlock: (element: HTMLElement) => void
|
||||
configure: (options: Partial<HLJSOptions>) => void
|
||||
initHighlighting: () => void
|
||||
initHighlightingOnLoad: () => void
|
||||
registerLanguage: (languageName: string, language: LanguageFn) => void
|
||||
listLanguages: () => string[]
|
||||
registerAliases: (aliasList: string | string[], { languageName } : {languageName: string}) => void
|
||||
getLanguage: (languageName: string) => Language | undefined
|
||||
requireLanguage: (languageName: string) => Language | never
|
||||
autoDetection: (languageName: string) => boolean
|
||||
inherit: <T>(original: T, ...args: Record<string, any>[]) => T
|
||||
addPlugin: (plugin: HLJSPlugin) => void
|
||||
debugMode: () => void
|
||||
safeMode: () => void
|
||||
versionString: string
|
||||
vuePlugin: () => VuePlugin
|
||||
}
|
||||
|
||||
interface ModesAPI {
|
||||
SHEBANG: (mode?: Partial<Mode> & {binary?: string | RegExp}) => Mode
|
||||
BACKSLASH_ESCAPE: Mode
|
||||
QUOTE_STRING_MODE: Mode
|
||||
APOS_STRING_MODE: Mode
|
||||
PHRASAL_WORDS_MODE: Mode
|
||||
COMMENT: (begin: string | RegExp, end: string | RegExp, modeOpts?: Mode | {}) => Mode
|
||||
C_LINE_COMMENT_MODE: Mode
|
||||
C_BLOCK_COMMENT_MODE: Mode
|
||||
HASH_COMMENT_MODE: Mode
|
||||
NUMBER_MODE: Mode
|
||||
C_NUMBER_MODE: Mode
|
||||
BINARY_NUMBER_MODE: Mode
|
||||
CSS_NUMBER_MODE: Mode
|
||||
REGEXP_MODE: Mode
|
||||
TITLE_MODE: Mode
|
||||
UNDERSCORE_TITLE_MODE: Mode
|
||||
METHOD_GUARD: Mode
|
||||
END_SAME_AS_BEGIN: (mode: Mode) => Mode
|
||||
// built in regex
|
||||
IDENT_RE: string
|
||||
UNDERSCORE_IDENT_RE: string
|
||||
NUMBER_RE: string
|
||||
C_NUMBER_RE: string
|
||||
BINARY_NUMBER_RE: string
|
||||
RE_STARTERS_RE: string
|
||||
}
|
||||
|
||||
type LanguageFn = (hljs?: HLJSApi) => Language
|
||||
type CompilerExt = (mode: Mode, parent: Mode | Language | null) => void
|
||||
|
||||
interface HighlightResult {
|
||||
relevance : number
|
||||
value : string
|
||||
language? : string
|
||||
emitter : Emitter
|
||||
illegal : boolean
|
||||
top? : Language | CompiledMode
|
||||
illegalBy? : illegalData
|
||||
sofar? : string
|
||||
errorRaised? : Error
|
||||
// * for auto-highlight
|
||||
second_best? : Omit<HighlightResult, 'second_best'>
|
||||
code?: string
|
||||
}
|
||||
interface AutoHighlightResult extends HighlightResult {}
|
||||
|
||||
interface illegalData {
|
||||
msg: string
|
||||
context: string
|
||||
mode: CompiledMode
|
||||
}
|
||||
|
||||
type BeforeHighlightContext = {
|
||||
code: string,
|
||||
language: string,
|
||||
result?: HighlightResult
|
||||
}
|
||||
type PluginEvent = keyof HLJSPlugin;
|
||||
type HLJSPlugin = {
|
||||
'after:highlight'?: (result: HighlightResult) => void,
|
||||
'before:highlight'?: (context: BeforeHighlightContext) => void,
|
||||
'after:highlightBlock'?: (data: { result: HighlightResult}) => void,
|
||||
'before:highlightBlock'?: (data: { block: Element, language: string}) => void,
|
||||
}
|
||||
|
||||
interface EmitterConstructor {
|
||||
new (opts: any): Emitter
|
||||
}
|
||||
|
||||
interface HLJSOptions {
|
||||
noHighlightRe: RegExp
|
||||
languageDetectRe: RegExp
|
||||
classPrefix: string
|
||||
tabReplace?: string
|
||||
useBR: boolean
|
||||
languages?: string[]
|
||||
__emitter: EmitterConstructor
|
||||
}
|
||||
|
||||
interface CallbackResponse {
|
||||
data: Record<string, any>
|
||||
ignoreMatch: () => void
|
||||
}
|
||||
|
||||
/************
|
||||
PRIVATE API
|
||||
************/
|
||||
|
||||
/* for jsdoc annotations in the JS source files */
|
||||
|
||||
type AnnotatedError = Error & {mode?: Mode | Language, languageName?: string, badRule?: Mode}
|
||||
|
||||
type ModeCallback = (match: RegExpMatchArray, response: CallbackResponse) => void
|
||||
type HighlightedHTMLElement = HTMLElement & {result?: object, second_best?: object, parentNode: HTMLElement}
|
||||
type EnhancedMatch = RegExpMatchArray & {rule: CompiledMode, type: MatchType}
|
||||
type MatchType = "begin" | "end" | "illegal"
|
||||
|
||||
interface Emitter {
|
||||
addKeyword(text: string, kind: string): void
|
||||
addText(text: string): void
|
||||
toHTML(): string
|
||||
finalize(): void
|
||||
closeAllNodes(): void
|
||||
openNode(kind: string): void
|
||||
closeNode(): void
|
||||
addSublanguage(emitter: Emitter, subLanguageName: string): void
|
||||
}
|
||||
|
||||
/* modes */
|
||||
|
||||
interface ModeCallbacks {
|
||||
"on:end"?: Function,
|
||||
"on:begin"?: ModeCallback
|
||||
}
|
||||
|
||||
interface Mode extends ModeCallbacks, ModeDetails {
|
||||
|
||||
}
|
||||
|
||||
interface LanguageDetail {
|
||||
name?: string
|
||||
rawDefinition?: () => Language
|
||||
aliases?: string[]
|
||||
disableAutodetect?: boolean
|
||||
contains: (Mode)[]
|
||||
case_insensitive?: boolean
|
||||
keywords?: Record<string, any> | string
|
||||
compiled?: boolean,
|
||||
exports?: any,
|
||||
classNameAliases?: Record<string, string>
|
||||
compilerExtensions?: CompilerExt[]
|
||||
supersetOf?: string
|
||||
}
|
||||
|
||||
type Language = LanguageDetail & Partial<Mode>
|
||||
|
||||
interface CompiledLanguage extends LanguageDetail, CompiledMode {
|
||||
compiled: true
|
||||
contains: CompiledMode[]
|
||||
keywords: Record<string, any>
|
||||
}
|
||||
|
||||
type KeywordData = [string, number];
|
||||
type KeywordDict = Record<string, KeywordData>
|
||||
|
||||
type CompiledMode = Omit<Mode, 'contains'> &
|
||||
{
|
||||
contains: CompiledMode[]
|
||||
keywords: KeywordDict
|
||||
data: Record<string, any>
|
||||
terminatorEnd: string
|
||||
keywordPatternRe: RegExp
|
||||
beginRe: RegExp
|
||||
endRe: RegExp
|
||||
illegalRe: RegExp
|
||||
matcher: any
|
||||
compiled: true
|
||||
starts?: CompiledMode
|
||||
parent?: CompiledMode
|
||||
}
|
||||
|
||||
interface ModeDetails {
|
||||
begin?: RegExp | string
|
||||
match?: RegExp | string
|
||||
end?: RegExp | string
|
||||
className?: string
|
||||
contains?: ("self" | Mode)[]
|
||||
endsParent?: boolean
|
||||
endsWithParent?: boolean
|
||||
endSameAsBegin?: boolean
|
||||
skip?: boolean
|
||||
excludeBegin?: boolean
|
||||
excludeEnd?: boolean
|
||||
returnBegin?: boolean
|
||||
returnEnd?: boolean
|
||||
__beforeBegin?: Function
|
||||
parent?: Mode
|
||||
starts?:Mode
|
||||
lexemes?: string | RegExp
|
||||
keywords?: Record<string, any> | string
|
||||
beginKeywords?: string
|
||||
relevance?: number
|
||||
illegal?: string | RegExp | Array<string | RegExp>
|
||||
variants?: Mode[]
|
||||
cachedVariants?: Mode[]
|
||||
// parsed
|
||||
subLanguage?: string | string[]
|
||||
compiled?: boolean
|
||||
label?: string
|
||||
}
|
||||
|
||||
// deprecated API since v10
|
||||
// declare module 'highlight.js/lib/highlight.js';
|
||||
|
||||
declare module 'highlight.js' {
|
||||
export = hljs;
|
||||
}
|
||||
|
||||
declare module 'highlight.js/lib/core' {
|
||||
export = hljs;
|
||||
}
|
||||
|
||||
declare module 'highlight.js/lib/core.js' {
|
||||
export = hljs;
|
||||
}
|
||||
|
||||
declare module 'highlight.js/lib/languages/*' {
|
||||
export default function(hljs?: HLJSApi): LanguageDetail;
|
||||
}
|
||||
|
||||
export = hljs;
|
||||
|
7
src/third_party/highlightjs/highlightjs/index.js
vendored
Normal file
7
src/third_party/highlightjs/highlightjs/index.js
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
var hljs = require('./core');
|
||||
|
||||
hljs.registerLanguage('javascript', require('./languages/javascript'));
|
||||
hljs.registerLanguage('python', require('./languages/python'));
|
||||
hljs.registerLanguage('csharp', require('./languages/csharp'));
|
||||
|
||||
module.exports = hljs;
|
367
src/third_party/highlightjs/highlightjs/languages/csharp.js
vendored
Normal file
367
src/third_party/highlightjs/highlightjs/languages/csharp.js
vendored
Normal file
@ -0,0 +1,367 @@
|
||||
/*
|
||||
Language: C#
|
||||
Author: Jason Diamond <jason@diamond.name>
|
||||
Contributor: Nicolas LLOBERA <nllobera@gmail.com>, Pieter Vantorre <pietervantorre@gmail.com>, David Pine <david.pine@microsoft.com>
|
||||
Website: https://docs.microsoft.com/en-us/dotnet/csharp/
|
||||
Category: common
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function csharp(hljs) {
|
||||
var BUILT_IN_KEYWORDS = [
|
||||
'bool',
|
||||
'byte',
|
||||
'char',
|
||||
'decimal',
|
||||
'delegate',
|
||||
'double',
|
||||
'dynamic',
|
||||
'enum',
|
||||
'float',
|
||||
'int',
|
||||
'long',
|
||||
'nint',
|
||||
'nuint',
|
||||
'object',
|
||||
'sbyte',
|
||||
'short',
|
||||
'string',
|
||||
'ulong',
|
||||
'unit',
|
||||
'ushort'
|
||||
];
|
||||
var FUNCTION_MODIFIERS = [
|
||||
'public',
|
||||
'private',
|
||||
'protected',
|
||||
'static',
|
||||
'internal',
|
||||
'protected',
|
||||
'abstract',
|
||||
'async',
|
||||
'extern',
|
||||
'override',
|
||||
'unsafe',
|
||||
'virtual',
|
||||
'new',
|
||||
'sealed',
|
||||
'partial'
|
||||
];
|
||||
var LITERAL_KEYWORDS = [
|
||||
'default',
|
||||
'false',
|
||||
'null',
|
||||
'true'
|
||||
];
|
||||
var NORMAL_KEYWORDS = [
|
||||
'abstract',
|
||||
'as',
|
||||
'base',
|
||||
'break',
|
||||
'case',
|
||||
'class',
|
||||
'const',
|
||||
'continue',
|
||||
'do',
|
||||
'else',
|
||||
'event',
|
||||
'explicit',
|
||||
'extern',
|
||||
'finally',
|
||||
'fixed',
|
||||
'for',
|
||||
'foreach',
|
||||
'goto',
|
||||
'if',
|
||||
'implicit',
|
||||
'in',
|
||||
'interface',
|
||||
'internal',
|
||||
'is',
|
||||
'lock',
|
||||
'namespace',
|
||||
'new',
|
||||
'operator',
|
||||
'out',
|
||||
'override',
|
||||
'params',
|
||||
'private',
|
||||
'protected',
|
||||
'public',
|
||||
'readonly',
|
||||
'record',
|
||||
'ref',
|
||||
'return',
|
||||
'sealed',
|
||||
'sizeof',
|
||||
'stackalloc',
|
||||
'static',
|
||||
'struct',
|
||||
'switch',
|
||||
'this',
|
||||
'throw',
|
||||
'try',
|
||||
'typeof',
|
||||
'unchecked',
|
||||
'unsafe',
|
||||
'using',
|
||||
'virtual',
|
||||
'void',
|
||||
'volatile',
|
||||
'while'
|
||||
];
|
||||
var CONTEXTUAL_KEYWORDS = [
|
||||
'add',
|
||||
'alias',
|
||||
'and',
|
||||
'ascending',
|
||||
'async',
|
||||
'await',
|
||||
'by',
|
||||
'descending',
|
||||
'equals',
|
||||
'from',
|
||||
'get',
|
||||
'global',
|
||||
'group',
|
||||
'init',
|
||||
'into',
|
||||
'join',
|
||||
'let',
|
||||
'nameof',
|
||||
'not',
|
||||
'notnull',
|
||||
'on',
|
||||
'or',
|
||||
'orderby',
|
||||
'partial',
|
||||
'remove',
|
||||
'select',
|
||||
'set',
|
||||
'unmanaged',
|
||||
'value|0',
|
||||
'var',
|
||||
'when',
|
||||
'where',
|
||||
'with',
|
||||
'yield'
|
||||
];
|
||||
|
||||
var KEYWORDS = {
|
||||
keyword: NORMAL_KEYWORDS.concat(CONTEXTUAL_KEYWORDS).join(' '),
|
||||
built_in: BUILT_IN_KEYWORDS.join(' '),
|
||||
literal: LITERAL_KEYWORDS.join(' ')
|
||||
};
|
||||
var TITLE_MODE = hljs.inherit(hljs.TITLE_MODE, {begin: '[a-zA-Z](\\.?\\w)*'});
|
||||
var NUMBERS = {
|
||||
className: 'number',
|
||||
variants: [
|
||||
{ begin: '\\b(0b[01\']+)' },
|
||||
{ begin: '(-?)\\b([\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)(u|U|l|L|ul|UL|f|F|b|B)' },
|
||||
{ begin: '(-?)(\\b0[xX][a-fA-F0-9\']+|(\\b[\\d\']+(\\.[\\d\']*)?|\\.[\\d\']+)([eE][-+]?[\\d\']+)?)' }
|
||||
],
|
||||
relevance: 0
|
||||
};
|
||||
var VERBATIM_STRING = {
|
||||
className: 'string',
|
||||
begin: '@"', end: '"',
|
||||
contains: [{begin: '""'}]
|
||||
};
|
||||
var VERBATIM_STRING_NO_LF = hljs.inherit(VERBATIM_STRING, {illegal: /\n/});
|
||||
var SUBST = {
|
||||
className: 'subst',
|
||||
begin: /\{/, end: /\}/,
|
||||
keywords: KEYWORDS
|
||||
};
|
||||
var SUBST_NO_LF = hljs.inherit(SUBST, {illegal: /\n/});
|
||||
var INTERPOLATED_STRING = {
|
||||
className: 'string',
|
||||
begin: /\$"/, end: '"',
|
||||
illegal: /\n/,
|
||||
contains: [{begin: /\{\{/}, {begin: /\}\}/}, hljs.BACKSLASH_ESCAPE, SUBST_NO_LF]
|
||||
};
|
||||
var INTERPOLATED_VERBATIM_STRING = {
|
||||
className: 'string',
|
||||
begin: /\$@"/, end: '"',
|
||||
contains: [{begin: /\{\{/}, {begin: /\}\}/}, {begin: '""'}, SUBST]
|
||||
};
|
||||
var INTERPOLATED_VERBATIM_STRING_NO_LF = hljs.inherit(INTERPOLATED_VERBATIM_STRING, {
|
||||
illegal: /\n/,
|
||||
contains: [{begin: /\{\{/}, {begin: /\}\}/}, {begin: '""'}, SUBST_NO_LF]
|
||||
});
|
||||
SUBST.contains = [
|
||||
INTERPOLATED_VERBATIM_STRING,
|
||||
INTERPOLATED_STRING,
|
||||
VERBATIM_STRING,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
NUMBERS,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
];
|
||||
SUBST_NO_LF.contains = [
|
||||
INTERPOLATED_VERBATIM_STRING_NO_LF,
|
||||
INTERPOLATED_STRING,
|
||||
VERBATIM_STRING_NO_LF,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
NUMBERS,
|
||||
hljs.inherit(hljs.C_BLOCK_COMMENT_MODE, {illegal: /\n/})
|
||||
];
|
||||
var STRING = {
|
||||
variants: [
|
||||
INTERPOLATED_VERBATIM_STRING,
|
||||
INTERPOLATED_STRING,
|
||||
VERBATIM_STRING,
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE
|
||||
]
|
||||
};
|
||||
|
||||
var GENERIC_MODIFIER = {
|
||||
begin: "<",
|
||||
end: ">",
|
||||
contains: [
|
||||
{ beginKeywords: "in out"},
|
||||
TITLE_MODE
|
||||
]
|
||||
};
|
||||
var TYPE_IDENT_RE = hljs.IDENT_RE + '(<' + hljs.IDENT_RE + '(\\s*,\\s*' + hljs.IDENT_RE + ')*>)?(\\[\\])?';
|
||||
var AT_IDENTIFIER = {
|
||||
// prevents expressions like `@class` from incorrect flagging
|
||||
// `class` as a keyword
|
||||
begin: "@" + hljs.IDENT_RE,
|
||||
relevance: 0
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'C#',
|
||||
aliases: ['cs', 'c#'],
|
||||
keywords: KEYWORDS,
|
||||
illegal: /::/,
|
||||
contains: [
|
||||
hljs.COMMENT(
|
||||
'///',
|
||||
'$',
|
||||
{
|
||||
returnBegin: true,
|
||||
contains: [
|
||||
{
|
||||
className: 'doctag',
|
||||
variants: [
|
||||
{
|
||||
begin: '///', relevance: 0
|
||||
},
|
||||
{
|
||||
begin: '<!--|-->'
|
||||
},
|
||||
{
|
||||
begin: '</?', end: '>'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
),
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE,
|
||||
{
|
||||
className: 'meta',
|
||||
begin: '#', end: '$',
|
||||
keywords: {
|
||||
'meta-keyword': 'if else elif endif define undef warning error line region endregion pragma checksum'
|
||||
}
|
||||
},
|
||||
STRING,
|
||||
NUMBERS,
|
||||
{
|
||||
beginKeywords: 'class interface',
|
||||
relevance: 0,
|
||||
end: /[{;=]/,
|
||||
illegal: /[^\s:,]/,
|
||||
contains: [
|
||||
{ beginKeywords: "where class" },
|
||||
TITLE_MODE,
|
||||
GENERIC_MODIFIER,
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
beginKeywords: 'namespace',
|
||||
relevance: 0,
|
||||
end: /[{;=]/,
|
||||
illegal: /[^\s:]/,
|
||||
contains: [
|
||||
TITLE_MODE,
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
beginKeywords: 'record',
|
||||
relevance: 0,
|
||||
end: /[{;=]/,
|
||||
illegal: /[^\s:]/,
|
||||
contains: [
|
||||
TITLE_MODE,
|
||||
GENERIC_MODIFIER,
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
// [Attributes("")]
|
||||
className: 'meta',
|
||||
begin: '^\\s*\\[', excludeBegin: true, end: '\\]', excludeEnd: true,
|
||||
contains: [
|
||||
{className: 'meta-string', begin: /"/, end: /"/}
|
||||
]
|
||||
},
|
||||
{
|
||||
// Expression keywords prevent 'keyword Name(...)' from being
|
||||
// recognized as a function definition
|
||||
beginKeywords: 'new return throw await else',
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'function',
|
||||
begin: '(' + TYPE_IDENT_RE + '\\s+)+' + hljs.IDENT_RE + '\\s*(<.+>\\s*)?\\(', returnBegin: true,
|
||||
end: /\s*[{;=]/, excludeEnd: true,
|
||||
keywords: KEYWORDS,
|
||||
contains: [
|
||||
// prevents these from being highlighted `title`
|
||||
{
|
||||
beginKeywords: FUNCTION_MODIFIERS.join(" "),
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
begin: hljs.IDENT_RE + '\\s*(<.+>\\s*)?\\(', returnBegin: true,
|
||||
contains: [
|
||||
hljs.TITLE_MODE,
|
||||
GENERIC_MODIFIER
|
||||
],
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'params',
|
||||
begin: /\(/, end: /\)/,
|
||||
excludeBegin: true,
|
||||
excludeEnd: true,
|
||||
keywords: KEYWORDS,
|
||||
relevance: 0,
|
||||
contains: [
|
||||
STRING,
|
||||
NUMBERS,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
hljs.C_LINE_COMMENT_MODE,
|
||||
hljs.C_BLOCK_COMMENT_MODE
|
||||
]
|
||||
},
|
||||
AT_IDENTIFIER
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = csharp;
|
601
src/third_party/highlightjs/highlightjs/languages/javascript.js
vendored
Normal file
601
src/third_party/highlightjs/highlightjs/languages/javascript.js
vendored
Normal file
@ -0,0 +1,601 @@
|
||||
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"
|
||||
];
|
||||
|
||||
const TYPES = [
|
||||
"Intl",
|
||||
"DataView",
|
||||
"Number",
|
||||
"Math",
|
||||
"Date",
|
||||
"String",
|
||||
"RegExp",
|
||||
"Object",
|
||||
"Function",
|
||||
"Boolean",
|
||||
"Error",
|
||||
"Symbol",
|
||||
"Set",
|
||||
"Map",
|
||||
"WeakSet",
|
||||
"WeakMap",
|
||||
"Proxy",
|
||||
"Reflect",
|
||||
"JSON",
|
||||
"Promise",
|
||||
"Float64Array",
|
||||
"Int16Array",
|
||||
"Int32Array",
|
||||
"Int8Array",
|
||||
"Uint16Array",
|
||||
"Uint32Array",
|
||||
"Float32Array",
|
||||
"Array",
|
||||
"Uint8Array",
|
||||
"Uint8ClampedArray",
|
||||
"ArrayBuffer"
|
||||
];
|
||||
|
||||
const ERROR_TYPES = [
|
||||
"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",
|
||||
"module",
|
||||
"global" // Node.js
|
||||
];
|
||||
|
||||
const BUILT_INS = [].concat(
|
||||
BUILT_IN_GLOBALS,
|
||||
BUILT_IN_VARIABLES,
|
||||
TYPES,
|
||||
ERROR_TYPES
|
||||
);
|
||||
|
||||
/**
|
||||
* @param {string} value
|
||||
* @returns {RegExp}
|
||||
* */
|
||||
|
||||
/**
|
||||
* @param {RegExp | string } re
|
||||
* @returns {string}
|
||||
*/
|
||||
function source(re) {
|
||||
if (!re) return null;
|
||||
if (typeof re === "string") return re;
|
||||
|
||||
return re.source;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {RegExp | string } re
|
||||
* @returns {string}
|
||||
*/
|
||||
function lookahead(re) {
|
||||
return concat('(?=', re, ')');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {...(RegExp | string) } args
|
||||
* @returns {string}
|
||||
*/
|
||||
function concat(...args) {
|
||||
const joined = args.map((x) => source(x)).join("");
|
||||
return joined;
|
||||
}
|
||||
|
||||
/*
|
||||
Language: JavaScript
|
||||
Description: JavaScript (JS) is a lightweight, interpreted, or just-in-time compiled programming language with first-class functions.
|
||||
Category: common, scripting
|
||||
Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript
|
||||
*/
|
||||
|
||||
/** @type LanguageFn */
|
||||
function javascript(hljs) {
|
||||
/**
|
||||
* 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: '</>'
|
||||
};
|
||||
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];
|
||||
// nested type?
|
||||
// HTML should not include another raw `<` inside a tag
|
||||
// But a type might: `<Array<Array<number>>`, etc.
|
||||
if (nextChar === "<") {
|
||||
response.ignoreMatch();
|
||||
return;
|
||||
}
|
||||
// <something>
|
||||
// This is now either a tag or a type.
|
||||
if (nextChar === ">") {
|
||||
// if we cannot find a matching closing tag, then we
|
||||
// will ignore it
|
||||
if (!hasClosingTag(match, { after: afterMatchIndex })) {
|
||||
response.ignoreMatch();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
const KEYWORDS$1 = {
|
||||
$pattern: IDENT_RE,
|
||||
keyword: KEYWORDS.join(" "),
|
||||
literal: LITERALS.join(" "),
|
||||
built_in: BUILT_INS.join(" ")
|
||||
};
|
||||
|
||||
// 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 TEMPLATE_STRING = {
|
||||
className: 'string',
|
||||
begin: '`',
|
||||
end: '`',
|
||||
contains: [
|
||||
hljs.BACKSLASH_ESCAPE,
|
||||
SUBST
|
||||
]
|
||||
};
|
||||
const JSDOC_COMMENT = hljs.COMMENT(
|
||||
/\/\*\*(?!\/)/,
|
||||
'\\*/',
|
||||
{
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
className: 'doctag',
|
||||
begin: '@[A-Za-z]+',
|
||||
contains: [
|
||||
{
|
||||
className: 'type',
|
||||
begin: '\\{',
|
||||
end: '\\}',
|
||||
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,
|
||||
TEMPLATE_STRING,
|
||||
NUMBER,
|
||||
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
|
||||
};
|
||||
|
||||
return {
|
||||
name: 'Javascript',
|
||||
aliases: ['js', 'jsx', 'mjs', 'cjs'],
|
||||
keywords: KEYWORDS$1,
|
||||
// this will be extended by TypeScript
|
||||
exports: { PARAMS_CONTAINS },
|
||||
illegal: /#(?![$_A-z])/,
|
||||
contains: [
|
||||
hljs.SHEBANG({
|
||||
label: "shebang",
|
||||
binary: "node",
|
||||
relevance: 5
|
||||
}),
|
||||
{
|
||||
label: "use_strict",
|
||||
className: 'meta',
|
||||
relevance: 10,
|
||||
begin: /^\s*['"]use (strict|asm)['"]/
|
||||
},
|
||||
hljs.APOS_STRING_MODE,
|
||||
hljs.QUOTE_STRING_MODE,
|
||||
HTML_TEMPLATE,
|
||||
CSS_TEMPLATE,
|
||||
TEMPLATE_STRING,
|
||||
COMMENT,
|
||||
NUMBER,
|
||||
{ // object attr container
|
||||
begin: concat(/[{,\n]\s*/,
|
||||
// we need to look ahead to make sure that we actually have an
|
||||
// attribute coming up so we don't steal a comma from a potential
|
||||
// "value" container
|
||||
//
|
||||
// NOTE: this might not work how you think. We don't actually always
|
||||
// enter this mode and stay. Instead it might merely match `,
|
||||
// <comments up next>` and then immediately end after the , because it
|
||||
// fails to find any actual attrs. But this still does the job because
|
||||
// it prevents the value contain rule from grabbing this instead and
|
||||
// prevening this rule from firing when we actually DO have keys.
|
||||
lookahead(concat(
|
||||
// we also need to allow for multiple possible comments inbetween
|
||||
// the first key:value pairing
|
||||
/(((\/\/.*$)|(\/\*(\*[^/]|[^*])*\*\/))\s*)*/,
|
||||
IDENT_RE$1 + '\\s*:'))),
|
||||
relevance: 0,
|
||||
contains: [
|
||||
{
|
||||
className: 'attr',
|
||||
begin: IDENT_RE$1 + lookahead('\\s*:'),
|
||||
relevance: 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{ // "value" container
|
||||
begin: '(' + hljs.RE_STARTERS_RE + '|\\b(case|return|throw)\\b)\\s*',
|
||||
keywords: 'return throw case',
|
||||
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: '(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)|' + hljs.UNDERSCORE_IDENT_RE + ')\\s*=>',
|
||||
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
|
||||
},
|
||||
{
|
||||
className: '',
|
||||
begin: /\s/,
|
||||
end: /\s*/,
|
||||
skip: true
|
||||
},
|
||||
{ // JSX
|
||||
variants: [
|
||||
{ begin: FRAGMENT.begin, end: FRAGMENT.end },
|
||||
{
|
||||
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']
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
relevance: 0
|
||||
},
|
||||
{
|
||||
className: 'function',
|
||||
beginKeywords: 'function',
|
||||
end: /[{;]/,
|
||||
excludeEnd: true,
|
||||
keywords: KEYWORDS$1,
|
||||
contains: [
|
||||
'self',
|
||||
hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1 }),
|
||||
PARAMS
|
||||
],
|
||||
illegal: /%/
|
||||
},
|
||||
{
|
||||
// prevent this from getting swallowed up by function
|
||||
// since they appear "function like"
|
||||
beginKeywords: "while if switch catch for"
|
||||
},
|
||||
{
|
||||
className: 'function',
|
||||
// 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: hljs.UNDERSCORE_IDENT_RE +
|
||||
'\\(' + // first parens
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*(\\(' +
|
||||
'[^()]*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)[^()]*)*' +
|
||||
'\\)\\s*\\{', // end parens
|
||||
returnBegin:true,
|
||||
contains: [
|
||||
PARAMS,
|
||||
hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1 }),
|
||||
]
|
||||
},
|
||||
// hack: prevents detection of keywords in some circumstances
|
||||
// .keyword()
|
||||
// $keyword = x
|
||||
{
|
||||
variants: [
|
||||
{ begin: '\\.' + IDENT_RE$1 },
|
||||
{ begin: '\\$' + IDENT_RE$1 }
|
||||
],
|
||||
relevance: 0
|
||||
},
|
||||
{ // ES6 class
|
||||
className: 'class',
|
||||
beginKeywords: 'class',
|
||||
end: /[{;=]/,
|
||||
excludeEnd: true,
|
||||
illegal: /[:"[\]]/,
|
||||
contains: [
|
||||
{ beginKeywords: 'extends' },
|
||||
hljs.UNDERSCORE_TITLE_MODE
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /\b(?=constructor)/,
|
||||
end: /[{;]/,
|
||||
excludeEnd: true,
|
||||
contains: [
|
||||
hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1 }),
|
||||
'self',
|
||||
PARAMS
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: '(get|set)\\s+(?=' + IDENT_RE$1 + '\\()',
|
||||
end: /\{/,
|
||||
keywords: "get set",
|
||||
contains: [
|
||||
hljs.inherit(hljs.TITLE_MODE, { begin: IDENT_RE$1 }),
|
||||
{ begin: /\(\)/ }, // eat to avoid empty params
|
||||
PARAMS
|
||||
]
|
||||
},
|
||||
{
|
||||
begin: /\$[(.]/ // relevance booster for a pattern common to JS libs: `$(something)` and `$.something`
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = javascript;
|
289
src/third_party/highlightjs/highlightjs/languages/python.js
vendored
Normal file
289
src/third_party/highlightjs/highlightjs/languages/python.js
vendored
Normal file
@ -0,0 +1,289 @@
|
||||
/*
|
||||
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 RESERVED_WORDS = [
|
||||
'and',
|
||||
'as',
|
||||
'assert',
|
||||
'async',
|
||||
'await',
|
||||
'break',
|
||||
'class',
|
||||
'continue',
|
||||
'def',
|
||||
'del',
|
||||
'elif',
|
||||
'else',
|
||||
'except',
|
||||
'finally',
|
||||
'for',
|
||||
'',
|
||||
'from',
|
||||
'global',
|
||||
'if',
|
||||
'import',
|
||||
'in',
|
||||
'is',
|
||||
'lambda',
|
||||
'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',
|
||||
];
|
||||
|
||||
const KEYWORDS = {
|
||||
keyword: RESERVED_WORDS.join(' '),
|
||||
built_in: BUILT_INS.join(' '),
|
||||
literal: LITERALS.join(' ')
|
||||
};
|
||||
|
||||
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})\\.`;
|
||||
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]?\\b` },
|
||||
{ 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]?\\b' },
|
||||
{ begin: '\\b0[bB](_?[01])+[lL]?\\b' },
|
||||
{ begin: '\\b0[oO](_?[0-7])+[lL]?\\b' },
|
||||
{ begin: '\\b0[xX](_?[0-9a-fA-F])+[lL]?\\b' },
|
||||
|
||||
// imagnumber (digitpart-based)
|
||||
// https://docs.python.org/3.9/reference/lexical_analysis.html#imaginary-literals
|
||||
{ begin: `\\b(${digitpart})[jJ]\\b` },
|
||||
]
|
||||
};
|
||||
|
||||
const PARAMS = {
|
||||
className: 'params',
|
||||
variants: [
|
||||
// Exclude params at functions without params
|
||||
{begin: /\(\s*\)/, skip: true, className: null },
|
||||
{
|
||||
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'],
|
||||
keywords: KEYWORDS,
|
||||
illegal: /(<\/|->|\?)|=>/,
|
||||
contains: [
|
||||
PROMPT,
|
||||
NUMBER,
|
||||
// eat "if" prior to string so that it won't accidentally be
|
||||
// labeled as an f-string as in:
|
||||
{ begin: /\bself\b/, }, // very common convention
|
||||
{ beginKeywords: "if", relevance: 0 },
|
||||
STRING,
|
||||
hljs.HASH_COMMENT_MODE,
|
||||
{
|
||||
variants: [
|
||||
{className: 'function', beginKeywords: 'def'},
|
||||
{className: 'class', beginKeywords: 'class'}
|
||||
],
|
||||
end: /:/,
|
||||
illegal: /[${=;\n,]/,
|
||||
contains: [
|
||||
hljs.UNDERSCORE_TITLE_MODE,
|
||||
PARAMS,
|
||||
{
|
||||
begin: /->/, endsWithParent: true,
|
||||
keywords: 'None'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
className: 'meta',
|
||||
begin: /^[\t ]*@/, end: /(?=#)|$/,
|
||||
contains: [NUMBER, PARAMS, STRING]
|
||||
},
|
||||
{
|
||||
begin: /\b(print|exec)\(/ // don’t highlight keywords-turned-functions in Python 3
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = python;
|
31
src/third_party/highlightjs/roll.sh
vendored
Executable file
31
src/third_party/highlightjs/roll.sh
vendored
Executable file
@ -0,0 +1,31 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set +x
|
||||
|
||||
# Pick a stable release revision from here:
|
||||
# https://github.com/highlightjs/highlight.js/releases
|
||||
RELEASE_REVISION="af20048d5c601d6e30016d8171317bfdf8a6c242"
|
||||
LANGUAGES="javascript python csharp"
|
||||
|
||||
trap "cd $(pwd -P)" EXIT
|
||||
SCRIPT_PATH="$(cd "$(dirname "$0")" ; pwd -P)"
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
rm -rf ./output
|
||||
mkdir -p ./output
|
||||
|
||||
cd ./output
|
||||
git clone git@github.com:highlightjs/highlight.js.git
|
||||
cd ./highlight.js
|
||||
git checkout ${RELEASE_REVISION}
|
||||
npm install
|
||||
node tools/build.js -t node ${LANGUAGES}
|
||||
|
||||
cd ../..
|
||||
rm -rf ./highlightjs
|
||||
mkdir -p ./highlightjs
|
||||
cp -R output/highlight.js/build/lib/* highlightjs/
|
||||
cp output/highlight.js/build/LICENSE highlightjs/
|
||||
cp output/highlight.js/build/types/index.d.ts highlightjs/
|
||||
echo $'\n'"export = hljs;"$'\n' >> highlightjs/index.d.ts
|
||||
rm -rf ./output
|
@ -62,6 +62,8 @@ async function checkDeps() {
|
||||
function allowImport(from, to) {
|
||||
if (!to.startsWith(src + path.sep))
|
||||
return true;
|
||||
if (!fs.existsSync(to))
|
||||
return true;
|
||||
from = path.relative(root, from).replace(/\\/g, '/');
|
||||
to = path.relative(root, to).replace(/\\/g, '/');
|
||||
const fromDirectory = from.substring(0, from.lastIndexOf('/') + 1);
|
||||
|
Loading…
Reference in New Issue
Block a user