diff --git a/demo/kitchen-sink/docs/handlebars.hbs b/demo/kitchen-sink/docs/handlebars.hbs
index 1cdf786e..bb096a1a 100644
--- a/demo/kitchen-sink/docs/handlebars.hbs
+++ b/demo/kitchen-sink/docs/handlebars.hbs
@@ -3,6 +3,6 @@
diff --git a/lib/ace/mode/_test/tokens_cirru.json b/lib/ace/mode/_test/tokens_cirru.json
new file mode 100644
index 00000000..de4852e6
--- /dev/null
+++ b/lib/ace/mode/_test/tokens_cirru.json
@@ -0,0 +1,267 @@
+[[
+ "start",
+ ["comment.line.double-dash","-- https://github.com/Cirru/cirru-gopher/blob/master/code/scope.cr,"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","set"],
+ ["text"," "],
+ ["variable.parameter","a"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","2"],
+ ["storage.modifier",")"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","self"],
+ ["storage.modifier",")"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","set"],
+ ["text"," "],
+ ["variable.parameter","c"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","child"],
+ ["storage.modifier",")"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","under"],
+ ["text"," "],
+ ["variable.parameter","c"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["support.function","under"],
+ ["text"," "],
+ ["variable.parameter","parent"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["support.function","print"],
+ ["text"," "],
+ ["variable.parameter","a"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","get"],
+ ["text"," "],
+ ["variable.parameter","c"],
+ ["text"," "],
+ ["variable.parameter","a"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","set"],
+ ["text"," "],
+ ["variable.parameter","c"],
+ ["text"," "],
+ ["variable.parameter","x"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","3"],
+ ["storage.modifier",")"]
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","get"],
+ ["text"," "],
+ ["variable.parameter","c"],
+ ["text"," "],
+ ["variable.parameter","x"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","set"],
+ ["text"," "],
+ ["variable.parameter","just-print"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","code"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["support.function","print"],
+ ["text"," "],
+ ["variable.parameter","a"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["variable.parameter","just-print"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","eval"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","self"],
+ ["storage.modifier",")"],
+ ["text"," "],
+ ["variable.parameter","just-print"]
+],[
+ "line",
+ ["support.function","eval"],
+ ["text"," "],
+ ["variable.parameter","just-print"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","string"],
+ ["text"," "],
+ ["string.quoted.double","\"string with space\""],
+ ["storage.modifier",")"]
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","string"],
+ ["text"," "],
+ ["string.quoted.double","\"escapes "],
+ ["constant.character.escape","\\n"],
+ ["string.quoted.double"," "],
+ ["constant.character.escape","\\\"\\\\"],
+ ["string.quoted.double","\""],
+ ["storage.modifier",")"]
+],[
+ "start"
+],[
+ "start",
+ ["support.function","brackets"],
+ ["text"," "],
+ ["storage.modifier","((((()))))"]
+],[
+ "start"
+],[
+ "line",
+ ["string.quoted.double","\"eval\""],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","string"],
+ ["text"," "],
+ ["string.quoted.double","\"eval\""]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","add"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","1"],
+ ["storage.modifier",")"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","2"],
+ ["storage.modifier","))"]
+],[
+ "start"
+],[
+ "start",
+ ["support.function","print"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","unwrap"],
+ ["text"," "],
+ ["storage.modifier","$"]
+],[
+ "line",
+ ["text"," "],
+ ["support.function","map"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","a"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","1"],
+ ["storage.modifier",")"],
+ ["text"," "],
+ ["storage.modifier","("],
+ ["support.function","b"],
+ ["text"," "],
+ ["storage.modifier","$"],
+ ["text"," "],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","2"],
+ ["storage.modifier",")"]
+],[
+ "start"
+],[
+ "line",
+ ["support.function","print"],
+ ["text"," "],
+ ["variable.parameter","a"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","1"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["storage.modifier",","],
+ ["text"," "],
+ ["variable.parameter","b"],
+ ["text"," "],
+ ["variable.parameter","c"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["support.function","int"],
+ ["text"," "],
+ ["constant.numeric","2"]
+],[
+ "line",
+ ["markup.raw"," "],
+ ["storage.modifier",","],
+ ["text"," "],
+ ["variable.parameter","d"]
+]]
\ No newline at end of file
diff --git a/lib/ace/mode/_test/tokens_elixir.json b/lib/ace/mode/_test/tokens_elixir.json
new file mode 100644
index 00000000..cbbe1fee
--- /dev/null
+++ b/lib/ace/mode/_test/tokens_elixir.json
@@ -0,0 +1,196 @@
+[[
+ "start",
+ ["keyword.control.module.elixir","defmodule"],
+ ["meta.module.elixir"," "],
+ ["entity.name.type.module.elixir","HelloModule"],
+ ["text"," "],
+ ["keyword.control.elixir","do"]
+],[
+ "comment.documentation.heredoc",
+ ["text"," "],
+ ["comment.documentation.heredoc","@moduledoc \"\"\""]
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," This is supposed to be `markdown`."]
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," __Yes__ this is [mark](http://down.format)"]
+],[
+ "comment.documentation.heredoc"
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," # Truly"]
+],[
+ "comment.documentation.heredoc"
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," ## marked"]
+],[
+ "comment.documentation.heredoc"
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," * with lists"]
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," * more"]
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," * and more"]
+],[
+ "comment.documentation.heredoc"
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," Even.with(code)"]
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," blocks |> with |> samples"]
+],[
+ "comment.documentation.heredoc"
+],[
+ "comment.documentation.heredoc",
+ ["comment.documentation.heredoc"," _Docs are first class citizens in Elixir_ (Jose Valim)"]
+],[
+ "start",
+ ["comment.documentation.heredoc"," \"\"\""]
+],[
+ "start",
+ ["text"," "]
+],[
+ "start",
+ ["text"," "],
+ ["punctuation.definition.comment.elixir","#"],
+ ["comment.line.number-sign.elixir"," A \"Hello world\" function"]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","def"],
+ ["text"," some_fun "],
+ ["keyword.control.elixir","do"]
+],[
+ "start",
+ ["text"," "],
+ ["variable.other.constant.elixir","IO"],
+ ["punctuation.separator.method.elixir","."],
+ ["text","puts "],
+ ["punctuation.definition.string.begin.elixir","\""],
+ ["string.quoted.double.elixir","Juhu Kinners!"],
+ ["punctuation.definition.string.end.elixir","\""]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","end"]
+],[
+ "start",
+ ["text"," "],
+ ["punctuation.definition.comment.elixir","#"],
+ ["comment.line.number-sign.elixir"," A private function"]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","defp"],
+ ["text"," priv "],
+ ["keyword.control.elixir","do"]
+],[
+ "punctuation.definition.string.begin.elixir7",
+ ["text"," is_regex "],
+ ["punctuation.definition.string.begin.elixir","~r\"\"\""]
+],[
+ "punctuation.definition.string.begin.elixir7",
+ ["string.quoted.double.heredoc.elixir"," This is a regex"]
+],[
+ "punctuation.definition.string.begin.elixir7",
+ ["string.quoted.double.heredoc.elixir"," spanning several"]
+],[
+ "punctuation.definition.string.begin.elixir7",
+ ["string.quoted.double.heredoc.elixir"," lines."]
+],[
+ "start",
+ ["punctuation.definition.string.end.elixir"," \"\"\""]
+],[
+ "start",
+ ["text"," x "],
+ ["keyword.operator.assignment.elixir","="],
+ ["text"," elem"],
+ ["punctuation.section.function.elixir","("],
+ ["punctuation.section.scope.elixir","{"],
+ ["text"," "],
+ ["punctuation.definition.constant.elixir",":"],
+ ["constant.other.symbol.elixir","a"],
+ ["punctuation.separator.object.elixir",","],
+ ["text"," "],
+ ["punctuation.definition.constant.elixir",":"],
+ ["constant.other.symbol.elixir","b"],
+ ["punctuation.separator.object.elixir",","],
+ ["text"," "],
+ ["punctuation.definition.constant.elixir",":"],
+ ["constant.other.symbol.elixir","c"],
+ ["text"," "],
+ ["punctuation.section.scope.elixir","}"],
+ ["punctuation.separator.object.elixir",","],
+ ["text"," "],
+ ["constant.numeric.elixir","0"],
+ ["punctuation.section.function.elixir",")"],
+ ["text"," "],
+ ["punctuation.definition.comment.elixir","#"],
+ ["comment.line.number-sign.elixir","=> :a"]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","end"]
+],[
+ "start",
+ ["keyword.control.elixir","end"]
+],[
+ "start"
+],[
+ "start",
+ ["text","test_fun "],
+ ["keyword.operator.assignment.elixir","="],
+ ["text"," "],
+ ["keyword.control.elixir","fn"],
+ ["punctuation.section.function.elixir","("],
+ ["text","x"],
+ ["punctuation.section.function.elixir",")"],
+ ["text"," "],
+ ["keyword.operator.arithmetic.elixir","-"],
+ ["keyword.operator.comparison.elixir",">"]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","cond"],
+ ["text"," "],
+ ["keyword.control.elixir","do"]
+],[
+ "start",
+ ["text"," x "],
+ ["keyword.operator.comparison.elixir",">"],
+ ["text"," "],
+ ["constant.numeric.elixir","10"],
+ ["text"," "],
+ ["keyword.operator.arithmetic.elixir","-"],
+ ["keyword.operator.comparison.elixir",">"]
+],[
+ "start",
+ ["text"," "],
+ ["punctuation.definition.constant.elixir",":"],
+ ["constant.other.symbol.elixir","greater_than_ten"]
+],[
+ "start",
+ ["text"," "],
+ ["constant.language.elixir","true"],
+ ["text"," "],
+ ["keyword.operator.arithmetic.elixir","-"],
+ ["keyword.operator.comparison.elixir",">"]
+],[
+ "start",
+ ["text"," "],
+ ["punctuation.definition.constant.elixir",":"],
+ ["constant.other.symbol.elixir","maybe_ten"]
+],[
+ "start",
+ ["text"," "],
+ ["keyword.control.elixir","end"]
+],[
+ "start",
+ ["keyword.control.elixir","end"]
+]]
\ No newline at end of file
diff --git a/lib/ace/mode/_test/tokens_handlebars.json b/lib/ace/mode/_test/tokens_handlebars.json
index ef8cb82a..1ec79139 100644
--- a/lib/ace/mode/_test/tokens_handlebars.json
+++ b/lib/ace/mode/_test/tokens_handlebars.json
@@ -59,9 +59,9 @@
["meta.tag.punctuation.tag-open.xml","<"],
["meta.tag.tag-name.xml","div"],
["meta.tag.punctuation.tag-close.xml",">"],
- ["storage.type.start","{{"],
+ ["support.function","{{{"],
["variable.parameter","body"],
- ["storage.type.end","}}"],
+ ["support.function","}}}"],
["meta.tag.punctuation.end-tag-open.xml",""],
["meta.tag.tag-name.xml","div"],
["meta.tag.punctuation.tag-close.xml",">"]
diff --git a/lib/ace/mode/handlebars.js b/lib/ace/mode/handlebars.js
index 38af7e5c..3f2e7179 100644
--- a/lib/ace/mode/handlebars.js
+++ b/lib/ace/mode/handlebars.js
@@ -21,7 +21,7 @@ var Mode = function() {
oop.inherits(Mode, HtmlMode);
(function() {
-
+ this.blockComment = {start: "{!--", end: "--}"};
this.$id = "ace/mode/handlebars";
}).call(Mode.prototype);
diff --git a/lib/ace/mode/handlebars_highlight_rules.js b/lib/ace/mode/handlebars_highlight_rules.js
index c264afc1..f91a48ec 100644
--- a/lib/ace/mode/handlebars_highlight_rules.js
+++ b/lib/ace/mode/handlebars_highlight_rules.js
@@ -15,7 +15,7 @@ var HandlebarsHighlightRules = function() {
var hbs = {
regex : "(?={{)",
push : "handlebars"
- }
+ };
for (var key in this.$rules) {
this.$rules[key].unshift(hbs);
}
@@ -40,22 +40,22 @@ var HandlebarsHighlightRules = function() {
defaultToken : "comment"
}]
}, {
- token : "storage.type.start", // begin section
- regex : "{{[#\\^/&]?",
+ token : "support.function", // unescaped variable
+ regex : "{{{",
push : [{
- token : "storage.type.end",
- regex : "}}",
+ token : "support.function",
+ regex : "}}}",
next : pop2
}, {
token : "variable.parameter",
regex : "[a-zA-Z_$][a-zA-Z0-9_$]*"
}]
}, {
- token : "support.function", // unescaped variable
- regex : "{{{",
+ token : "storage.type.start", // begin section
+ regex : "{{[#\\^/&]?",
push : [{
- token : "support.function",
- regex : "}}}",
+ token : "storage.type.end",
+ regex : "}}",
next : pop2
}, {
token : "variable.parameter",
diff --git a/lib/ace/snippets/elixir.js b/lib/ace/snippets/elixir.js
new file mode 100644
index 00000000..359d9103
--- /dev/null
+++ b/lib/ace/snippets/elixir.js
@@ -0,0 +1,7 @@
+define(function(require, exports, module) {
+"use strict";
+
+exports.snippetText = require("../requirejs/text!./.snippets");
+exports.scope = "";
+
+});
diff --git a/lib/ace/snippets/elixir.snippets b/lib/ace/snippets/elixir.snippets
new file mode 100644
index 00000000..e69de29b
{{title}}
-