Make behavioural actions easily extensible
This commit is contained in:
parent
deb5a01693
commit
bc45a88928
4 changed files with 42 additions and 48 deletions
|
|
@ -415,7 +415,7 @@ var Editor =function(renderer, session) {
|
|||
|
||||
if (this.getBehavioursEnabled()) {
|
||||
// Get a transform if the current mode wants one.
|
||||
var transform = mode.transformInsert(session.getState(cursor.row), this, session, text);
|
||||
var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);
|
||||
if (transform)
|
||||
text = transform.text;
|
||||
}
|
||||
|
|
@ -637,7 +637,10 @@ var Editor =function(renderer, session) {
|
|||
if (this.getBehavioursEnabled()) {
|
||||
var session = this.session;
|
||||
var state = session.getState(range.start.row);
|
||||
range = session.getMode().transformRemove(state, this, session, range);
|
||||
var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);
|
||||
if (new_range !== false) {
|
||||
range = new_range;
|
||||
}
|
||||
}
|
||||
|
||||
this.session.remove(range);
|
||||
|
|
|
|||
|
|
@ -44,20 +44,24 @@ var Behaviour = function() {
|
|||
|
||||
(function () {
|
||||
|
||||
this.add = function (name, insert, remove) {
|
||||
if (this.$behaviours === undefined) {
|
||||
this.$behaviours = {};
|
||||
this.add = function (name, action, callback) {
|
||||
switch (undefined) {
|
||||
case this.$behaviours:
|
||||
this.$behaviours = {};
|
||||
case this.$behaviours[name]:
|
||||
this.$behaviours[name] = {};
|
||||
}
|
||||
this.$behaviours[name] = {
|
||||
insert: insert,
|
||||
remove: remove
|
||||
};
|
||||
this.$behaviours[name][action] = callback;
|
||||
}
|
||||
|
||||
this.addBehaviours = function (behaviours) {
|
||||
for (var key in behaviours) {
|
||||
if (behaviours.hasOwnProperty(key)) {
|
||||
this.addBehaviour(key, behaviours[key].insert, behaviours[key].remove);
|
||||
for (var action in behaviours[key]) {
|
||||
if (behaviours[key].hasOwnProperty(action)) {
|
||||
this.add(key, action, behaviours[key][action]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -74,11 +78,7 @@ var Behaviour = function() {
|
|||
} else {
|
||||
var behaviours = mode.getBehaviours();
|
||||
}
|
||||
for (var key in behaviours) {
|
||||
if (behaviours.hasOwnProperty(key)) {
|
||||
this.add(key, behaviours[key].insert, behaviours[key].remove);
|
||||
}
|
||||
}
|
||||
this.addBehaviours(behaviours);
|
||||
}
|
||||
|
||||
this.getBehaviours = function (filter) {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ var Behaviour = require('ace/mode/behaviour').Behaviour;
|
|||
|
||||
var CstyleBehaviour = function () {
|
||||
|
||||
this.add("brace_insert", function (state, editor, session, text) {
|
||||
this.add("braces", "insertion", function (state, action, editor, session, text) {
|
||||
if (text == '{') {
|
||||
var selection = editor.getSelectionRange();
|
||||
var selected = session.doc.getTextRange(selection);
|
||||
|
|
@ -88,7 +88,9 @@ var CstyleBehaviour = function () {
|
|||
}
|
||||
}
|
||||
return false;
|
||||
}, function (state, editor, session, range) {
|
||||
});
|
||||
|
||||
this.add("braces", "deletion", function (state, action, editor, session, range) {
|
||||
var selected = session.doc.getTextRange(range);
|
||||
if (!range.isMultiLine() && selected == '{') {
|
||||
var line = session.doc.getLine(range.start.row);
|
||||
|
|
@ -101,7 +103,7 @@ var CstyleBehaviour = function () {
|
|||
return false;
|
||||
});
|
||||
|
||||
this.add("parens_insert", function (state, editor, session, text) {
|
||||
this.add("parens", "insertion", function (state, action, editor, session, text) {
|
||||
if (text == '(') {
|
||||
var selection = editor.getSelectionRange();
|
||||
var selected = session.doc.getTextRange(selection);
|
||||
|
|
@ -131,7 +133,9 @@ var CstyleBehaviour = function () {
|
|||
}
|
||||
}
|
||||
return false;
|
||||
}, function (state, editor, session, range) {
|
||||
});
|
||||
|
||||
this.add("parens", "deletion", function (state, action, editor, session, range) {
|
||||
var selected = session.doc.getTextRange(range);
|
||||
if (!range.isMultiLine() && selected == '(') {
|
||||
var line = session.doc.getLine(range.start.row);
|
||||
|
|
@ -144,7 +148,7 @@ var CstyleBehaviour = function () {
|
|||
return false;
|
||||
});
|
||||
|
||||
this.add("string_dquotes", function (state, editor, session, text) {
|
||||
this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
|
||||
if (text == '"') {
|
||||
var selection = editor.getSelectionRange();
|
||||
var selected = session.doc.getTextRange(selection);
|
||||
|
|
@ -193,7 +197,9 @@ var CstyleBehaviour = function () {
|
|||
}
|
||||
}
|
||||
return false;
|
||||
}, function (state, editor, session, range) {
|
||||
});
|
||||
|
||||
this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {
|
||||
var selected = session.doc.getTextRange(range);
|
||||
if (!range.isMultiLine() && selected == '"') {
|
||||
var line = session.doc.getLine(range.start.row);
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ var Mode = function() {
|
|||
this.$modes[this.$embeds[i]] = new mapping[this.$embeds[i]]();
|
||||
}
|
||||
|
||||
var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformInsert', 'transformRemove'];
|
||||
var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction'];
|
||||
|
||||
for (var i = 0; i < delegations.length; i++) {
|
||||
(function(scope) {
|
||||
|
|
@ -182,36 +182,21 @@ var Mode = function() {
|
|||
return defaultHandler ? defaultHandler.apply(this, args) : undefined;
|
||||
};
|
||||
|
||||
this.transformInsert = function(state, editor, session, text) {
|
||||
this.transformAction = function(state, action, editor, session, param) {
|
||||
if (this.$behaviour) {
|
||||
var behaviours = this.$behaviour.getBehaviours();
|
||||
for (var key in behaviours) {
|
||||
if (behaviours.hasOwnProperty(key)) {
|
||||
var ret = behaviours[key].insert.apply(this, arguments);
|
||||
if (ret !== false) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
var behaviours = this.$behaviour.getBehaviours();
|
||||
for (var key in behaviours) {
|
||||
if (behaviours.hasOwnProperty(key) && behaviours[key][action]) {
|
||||
var ret = behaviours[key][action].apply(this, arguments);
|
||||
if (ret !== false) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
this.transformRemove = function(state, editor, session, range) {
|
||||
if (this.$behaviour) {
|
||||
var behaviours = this.$behaviour.getBehaviours();
|
||||
for (var key in behaviours) {
|
||||
if (behaviours.hasOwnProperty(key)) {
|
||||
var ret = behaviours[key].remove.apply(this, arguments);
|
||||
if (ret !== false) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return range;
|
||||
};
|
||||
|
||||
}).call(Mode.prototype);
|
||||
|
||||
exports.Mode = Mode;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue