setTimeout()

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);