299 lines
6.6 KiB
JavaScript
299 lines
6.6 KiB
JavaScript
|
module.exports = function(hljs) {
|
||
|
function orReValues(ops){
|
||
|
return ops
|
||
|
.map(function(op) {
|
||
|
return op
|
||
|
.split('')
|
||
|
.map(function(char) {
|
||
|
return '\\' + char;
|
||
|
})
|
||
|
.join('');
|
||
|
})
|
||
|
.join('|');
|
||
|
}
|
||
|
|
||
|
var RE_IDENT = '~?[a-z$_][0-9a-zA-Z$_]*';
|
||
|
var RE_MODULE_IDENT = '`?[A-Z$_][0-9a-zA-Z$_]*';
|
||
|
|
||
|
var RE_PARAM_TYPEPARAM = '\'?[a-z$_][0-9a-z$_]*';
|
||
|
var RE_PARAM_TYPE = '\s*:\s*[a-z$_][0-9a-z$_]*(\(\s*(' + RE_PARAM_TYPEPARAM + '\s*(,' + RE_PARAM_TYPEPARAM + ')*)?\s*\))?';
|
||
|
var RE_PARAM = RE_IDENT + '(' + RE_PARAM_TYPE + ')?(' + RE_PARAM_TYPE + ')?';
|
||
|
var RE_OPERATOR = "(" + orReValues(['||', '&&', '++', '**', '+.', '*', '/', '*.', '/.', '...', '|>']) + "|==|===)";
|
||
|
var RE_OPERATOR_SPACED = "\\s+" + RE_OPERATOR + "\\s+";
|
||
|
|
||
|
var KEYWORDS = {
|
||
|
keyword:
|
||
|
'and as asr assert begin class constraint do done downto else end exception external' +
|
||
|
'for fun function functor if in include inherit initializer' +
|
||
|
'land lazy let lor lsl lsr lxor match method mod module mutable new nonrec' +
|
||
|
'object of open or private rec sig struct then to try type val virtual when while with',
|
||
|
built_in:
|
||
|
'array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ',
|
||
|
literal:
|
||
|
'true false'
|
||
|
};
|
||
|
|
||
|
var RE_NUMBER = '\\b(0[xX][a-fA-F0-9_]+[Lln]?|' +
|
||
|
'0[oO][0-7_]+[Lln]?|' +
|
||
|
'0[bB][01_]+[Lln]?|' +
|
||
|
'[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)';
|
||
|
|
||
|
var NUMBER_MODE = {
|
||
|
className: 'number',
|
||
|
relevance: 0,
|
||
|
variants: [
|
||
|
{
|
||
|
begin: RE_NUMBER
|
||
|
},
|
||
|
{
|
||
|
begin: '\\(\\-' + RE_NUMBER + '\\)'
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
var OPERATOR_MODE = {
|
||
|
className: 'operator',
|
||
|
relevance: 0,
|
||
|
begin: RE_OPERATOR
|
||
|
};
|
||
|
var LIST_CONTENTS_MODES = [
|
||
|
{
|
||
|
className: 'identifier',
|
||
|
relevance: 0,
|
||
|
begin: RE_IDENT
|
||
|
},
|
||
|
OPERATOR_MODE,
|
||
|
NUMBER_MODE
|
||
|
];
|
||
|
|
||
|
var MODULE_ACCESS_CONTENTS = [
|
||
|
hljs.QUOTE_STRING_MODE,
|
||
|
OPERATOR_MODE,
|
||
|
{
|
||
|
className: 'module',
|
||
|
begin: "\\b" + RE_MODULE_IDENT, returnBegin: true,
|
||
|
end: "\.",
|
||
|
contains: [
|
||
|
{
|
||
|
className: 'identifier',
|
||
|
begin: RE_MODULE_IDENT,
|
||
|
relevance: 0
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
];
|
||
|
|
||
|
var PARAMS_CONTENTS = [
|
||
|
{
|
||
|
className: 'module',
|
||
|
begin: "\\b" + RE_MODULE_IDENT, returnBegin: true,
|
||
|
end: "\.",
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
{
|
||
|
className: 'identifier',
|
||
|
begin: RE_MODULE_IDENT,
|
||
|
relevance: 0
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
];
|
||
|
|
||
|
var PARAMS_MODE = {
|
||
|
begin: RE_IDENT,
|
||
|
end: '(,|\\n|\\))',
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
OPERATOR_MODE,
|
||
|
{
|
||
|
className: 'typing',
|
||
|
begin: ':',
|
||
|
end: '(,|\\n)',
|
||
|
returnBegin: true,
|
||
|
relevance: 0,
|
||
|
contains: PARAMS_CONTENTS
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
var FUNCTION_BLOCK_MODE = {
|
||
|
className: 'function',
|
||
|
relevance: 0,
|
||
|
keywords: KEYWORDS,
|
||
|
variants: [
|
||
|
{
|
||
|
begin: '\\s(\\(\\.?.*?\\)|' + RE_IDENT + ')\\s*=>',
|
||
|
end: '\\s*=>',
|
||
|
returnBegin: true,
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
{
|
||
|
className: 'params',
|
||
|
variants: [
|
||
|
{
|
||
|
begin: RE_IDENT
|
||
|
},
|
||
|
{
|
||
|
begin: RE_PARAM
|
||
|
},
|
||
|
{
|
||
|
begin: /\(\s*\)/,
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
begin: '\\s\\(\\.?[^;\\|]*\\)\\s*=>',
|
||
|
end: '\\s=>',
|
||
|
returnBegin: true,
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
{
|
||
|
className: 'params',
|
||
|
relevance: 0,
|
||
|
variants: [
|
||
|
PARAMS_MODE
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
begin: '\\(\\.\\s' + RE_IDENT + '\\)\\s*=>'
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
MODULE_ACCESS_CONTENTS.push(FUNCTION_BLOCK_MODE);
|
||
|
|
||
|
var CONSTRUCTOR_MODE = {
|
||
|
className: 'constructor',
|
||
|
begin: RE_MODULE_IDENT + '\\(',
|
||
|
end: '\\)',
|
||
|
illegal: '\\n',
|
||
|
keywords: KEYWORDS,
|
||
|
contains: [
|
||
|
hljs.QUOTE_STRING_MODE,
|
||
|
OPERATOR_MODE,
|
||
|
{
|
||
|
className: 'params',
|
||
|
begin: '\\b' + RE_IDENT
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
var PATTERN_MATCH_BLOCK_MODE = {
|
||
|
className: 'pattern-match',
|
||
|
begin: '\\|',
|
||
|
returnBegin: true,
|
||
|
keywords: KEYWORDS,
|
||
|
end: '=>',
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
CONSTRUCTOR_MODE,
|
||
|
OPERATOR_MODE,
|
||
|
{
|
||
|
relevance: 0,
|
||
|
className: 'constructor',
|
||
|
begin: RE_MODULE_IDENT
|
||
|
}
|
||
|
]
|
||
|
};
|
||
|
|
||
|
var MODULE_ACCESS_MODE = {
|
||
|
className: 'module-access',
|
||
|
keywords: KEYWORDS,
|
||
|
returnBegin: true,
|
||
|
variants: [
|
||
|
{
|
||
|
begin: "\\b(" + RE_MODULE_IDENT + "\\.)+" + RE_IDENT
|
||
|
},
|
||
|
{
|
||
|
begin: "\\b(" + RE_MODULE_IDENT + "\\.)+\\(",
|
||
|
end: "\\)",
|
||
|
returnBegin: true,
|
||
|
contains: [
|
||
|
FUNCTION_BLOCK_MODE,
|
||
|
{
|
||
|
begin: '\\(',
|
||
|
end: '\\)',
|
||
|
skip: true
|
||
|
}
|
||
|
].concat(MODULE_ACCESS_CONTENTS)
|
||
|
},
|
||
|
{
|
||
|
begin: "\\b(" + RE_MODULE_IDENT + "\\.)+{",
|
||
|
end: "}"
|
||
|
}
|
||
|
],
|
||
|
contains: MODULE_ACCESS_CONTENTS
|
||
|
};
|
||
|
|
||
|
PARAMS_CONTENTS.push(MODULE_ACCESS_MODE);
|
||
|
|
||
|
return {
|
||
|
aliases: ['re'],
|
||
|
keywords: KEYWORDS,
|
||
|
illegal: '(:\\-|:=|\\${|\\+=)',
|
||
|
contains: [
|
||
|
hljs.COMMENT('/\\*', '\\*/', { illegal: '^(\\#,\\/\\/)' }),
|
||
|
{
|
||
|
className: 'character',
|
||
|
begin: '\'(\\\\[^\']+|[^\'])\'',
|
||
|
illegal: '\\n',
|
||
|
relevance: 0
|
||
|
},
|
||
|
hljs.QUOTE_STRING_MODE,
|
||
|
{
|
||
|
className: 'literal',
|
||
|
begin: '\\(\\)',
|
||
|
relevance: 0
|
||
|
},
|
||
|
{
|
||
|
className: 'literal',
|
||
|
begin: '\\[\\|',
|
||
|
end: '\\|\\]',
|
||
|
relevance: 0,
|
||
|
contains: LIST_CONTENTS_MODES
|
||
|
},
|
||
|
{
|
||
|
className: 'literal',
|
||
|
begin: '\\[',
|
||
|
end: '\\]',
|
||
|
relevance: 0,
|
||
|
contains: LIST_CONTENTS_MODES
|
||
|
},
|
||
|
CONSTRUCTOR_MODE,
|
||
|
{
|
||
|
className: 'operator',
|
||
|
begin: RE_OPERATOR_SPACED,
|
||
|
illegal: '\\-\\->',
|
||
|
relevance: 0
|
||
|
},
|
||
|
NUMBER_MODE,
|
||
|
hljs.C_LINE_COMMENT_MODE,
|
||
|
PATTERN_MATCH_BLOCK_MODE,
|
||
|
FUNCTION_BLOCK_MODE,
|
||
|
{
|
||
|
className: 'module-def',
|
||
|
begin: "\\bmodule\\s+" + RE_IDENT + "\\s+" + RE_MODULE_IDENT + "\\s+=\\s+{",
|
||
|
end: "}",
|
||
|
returnBegin: true,
|
||
|
keywords: KEYWORDS,
|
||
|
relevance: 0,
|
||
|
contains: [
|
||
|
{
|
||
|
className: 'module',
|
||
|
relevance: 0,
|
||
|
begin: RE_MODULE_IDENT
|
||
|
},
|
||
|
{
|
||
|
begin: '{',
|
||
|
end: '}',
|
||
|
skip: true
|
||
|
}
|
||
|
].concat(MODULE_ACCESS_CONTENTS)
|
||
|
},
|
||
|
MODULE_ACCESS_MODE
|
||
|
]
|
||
|
};
|
||
|
};
|