forwarded 427843 https://bugs.kde.org/show_bug.cgi?id=94837 tags 427843 +patch thanks
hi nacho et al, On Thursday 07 June 2007 12:18:07 Nacho Barrientos Arias wrote: > The following setting works for me: > > Pattern: > "^#[0-9]{5,6}." > Action: > konsole -e links http://bugs.debian.org/`echo %s | sed 's/\#//g'` as we discussed on irc, it's not quite the same thing, is much less graceful, introduces quoting issues etc. so, i've thrown together a patch that adds this support, more "the way it outta be", attached. so now, in addition to '%s', you also have %n, where n is a non-negative integer. %0 is equivalent to %s, %1 matches the first group, etc. values of n greater than the largest group index don't get expanded. the patch is fairly minimal, and i did a cursory valgrind check to make sure that it wasn't leaking memory (though someone more familiar with QStringList might want to double check my logic). also, i see a few-years-old br upstream, so i'll forward the info there as well. sean
diff -Nru kdebase-3.5.7/klipper/urlgrabber.cpp kdebase-3.5.7.sean/klipper/urlgrabber.cpp --- kdebase-3.5.7/klipper/urlgrabber.cpp 2005-10-10 17:03:59.000000000 +0200 +++ kdebase-3.5.7.sean/klipper/urlgrabber.cpp 2007-06-07 21:03:21.000000000 +0200 @@ -51,7 +51,6 @@ { if( m_config == NULL ) m_config = kapp->config(); - myCurrentAction = 0L; myMenu = 0L; myPopupKillTimeout = 8; m_stripWhiteSpace = true; @@ -160,6 +159,7 @@ QString item; myCommandMapper.clear(); + myGroupingMapper.clear(); myPopupKillTimer->stop(); delete myMenu; @@ -184,6 +184,7 @@ else id = myMenu->insertItem( SmallIcon(command->pixmap), item); myCommandMapper.insert( id, command ); + myGroupingMapper.insert( id, action->capturedTexts() ); } } @@ -224,19 +225,27 @@ break; default: ClipCommand *command = myCommandMapper.find( id ); - if ( !command ) + QStringList *backrefs = myGroupingMapper.find( id ); + if ( !command || !backrefs ) qWarning("Klipper: can't find associated action"); else - execute( command ); + execute( command, backrefs ); } } -void URLGrabber::execute( const struct ClipCommand *command ) const +void URLGrabber::execute( const struct ClipCommand *command, + QStringList *backrefs) const { if ( command->isEnabled ) { QMap<QChar,QString> map; map.insert( 's', myClipData ); + int brCounter = -1; + QStringList::Iterator it = backrefs->begin(); + while( it != backrefs->end() ) { + map.insert( char(++brCounter + '0') , *it ); + ++it; + } QString cmdLine = KMacroExpander::expandMacrosShellQuote( command->command, map ); if ( cmdLine.isEmpty() ) diff -Nru kdebase-3.5.7/klipper/urlgrabber.h kdebase-3.5.7.sean/klipper/urlgrabber.h --- kdebase-3.5.7/klipper/urlgrabber.h 2005-10-10 17:03:59.000000000 +0200 +++ kdebase-3.5.7.sean/klipper/urlgrabber.h 2007-06-07 20:58:48.000000000 +0200 @@ -72,7 +72,8 @@ private: const ActionList& matchingActions( const QString& ); - void execute( const struct ClipCommand *command ) const; + void execute( const struct ClipCommand *command, + QStringList *backrefs ) const; void editData(); bool isAvoidedWindow() const; void actionMenu( bool wm_class_check ); @@ -83,6 +84,7 @@ QString myClipData; ClipAction *myCurrentAction; QIntDict<ClipCommand> myCommandMapper; + QIntDict<QStringList> myGroupingMapper; KPopupMenu *myMenu; QTimer *myPopupKillTimer; int myPopupKillTimeout; @@ -127,8 +129,13 @@ void setRegExp( const QString& r) { myRegExp = QRegExp( r ); } QString regExp() const { return myRegExp.pattern(); } - inline bool matches( const QString& string ) const { - return ( myRegExp.search( string ) != -1 ); + inline bool matches( const QString& string ) { + int res = myRegExp.search( string ) ; + if ( res != -1 ) { + myCapturedTexts = myRegExp.capturedTexts(); + return true; + } + return false; } void setDescription( const QString& d) { myDescription = d; } @@ -147,9 +154,15 @@ */ void save( KConfig * ) const; + /** + * Returns the most recent list of matched group backreferences. + * Note: you probably need to call matches() first. + */ + inline const QStringList* capturedTexts() const { return &myCapturedTexts; } private: QRegExp myRegExp; + QStringList myCapturedTexts; QString myDescription; QPtrList<ClipCommand> myCommands;
signature.asc
Description: This is a digitally signed message part.