/ src / theme / languages / erlang.js
erlang.js
  1  /*! `erlang` grammar compiled for Highlight.js 11.10.0 */
  2    (function(){
  3      var hljsGrammar = (function () {
  4    'use strict';
  5  
  6    /*
  7    Language: Erlang
  8    Description: Erlang is a general-purpose functional language, with strict evaluation, single assignment, and dynamic typing.
  9    Author: Nikolay Zakharov <nikolay.desh@gmail.com>, Dmitry Kovega <arhibot@gmail.com>
 10    Website: https://www.erlang.org
 11    Category: functional
 12    */
 13  
 14    /** @type LanguageFn */
 15    function erlang(hljs) {
 16      const BASIC_ATOM_RE = '[a-z\'][a-zA-Z0-9_\']*';
 17      const FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')';
 18      const ERLANG_RESERVED = {
 19        keyword:
 20          'after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if '
 21          + 'let not of orelse|10 query receive rem try when xor',
 22        literal:
 23          'false true'
 24      };
 25  
 26      const COMMENT = hljs.COMMENT('%', '$');
 27      const NUMBER = {
 28        className: 'number',
 29        begin: '\\b(\\d+(_\\d+)*#[a-fA-F0-9]+(_[a-fA-F0-9]+)*|\\d+(_\\d+)*(\\.\\d+(_\\d+)*)?([eE][-+]?\\d+)?)',
 30        relevance: 0
 31      };
 32      const NAMED_FUN = { begin: 'fun\\s+' + BASIC_ATOM_RE + '/\\d+' };
 33      const FUNCTION_CALL = {
 34        begin: FUNCTION_NAME_RE + '\\(',
 35        end: '\\)',
 36        returnBegin: true,
 37        relevance: 0,
 38        contains: [
 39          {
 40            begin: FUNCTION_NAME_RE,
 41            relevance: 0
 42          },
 43          {
 44            begin: '\\(',
 45            end: '\\)',
 46            endsWithParent: true,
 47            returnEnd: true,
 48            relevance: 0
 49            // "contains" defined later
 50          }
 51        ]
 52      };
 53      const TUPLE = {
 54        begin: /\{/,
 55        end: /\}/,
 56        relevance: 0
 57        // "contains" defined later
 58      };
 59      const VAR1 = {
 60        begin: '\\b_([A-Z][A-Za-z0-9_]*)?',
 61        relevance: 0
 62      };
 63      const VAR2 = {
 64        begin: '[A-Z][a-zA-Z0-9_]*',
 65        relevance: 0
 66      };
 67      const RECORD_ACCESS = {
 68        begin: '#' + hljs.UNDERSCORE_IDENT_RE,
 69        relevance: 0,
 70        returnBegin: true,
 71        contains: [
 72          {
 73            begin: '#' + hljs.UNDERSCORE_IDENT_RE,
 74            relevance: 0
 75          },
 76          {
 77            begin: /\{/,
 78            end: /\}/,
 79            relevance: 0
 80            // "contains" defined later
 81          }
 82        ]
 83      };
 84      const CHAR_LITERAL = {
 85        scope: 'string',
 86        match: /\$(\\([^0-9]|[0-9]{1,3}|)|.)/,
 87      };
 88  
 89      const BLOCK_STATEMENTS = {
 90        beginKeywords: 'fun receive if try case',
 91        end: 'end',
 92        keywords: ERLANG_RESERVED
 93      };
 94      BLOCK_STATEMENTS.contains = [
 95        COMMENT,
 96        NAMED_FUN,
 97        hljs.inherit(hljs.APOS_STRING_MODE, { className: '' }),
 98        BLOCK_STATEMENTS,
 99        FUNCTION_CALL,
100        hljs.QUOTE_STRING_MODE,
101        NUMBER,
102        TUPLE,
103        VAR1,
104        VAR2,
105        RECORD_ACCESS,
106        CHAR_LITERAL
107      ];
108  
109      const BASIC_MODES = [
110        COMMENT,
111        NAMED_FUN,
112        BLOCK_STATEMENTS,
113        FUNCTION_CALL,
114        hljs.QUOTE_STRING_MODE,
115        NUMBER,
116        TUPLE,
117        VAR1,
118        VAR2,
119        RECORD_ACCESS,
120        CHAR_LITERAL
121      ];
122      FUNCTION_CALL.contains[1].contains = BASIC_MODES;
123      TUPLE.contains = BASIC_MODES;
124      RECORD_ACCESS.contains[1].contains = BASIC_MODES;
125  
126      const DIRECTIVES = [
127        "-module",
128        "-record",
129        "-undef",
130        "-export",
131        "-ifdef",
132        "-ifndef",
133        "-author",
134        "-copyright",
135        "-doc",
136        "-vsn",
137        "-import",
138        "-include",
139        "-include_lib",
140        "-compile",
141        "-define",
142        "-else",
143        "-endif",
144        "-file",
145        "-behaviour",
146        "-behavior",
147        "-spec"
148      ];
149  
150      const PARAMS = {
151        className: 'params',
152        begin: '\\(',
153        end: '\\)',
154        contains: BASIC_MODES
155      };
156  
157      return {
158        name: 'Erlang',
159        aliases: [ 'erl' ],
160        keywords: ERLANG_RESERVED,
161        illegal: '(</|\\*=|\\+=|-=|/\\*|\\*/|\\(\\*|\\*\\))',
162        contains: [
163          {
164            className: 'function',
165            begin: '^' + BASIC_ATOM_RE + '\\s*\\(',
166            end: '->',
167            returnBegin: true,
168            illegal: '\\(|#|//|/\\*|\\\\|:|;',
169            contains: [
170              PARAMS,
171              hljs.inherit(hljs.TITLE_MODE, { begin: BASIC_ATOM_RE })
172            ],
173            starts: {
174              end: ';|\\.',
175              keywords: ERLANG_RESERVED,
176              contains: BASIC_MODES
177            }
178          },
179          COMMENT,
180          {
181            begin: '^-',
182            end: '\\.',
183            relevance: 0,
184            excludeEnd: true,
185            returnBegin: true,
186            keywords: {
187              $pattern: '-' + hljs.IDENT_RE,
188              keyword: DIRECTIVES.map(x => `${x}|1.5`).join(" ")
189            },
190            contains: [ PARAMS ]
191          },
192          NUMBER,
193          hljs.QUOTE_STRING_MODE,
194          RECORD_ACCESS,
195          VAR1,
196          VAR2,
197          TUPLE,
198          CHAR_LITERAL,
199          { begin: /\.$/ } // relevance booster
200        ]
201      };
202    }
203  
204    return erlang;
205  
206  })();
207  
208      hljs.registerLanguage('erlang', hljsGrammar);
209    })();