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; + +});