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()) {
|
if (this.getBehavioursEnabled()) {
|
||||||
// Get a transform if the current mode wants one.
|
// 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)
|
if (transform)
|
||||||
text = transform.text;
|
text = transform.text;
|
||||||
}
|
}
|
||||||
|
|
@ -637,7 +637,10 @@ var Editor =function(renderer, session) {
|
||||||
if (this.getBehavioursEnabled()) {
|
if (this.getBehavioursEnabled()) {
|
||||||
var session = this.session;
|
var session = this.session;
|
||||||
var state = session.getState(range.start.row);
|
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);
|
this.session.remove(range);
|
||||||
|
|
|
||||||
|
|
@ -44,20 +44,24 @@ var Behaviour = function() {
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
|
|
||||||
this.add = function (name, insert, remove) {
|
this.add = function (name, action, callback) {
|
||||||
if (this.$behaviours === undefined) {
|
switch (undefined) {
|
||||||
this.$behaviours = {};
|
case this.$behaviours:
|
||||||
|
this.$behaviours = {};
|
||||||
|
case this.$behaviours[name]:
|
||||||
|
this.$behaviours[name] = {};
|
||||||
}
|
}
|
||||||
this.$behaviours[name] = {
|
this.$behaviours[name][action] = callback;
|
||||||
insert: insert,
|
|
||||||
remove: remove
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addBehaviours = function (behaviours) {
|
this.addBehaviours = function (behaviours) {
|
||||||
for (var key in behaviours) {
|
for (var key in behaviours) {
|
||||||
if (behaviours.hasOwnProperty(key)) {
|
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 {
|
} else {
|
||||||
var behaviours = mode.getBehaviours();
|
var behaviours = mode.getBehaviours();
|
||||||
}
|
}
|
||||||
for (var key in behaviours) {
|
this.addBehaviours(behaviours);
|
||||||
if (behaviours.hasOwnProperty(key)) {
|
|
||||||
this.add(key, behaviours[key].insert, behaviours[key].remove);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getBehaviours = function (filter) {
|
this.getBehaviours = function (filter) {
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ var Behaviour = require('ace/mode/behaviour').Behaviour;
|
||||||
|
|
||||||
var CstyleBehaviour = function () {
|
var CstyleBehaviour = function () {
|
||||||
|
|
||||||
this.add("brace_insert", function (state, editor, session, text) {
|
this.add("braces", "insertion", function (state, action, editor, session, text) {
|
||||||
if (text == '{') {
|
if (text == '{') {
|
||||||
var selection = editor.getSelectionRange();
|
var selection = editor.getSelectionRange();
|
||||||
var selected = session.doc.getTextRange(selection);
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
|
@ -88,7 +88,9 @@ var CstyleBehaviour = function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}, function (state, editor, session, range) {
|
});
|
||||||
|
|
||||||
|
this.add("braces", "deletion", function (state, action, editor, session, range) {
|
||||||
var selected = session.doc.getTextRange(range);
|
var selected = session.doc.getTextRange(range);
|
||||||
if (!range.isMultiLine() && selected == '{') {
|
if (!range.isMultiLine() && selected == '{') {
|
||||||
var line = session.doc.getLine(range.start.row);
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
|
@ -101,7 +103,7 @@ var CstyleBehaviour = function () {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.add("parens_insert", function (state, editor, session, text) {
|
this.add("parens", "insertion", function (state, action, editor, session, text) {
|
||||||
if (text == '(') {
|
if (text == '(') {
|
||||||
var selection = editor.getSelectionRange();
|
var selection = editor.getSelectionRange();
|
||||||
var selected = session.doc.getTextRange(selection);
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
|
@ -131,7 +133,9 @@ var CstyleBehaviour = function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}, function (state, editor, session, range) {
|
});
|
||||||
|
|
||||||
|
this.add("parens", "deletion", function (state, action, editor, session, range) {
|
||||||
var selected = session.doc.getTextRange(range);
|
var selected = session.doc.getTextRange(range);
|
||||||
if (!range.isMultiLine() && selected == '(') {
|
if (!range.isMultiLine() && selected == '(') {
|
||||||
var line = session.doc.getLine(range.start.row);
|
var line = session.doc.getLine(range.start.row);
|
||||||
|
|
@ -144,7 +148,7 @@ var CstyleBehaviour = function () {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
this.add("string_dquotes", function (state, editor, session, text) {
|
this.add("string_dquotes", "insertion", function (state, action, editor, session, text) {
|
||||||
if (text == '"') {
|
if (text == '"') {
|
||||||
var selection = editor.getSelectionRange();
|
var selection = editor.getSelectionRange();
|
||||||
var selected = session.doc.getTextRange(selection);
|
var selected = session.doc.getTextRange(selection);
|
||||||
|
|
@ -193,7 +197,9 @@ var CstyleBehaviour = function () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}, function (state, editor, session, range) {
|
});
|
||||||
|
|
||||||
|
this.add("string_dquotes", "deletion", function (state, action, editor, session, range) {
|
||||||
var selected = session.doc.getTextRange(range);
|
var selected = session.doc.getTextRange(range);
|
||||||
if (!range.isMultiLine() && selected == '"') {
|
if (!range.isMultiLine() && selected == '"') {
|
||||||
var line = session.doc.getLine(range.start.row);
|
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]]();
|
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++) {
|
for (var i = 0; i < delegations.length; i++) {
|
||||||
(function(scope) {
|
(function(scope) {
|
||||||
|
|
@ -182,36 +182,21 @@ var Mode = function() {
|
||||||
return defaultHandler ? defaultHandler.apply(this, args) : undefined;
|
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) {
|
if (this.$behaviour) {
|
||||||
var behaviours = this.$behaviour.getBehaviours();
|
var behaviours = this.$behaviour.getBehaviours();
|
||||||
for (var key in behaviours) {
|
for (var key in behaviours) {
|
||||||
if (behaviours.hasOwnProperty(key)) {
|
if (behaviours.hasOwnProperty(key) && behaviours[key][action]) {
|
||||||
var ret = behaviours[key].insert.apply(this, arguments);
|
var ret = behaviours[key][action].apply(this, arguments);
|
||||||
if (ret !== false) {
|
if (ret !== false) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
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);
|
}).call(Mode.prototype);
|
||||||
|
|
||||||
exports.Mode = Mode;
|
exports.Mode = Mode;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue