| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | /*Language: ErlangDescription: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.Author: Nikolay Zakharov <[email protected]>, Dmitry Kovega <[email protected]>Category: functional*/function(hljs) {  var BASIC_ATOM_RE = '[a-z\'][a-zA-Z0-9_\']*';  var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';  var ERLANG_RESERVED = {    keyword:      'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if ' +      'let not of orelse|10 query receive rem try when xor',    literal:      'false true'  };  var COMMENT = hljs.COMMENT('%', '$');  var NUMBER = {    className: 'number',    begin: '\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)',    relevance: 0  };  var NAMED_FUN = {    begin: 'fun\\s+' + BASIC_ATOM_RE + '/\\d+'  };  var FUNCTION_CALL = {    begin: FUNCTION_NAME_RE + '\\(', end: '\\)',    returnBegin: true,    relevance: 0,    contains: [      {        begin: FUNCTION_NAME_RE, relevance: 0      },      {        begin: '\\(', end: '\\)', endsWithParent: true,        returnEnd: true,        relevance: 0        // "contains" defined later      }    ]  };  var TUPLE = {    begin: '{', end: '}',    relevance: 0    // "contains" defined later  };  var VAR1 = {    begin: '\\b_([A-Z][A-Za-z0-9_]*)?',    relevance: 0  };  var VAR2 = {    begin: '[A-Z][a-zA-Z0-9_]*',    relevance: 0  };  var RECORD_ACCESS = {    begin: '#' + hljs.UNDERSCORE_IDENT_RE,    relevance: 0,    returnBegin: true,    contains: [      {        begin: '#' + hljs.UNDERSCORE_IDENT_RE,        relevance: 0      },      {        begin: '{', end: '}',        relevance: 0        // "contains" defined later      }    ]  };  var BLOCK_STATEMENTS = {    beginKeywords: 'fun receive if try case', end: 'end',    keywords: ERLANG_RESERVED  };  BLOCK_STATEMENTS.contains = [    COMMENT,    NAMED_FUN,    hljs.inherit(hljs.APOS_STRING_MODE, {className: ''}),    BLOCK_STATEMENTS,    FUNCTION_CALL,    hljs.QUOTE_STRING_MODE,    NUMBER,    TUPLE,    VAR1, VAR2,    RECORD_ACCESS  ];  var BASIC_MODES = [    COMMENT,    NAMED_FUN,    BLOCK_STATEMENTS,    FUNCTION_CALL,    hljs.QUOTE_STRING_MODE,    NUMBER,    TUPLE,    VAR1, VAR2,    RECORD_ACCESS  ];  FUNCTION_CALL.contains[1].contains = BASIC_MODES;  TUPLE.contains = BASIC_MODES;  RECORD_ACCESS.contains[1].contains = BASIC_MODES;  var PARAMS = {    className: 'params',    begin: '\\(', end: '\\)',    contains: BASIC_MODES  };  return {    aliases: ['erl'],    keywords: ERLANG_RESERVED,    illegal: '(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))',    contains: [      {        className: 'function',        begin: '^' + BASIC_ATOM_RE + '\\s*\\(', end: '->',        returnBegin: true,        illegal: '\\(|#|//|/\\*|\\\\|:|;',        contains: [          PARAMS,          hljs.inherit(hljs.TITLE_MODE, {begin: BASIC_ATOM_RE})        ],        starts: {          end: ';|\\.',          keywords: ERLANG_RESERVED,          contains: BASIC_MODES        }      },      COMMENT,      {        begin: '^-', end: '\\.',        relevance: 0,        excludeEnd: true,        returnBegin: true,        lexemes: '-' + hljs.IDENT_RE,        keywords:          '-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn ' +          '-import -include -include_lib -compile -define -else -endif -file -behaviour ' +          '-behavior -spec',        contains: [PARAMS]      },      NUMBER,      hljs.QUOTE_STRING_MODE,      RECORD_ACCESS,      VAR1, VAR2,      TUPLE,      {begin: /\.$/} // relevance booster    ]  };}
 |