Bug 148359 - Placeholder extended by the equivalent regular expression
Summary: Placeholder extended by the equivalent regular expression
Status: RESOLVED FIXED
Alias: None
Product: kate
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: unspecified Linux
: NOR wishlist
Target Milestone: ---
Assignee: KWrite Developers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-07-30 15:53 UTC by Andrea
Modified: 2007-09-08 01:23 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Andrea 2007-07-30 15:53:35 UTC
Version:           2.5.7 (using KDE 3.5.7 "release 60.1" , openSUSE )
Compiler:          Target: i586-suse-linux
OS:                Linux (i686) release 2.6.18.8-0.5-default

Inside the Replace Text window, when placeholders are used, if I push the "Insert Placeholder" button I obtain the list of available placeholders, listed as Complete Match, Captured Text (1), Captured Text (2), ...

I think it can be useful if the list contains also the regular expression component corresponding to the single placeholder, expecially when the regular expression contains several placeholders.

Following my idea, given the regular expression ([A-Z])([0-9]([0-9])), placeholders should be prompted as Captured Text (1): [A-Z], Captured Text (2): [0-9][0-9], and Captured Text (3): [0-9] instead of Captured Text (1), Captured Text (2), and Captured Text (3).
Comment 1 Sebastian Pipping 2007-08-30 00:36:48 UTC
Cool idea actually!
Comment 2 Sebastian Pipping 2007-09-08 01:23:54 UTC
SVN commit 709626 by sping:

The menu behind "Add..." now shows the pattern part for each paranthesis, isn't that cool? :-)
BUG: 148359


 M  +97 -11    katesearchbar.cpp  
 M  +1 -0      katesearchbar.h  


--- trunk/KDE/kdelibs/kate/utils/katesearchbar.cpp #709625:709626
@@ -934,6 +934,90 @@
 
 
 
+struct ParInfo {
+    int openIndex;
+    bool capturing;
+    int captureNumber; // 1..9
+};
+
+
+
+QVector<QString> KateSearchBar::getCapturePatterns(const QString & pattern) {
+    QVector<QString> capturePatterns;
+    capturePatterns.reserve(9);
+    QStack<ParInfo> parInfos;
+
+    const int inputLen = pattern.length();
+    int input = 0; // walker index
+    bool insideClass = false;
+    int captureCount = 0;
+
+    while (input < inputLen) {
+        if (insideClass) {
+            // Wait for closing, unescaped ']'
+            if (pattern[input].unicode() == L']') {
+                insideClass = false;
+            }
+            input++;
+        }
+        else
+        {
+            // XXX
+            switch (pattern[input].unicode())
+            {
+            case L'\\':
+                // Skip this and any next character
+                input += 2;
+                break;
+
+            case L'(':
+                ParInfo curInfo;
+                curInfo.openIndex = input;
+                curInfo.capturing = (input + 1 >= inputLen) || (pattern[input + 1].unicode() != '?');
+                if (curInfo.capturing) {
+                    captureCount++;
+                }
+                curInfo.captureNumber = captureCount;
+                parInfos.push(curInfo);
+
+                input++;
+                break;
+                
+            case L')':
+                if (!parInfos.empty()) {
+                    ParInfo & top = parInfos.top();
+                    if (top.capturing && (top.captureNumber <= 9)) {
+                        const int start = top.openIndex + 1;
+                        const int len = input - start;
+                        if (capturePatterns.size() < top.captureNumber) {
+                            capturePatterns.resize(top.captureNumber);
+                        }
+                        capturePatterns[top.captureNumber - 1] = pattern.mid(start, len);
+                    }
+                    parInfos.pop();
+                }
+
+                input++;
+                break;
+
+            case L'[':
+                input++;
+                insideClass = true;
+                break;
+
+            default:
+                input++;
+                break;
+
+            }
+        }
+    }
+
+    return capturePatterns;
+}
+
+
+
 void KateSearchBar::addMenuEntry(QMenu * menu, QVector<QString> & insertBefore, QVector<QString> & insertAfter,
         uint & walker, const QString & before, const QString after, const QString description,
         const QString & realBefore, const QString & realAfter) {
@@ -976,17 +1060,19 @@
         addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\0", "", i18n("Whole match reference"));
         popupMenu->addSeparator();
         if (regexMode) {
-            // TODO Add pattern text for each capture as requested by bug #148359
-            // http://bugs.kde.org/show_bug.cgi?id=148359
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\1", "", i18n("Capture reference 1"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\2", "", i18n("Capture reference 2"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\3", "", i18n("Capture reference 3"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\4", "", i18n("Capture reference 4"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\5", "", i18n("Capture reference 5"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\6", "", i18n("Capture reference 6"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\7", "", i18n("Capture reference 7"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\8", "", i18n("Capture reference 8"));
-            addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\9", "", i18n("Capture reference 9"));
+            const QString pattern = m_powerUi->pattern->currentText();
+            const QVector<QString> capturePatterns = getCapturePatterns(pattern);
+
+            const int captureCount = capturePatterns.count();
+            for (int i = 1; i <= 9; i++) {
+                const QString number = QString::number(i);
+                const QString & captureDetails = (i <= captureCount)
+                        ? (QString(" == ") + capturePatterns[i - 1].left(30))
+                        : QString();
+                addMenuEntry(popupMenu, insertBefore, insertAfter, walker, "\\" + number, "",
+                        i18n("Reference") + " " + number + captureDetails);
+            }
+
             popupMenu->addSeparator();
         }
     }
--- trunk/KDE/kdelibs/kate/utils/katesearchbar.h #709625:709626
@@ -113,6 +113,7 @@
     void replaceMatch(const QVector<KTextEditor::Range> & match, const QString & replacement,
             int replacementCounter = 1);
 
+    QVector<QString> getCapturePatterns(const QString & pattern);
     void addMenuEntry(QMenu * menu, QVector<QString> & insertBefore,
             QVector<QString> & insertAfter, uint & walker,
             const QString & before, const QString after, const QString description,