417 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			417 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						||
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;
 |