in lib/ace/editor.js [580:687]
setTimeout(function() {
self.$highlightTagPending = false;
var session = self.session;
if (!session || !session.bgTokenizer) return;
var pos = self.getCursorPosition();
var iterator = new TokenIterator(self.session, pos.row, pos.column);
var token = iterator.getCurrentToken();
if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) {
session.removeMarker(session.$tagHighlight);
session.$tagHighlight = null;
return;
}
if (token.type.indexOf("tag-open") !== -1) {
token = iterator.stepForward();
if (!token)
return;
}
var tag = token.value;
var currentTag = token.value;
var depth = 0;
var prevToken = iterator.stepBackward();
if (prevToken.value === '<'){
//find closing tag
do {
prevToken = token;
token = iterator.stepForward();
if (token) {
if (token.type.indexOf('tag-name') !== -1) {
currentTag = token.value;
if (tag === currentTag) {
if (prevToken.value === '<') {
depth++;
} else if (prevToken.value === '</') {
depth--;
}
}
} else if (tag === currentTag && token.value === '/>') { // self closing tag
depth--;
}
}
} while (token && depth >= 0);
} else {
//find opening tag
do {
token = prevToken;
prevToken = iterator.stepBackward();
if (token) {
if (token.type.indexOf('tag-name') !== -1) {
if (tag === token.value) {
if (prevToken.value === '<') {
depth++;
} else if (prevToken.value === '</') {
depth--;
}
}
} else if (token.value === '/>') { // self closing tag
var stepCount = 0;
var tmpToken = prevToken;
while (tmpToken) {
if (tmpToken.type.indexOf('tag-name') !== -1 && tmpToken.value === tag) {
depth--;
break;
} else if (tmpToken.value === '<') {
break;
}
tmpToken = iterator.stepBackward();
stepCount++;
}
for (var i = 0; i < stepCount; i++) {
iterator.stepForward();
}
}
}
} while (prevToken && depth <= 0);
//select tag again
iterator.stepForward();
}
if (!token) {
session.removeMarker(session.$tagHighlight);
session.$tagHighlight = null;
return;
}
var row = iterator.getCurrentTokenRow();
var column = iterator.getCurrentTokenColumn();
var range = new Range(row, column, row, column+token.value.length);
//remove range if different
var sbm = session.$backMarkers[session.$tagHighlight];
if (session.$tagHighlight && sbm != undefined && range.compareRange(sbm.range) !== 0) {
session.removeMarker(session.$tagHighlight);
session.$tagHighlight = null;
}
if (!session.$tagHighlight)
session.$tagHighlight = session.addMarker(range, "ace_bracket", "text");
}, 50);