diff --git a/lib/ace/editor.js b/lib/ace/editor.js index a32ff85e..14422369 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -412,7 +412,7 @@ var Editor =function(renderer, session) { var mode = session.getMode(); var cursor = this.getCursorPosition(); - var transform = mode.transformInput(session.getState(cursor.row), this, session, text); + var transform = mode.transformInsert(session.getState(cursor.row), this, session, text); if (transform) text = transform.text; diff --git a/lib/ace/mode/text.js b/lib/ace/mode/text.js index 70a3739c..819b45aa 100644 --- a/lib/ace/mode/text.js +++ b/lib/ace/mode/text.js @@ -179,11 +179,70 @@ var Mode = function() { return defaultHandler ? defaultHandler.apply(this, args) : undefined; }; - this.transformInput = function(state, editor, session, text) { + this.addBehaviour = function (name, insert, remove) { + if (this.$behaviours === undefined) { + this.$behaviours = {}; + } + this.$behaviours[name] = { + insert: insert, + remove: remove + }; + } + + this.removeBehaviour = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + } + + this.inheritBehaviours = function (mode) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(); + } else { + var behaviours = mode.getBehaviours(); + } + for (var key in behaviours) { + if (behaviours.hasOwnProperty(key)) { + this.addBehaviour(key, behaviours[key].insert, behaviours[key].remove); + } + } + } + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {} + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + } + + this.transformInsert = function(state, editor, session, text) { + for (var key in this.$behaviours) { + if (this.$behaviours.hasOwnProperty(key)) { + var ret = this.$behaviours[key].insert.apply(this, arguments); + if (ret !== false) { + return ret; + } + } + } return false; }; this.transformRemove = function(state, editor, session, range) { + for (var key in this.$behaviours) { + if (this.$behaviours.hasOwnProperty(key)) { + var ret = this.$behaviours[key].remove.apply(this, arguments); + if (ret !== false) { + return ret; + } + } + } return range; };