diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index 4b4a6b4f..d0a3e495 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -140,6 +140,44 @@ var Mode = function() { editor.session.$selectionOccurrences = []; }; + + this.createModeDelegates = function (mapping) { + if (!this.$embeds) { + return; + } + this.$modes = {}; + for (var i = 0; i < this.$embeds.length; i++) { + this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]](); + } + + var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent']; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + } + } (this)); + } + } + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0]; + + for (var i = 0; i < this.$embeds.length; i++) { + var split = state.split(this.$embeds[i]); + + 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; + }; }).call(Mode.prototype); diff --git a/lib/ace/mode/text_highlight_rules.js b/lib/ace/mode/text_highlight_rules.js index d4b362a7..3ff947b1 100644 --- a/lib/ace/mode/text_highlight_rules.js +++ b/lib/ace/mode/text_highlight_rules.js @@ -73,6 +73,34 @@ var TextHighlightRules = function() { this.getRules = function() { return this.$rules; }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states) { + var embedRules = new HighlightRules().getRules(); + if (states) { + for (var i = 0; i < states.length; i++) { + states[i] = prefix + states[i]; + } + } else { + states = []; + for (var key in embedRules) { + states.push(prefix + key); + } + } + this.addRules(embedRules, prefix); + + for (var i = 0; i < states.length; i++) { + Array.prototype.unshift.apply(this.$rules[states[i]], escapeRules); + } + + if (!this.$embeds) { + this.$embeds = []; + } + this.$embeds.push(prefix); + } + + this.getEmbeds = function() { + return this.$embeds; + } }).call(TextHighlightRules.prototype);