|
|
|
|
/*
|
|
|
|
|
Language: Julia
|
|
|
|
|
Description: Julia is a high-level, high-performance, dynamic programming language.
|
|
|
|
|
Author: Kenta Sato <bicycle1885@gmail.com>
|
|
|
|
|
Contributors: Alex Arslan <ararslan@comcast.net>, Fredrik Ekre <ekrefredrik@gmail.com>
|
|
|
|
|
Website: https://julialang.org
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function julia(hljs) {
|
|
|
|
|
// Since there are numerous special names in Julia, it is too much trouble
|
|
|
|
|
// to maintain them by hand. Hence these names (i.e. keywords, literals and
|
|
|
|
|
// built-ins) are automatically generated from Julia 1.5.2 itself through
|
|
|
|
|
// the following scripts for each.
|
|
|
|
|
|
|
|
|
|
// ref: https://docs.julialang.org/en/v1/manual/variables/#Allowed-Variable-Names
|
|
|
|
|
var VARIABLE_NAME_RE = '[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*';
|
|
|
|
|
|
|
|
|
|
// # keyword generator, multi-word keywords handled manually below (Julia 1.5.2)
|
|
|
|
|
// import REPL.REPLCompletions
|
|
|
|
|
// res = String["in", "isa", "where"]
|
|
|
|
|
// for kw in collect(x.keyword for x in REPLCompletions.complete_keyword(""))
|
|
|
|
|
// if !(contains(kw, " ") || kw == "struct")
|
|
|
|
|
// push!(res, kw)
|
|
|
|
|
// end
|
|
|
|
|
// end
|
|
|
|
|
// sort!(unique!(res))
|
|
|
|
|
// foreach(x -> println("\'", x, "\',"), res)
|
|
|
|
|
var KEYWORD_LIST = [
|
|
|
|
|
'baremodule',
|
|
|
|
|
'begin',
|
|
|
|
|
'break',
|
|
|
|
|
'catch',
|
|
|
|
|
'ccall',
|
|
|
|
|
'const',
|
|
|
|
|
'continue',
|
|
|
|
|
'do',
|
|
|
|
|
'else',
|
|
|
|
|
'elseif',
|
|
|
|
|
'end',
|
|
|
|
|
'export',
|
|
|
|
|
'false',
|
|
|
|
|
'finally',
|
|
|
|
|
'for',
|
|
|
|
|
'function',
|
|
|
|
|
'global',
|
|
|
|
|
'if',
|
|
|
|
|
'import',
|
|
|
|
|
'in',
|
|
|
|
|
'isa',
|
|
|
|
|
'let',
|
|
|
|
|
'local',
|
|
|
|
|
'macro',
|
|
|
|
|
'module',
|
|
|
|
|
'quote',
|
|
|
|
|
'return',
|
|
|
|
|
'true',
|
|
|
|
|
'try',
|
|
|
|
|
'using',
|
|
|
|
|
'where',
|
|
|
|
|
'while',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// # literal generator (Julia 1.5.2)
|
|
|
|
|
// import REPL.REPLCompletions
|
|
|
|
|
// res = String["true", "false"]
|
|
|
|
|
// for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),
|
|
|
|
|
// REPLCompletions.completions("", 0)[1])
|
|
|
|
|
// try
|
|
|
|
|
// v = eval(Symbol(compl.mod))
|
|
|
|
|
// if !(v isa Function || v isa Type || v isa TypeVar || v isa Module || v isa Colon)
|
|
|
|
|
// push!(res, compl.mod)
|
|
|
|
|
// end
|
|
|
|
|
// catch e
|
|
|
|
|
// end
|
|
|
|
|
// end
|
|
|
|
|
// sort!(unique!(res))
|
|
|
|
|
// foreach(x -> println("\'", x, "\',"), res)
|
|
|
|
|
var LITERAL_LIST = [
|
|
|
|
|
'ARGS',
|
|
|
|
|
'C_NULL',
|
|
|
|
|
'DEPOT_PATH',
|
|
|
|
|
'ENDIAN_BOM',
|
|
|
|
|
'ENV',
|
|
|
|
|
'Inf',
|
|
|
|
|
'Inf16',
|
|
|
|
|
'Inf32',
|
|
|
|
|
'Inf64',
|
|
|
|
|
'InsertionSort',
|
|
|
|
|
'LOAD_PATH',
|
|
|
|
|
'MergeSort',
|
|
|
|
|
'NaN',
|
|
|
|
|
'NaN16',
|
|
|
|
|
'NaN32',
|
|
|
|
|
'NaN64',
|
|
|
|
|
'PROGRAM_FILE',
|
|
|
|
|
'QuickSort',
|
|
|
|
|
'RoundDown',
|
|
|
|
|
'RoundFromZero',
|
|
|
|
|
'RoundNearest',
|
|
|
|
|
'RoundNearestTiesAway',
|
|
|
|
|
'RoundNearestTiesUp',
|
|
|
|
|
'RoundToZero',
|
|
|
|
|
'RoundUp',
|
|
|
|
|
'VERSION|0',
|
|
|
|
|
'devnull',
|
|
|
|
|
'false',
|
|
|
|
|
'im',
|
|
|
|
|
'missing',
|
|
|
|
|
'nothing',
|
|
|
|
|
'pi',
|
|
|
|
|
'stderr',
|
|
|
|
|
'stdin',
|
|
|
|
|
'stdout',
|
|
|
|
|
'true',
|
|
|
|
|
'undef',
|
|
|
|
|
'π',
|
|
|
|
|
'ℯ',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// # built_in generator (Julia 1.5.2)
|
|
|
|
|
// import REPL.REPLCompletions
|
|
|
|
|
// res = String[]
|
|
|
|
|
// for compl in filter!(x -> isa(x, REPLCompletions.ModuleCompletion) && (x.parent === Base || x.parent === Core),
|
|
|
|
|
// REPLCompletions.completions("", 0)[1])
|
|
|
|
|
// try
|
|
|
|
|
// v = eval(Symbol(compl.mod))
|
|
|
|
|
// if (v isa Type || v isa TypeVar) && (compl.mod != "=>")
|
|
|
|
|
// push!(res, compl.mod)
|
|
|
|
|
// end
|
|
|
|
|
// catch e
|
|
|
|
|
// end
|
|
|
|
|
// end
|
|
|
|
|
// sort!(unique!(res))
|
|
|
|
|
// foreach(x -> println("\'", x, "\',"), res)
|
|
|
|
|
var BUILT_IN_LIST = [
|
|
|
|
|
'AbstractArray',
|
|
|
|
|
'AbstractChannel',
|
|
|
|
|
'AbstractChar',
|
|
|
|
|
'AbstractDict',
|
|
|
|
|
'AbstractDisplay',
|
|
|
|
|
'AbstractFloat',
|
|
|
|
|
'AbstractIrrational',
|
|
|
|
|
'AbstractMatrix',
|
|
|
|
|
'AbstractRange',
|
|
|
|
|
'AbstractSet',
|
|
|
|
|
'AbstractString',
|
|
|
|
|
'AbstractUnitRange',
|
|
|
|
|
'AbstractVecOrMat',
|
|
|
|
|
'AbstractVector',
|
|
|
|
|
'Any',
|
|
|
|
|
'ArgumentError',
|
|
|
|
|
'Array',
|
|
|
|
|
'AssertionError',
|
|
|
|
|
'BigFloat',
|
|
|
|
|
'BigInt',
|
|
|
|
|
'BitArray',
|
|
|
|
|
'BitMatrix',
|
|
|
|
|
'BitSet',
|
|
|
|
|
'BitVector',
|
|
|
|
|
'Bool',
|
|
|
|
|
'BoundsError',
|
|
|
|
|
'CapturedException',
|
|
|
|
|
'CartesianIndex',
|
|
|
|
|
'CartesianIndices',
|
|
|
|
|
'Cchar',
|
|
|
|
|
'Cdouble',
|
|
|
|
|
'Cfloat',
|
|
|
|
|
'Channel',
|
|
|
|
|
'Char',
|
|
|
|
|
'Cint',
|
|
|
|
|
'Cintmax_t',
|
|
|
|
|
'Clong',
|
|
|
|
|
'Clonglong',
|
|
|
|
|
'Cmd',
|
|
|
|
|
'Colon',
|
|
|
|
|
'Complex',
|
|
|
|
|
'ComplexF16',
|
|
|
|
|
'ComplexF32',
|
|
|
|
|
'ComplexF64',
|
|
|
|
|
'CompositeException',
|
|
|
|
|
'Condition',
|
|
|
|
|
'Cptrdiff_t',
|
|
|
|
|
'Cshort',
|
|
|
|
|
'Csize_t',
|
|
|
|
|
'Cssize_t',
|
|
|
|
|
'Cstring',
|
|
|
|
|
'Cuchar',
|
|
|
|
|
'Cuint',
|
|
|
|
|
'Cuintmax_t',
|
|
|
|
|
'Culong',
|
|
|
|
|
'Culonglong',
|
|
|
|
|
'Cushort',
|
|
|
|
|
'Cvoid',
|
|
|
|
|
'Cwchar_t',
|
|
|
|
|
'Cwstring',
|
|
|
|
|
'DataType',
|
|
|
|
|
'DenseArray',
|
|
|
|
|
'DenseMatrix',
|
|
|
|
|
'DenseVecOrMat',
|
|
|
|
|
'DenseVector',
|
|
|
|
|
'Dict',
|
|
|
|
|
'DimensionMismatch',
|
|
|
|
|
'Dims',
|
|
|
|
|
'DivideError',
|
|
|
|
|
'DomainError',
|
|
|
|
|
'EOFError',
|
|
|
|
|
'Enum',
|
|
|
|
|
'ErrorException',
|
|
|
|
|
'Exception',
|
|
|
|
|
'ExponentialBackOff',
|
|
|
|
|
'Expr',
|
|
|
|
|
'Float16',
|
|
|
|
|
'Float32',
|
|
|
|
|
'Float64',
|
|
|
|
|
'Function',
|
|
|
|
|
'GlobalRef',
|
|
|
|
|
'HTML',
|
|
|
|
|
'IO',
|
|
|
|
|
'IOBuffer',
|
|
|
|
|
'IOContext',
|
|
|
|
|
'IOStream',
|
|
|
|
|
'IdDict',
|
|
|
|
|
'IndexCartesian',
|
|
|
|
|
'IndexLinear',
|
|
|
|
|
'IndexStyle',
|
|
|
|
|
'InexactError',
|
|
|
|
|
'InitError',
|
|
|
|
|
'Int',
|
|
|
|
|
'Int128',
|
|
|
|
|
'Int16',
|
|
|
|
|
'Int32',
|
|
|
|
|
'Int64',
|
|
|
|
|
'Int8',
|
|
|
|
|
'Integer',
|
|
|
|
|
'InterruptException',
|
|
|
|
|
'InvalidStateException',
|
|
|
|
|
'Irrational',
|
|
|
|
|
'KeyError',
|
|
|
|
|
'LinRange',
|
|
|
|
|
'LineNumberNode',
|
|
|
|
|
'LinearIndices',
|
|
|
|
|
'LoadError',
|
|
|
|
|
'MIME',
|
|
|
|
|
'Matrix',
|
|
|
|
|
'Method',
|
|
|
|
|
'MethodError',
|
|
|
|
|
'Missing',
|
|
|
|
|
'MissingException',
|
|
|
|
|
'Module',
|
|
|
|
|
'NTuple',
|
|
|
|
|
'NamedTuple',
|
|
|
|
|
'Nothing',
|
|
|
|
|
'Number',
|
|
|
|
|
'OrdinalRange',
|
|
|
|
|
'OutOfMemoryError',
|
|
|
|
|
'OverflowError',
|
|
|
|
|
'Pair',
|
|
|
|
|
'PartialQuickSort',
|
|
|
|
|
'PermutedDimsArray',
|
|
|
|
|
'Pipe',
|
|
|
|
|
'ProcessFailedException',
|
|
|
|
|
'Ptr',
|
|
|
|
|
'QuoteNode',
|
|
|
|
|
'Rational',
|
|
|
|
|
'RawFD',
|
|
|
|
|
'ReadOnlyMemoryError',
|
|
|
|
|
'Real',
|
|
|
|
|
'ReentrantLock',
|
|
|
|
|
'Ref',
|
|
|
|
|
'Regex',
|
|
|
|
|
'RegexMatch',
|
|
|
|
|
'RoundingMode',
|
|
|
|
|
'SegmentationFault',
|
|
|
|
|
'Set',
|
|
|
|
|
'Signed',
|
|
|
|
|
'Some',
|
|
|
|
|
'StackOverflowError',
|
|
|
|
|
'StepRange',
|
|
|
|
|
'StepRangeLen',
|
|
|
|
|
'StridedArray',
|
|
|
|
|
'StridedMatrix',
|
|
|
|
|
'StridedVecOrMat',
|
|
|
|
|
'StridedVector',
|
|
|
|
|
'String',
|
|
|
|
|
'StringIndexError',
|
|
|
|
|
'SubArray',
|
|
|
|
|
'SubString',
|
|
|
|
|
'SubstitutionString',
|
|
|
|
|
'Symbol',
|
|
|
|
|
'SystemError',
|
|
|
|
|
'Task',
|
|
|
|
|
'TaskFailedException',
|
|
|
|
|
'Text',
|
|
|
|
|
'TextDisplay',
|
|
|
|
|
'Timer',
|
|
|
|
|
'Tuple',
|
|
|
|
|
'Type',
|
|
|
|
|
'TypeError',
|
|
|
|
|
'TypeVar',
|
|
|
|
|
'UInt',
|
|
|
|
|
'UInt128',
|
|
|
|
|
'UInt16',
|
|
|
|
|
'UInt32',
|
|
|
|
|
'UInt64',
|
|
|
|
|
'UInt8',
|
|
|
|
|
'UndefInitializer',
|
|
|
|
|
'UndefKeywordError',
|
|
|
|
|
'UndefRefError',
|
|
|
|
|
'UndefVarError',
|
|
|
|
|
'Union',
|
|
|
|
|
'UnionAll',
|
|
|
|
|
'UnitRange',
|
|
|
|
|
'Unsigned',
|
|
|
|
|
'Val',
|
|
|
|
|
'Vararg',
|
|
|
|
|
'VecElement',
|
|
|
|
|
'VecOrMat',
|
|
|
|
|
'Vector',
|
|
|
|
|
'VersionNumber',
|
|
|
|
|
'WeakKeyDict',
|
|
|
|
|
'WeakRef',
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
var KEYWORDS = {
|
|
|
|
|
$pattern: VARIABLE_NAME_RE,
|
|
|
|
|
keyword: KEYWORD_LIST,
|
|
|
|
|
literal: LITERAL_LIST,
|
|
|
|
|
built_in: BUILT_IN_LIST,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// placeholder for recursive self-reference
|
|
|
|
|
var DEFAULT = {
|
|
|
|
|
keywords: KEYWORDS, illegal: /<\//
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// ref: https://docs.julialang.org/en/v1/manual/integers-and-floating-point-numbers/
|
|
|
|
|
var NUMBER = {
|
|
|
|
|
className: 'number',
|
|
|
|
|
// supported numeric literals:
|
|
|
|
|
// * binary literal (e.g. 0x10)
|
|
|
|
|
// * octal literal (e.g. 0o76543210)
|
|
|
|
|
// * hexadecimal literal (e.g. 0xfedcba876543210)
|
|
|
|
|
// * hexadecimal floating point literal (e.g. 0x1p0, 0x1.2p2)
|
|
|
|
|
// * decimal literal (e.g. 9876543210, 100_000_000)
|
|
|
|
|
// * floating pointe literal (e.g. 1.2, 1.2f, .2, 1., 1.2e10, 1.2e-10)
|
|
|
|
|
begin: /(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,
|
|
|
|
|
relevance: 0
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var CHAR = {
|
|
|
|
|
className: 'string',
|
|
|
|
|
begin: /'(.|\\[xXuU][a-zA-Z0-9]+)'/
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var INTERPOLATION = {
|
|
|
|
|
className: 'subst',
|
|
|
|
|
begin: /\$\(/, end: /\)/,
|
|
|
|
|
keywords: KEYWORDS
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var INTERPOLATED_VARIABLE = {
|
|
|
|
|
className: 'variable',
|
|
|
|
|
begin: '\\$' + VARIABLE_NAME_RE
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// TODO: neatly escape normal code in string literal
|
|
|
|
|
var STRING = {
|
|
|
|
|
className: 'string',
|
|
|
|
|
contains: [hljs.BACKSLASH_ESCAPE, INTERPOLATION, INTERPOLATED_VARIABLE],
|
|
|
|
|
variants: [
|
|
|
|
|
{ begin: /\w*"""/, end: /"""\w*/, relevance: 10 },
|
|
|
|
|
{ begin: /\w*"/, end: /"\w*/ }
|
|
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var COMMAND = {
|
|
|
|
|
className: 'string',
|
|
|
|
|
contains: [hljs.BACKSLASH_ESCAPE, INTERPOLATION, INTERPOLATED_VARIABLE],
|
|
|
|
|
begin: '`', end: '`'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var MACROCALL = {
|
|
|
|
|
className: 'meta',
|
|
|
|
|
begin: '@' + VARIABLE_NAME_RE
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var COMMENT = {
|
|
|
|
|
className: 'comment',
|
|
|
|
|
variants: [
|
|
|
|
|
{ begin: '#=', end: '=#', relevance: 10 },
|
|
|
|
|
{ begin: '#', end: '$' }
|
|
|
|
|
]
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
DEFAULT.name = 'Julia';
|
|
|
|
|
DEFAULT.contains = [
|
|
|
|
|
NUMBER,
|
|
|
|
|
CHAR,
|
|
|
|
|
STRING,
|
|
|
|
|
COMMAND,
|
|
|
|
|
MACROCALL,
|
|
|
|
|
COMMENT,
|
|
|
|
|
hljs.HASH_COMMENT_MODE,
|
|
|
|
|
{
|
|
|
|
|
className: 'keyword',
|
|
|
|
|
begin:
|
|
|
|
|
'\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b'
|
|
|
|
|
},
|
|
|
|
|
{begin: /<:/} // relevance booster
|
|
|
|
|
];
|
|
|
|
|
INTERPOLATION.contains = DEFAULT.contains;
|
|
|
|
|
|
|
|
|
|
return DEFAULT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
module.exports = julia;
|