diff --git a/demo/demo.js b/demo/demo.js
index 892c50ce..23e83d6d 100644
--- a/demo/demo.js
+++ b/demo/demo.js
@@ -72,7 +72,7 @@ var TextileMode = require("ace/mode/textile").Mode;
var TextMode = require("ace/mode/text").Mode;
var GroovyMode = require("ace/mode/groovy").Mode;
var ScalaMode = require("ace/mode/scala").Mode;
-
+var LatexMode = require("ace/mode/latex").Mode;
var UndoManager = require("ace/undomanager").UndoManager;
var vim = require("ace/keyboard/keybinding/vim").Vim;
@@ -197,6 +197,9 @@ exports.launch = function(env) {
docs.scala.setMode(new ScalaMode());
docs.scala.setUndoManager(new UndoManager());
+ docs.latex = new EditSession(require("ace/requirejs/text!demo/docs/latex.tex"));
+ docs.latex.setMode(new LatexMode());
+ docs.latex.setUndoManager(new UndoManager());
// Add a "name" property to all docs
for (var doc in docs) {
@@ -241,7 +244,8 @@ exports.launch = function(env) {
ocaml: new OcamlMode(),
csharp: new CSharpMode(),
groovy: new GroovyMode(),
- scala: new ScalaMode()
+ scala: new ScalaMode(),
+ latex: new LatexMode()
};
function getMode() {
@@ -345,6 +349,9 @@ exports.launch = function(env) {
else if (mode instanceof ScalaMode) {
modeEl.value = "scala";
}
+ else if (mode instanceof LatexMode) {
+ modeEl.value = "latex";
+ }
else {
modeEl.value = "text";
}
diff --git a/kitchen-sink.html b/kitchen-sink.html
index b06ef927..35e9605e 100644
--- a/kitchen-sink.html
+++ b/kitchen-sink.html
@@ -38,6 +38,7 @@
+
@@ -69,6 +70,7 @@
+
diff --git a/lib/ace/mode/latex.js b/lib/ace/mode/latex.js
new file mode 100644
index 00000000..0b603236
--- /dev/null
+++ b/lib/ace/mode/latex.js
@@ -0,0 +1,58 @@
+define(function(require, exports, module) {
+
+var oop = require("pilot/oop");
+var TextMode = require("ace/mode/text").Mode;
+var Tokenizer = require("ace/tokenizer").Tokenizer;
+var LatexHighlightRules = require("ace/mode/latex_highlight_rules").LatexHighlightRules;
+var Range = require("ace/range").Range;
+
+var Mode = function()
+{
+ this.$tokenizer = new Tokenizer(new LatexHighlightRules().getRules());
+};
+oop.inherits(Mode, TextMode);
+
+(function()
+{
+ this.toggleCommentLines = function(state, doc, startRow, endRow) {
+ // This code is adapted from ruby.js
+ var outdent = true;
+ var outentedRows = [];
+
+ // LaTeX comments begin with % and go to the end of the line
+ var commentRegEx = /^(\s*)\%/;
+
+ for (var i = startRow; i <= endRow; i++) {
+ if (!commentRegEx.test(doc.getLine(i))) {
+ outdent = false;
+ break;
+ }
+ }
+
+ if (outdent) {
+ var deleteRange = new Range(0, 0, 0, 0);
+ for (var i = startRow; i <= endRow; i++) {
+ var line = doc.getLine(i);
+ var m = line.match(commentRegEx);
+ deleteRange.start.row = i;
+ deleteRange.end.row = i;
+ deleteRange.end.column = m[0].length;
+ doc.replace(deleteRange, m[1]);
+ }
+ }
+ else {
+ doc.indentRows(startRow, endRow, "%");
+ }
+ };
+
+ // There is no universally accepted way of indenting a tex document
+ // so just maintain the indentation of the previous line
+ this.getNextLineIndent = function(state, line, tab) {
+ return this.$getIndent(line);
+ };
+
+}).call(Mode.prototype);
+
+exports.Mode = Mode;
+
+});
diff --git a/lib/ace/mode/latex_highlight_rules.js b/lib/ace/mode/latex_highlight_rules.js
new file mode 100644
index 00000000..76a6ca90
--- /dev/null
+++ b/lib/ace/mode/latex_highlight_rules.js
@@ -0,0 +1,39 @@
+define(function(require, exports, module) {
+
+var oop = require("pilot/oop");
+var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules;
+
+var LatexHighlightRules = function()
+{
+ this.$rules = {
+ "start" : [
+ {
+ // A tex command e.g. \foo
+ token : "keyword",
+ regex : "\\\\(?:[^a-zA-Z]|[a-zA-Z]+)",
+ },
+ {
+ // Curly and square braces
+ token : "keyword",
+ regex : "[\\{\\}\\]\\[]"
+ },
+ {
+ // Inline math between two $ symbols
+ token : "string",
+ regex : "\\$(?:(?:\\\\.)|(?:[^\\$\\\\]))*?\\$"
+ },
+ {
+ // A comment. Tex comments start with % and go to
+ // the end of the line
+ token : "comment",
+ regex : "%.*$"
+ }
+ ]
+ };
+};
+
+oop.inherits(LatexHighlightRules, TextHighlightRules);
+
+exports.LatexHighlightRules = LatexHighlightRules;
+
+});