From 07fb7738db3d581e086fa01d8f6ed7697e181418 Mon Sep 17 00:00:00 2001 From: Adam Jimenez Date: Thu, 5 Jun 2014 19:56:46 +0100 Subject: [PATCH 1/3] Highlight matching HTML tag fixes #1308 --- lib/ace/editor.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index ef2d9f1a..57c6adb2 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -48,6 +48,7 @@ var EventEmitter = require("./lib/event_emitter").EventEmitter; var CommandManager = require("./commands/command_manager").CommandManager; var defaultCommands = require("./commands/default_commands").commands; var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; /** * The main entry point into the Ace functionality. @@ -534,6 +535,83 @@ var Editor = function(renderer, session) { self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text"); }, 50); }; + + this.$highlightTags = function() { + var session = this.session; + + if (session.$tagHighlight) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + } + + if (this.$highlightTagPending) { + return; + } + + // perform highlight async to not block the browser during navigation + var self = this; + this.$highlightTagPending = true; + setTimeout(function() { + self.$highlightTagPending = false; + + var pos = editor.getCursorPosition(); + var iterator = new TokenIterator(self.session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + + if( !token || token.type.indexOf('tag-name') === -1 ){ + return; + } + + var tag = token.value; + var depth = 0; + var prevToken = iterator.stepBackward(); + + if (prevToken.value == '<'){ + //find closing tag + do { + prevToken = token; + token = iterator.stepForward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value==='<'){ + depth++; + } else if (prevToken.value==='=0); + }else{ + //find opening tag + do { + token = prevToken; + prevToken = iterator.stepBackward(); + + if(token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value==='<') { + depth++; + } else if( prevToken.value===' Date: Fri, 6 Jun 2014 10:53:55 +0100 Subject: [PATCH 2/3] matching tag fixes remove global editor ref, add listener --- lib/ace/editor.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 57c6adb2..643bc217 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -554,7 +554,7 @@ var Editor = function(renderer, session) { setTimeout(function() { self.$highlightTagPending = false; - var pos = editor.getCursorPosition(); + var pos = self.getCursorPosition(); var iterator = new TokenIterator(self.session, pos.row, pos.column); var token = iterator.getCurrentToken(); @@ -729,6 +729,7 @@ var Editor = function(renderer, session) { } this.$highlightBrackets(); + this.$highlightTags(); this.$updateHighlightActiveLine(); this._signal("changeSelection"); }; From 111ec1899fc98cf841cc6e0d879bca46cbe1af59 Mon Sep 17 00:00:00 2001 From: Adam Jimenez Date: Fri, 6 Jun 2014 13:32:16 +0100 Subject: [PATCH 3/3] fix tag flicker fix tag highlight flicker when selecting --- lib/ace/editor.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 643bc217..f77c5aa3 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -539,11 +539,6 @@ var Editor = function(renderer, session) { this.$highlightTags = function() { var session = this.session; - if (session.$tagHighlight) { - session.removeMarker(session.$tagHighlight); - session.$tagHighlight = null; - } - if (this.$highlightTagPending) { return; } @@ -558,7 +553,9 @@ var Editor = function(renderer, session) { var iterator = new TokenIterator(self.session, pos.row, pos.column); var token = iterator.getCurrentToken(); - if( !token || token.type.indexOf('tag-name') === -1 ){ + if (!token || token.type.indexOf('tag-name') === -1) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; return; } @@ -601,15 +598,23 @@ var Editor = function(renderer, session) { } 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); - - if (range) - self.session.$tagHighlight = self.session.addMarker(range, "ace_bracket", "text"); + + //remove range if different + if (session.$tagHighlight && range.compareRange(session.$backMarkers[session.$tagHighlight].range)!==0) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + } + + if (range && !session.$tagHighlight) + session.$tagHighlight = session.addMarker(range, "ace_bracket", "text"); }, 50); };