[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