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/chromium/protocol.ts
|
||||||
src/server/firefox/protocol.ts
|
src/server/firefox/protocol.ts
|
||||||
src/server/webkit/protocol.ts
|
src/server/webkit/protocol.ts
|
||||||
|
src/third_party/
|
||||||
/types/*
|
/types/*
|
||||||
/index.d.ts
|
/index.d.ts
|
||||||
utils/generate_types/overrides.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"
|
"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": {
|
"hmac-drbg": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,6 @@
|
||||||
"commander": "^6.1.0",
|
"commander": "^6.1.0",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"extract-zip": "^2.0.1",
|
"extract-zip": "^2.0.1",
|
||||||
"highlight.js": "^10.1.2",
|
|
||||||
"https-proxy-agent": "^5.0.0",
|
"https-proxy-agent": "^5.0.0",
|
||||||
"jpeg-js": "^0.4.2",
|
"jpeg-js": "^0.4.2",
|
||||||
"mime": "^2.4.6",
|
"mime": "^2.4.6",
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as querystring from 'querystring';
|
import * as querystring from 'querystring';
|
||||||
import { Writable } from 'stream';
|
import { Writable } from 'stream';
|
||||||
import { highlight } from 'highlight.js';
|
import * as hljs from '../../third_party/highlightjs/highlightjs';
|
||||||
import { CodeGeneratorOutput } from './codeGenerator';
|
import { CodeGeneratorOutput } from './codeGenerator';
|
||||||
|
|
||||||
export class OutputMultiplexer implements CodeGeneratorOutput {
|
export class OutputMultiplexer implements CodeGeneratorOutput {
|
||||||
|
|
@ -73,7 +73,7 @@ export class TerminalOutput implements CodeGeneratorOutput {
|
||||||
}
|
}
|
||||||
|
|
||||||
private _highlight(text: string) {
|
private _highlight(text: string) {
|
||||||
let highlightedCode = highlight(this._language, text).value;
|
let highlightedCode = hljs.highlight(this._language, text).value;
|
||||||
highlightedCode = querystring.unescape(highlightedCode);
|
highlightedCode = querystring.unescape(highlightedCode);
|
||||||
highlightedCode = highlightedCode.replace(/<span class="hljs-keyword">/g, '\x1b[38;5;205m');
|
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');
|
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) {
|
function allowImport(from, to) {
|
||||||
if (!to.startsWith(src + path.sep))
|
if (!to.startsWith(src + path.sep))
|
||||||
return true;
|
return true;
|
||||||
|
if (!fs.existsSync(to))
|
||||||
|
return true;
|
||||||
from = path.relative(root, from).replace(/\\/g, '/');
|
from = path.relative(root, from).replace(/\\/g, '/');
|
||||||
to = path.relative(root, to).replace(/\\/g, '/');
|
to = path.relative(root, to).replace(/\\/g, '/');
|
||||||
const fromDirectory = from.substring(0, from.lastIndexOf('/') + 1);
|
const fromDirectory = from.substring(0, from.lastIndexOf('/') + 1);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue