]>
luflow.net public git repositories - flow-web.git/blob - static/highlight/languages/elixir.js
1 /*! `elixir` grammar compiled for Highlight.js 11.11.1 */
3 var hljsGrammar
= (function () {
8 Author: Josh Adams <josh@isotope11.com>
9 Description: language definition for Elixir source code files (.ex and .exs). Based on ruby language support.
11 Website: https://elixir-lang.org
14 /** @type LanguageFn */
15 function elixir(hljs
) {
16 const regex
= hljs
.regex
;
17 const ELIXIR_IDENT_RE
= '[a-zA-Z_][a-zA-Z0-9_.]*(!|\\?)?';
18 const ELIXIR_METHOD_RE
= '[a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?';
58 $pattern: ELIXIR_IDENT_RE
,
70 begin: '(\\b0o[0-7_]+)|(\\b0b[01_]+)|(\\b0x[0-9a-fA-F_]+)|(-?\\b[0-9][0-9_]*(\\.[0-9_]+([eE][-+]?[0-9]+)?)?)',
73 // TODO: could be tightened
74 // https://elixir-lang.readthedocs.io/en/latest/intro/18.html
75 // but you also need to include closing delemeters in the escape list per
76 // individual sigil mode from what I can tell,
77 // ie: \} might or might not be an escape depending on the sigil used
78 const ESCAPES_RE
= /\\[\s\S]/;
79 // const ESCAPES_RE = /\\["'\\abdefnrstv0]/;
80 const BACKSLASH_ESCAPE
= {
85 const SIGIL_DELIMITERS
= '[/|([{<"\']';
86 const SIGIL_DELIMITER_MODES
= [
120 const escapeSigilEnd
= (end
) => {
122 scope: "char.escape",
123 begin: regex
.concat(/\\/, end
),
127 const LOWERCASE_SIGIL
= {
129 begin: '~[a-z]' + '(?=' + SIGIL_DELIMITERS
+ ')',
130 contains: SIGIL_DELIMITER_MODES
.map(x
=> hljs
.inherit(x
,
132 escapeSigilEnd(x
.end
),
139 const UPCASE_SIGIL
= {
141 begin: '~[A-Z]' + '(?=' + SIGIL_DELIMITERS
+ ')',
142 contains: SIGIL_DELIMITER_MODES
.map(x
=> hljs
.inherit(x
,
143 { contains: [ escapeSigilEnd(x
.end
) ] }
147 const REGEX_SIGIL
= {
151 begin: '~r' + '(?=' + SIGIL_DELIMITERS
+ ')',
152 contains: SIGIL_DELIMITER_MODES
.map(x
=> hljs
.inherit(x
,
154 end: regex
.concat(x
.end
, /[uismxfU]{0,7}/),
156 escapeSigilEnd(x
.end
),
164 begin: '~R' + '(?=' + SIGIL_DELIMITERS
+ ')',
165 contains: SIGIL_DELIMITER_MODES
.map(x
=> hljs
.inherit(x
,
167 end: regex
.concat(x
.end
, /[uismxfU]{0,7}/),
168 contains: [ escapeSigilEnd(x
.end
) ]
178 hljs
.BACKSLASH_ESCAPE
,
193 contains: [] // override default
198 contains: [] // override default
203 contains: [] // override default
208 contains: [] // override default
221 className: 'function',
222 beginKeywords: 'def defp defmacro defmacrop',
223 end: /\B\b/, // the mode is ended by the title
225 hljs.inherit(hljs.TITLE_MODE, {
226 begin: ELIXIR_IDENT_RE,
231 const CLASS = hljs.inherit(FUNCTION, {
233 beginKeywords: 'defimpl defmodule defprotocol defrecord',
236 const ELIXIR_DEFAULT_CONTAINS = [
241 hljs.HASH_COMMENT_MODE,
247 begin: ':(?![\\s:])',
250 { begin: ELIXIR_METHOD_RE }
256 begin: ELIXIR_IDENT_RE + ':(?!:)',
259 { // Usage of a module, struct, etc.
260 className: 'title.class',
261 begin: /(\b[A-Z][a-zA-Z0-9_]+)/,
266 className: 'variable',
267 begin: '(\\$\\W)|((\\$|@@?)(\\w+))'
269 // -> has been removed, capnproto always uses this grammar construct
271 SUBST.contains = ELIXIR_DEFAULT_CONTAINS;
280 contains: ELIXIR_DEFAULT_CONTAINS
288 hljs.registerLanguage('elixir', hljsGrammar);