123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- 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
- ]
- };
- };
|