[geany/geany-plugins] e72ea2: PairTagHighlighter: improve brackets search

Volodymyr Kononenko git-noreply at xxxxx
Wed Nov 20 08:59:15 UTC 2013


Branch:      refs/heads/master
Author:      Volodymyr Kononenko <vm at kononenko.ws>
Committer:   Volodymyr Kononenko <volodymyr.kononenko at globallogic.com>
Date:        Wed, 20 Nov 2013 08:59:15 UTC
Commit:      e72ea257154043f45bb3e7091eb170fb3dd984be
             https://github.com/geany/geany-plugins/commit/e72ea257154043f45bb3e7091eb170fb3dd984be

Log Message:
-----------
PairTagHighlighter: improve brackets search

Ignore brackets corresponding to php tags (<? <?php ?>)
and object operators (->). Thanks Peter Donin for bugreport!


Modified Paths:
--------------
    pairtaghighlighter/src/pair_tag_highlighter.c

Modified: pairtaghighlighter/src/pair_tag_highlighter.c
61 files changed, 42 insertions(+), 19 deletions(-)
===================================================================
@@ -55,13 +55,26 @@ static gint findBracket(ScintillaObject *sci, gint position, gint endOfSearchPos
         for(pos=position; pos<=endOfSearchPos; pos++)
         {
             gchar charAtCurPosition = sci_get_char_at(sci, pos);
-            if(charAtCurPosition == searchedBracket)
-            {
+            gchar charAtPrevPosition = sci_get_char_at(sci, pos-1);
+            gchar charAtNextPosition = sci_get_char_at(sci, pos+1);
+
+            if(charAtCurPosition == searchedBracket) {
+                if ('>' == searchedBracket) {
+                    if (('-' == charAtPrevPosition) || ('?' == charAtPrevPosition))
+                        continue;
+                } else if ('<' == searchedBracket) {
+                    if ('?' == charAtNextPosition)
+                        continue;
+                }
                 foundBracket = pos;
                 break;
-            }
-            if(charAtCurPosition == breakBracket)
+            } else if(charAtCurPosition == breakBracket) {
+                if ('<' == breakBracket) {
+                    if ('?' == charAtNextPosition)
+                        continue;
+                }
                 break;
+            }
         }
     }
     else
@@ -70,13 +83,27 @@ static gint findBracket(ScintillaObject *sci, gint position, gint endOfSearchPos
         for(pos=position-1; pos>=endOfSearchPos; pos--)
         {
             gchar charAtCurPosition = sci_get_char_at(sci, pos);
+            gchar charAtPrevPosition = sci_get_char_at(sci, pos+1);
+            gchar charAtNextPosition = sci_get_char_at(sci, pos-1);
+
             if(charAtCurPosition == searchedBracket)
             {
+                if ('<' == searchedBracket) {
+                    if ('?' == charAtPrevPosition)
+                        continue;
+                } else if ('>' == searchedBracket) {
+                    if (('-' == charAtNextPosition) || ('?' == charAtNextPosition))
+                        continue;
+                }
                 foundBracket = pos;
                 break;
-            }
-            if(charAtCurPosition == breakBracket)
+            } else if(charAtCurPosition == breakBracket) {
+                if ('>' == breakBracket) {
+                    if (('-' == charAtNextPosition) || ('?' == charAtNextPosition))
+                        continue;
+                }
                 break;
+            }
         }
     }
 
@@ -251,8 +278,8 @@ static void findMatchingClosingTag(ScintillaObject *sci, gchar *tagName, gint cl
         /* are we inside tag? */
         gint lineNumber = sci_get_line_from_position(sci, pos);
         gint lineEnd = sci_get_line_end_position(sci, lineNumber);
-        gint matchingOpeningBracket = findBracket(sci, pos, endOfDocument, '<', '\0', TRUE);
-        gint matchingClosingBracket = findBracket(sci, pos, endOfDocument, '>', '\0', TRUE);
+        gint matchingOpeningBracket = findBracket(sci, pos, lineEnd, '<', '\0', TRUE);
+        gint matchingClosingBracket = findBracket(sci, pos, lineEnd, '>', '\0', TRUE);
 
         if(-1 != matchingOpeningBracket && -1 != matchingClosingBracket
             && (matchingClosingBracket > matchingOpeningBracket))
@@ -271,14 +298,7 @@ static void findMatchingClosingTag(ScintillaObject *sci, gchar *tagName, gint cl
             }
             pos = matchingClosingBracket;
         }
-        /* Speed up search: if findBracket returns -1, that means end of line
-         * is reached. There is no need to go through the same positions again.
-         * Jump to the end of line */
-        else if(-1 == matchingOpeningBracket || -1 == matchingClosingBracket)
-        {
-            pos = lineEnd;
-            continue;
-        }
+
         if(openingTagsCount == closingTagsCount)
         {
             /* matching tag is found */
@@ -339,10 +359,13 @@ static void run_tag_highlighter(ScintillaObject *sci)
         clear_previous_highlighting(sci, highlightedBrackets[2], highlightedBrackets[3]);
     }
 
-    highlightedBrackets[0] = openingBracket;
-    highlightedBrackets[1] = closingBracket;
+    /* Don't run search on empty brackets <> */
+    if (closingBracket - openingBracket > 1) {
+        highlightedBrackets[0] = openingBracket;
+        highlightedBrackets[1] = closingBracket;
 
-    findMatchingTag(sci, openingBracket, closingBracket);
+        findMatchingTag(sci, openingBracket, closingBracket);
+    }
 }
 
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Plugins-Commits mailing list