[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs/kate
From:       Sebastian Pipping <webmaster () hartwork ! org>
Date:       2007-08-31 3:33:04
Message-ID: 1188531184.283186.26040.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 706661 by sping:

Several regex search releated bugfixes


 M  +13 -1     document/katedocument.cpp  
 M  +98 -2     utils/katesearchbar.cpp  
 M  +1 -0      utils/katesearchbar.h  


--- trunk/KDE/kdelibs/kate/document/katedocument.cpp #706660:706661
@@ -2179,8 +2179,20 @@
 
       const int offset = (j == forMin) ? minLeft : 0;
       uint foundAt, myMatchLen;
-      const bool found = textLine->searchText (offset, regexp, &foundAt, \
&myMatchLen, backwards);  
+        // BEGIN QUICK BUGFIX
+//      const bool found = textLine->searchText (offset, regexp, &foundAt, \
&myMatchLen, backwards); +        const int first = (j == forMin) ? minLeft : 0;
+        const int afterLast = (j == forMax) ? maxRight : textLine->length();
+        const QString hay = textLine->string(first, afterLast - first);
+        foundAt = backwards ? regexp.lastIndexIn(hay) : regexp.indexIn(hay);
+        const bool found = (foundAt != -1);
+        if (found) {
+            foundAt += first;
+            myMatchLen = regexp.matchedLength();
+        }
+        // END QUICK BUGFIX
+
       /*
       TODO do we still need this?
 
--- trunk/KDE/kdelibs/kate/utils/katesearchbar.cpp #706660:706661
@@ -358,6 +358,42 @@
 
 
 
+void KateSearchBar::fixForSingleLine(Range & range, bool forwards) {
+    kDebug() << "Single-line workaround checking" << range;
+    if (forwards) {
+        const int line = range.start().line();
+        const int col = range.start().column();
+        const int maxColWithNewline = m_view->doc()->lineLength(line);
+        if (col == maxColWithNewline) {
+            kDebug() << "Starting on a newline" << range;
+            const int maxLine = m_view->doc()->lines() - 1;
+            if (line < maxLine) {
+                range.setRange(Cursor(line + 1, 0), range.end());                
+                kDebug() << "Search range fixed to " << range;
+            } else {
+                // Already at last line
+                range = Range::invalid();
+            }
+        }
+    } else {
+        const int col = range.end().column();
+        if (col == 0) {
+            kDebug() << "Ending after a newline" << range;
+            const int line = range.end().line();
+            if (line > 0) {
+                const int maxColWithNewline = m_view->doc()->lineLength(line - 1);
+                range.setRange(range.start(), Cursor(line - 1, maxColWithNewline));
+                kDebug() << "Search range fixed to " << range;
+            } else {
+                // Already at first line
+                range = Range::invalid();
+            }
+        }
+    }
+}
+
+
+
 void KateSearchBar::onStep(bool replace, bool forwards) {
     // What to find?
     const QString pattern = (m_powerUi != NULL)
@@ -378,6 +414,7 @@
         enabledOptions |= Search::Backwards;
     }
 
+    bool multiLinePattern = false;
     if (m_powerUi != NULL) {
         switch (m_powerUi->searchMode->currentIndex()) {
         case 1: // Whole words
@@ -386,9 +423,15 @@
 
         case 2: // Escape sequences
             enabledOptions |= Search::EscapeSequences;
+            multiLinePattern = true;
             break;
 
         case 3: // Regular expression
+            {
+                // Check if pattern multi-line
+                QString patternCopy(pattern);
+                KateDocument::repairPattern(patternCopy, multiLinePattern);
+            }
             enabledOptions |= Search::Regex;
             break;
 
@@ -435,7 +478,14 @@
             inputRange = m_view->doc()->documentRange();
         }
     }
+    kDebug() << "Search range is" << inputRange;
 
+    // Single-line workaround
+    if (!multiLinePattern) {
+        fixForSingleLine(inputRange, forwards);
+    }
+
+
     // Find, first try
     const QVector<Range> resultRanges = m_view->doc()->searchText(inputRange, \
pattern, enabledOptions);  const Range & match = resultRanges[0];
@@ -457,6 +507,8 @@
                 } else {
                     inputRange.setRange(inputRange.start(), selection.start());
                 }
+                fixForSingleLine(inputRange, forwards);
+
                 const QVector<Range> resultRanges2 = \
m_view->doc()->searchText(inputRange, pattern, enabledOptions);  const Range & match2 \
= resultRanges2[0];  if (match2.isValid()) {
@@ -632,6 +684,7 @@
         enabledOptions |= Search::CaseInsensitive;
     }
 
+    bool multiLinePattern = false;
     if (m_powerUi != NULL) {
         switch (m_powerUi->searchMode->currentIndex()) {
         case 1: // Whole words
@@ -640,9 +693,15 @@
 
         case 2: // Escape sequences
             enabledOptions |= Search::EscapeSequences;
+            multiLinePattern = true;
             break;
 
         case 3: // Regular expression
+            {
+                // Check if pattern multi-line
+                QString patternCopy(pattern);
+                KateDocument::repairPattern(patternCopy, multiLinePattern);
+            }
             enabledOptions |= Search::Regex;
             break;
 
@@ -671,9 +730,46 @@
             break;
         }
 
-        // Continue after match
         replacementJobs.append(resultRanges);
-        inputRange.setRange(match.end(), inputRange.end());
+
+        if (!multiLinePattern) {
+            // NOTE: Without this workaround patterns like ".*" would hit
+            // each line twice, second time the newline only
+            const int line = match.end().line();
+            const int maxLine = m_view->doc()->lines() - 1;
+            if (line < maxLine) {
+                inputRange.setRange(Cursor(line + 1, 0), inputRange.end());
+            } else {
+                // Already at last line
+                break;
+            }
+        } else {
+            // Continue after match
+            if (match.start() == match.end()) {
+                // Can happen for regex patterns like "^".
+                // If we don't advance here we will loop forever...
+                const int line = match.end().line();
+                const int col = match.end().column();
+                const int maxColWithNewline = m_view->doc()->lineLength(line);
+                if (col < maxColWithNewline) {
+                    // Advance on same line
+                    inputRange.setRange(Cursor(line, col + 1), inputRange.end());
+                } else {
+                    // Advance to next line
+                    const int maxLine = m_view->doc()->lines() - 1;
+                    if (line < maxLine) {
+                        // Next line
+                        inputRange.setRange(Cursor(line + 1, 0), inputRange.end());
+                    } else {
+                        // Already at last line
+                        break;
+                    }
+                }
+            } else {
+                inputRange.setRange(match.end(), inputRange.end());
+            }
+        }
+
         if (!inputRange.isValid()) {
             break;
         }
--- trunk/KDE/kdelibs/kate/utils/katesearchbar.h #706660:706661
@@ -111,6 +111,7 @@
     void addCurrentTextToHistory(QComboBox * combo);
     void backupConfig(bool ofPower);
     void sendConfig();
+    void fixForSingleLine(KTextEditor::Range & range, bool forwards);
 
 private:
     // Overridden


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic