diff --git a/lib/ace/mode/behaviour/xml.js b/lib/ace/mode/behaviour/xml.js index 7f1b02d9..e4abfb7b 100644 --- a/lib/ace/mode/behaviour/xml.js +++ b/lib/ace/mode/behaviour/xml.js @@ -30,6 +30,19 @@ var XmlBehaviour = function () { selection: [1, 1] } } + } else if (text == "\n") { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChars = line.substring(cursor.column, cursor.column + 2); + if (rightChars == ')", next: "tag" @@ -184,15 +182,13 @@ var HtmlHighlightRules = function() { token: "text", regex: "<\\/(?=script)", next: "tag" - }); - - var cssRules = new CssHighlightRules().getRules(); - this.addRules(cssRules, "css-"); - this.$rules["css-start"].unshift({ + }], ["js-start"]); + + this.embedRules(CssHighlightRules, "css-", [{ token: "text", regex: "<\\/(?=style)", next: "tag" - }); + }], ["css-start"]); }; oop.inherits(HtmlHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/java_highlight_rules.js b/lib/ace/mode/java_highlight_rules.js index 6efcd07e..db7fe99b 100644 --- a/lib/ace/mode/java_highlight_rules.js +++ b/lib/ace/mode/java_highlight_rules.js @@ -7,8 +7,6 @@ var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightR var JavaHighlightRules = function() { - var docComment = new DocCommentHighlightRules(); - // taken from http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html var keywords = lang.arrayToMap( ("abstract|continue|for|new|switch|" + @@ -66,7 +64,7 @@ var JavaHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - docComment.getStartRule("doc-start"), + new DocCommentHighlightRules().getStartRule("doc-start"), { token : "comment", // multi line comment regex : "\\/\\*", @@ -156,9 +154,9 @@ var JavaHighlightRules = function() { } ] }; - - this.addRules(docComment.getRules(), "doc-"); - this.$rules["doc-start"][0].next = "start"; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ new DocCommentHighlightRules().getEndRule("start") ]); }; oop.inherits(JavaHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/javascript_highlight_rules.js b/lib/ace/mode/javascript_highlight_rules.js index f5998deb..14b1795c 100644 --- a/lib/ace/mode/javascript_highlight_rules.js +++ b/lib/ace/mode/javascript_highlight_rules.js @@ -45,8 +45,6 @@ var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightR var JavaScriptHighlightRules = function() { - var docComment = new DocCommentHighlightRules(); - var keywords = lang.arrayToMap( ("break|case|catch|continue|default|delete|do|else|finally|for|function|" + "if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|" + @@ -71,7 +69,7 @@ var JavaScriptHighlightRules = function() { token : "comment", regex : "\\/\\/.*$" }, - docComment.getStartRule("doc-start"), + new DocCommentHighlightRules().getStartRule("doc-start"), { token : "comment", // multi line comment regex : "\\/\\*", @@ -168,9 +166,9 @@ var JavaScriptHighlightRules = function() { } ] }; - - this.addRules(docComment.getRules(), "doc-"); - this.$rules["doc-start"][0].next = "start"; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ new DocCommentHighlightRules().getEndRule("start") ]); }; oop.inherits(JavaScriptHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/php_highlight_rules.js b/lib/ace/mode/php_highlight_rules.js index 5e5d3922..a3c1e2dc 100644 --- a/lib/ace/mode/php_highlight_rules.js +++ b/lib/ace/mode/php_highlight_rules.js @@ -44,9 +44,7 @@ var DocCommentHighlightRules = require("ace/mode/doc_comment_highlight_rules").D var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules; var PhpHighlightRules = function() { - - var docComment = new DocCommentHighlightRules(); - + var builtinFunctions = lang.arrayToMap( ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|' + 'aggregate_methods_by_list|aggregate_methods_by_regexp|aggregate_properties|aggregate_properties_by_list|' + @@ -476,7 +474,7 @@ var PhpHighlightRules = function() { token : "comment", regex : "#.*$" }, - docComment.getStartRule("doc-start"), + new DocCommentHighlightRules().getStartRule("doc-start"), { token : "comment", // multi line comment regex : "\\/\\*", @@ -596,9 +594,9 @@ var PhpHighlightRules = function() { } ] }; - - this.addRules(docComment.getRules(), "doc-"); - this.$rules["doc-start"][0].next = "start"; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ new DocCommentHighlightRules().getEndRule("start") ]); }; oop.inherits(PhpHighlightRules, TextHighlightRules); diff --git a/lib/ace/mode/svg.js b/lib/ace/mode/svg.js index 4ba826a2..10384e57 100644 --- a/lib/ace/mode/svg.js +++ b/lib/ace/mode/svg.js @@ -42,10 +42,18 @@ var XmlMode = require("ace/mode/text").Mode; var JavaScriptMode = require("ace/mode/javascript").Mode; var Tokenizer = require("ace/tokenizer").Tokenizer; var SvgHighlightRules = require("ace/mode/svg_highlight_rules").SvgHighlightRules; +var XmlBehaviour = require("ace/mode/behaviour/xml").XmlBehaviour; var Mode = function() { - this.$tokenizer = new Tokenizer(new SvgHighlightRules().getRules()); - this.$js = new JavaScriptMode(); + this.highlighter = new SvgHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new XmlBehaviour(); + + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode + }); }; oop.inherits(Mode, XmlMode); @@ -53,38 +61,15 @@ oop.inherits(Mode, XmlMode); (function() { this.toggleCommentLines = function(state, doc, startRow, endRow) { - this.$delegate("toggleCommentLines", arguments, function() { - return 0; - }); + return 0; }; this.getNextLineIndent = function(state, line, tab) { - var self = this; - return this.$delegate("getNextLineIndent", arguments, function() { - return self.$getIndent(line); - }); + return self.$getIndent(line); }; this.checkOutdent = function(state, line, input) { - return this.$delegate("checkOutdent", arguments, function() { - return false; - }); - }; - - this.autoOutdent = function(state, doc, row) { - this.$delegate("autoOutdent", arguments); - }; - - this.$delegate = function(method, args, defaultHandler) { - var state = args[0]; - var split = state.split("js-"); - - if (!split[0] && split[1]) { - args[0] = split[1]; - return this.$js[method].apply(this.$js, args); - } - - return defaultHandler ? defaultHandler() : undefined; + return false; }; }).call(Mode.prototype); diff --git a/lib/ace/mode/svg_highlight_rules.js b/lib/ace/mode/svg_highlight_rules.js index 731e05a5..0f9ae5b9 100644 --- a/lib/ace/mode/svg_highlight_rules.js +++ b/lib/ace/mode/svg_highlight_rules.js @@ -65,11 +65,9 @@ var SvgHighlightRules = function() { }, { token : "string", regex : "'.*?'" - }]; - - var jsRules = new JavaScriptHighlightRules().getRules(); - this.addRules(jsRules, "js-"); - this.$rules["js-start"].unshift({ + }]; + + this.embedRules(JavaScriptHighlightRules, "js-", [{ token: "comment", regex: "\\/\\/.*(?=<\\/script>)", next: "tag" @@ -77,7 +75,7 @@ var SvgHighlightRules = function() { token: "text", regex: "<\\/(?=script)", next: "tag" - }); + }], ["js-start"]); }; diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index 7e2e96a2..b3eeac78 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -150,7 +150,9 @@ var Mode = function() { } this.$modes = {}; for (var i = 0; i < this.$embeds.length; i++) { - this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); + if (mapping[this.$embeds[i]]) { + this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); + } } var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction']; @@ -171,15 +173,16 @@ var Mode = function() { for (var i = 0; i < this.$embeds.length; i++) { var split = state.split(this.$embeds[i]); - + if (!this.$modes[this.$embeds[i]]) continue; + if (!split[0] && split[1]) { args[0] = split[1]; var mode = this.$modes[this.$embeds[i]]; return mode[method].apply(mode, args); } } - - return defaultHandler ? defaultHandler.apply(this, args) : undefined; + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; }; this.transformAction = function(state, action, editor, session, param) { diff --git a/lib/ace/mode/text_highlight_rules.js b/lib/ace/mode/text_highlight_rules.js index 3ff947b1..317cb316 100644 --- a/lib/ace/mode/text_highlight_rules.js +++ b/lib/ace/mode/text_highlight_rules.js @@ -53,6 +53,19 @@ var TextHighlightRules = function() { }; }; +// Could probably do with improving and moving into lang. +var deepCopy = function (o) { + var clone = o.constructor(); + for (var k in o) { + if (typeof o[k] === "object") { + clone[k] = deepCopy(o[k]); + } else { + clone[k] = o[k]; + } + } + return clone; +}; + (function() { this.addRules = function(rules, prefix) { @@ -60,11 +73,13 @@ var TextHighlightRules = function() { var state = rules[key]; for (var i=0; i