fix jumping to brackets in strings

This commit is contained in:
Adam Jimenez 2014-06-09 21:30:19 +01:00
commit e92b709eb2

View file

@ -1923,48 +1923,54 @@ var Editor = function(renderer, session) {
var cursor = this.getCursorPosition(); var cursor = this.getCursorPosition();
var iterator = new TokenIterator(this.session, cursor.row, cursor.column); var iterator = new TokenIterator(this.session, cursor.row, cursor.column);
var prevToken = iterator.getCurrentToken(); var prevToken = iterator.getCurrentToken();
var token; var token = prevToken;
//handle bracket as first char on line if (!token)
if (prevToken && prevToken.index===0)
token = prevToken;
else
token = iterator.stepForward(); token = iterator.stepForward();
if (!token) if (!token)
return; return;
//get next closing tag or bracket //get next closing tag or bracket
var matchType; var matchType;
var found = false; var found = false;
var inverse;
var depth = {}; var depth = {};
var i = cursor.column - token.start;
var bracketType;
var brackets = {
")": "(",
"(": "(",
"]": "[",
"[": "[",
"{": "{",
"}": "{"
};
do { do {
if (token.value.match(/[{}()\[\]]/g)) { if (token.value.match(/[{}()\[\]]/g)) {
for (var i=0; i<token.value.length; i++) { for (; i<token.value.length && !found; i++) {
if (!brackets[token.value[i]]) {
continue;
}
bracketType = brackets[token.value[i]]+'.'+token.type.replace("rparen", "lparen");
if (isNaN(depth[bracketType])) {
depth[bracketType] = 0;
}
switch (token.value[i]) { switch (token.value[i]) {
case '(': case '(':
case '[': case '[':
case '{': case '{':
if (isNaN(depth[token.value[i]])) { depth[bracketType]++;
depth[token.value] = 0;
}
depth[token.value[i]]++;
break; break;
case ')': case ')':
case ']': case ']':
case '}': case '}':
inverse = this.session.$brackets[token.value[i]]; depth[bracketType]--;
if (isNaN(depth[inverse])) { if (depth[bracketType]===-1) {
depth[inverse] = 0;
}
depth[inverse]--;
if (depth[inverse]===-1) {
matchType = 'bracket'; matchType = 'bracket';
found = true; found = true;
} }
@ -1976,23 +1982,24 @@ var Editor = function(renderer, session) {
depth[token.value] = 0; depth[token.value] = 0;
} }
if (prevToken.value==='<') { if (prevToken.value === '<') {
depth[token.value]++; depth[token.value]++;
} else if ( prevToken.value==='</') { } else if (prevToken.value === '</') {
depth[token.value]--; depth[token.value]--;
} }
if (depth[token.value]===-1) { if (depth[token.value] === -1) {
matchType = 'tag'; matchType = 'tag';
found = true; found = true;
} }
} }
if (found===false) { if (!found) {
prevToken = token; prevToken = token;
token = iterator.stepForward(); token = iterator.stepForward();
i = 0;
} }
} while (token && found===false); } while (token && !found);
//no match found //no match found
if (!matchType) { if (!matchType) {
@ -2005,9 +2012,9 @@ var Editor = function(renderer, session) {
if (!range) { if (!range) {
range = new Range( range = new Range(
iterator.getCurrentTokenRow(), iterator.getCurrentTokenRow(),
iterator.getCurrentTokenColumn(), iterator.getCurrentTokenColumn()+i-1,
iterator.getCurrentTokenRow(), iterator.getCurrentTokenRow(),
iterator.getCurrentTokenColumn() iterator.getCurrentTokenColumn()+i-1
); );
if (!range) if (!range)
return; return;
@ -2020,16 +2027,16 @@ var Editor = function(renderer, session) {
var tag = token.value; var tag = token.value;
else else
return; return;
var range = new Range( var range = new Range(
iterator.getCurrentTokenRow(), iterator.getCurrentTokenRow(),
iterator.getCurrentTokenColumn()-2, iterator.getCurrentTokenColumn()-2,
iterator.getCurrentTokenRow(), iterator.getCurrentTokenRow(),
iterator.getCurrentTokenColumn()-2 iterator.getCurrentTokenColumn()-2
); );
//find matching tag //find matching tag
if (range.compare(cursor.row, cursor.column)===0) { if (range.compare(cursor.row, cursor.column) === 0) {
found = false; found = false;
do { do {
token = prevToken; token = prevToken;
@ -2039,11 +2046,11 @@ var Editor = function(renderer, session) {
if (prevToken.type.indexOf('tag-close') !== -1) { if (prevToken.type.indexOf('tag-close') !== -1) {
range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn()+1); range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn()+1);
} }
if (token.value===tag && token.type.indexOf('tag-name') !== -1) { if (token.value === tag && token.type.indexOf('tag-name') !== -1) {
if (prevToken.value==='<') { if (prevToken.value === '<') {
depth[tag]++; depth[tag]++;
} else if ( prevToken.value==='</') { } else if ( prevToken.value === '</') {
depth[tag]--; depth[tag]--;
} }
@ -2051,17 +2058,17 @@ var Editor = function(renderer, session) {
found = true; found = true;
} }
} }
} while (prevToken && found===false); } while (prevToken && !found);
} }
//we found it //we found it
if (token && token.type.indexOf('tag-name')) { if (token && token.type.indexOf('tag-name')) {
var pos = range.start; var pos = range.start;
if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)
pos = range.end; pos = range.end;
} }
} }
pos = range && range.cursor || pos; pos = range && range.cursor || pos;
if (pos) { if (pos) {
if (select) { if (select) {