Index: lib/src/prism/components/prism-elixir.js |
diff --git a/lib/src/prism/components/prism-elixir.js b/lib/src/prism/components/prism-elixir.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..42ae187e1172277b4e2706b8db90b09d2c3a0e87 |
--- /dev/null |
+++ b/lib/src/prism/components/prism-elixir.js |
@@ -0,0 +1,90 @@ |
+Prism.languages.elixir = { |
+ // Negative look-ahead is needed for string interpolation |
+ // Negative look-behind is needed to avoid highlighting markdown headers in |
+ // multi-line doc strings |
+ 'comment': { |
+ pattern: /(^|[^#])#(?![{#]).*/m, |
+ lookbehind: true |
+ }, |
+ // ~r"""foo""", ~r'''foo''', ~r/foo/, ~r|foo|, ~r"foo", ~r'foo', ~r(foo), ~r[foo], ~r{foo}, ~r<foo> |
+ 'regex': /~[rR](?:("""|'''|[\/|"'])(?:\\.|(?!\1)[^\\])+\1|\((?:\\\)|[^)])+\)|\[(?:\\\]|[^\]])+\]|\{(?:\\\}|[^}])+\}|<(?:\\>|[^>])+>)[uismxfr]*/, |
+ 'string': [ |
+ { |
+ // ~s"""foo""", ~s'''foo''', ~s/foo/, ~s|foo|, ~s"foo", ~s'foo', ~s(foo), ~s[foo], ~s{foo}, ~s<foo> |
+ pattern: /~[cCsSwW](?:("""|'''|[\/|"'])(?:\\.|(?!\1)[^\\])+\1|\((?:\\\)|[^)])+\)|\[(?:\\\]|[^\]])+\]|\{(?:\\\}|#\{[^}]+\}|[^}])+\}|<(?:\\>|[^>])+>)[csa]?/, |
+ inside: { |
+ // See interpolation below |
+ } |
+ }, |
+ { |
+ pattern: /("""|''')[\s\S]*?\1/, |
+ inside: { |
+ // See interpolation below |
+ } |
+ }, |
+ { |
+ // Multi-line strings are allowed |
+ pattern: /("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/, |
+ inside: { |
+ // See interpolation below |
+ } |
+ } |
+ ], |
+ 'atom': { |
+ // Look-behind prevents bad highlighting of the :: operator |
+ pattern: /(^|[^:]):\w+/, |
+ lookbehind: true, |
+ alias: 'symbol' |
+ }, |
+ // Look-ahead prevents bad highlighting of the :: operator |
+ 'attr-name': /\w+:(?!:)/, |
+ 'capture': { |
+ // Look-behind prevents bad highlighting of the && operator |
+ pattern: /(^|[^&])&(?:[^&\s\d()][^\s()]*|(?=\())/, |
+ lookbehind: true, |
+ alias: 'function' |
+ }, |
+ 'argument': { |
+ // Look-behind prevents bad highlighting of the && operator |
+ pattern: /(^|[^&])&\d+/, |
+ lookbehind: true, |
+ alias: 'variable' |
+ }, |
+ 'attribute': { |
+ pattern: /@[\S]+/, |
+ alias: 'variable' |
+ }, |
+ 'number': /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i, |
+ 'keyword': /\b(?:after|alias|and|case|catch|cond|def(?:callback|exception|impl|module|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|require|rescue|try|unless|use|when)\b/, |
+ 'boolean': /\b(?:true|false|nil)\b/, |
+ 'operator': [ |
+ /\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/, |
+ { |
+ // We don't want to match << |
+ pattern: /([^<])<(?!<)/, |
+ lookbehind: true |
+ }, |
+ { |
+ // We don't want to match >> |
+ pattern: /([^>])>(?!>)/, |
+ lookbehind: true |
+ } |
+ ], |
+ 'punctuation': /<<|>>|[.,%\[\]{}()]/ |
+}; |
+ |
+Prism.languages.elixir.string.forEach(function(o) { |
+ o.inside = { |
+ 'interpolation': { |
+ pattern: /#\{[^}]+\}/, |
+ inside: { |
+ 'delimiter': { |
+ pattern: /^#\{|\}$/, |
+ alias: 'punctuation' |
+ }, |
+ rest: Prism.util.clone(Prism.languages.elixir) |
+ } |
+ } |
+ }; |
+}); |
+ |