//
// C++ Implementation: expander
//
// Description:
//
//
// Author: Jonas B<> r (C) 2004
//
// Copyright: See COPYING file that comes with this distribution
//
//
# include <algorithm>
# include "expander.h"
# include "../krusader.h"
# include "../krusaderview.h"
# include "../panelmanager.h"
# include "../Panel/listpanel.h"
# include "../Panel/panelfunc.h"
# include "../Panel/krview.h"
# include "../Synchronizer/synchronizergui.h"
# include "../Search/krsearchdialog.h"
# include "../GUI/profilemanager.h"
# include "../VFS/preservingcopyjob.h"
# include "../KViewer/krviewer.h"
# include "../krservices.h"
# ifdef __KJSEMBED__
# include "../KrJS/krjs.h"
# endif
# include <kdebug.h>
# include <kinputdialog.h>
# include <kstandarddirs.h>
# include <tdemessagebox.h>
# include <tdetempfile.h>
# include <tqstringlist.h>
# include <tqclipboard.h>
# include <functional>
using namespace std ;
# define NEED_PANEL if (panel==0) { panelMissingError(_expression,exp); return TQString(); }
# include "tstring.h"
TQValueList < const exp_placeholder * > & Expander : : _placeholder ( )
{
static TQValueList < const exp_placeholder * > ret ;
return ret ;
}
void exp_placeholder : : panelMissingError ( const TQString & s , Expander & exp )
{
exp . setError ( Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Needed panel specification missing in expander %1 " ) . arg ( s ) ) ) ;
}
TQStringList exp_placeholder : : fileList ( const ListPanel * const panel , const TQString & type , const TQString & mask , const bool ommitPath , const bool useUrl , Expander & exp , const TQString & error )
{
TQStringList items ;
if ( type . isEmpty ( ) | | type = = " all " )
panel - > view - > getItemsByMask ( mask , & items ) ;
else if ( type = = " files " )
panel - > view - > getItemsByMask ( mask , & items , false , true ) ;
else if ( type = = " dirs " )
panel - > view - > getItemsByMask ( mask , & items , true , false ) ;
else if ( type = = " selected " )
panel - > view - > getSelectedItems ( & items ) ;
else {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: Bad argument to %1: %2 is not valid item specifier " ) . arg ( error , type ) ) ) ;
return TQString ( ) ;
}
if ( ! ommitPath ) { // add the current path
// translate to urls using vfs
KURL : : List * list = panel - > func - > files ( ) - > vfs_getFiles ( & items ) ;
items . clear ( ) ;
// parse everything to a single qstring
for ( KURL : : List : : Iterator it = list - > begin ( ) ; it ! = list - > end ( ) ; + + it ) {
items . push_back ( useUrl ? ( * it ) . url ( ) : ( * it ) . path ( ) ) ;
}
delete list ;
}
return items ;
}
namespace {
class exp_simpleplaceholder : public exp_placeholder
{
public :
EXP_FUNC ;
virtual TagString expFunc ( const ListPanel * , const TQStringList & , const bool & , Expander & ) const = 0 ;
} ;
/**
* expands % _Path % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with the path of the specified panel
*/
class exp_Path : public exp_simpleplaceholder {
static const exp_Path instance ;
exp_Path ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _Count % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with the number of items , which type is specified by the first Parameter
*/
class exp_Count : public exp_simpleplaceholder {
static const exp_Count instance ;
exp_Count ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _Filter % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with the correspondend filter ( ie : " *.cpp " )
*/
class exp_Filter : public exp_simpleplaceholder {
static const exp_Filter instance ;
exp_Filter ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _Current % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with the current item ( ! = the selected onec )
*/
class exp_Current : public exp_simpleplaceholder {
static const exp_Current instance ;
exp_Current ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _List % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with a list of items , which type is specified by the first Parameter
*/
class exp_List : public exp_simpleplaceholder {
static const exp_List instance ;
exp_List ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _ListFile % ( ' _ ' is replaced by ' a ' , ' o ' , ' r ' or ' l ' to indicate the active , other , right or left panel ) with the name of a temporary file , containing a list of items , which type is specified by the first Parameter
*/
class exp_ListFile : public exp_simpleplaceholder {
static const exp_ListFile instance ;
exp_ListFile ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* expands % _Ask % ( ' _ ' is nessesary because there is no panel needed ) with the return of an input - dialog
*/
class exp_Ask : public exp_simpleplaceholder {
static const exp_Ask instance ;
exp_Ask ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This copies it ' s first Parameter to the clipboard
*/
class exp_Clipboard : public exp_placeholder {
static const exp_Clipboard instance ;
exp_Clipboard ( ) ;
public :
EXP_FUNC ;
} ;
/**
* This selects all items by the mask given with the first Parameter
*/
class exp_Select : public exp_simpleplaceholder {
static const exp_Select instance ;
exp_Select ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This changes the panel ' spath to the value given with the first Parameter .
*/
class exp_Goto : public exp_simpleplaceholder {
static const exp_Goto instance ;
exp_Goto ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This is equal to ' cp < first Parameter > < second Parameter > ' .
*/
class exp_Copy : public exp_placeholder {
static const exp_Copy instance ;
exp_Copy ( ) ;
public :
EXP_FUNC ;
} ;
/**
* This is equal to ' mv < first Parameter > < second Parameter > ' .
*/
class exp_Move : public exp_placeholder {
static const exp_Move instance ;
exp_Move ( ) ;
public :
EXP_FUNC ;
} ;
/**
* This opens the synchronizer with a given profile
*/
class exp_Sync : public exp_simpleplaceholder {
static const exp_Sync instance ;
exp_Sync ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This opens the searchmodule with a given profile
*/
class exp_NewSearch : public exp_simpleplaceholder {
static const exp_NewSearch instance ;
exp_NewSearch ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This loads the panel - profile with a given name
*/
class exp_Profile : public exp_simpleplaceholder {
static const exp_Profile instance ;
exp_Profile ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This is setting marks in the string where he is later splitted up for each { all , selected , files , dirs }
*/
class exp_Each : public exp_simpleplaceholder {
static const exp_Each instance ;
exp_Each ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This sets the sorting on a specific colunm
*/
class exp_ColSort : public exp_simpleplaceholder {
static const exp_ColSort instance ;
exp_ColSort ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
/**
* This sets relation between the left and right panel
*/
class exp_PanelSize : public exp_simpleplaceholder {
static const exp_PanelSize instance ;
exp_PanelSize ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
# ifdef __KJSEMBED__
/**
* This sets relation between the left and right panel
*/
class exp_Script : public exp_simpleplaceholder {
static const exp_Script instance ;
exp_Script ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
const exp_Script exp_Script : : instance ;
# endif
/**
* This loads a file in the internal viewer
*/
class exp_View : public exp_simpleplaceholder {
static const exp_View instance ;
exp_View ( ) ;
public :
SIMPLE_EXP_FUNC ;
} ;
const exp_View exp_View : : instance ;
const exp_PanelSize exp_PanelSize : : instance ;
const exp_ColSort exp_ColSort : : instance ;
const exp_Each exp_Each : : instance ;
const exp_Profile exp_Profile : : instance ;
const exp_NewSearch exp_NewSearch : : instance ;
const exp_Sync exp_Sync : : instance ;
const exp_Move exp_Move : : instance ;
const exp_Copy exp_Copy : : instance ;
const exp_Goto exp_Goto : : instance ;
const exp_Select exp_Select : : instance ;
const exp_Clipboard exp_Clipboard : : instance ;
const exp_Ask exp_Ask : : instance ;
const exp_ListFile exp_ListFile : : instance ;
const exp_List exp_List : : instance ;
const exp_Current exp_Current : : instance ;
const exp_Filter exp_Filter : : instance ;
const exp_Count exp_Count : : instance ;
const exp_Path exp_Path : : instance ;
////////////////////////////////////////////////////////////
//////////////////////// utils ////////////////////////
////////////////////////////////////////////////////////////
/**
* escapes everything that confuses bash in filenames
* @ param s String to manipulate
* @ return escaped string
*/
TQString bashquote ( TQString s ) {
/*
// we _can_not_ use this function because it _encloses_ the sting in single-quots!
// In this case quotes strings could not be concaternated anymore
return KrServices : : quote ( s ) ;
*/
static const TQString evilstuff = " \\ \" '`()[]{}!?;$&<>| \t \r \n " ; // stuff that should get escaped
for ( unsigned int i = 0 ; i < evilstuff . length ( ) ; + + i )
s . replace ( evilstuff [ i ] , ( TQString ( " \\ " ) + evilstuff [ i ] ) ) ;
return s ;
}
TQString separateAndQuote ( TQStringList list , const TQString & separator , const bool quote )
{
if ( quote )
transform ( list . begin ( ) , list . end ( ) , list . begin ( ) , bashquote ) ;
return list . join ( separator ) ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////// expander classes ////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
exp_Path : : exp_Path ( ) {
_expression = " Path " ;
_description = i18n ( " Panel's Path... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Automatically escape spaces " ) , " __yes " , false ) ) ;
}
TagString exp_Path : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & useUrl , Expander & exp ) const {
NEED_PANEL
TQString result ;
if ( useUrl )
result = panel - > func - > files ( ) - > vfs_getOrigin ( ) . url ( ) + " / " ;
else
result = panel - > func - > files ( ) - > vfs_getOrigin ( ) . path ( ) + " / " ;
if ( parameter [ 0 ] . lower ( ) = = " no " ) // don't escape spaces
return TagString ( result ) ;
else
return TagString ( bashquote ( result ) ) ;
}
exp_Count : : exp_Count ( ) {
_expression = " Count " ;
_description = i18n ( " Number of... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Count: " ) , " __choose:All;Files;Dirs;Selected " , false ) ) ;
}
TagString exp_Count : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & , Expander & exp ) const {
NEED_PANEL
int n = - 1 ;
if ( parameter [ 0 ] . isEmpty ( ) | | parameter [ 0 ] . lower ( ) = = " all " )
n = panel - > view - > numDirs ( ) + panel - > view - > numFiles ( ) ;
else if ( parameter [ 0 ] . lower ( ) = = " files " )
n = panel - > view - > numFiles ( ) ;
else if ( parameter [ 0 ] . lower ( ) = = " dirs " )
n = panel - > view - > numDirs ( ) ;
else if ( parameter [ 0 ] . lower ( ) = = " selected " )
n = panel - > view - > numSelected ( ) ;
else {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: Bad argument to Count: %1 is not valid item specifier " ) . arg ( parameter [ 0 ] ) ) ) ;
return TQString ( ) ;
}
return TagString ( TQString ( " %1 " ) . arg ( n ) ) ;
}
exp_Filter : : exp_Filter ( ) {
_expression = " Filter " ;
_description = i18n ( " Filter Mask (*.h, *.cpp, etc.) " ) ;
_needPanel = true ;
}
TagString exp_Filter : : expFunc ( const ListPanel * panel , const TQStringList & , const bool & , Expander & exp ) const {
NEED_PANEL
return panel - > view - > filterMask ( ) . nameFilter ( ) ;
}
exp_Current : : exp_Current ( ) {
_expression = " Current " ;
_description = i18n ( " Current File (!= Selected File)... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Omit the current path (optional) " ) , " __no " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Automatically escape spaces " ) , " __yes " , false ) ) ;
}
TagString exp_Current : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & useUrl , Expander & exp ) const {
NEED_PANEL
TQString item = panel - > view - > getCurrentItem ( ) ;
TQString result ;
if ( parameter [ 0 ] . lower ( ) = = " yes " ) // ommit the current path
result = item ;
else {
KURL url = panel - > func - > files ( ) - > vfs_getFile ( item ) ;
if ( useUrl )
result = url . url ( ) ;
else
result = url . path ( ) ;
}
if ( parameter [ 1 ] . lower ( ) = = " no " ) // don't escape spaces
return result ;
else
return bashquote ( result ) ;
}
exp_List : : exp_List ( ) {
_expression = " List " ;
_description = i18n ( " Item List of... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Which items: " ) , " __choose:All;Files;Dirs;Selected " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Separator between the items (optional): " ) , " " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Omit the current path (optional) " ) , " __no " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Mask (optional, all but 'Selected'): " ) , " __select " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Automatically escape spaces " ) , " __yes " , false ) ) ;
}
TagString exp_List : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & useUrl , Expander & exp ) const {
NEED_PANEL
// get selected items from view
TQStringList items ;
TQString mask ;
if ( parameter . count ( ) < = 3 | | parameter [ 3 ] . isEmpty ( ) )
mask = " * " ;
else
mask = parameter [ 3 ] ;
return separateAndQuote (
fileList ( panel ,
parameter . empty ( ) ? TQString ( ) : parameter [ 0 ] . lower ( ) ,
mask , parameter . count ( ) > 2 ? parameter [ 2 ] . lower ( ) = = " yes " : false ,
useUrl , exp , " List " ) ,
parameter . count ( ) > 1 ? parameter [ 1 ] : " " ,
parameter . count ( ) > 4 ? parameter [ 4 ] . lower ( ) = = " yes " : true ) ;
}
exp_ListFile : : exp_ListFile ( ) {
_expression = " ListFile " ;
_description = i18n ( " Filename of an Item List... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Which items: " ) , " __choose:All;Files;Dirs;Selected " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Separator between the items (optional) " ) , " \n " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Omit the current path (optional) " ) , " __no " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Mask (optional, all but 'Selected'): " ) , " __select " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Automatically escape spaces " ) , " __no " , false ) ) ;
}
TagString exp_ListFile : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & useUrl , Expander & exp ) const {
NEED_PANEL
// get selected items from view
TQStringList items ;
TQString mask ;
if ( parameter . count ( ) < = 3 | | parameter [ 3 ] . isEmpty ( ) )
mask = " * " ;
else
mask = parameter [ 3 ] ;
KTempFile tmpFile ( locateLocal ( " tmp " , " krusader " ) , " .itemlist " ) ;
if ( tmpFile . status ( ) ! = 0 ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_WORLD , i18n ( " Expander: tempfile couldn't be opened (%1) " ) . arg ( strerror ( tmpFile . status ( ) ) ) ) ) ;
return TQString ( ) ;
}
TQTextStream stream ( tmpFile . file ( ) ) ;
stream < < separateAndQuote (
fileList ( panel ,
parameter . empty ( ) ? TQString ( ) : parameter [ 0 ] . lower ( ) ,
mask , parameter . count ( ) > 2 ? parameter [ 2 ] . lower ( ) = = " yes " : false ,
useUrl , exp , " ListFile " ) ,
parameter . count ( ) > 1 ? parameter [ 1 ] : " \n " ,
parameter . count ( ) > 4 ? parameter [ 4 ] . lower ( ) = = " yes " : true )
< < " \n " ;
tmpFile . close ( ) ;
return tmpFile . name ( ) ;
}
exp_Select : : exp_Select ( ) {
_expression = " Select " ;
_description = i18n ( " Manipulate the Selection... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Selection mask: " ) , " __select " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Manipulate in which way: " ) , " __choose:Set;Add;Remove " , false ) ) ;
}
TagString exp_Select : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & , Expander & exp ) const {
NEED_PANEL
KRQuery mask ;
if ( parameter . count ( ) < = 0 | | parameter [ 0 ] . isEmpty ( ) )
mask = KRQuery ( " * " ) ;
else
mask = KRQuery ( parameter [ 0 ] ) ;
if ( parameter [ 1 ] . lower ( ) = = " add " )
panel - > view - > select ( mask ) ;
else if ( parameter [ 1 ] . lower ( ) = = " remove " )
panel - > view - > unselect ( mask ) ;
else { // parameter[1].lower() == "set" or isEmpty() or whatever
panel - > view - > unselect ( KRQuery ( " * " ) ) ;
panel - > view - > select ( mask ) ;
}
return TQString ( ) ; // this doesn't return anything, that's normal!
}
exp_Goto : : exp_Goto ( ) {
_expression = " Goto " ;
_description = i18n ( " Jump to a Location... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Choose a path: " ) , " __goto " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Open location in a new tab " ) , " __no " , false ) ) ;
}
TagString exp_Goto : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & , Expander & exp ) const {
NEED_PANEL
bool newTab = false ;
if ( parameter [ 1 ] . lower ( ) = = " yes " )
newTab = true ;
if ( newTab ) {
if ( panel = = LEFT_PANEL )
krApp - > mainView - > leftMng - > slotNewTab ( parameter [ 0 ] ) ;
else
krApp - > mainView - > rightMng - > slotNewTab ( parameter [ 0 ] ) ;
}
else {
panel - > func - > openUrl ( parameter [ 0 ] , " " ) ;
const_cast < ListPanel * > ( panel ) - > slotFocusOnMe ( ) ;
}
return TQString ( ) ; // this doesn't return anything, that's normal!
}
/*
exp_Search : : exp_Search ( ) {
_expression = " Search " ;
_description = i18n ( " Search for files " ) ;
_needPanel = true ;
addParameter ( new exp_parameter ( i18n ( " please choose the setting " ) , " __searchprofile " , true ) ) ;
addParameter ( new exp_parameter ( i18n ( " open the search in a new tab " ) , " __yes " , false ) ) ; //TODO: add this also to panel-dependent as soon as vfs support the display of search-results
}
*/
exp_Ask : : exp_Ask ( ) {
_expression = " Ask " ;
_description = i18n ( " Ask Parameter from User... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Question: " ) , " Where do you want do go today? " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Preset (optional): " ) , " " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Caption (optional): " ) , " " , false ) ) ;
}
TagString exp_Ask : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
TQString caption , preset , result ;
if ( parameter . count ( ) < = 2 | | parameter [ 2 ] . isEmpty ( ) )
caption = i18n ( " User Action " ) ;
else
caption = parameter [ 2 ] ;
if ( parameter . count ( ) < = 1 | | parameter [ 1 ] . isEmpty ( ) )
preset = TQString ( ) ;
else
preset = parameter [ 1 ] ;
bool ok ;
result = KInputDialog : : getText (
caption ,
parameter [ 0 ] ,
preset ,
& ok ) ;
if ( ok )
return result ;
else {
setError ( exp , Error ( Error : : S_ERROR , Error : : C_USER , " User cancelled " ) ) ;
return TQString ( ) ;
}
}
exp_Clipboard : : exp_Clipboard ( ) {
_expression = " Clipboard " ;
_description = i18n ( " Copy to Clipboard... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " What to copy: " ) , " __placeholder " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Append to current clipboard content with this separator (optional): " ) , " " , false ) ) ;
}
TagString exp_Clipboard : : expFunc ( const ListPanel * , const TagStringList & parameter , const bool & , Expander & exp ) const {
// kdDebug() << "Expander::exp_Clipboard, parameter[0]: '" << parameter[0] << "', Clipboard: " << TDEApplication::clipboard()->text() << endl;
TQStringList lst = splitEach ( parameter [ 0 ] ) ;
if ( ! parameter [ 1 ] . isSimple ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Expander: %Each% may not be in the second argument of %Clipboard% " ) ) ) ;
return TQString ( ) ;
}
if ( parameter . count ( ) < = 1 | | parameter [ 1 ] . string ( ) . isEmpty ( ) | | TDEApplication : : clipboard ( ) - > text ( ) . isEmpty ( ) )
TDEApplication : : clipboard ( ) - > setText ( lst . join ( " \n " ) ) ;
else
TDEApplication : : clipboard ( ) - > setText ( TDEApplication : : clipboard ( ) - > text ( ) + parameter [ 1 ] . string ( ) + lst . join ( " \n " ) ) ;
return TQString ( ) ; // this doesn't return anything, that's normal!
}
exp_Copy : : exp_Copy ( ) {
_expression = " Copy " ;
_description = i18n ( " Copy a File/Folder... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " What to copy: " ) , " __placeholder " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Where to copy: " ) , " __placeholder " , true ) ) ;
}
TagString exp_Copy : : expFunc ( const ListPanel * , const TagStringList & parameter , const bool & , Expander & exp ) const {
// basically the parameter can already be used as URL, but since KURL has problems with ftp-proxy-urls (like ftp://username@proxyusername@url...) this is neccesary:
TQStringList lst = splitEach ( parameter [ 0 ] ) ;
if ( ! parameter [ 1 ] . isSimple ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Expander: %Each% may not be in the second argument of %Copy% " ) ) ) ;
return TQString ( ) ;
}
KURL : : List src ;
for ( TQStringList : : const_iterator it = lst . begin ( ) , end = lst . end ( ) ; it ! = end ; + + it )
src . push_back ( vfs : : fromPathOrURL ( * it ) ) ;
// or transform(...) ?
KURL dest = vfs : : fromPathOrURL ( parameter [ 1 ] . string ( ) ) ;
if ( ! dest . isValid ( ) )
{
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: invalid URL's in %_Copy( \" src \" , \" dest \" )% " ) ) ) ;
return TQString ( ) ;
}
for ( const KURL & url : src )
{
if ( ! url . isValid ( ) )
{
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: invalid URL's in %_Copy( \" src \" , \" dest \" )% " ) ) ) ;
return TQString ( ) ;
}
}
PreservingCopyJob : : createCopyJob ( PM_DEFAULT , src , dest , TDEIO : : CopyJob : : Copy , false , true ) ;
return TQString ( ) ; // this doesn't return everything, that's normal!
}
exp_Move : : exp_Move ( ) {
_expression = " Move " ;
_description = i18n ( " Move/Rename a File/Folder... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " What to move/rename: " ) , " __placeholder " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " New target/name: " ) , " __placeholder " , true ) ) ;
}
TagString exp_Move : : expFunc ( const ListPanel * , const TagStringList & parameter , const bool & , Expander & exp ) const {
// basically the parameter can already be used as URL, but since KURL has problems with ftp-proxy-urls (like ftp://username@proxyusername@url...) this is neccesary:
TQStringList lst = splitEach ( parameter [ 0 ] ) ;
if ( ! parameter [ 1 ] . isSimple ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " %Each% may not be in the second argument of %Move% " ) ) ) ;
return TQString ( ) ;
}
KURL : : List src ;
for ( TQStringList : : const_iterator it = lst . begin ( ) , end = lst . end ( ) ; it ! = end ; + + it )
src . push_back ( vfs : : fromPathOrURL ( * it ) ) ;
// or transform(...) ?
KURL dest = vfs : : fromPathOrURL ( parameter [ 1 ] . string ( ) ) ;
if ( ! dest . isValid ( ) )
{
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: invalid URL's in %_Move( \" src \" , \" dest \" )% " ) ) ) ;
return TQString ( ) ;
}
for ( const KURL & url : src )
{
if ( ! url . isValid ( ) )
{
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: invalid URL's in %_Move( \" src \" , \" dest \" )% " ) ) ) ;
return TQString ( ) ;
}
}
PreservingCopyJob : : createCopyJob ( PM_DEFAULT , src , dest , TDEIO : : CopyJob : : Move , false , true ) ;
return TQString ( ) ; // this doesn't return anything, that's normal!
}
exp_Sync : : exp_Sync ( ) {
_expression = " Sync " ;
_description = i18n ( " Load a Synchronizer Profile... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Choose a profile: " ) , " __syncprofile " , true ) ) ;
}
TagString exp_Sync : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no profile specified for %_Sync(profile)% " ) ) ) ;
return TQString ( ) ;
}
new SynchronizerGUI ( 0 , parameter [ 0 ] ) ;
return TQString ( ) ; // this doesn't return everything, that's normal!
}
exp_NewSearch : : exp_NewSearch ( ) {
_expression = " NewSearch " ;
_description = i18n ( " Load a Searchmodule Profile... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Choose a profile: " ) , " __searchprofile " , true ) ) ;
}
TagString exp_NewSearch : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no profile specified for %_NewSearch(profile)% " ) ) ) ;
return TQString ( ) ;
}
new KrSearchDialog ( parameter [ 0 ] , krApp ) ;
return TQString ( ) ; // this doesn't return everything, that's normal!
}
exp_Profile : : exp_Profile ( ) {
_expression = " Profile " ;
_description = i18n ( " Load a Panel Profile... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Choose a profile: " ) , " __panelprofile " , true ) ) ;
}
TagString exp_Profile : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no profile specified for %_Profile(profile)%; abort... " ) ) ) ;
return TQString ( ) ;
}
MAIN_VIEW - > profiles ( parameter [ 0 ] ) ;
return TQString ( ) ; // this doesn't return everything, that's normal!
}
exp_Each : : exp_Each ( ) {
_expression = " Each " ;
_description = i18n ( " Separate Program Call for Each... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Which items: " ) , " __choose:All;Files;Dirs;Selected " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Omit the current path (optional) " ) , " __no " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Mask (optional, all but 'Selected'): " ) , " __select " , false ) ) ;
addParameter ( exp_parameter ( i18n ( " Automatically escape spaces " ) , " __yes " , false ) ) ;
}
TagString exp_Each : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & useUrl , Expander & exp ) const {
NEED_PANEL
TQString mask ;
if ( parameter . count ( ) < = 2 | | parameter [ 2 ] . isEmpty ( ) )
mask = " * " ;
else
mask = parameter [ 2 ] ;
TagString ret ;
TQStringList l = fileList ( panel ,
parameter . empty ( ) ? TQString ( ) : parameter [ 0 ] . lower ( ) ,
mask , parameter . count ( ) > 1 & & parameter [ 1 ] . lower ( ) = = " yes " ,
useUrl , exp , " Each " ) ;
if ( ! ( parameter . count ( ) < = 3 | | parameter [ 3 ] . lower ( ) ! = " yes " ) )
transform ( l . begin ( ) , l . end ( ) , l . begin ( ) , bashquote ) ;
ret . insertTag ( 0 , l ) ;
return ret ;
}
exp_ColSort : : exp_ColSort ( ) {
_expression = " ColSort " ;
_description = i18n ( " Set Sorting for This Panel... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Choose a column: " ) , " __choose:Name;Ext;Type;Size;Modified;Perms;rwx;Owner;Group " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Choose a sort sequence: " ) , " __choose:Toggle;Asc;Desc " , false ) ) ;
}
TagString exp_ColSort : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & , Expander & exp ) const {
NEED_PANEL
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no column specified for %_ColSort(column)% " ) ) ) ;
return TQString ( ) ;
}
int mode = ( int ) panel - > view - > sortMode ( ) ;
/* from Panel/krview.h:
enum SortSpec { Name = 0x1 ,
Ext = 0x2 ,
Size = 0x4 ,
Type = 0x8 ,
Modified = 0x10 ,
Permissions = 0x20 ,
KrPermissions = 0x40 ,
Owner = 0x80 ,
Group = 0x100 ,
Descending = 0x200 ,
DirsFirst = 0x400 ,
IgnoreCase = 0x800 } ;
*/
// krOut << "start: exp_ColSort::expFunc" << endl;
# define MODE_OUT krOut << TQString( "mode: %1" ).arg( mode, 0, 2 ) << endl; // displays mode in base-2
//MODE_OUT
if ( parameter . count ( ) < = 1 | | ( parameter [ 1 ] . lower ( ) ! = " asc " & & parameter [ 1 ] . lower ( ) ! = " desc " ) ) { //default == toggle
if ( mode & KrViewProperties : : Descending )
mode & = ~ KrViewProperties : : Descending ; // == asc
else
mode | = KrViewProperties : : Descending ; // == desc
} else
if ( parameter [ 1 ] . lower ( ) = = " asc " ) {
mode & = ~ KrViewProperties : : Descending ;
}
else { // == desc
mode | = KrViewProperties : : Descending ;
}
//MODE_OUT
// clear all column-infromation:
mode & = ~ ( KrViewProperties : : Name | KrViewProperties : : Ext | KrViewProperties : : Size | KrViewProperties : : Type | KrViewProperties : : Modified | KrViewProperties : : Permissions | KrViewProperties : : KrPermissions | KrViewProperties : : Owner | KrViewProperties : : Group ) ;
MODE_OUT
if ( parameter [ 0 ] . lower ( ) = = " name " ) {
mode | = KrViewProperties : : Name ;
} else
if ( parameter [ 0 ] . lower ( ) = = " ext " ) {
mode | = KrViewProperties : : Ext ;
} else
if ( parameter [ 0 ] . lower ( ) = = " type " ) {
mode | = KrViewProperties : : Type ;
} else
if ( parameter [ 0 ] . lower ( ) = = " size " ) {
mode | = KrViewProperties : : Size ;
} else
if ( parameter [ 0 ] . lower ( ) = = " modified " ) {
mode | = KrViewProperties : : Modified ;
} else
if ( parameter [ 0 ] . lower ( ) = = " perms " ) {
mode | = KrViewProperties : : Permissions ;
} else
if ( parameter [ 0 ] . lower ( ) = = " rwx " ) {
mode | = KrViewProperties : : KrPermissions ;
} else
if ( parameter [ 0 ] . lower ( ) = = " owner " ) {
mode | = KrViewProperties : : Owner ;
} else
if ( parameter [ 0 ] . lower ( ) = = " group " ) {
mode | = KrViewProperties : : Group ;
} else {
setError ( exp , Error ( Error : : S_WARNING , Error : : C_ARGUMENT , i18n ( " Expander: unknown column specified for %_ColSort(%1)% " ) . arg ( parameter [ 0 ] ) ) ) ;
return TQString ( ) ;
}
//MODE_OUT
panel - > view - > setSortMode ( ( KrViewProperties : : SortSpec ) mode ) ;
// krOut << "end: exp_ColSort::expFunc" << endl;
return TQString ( ) ; // this doesn't return anything, that's normal!
}
exp_PanelSize : : exp_PanelSize ( ) {
_expression = " PanelSize " ;
_description = i18n ( " Set Relation Between the Panels... " ) ;
_needPanel = true ;
addParameter ( exp_parameter ( i18n ( " Set the new size in percent: " ) , " __int:0;100;5;50 " , true ) ) ;
}
TagString exp_PanelSize : : expFunc ( const ListPanel * panel , const TQStringList & parameter , const bool & , Expander & exp ) const {
NEED_PANEL
int newSize ;
if ( parameter [ 0 ] . isEmpty ( ) )
newSize = 50 ; //default is 50%
else
newSize = parameter [ 0 ] . toInt ( ) ;
if ( newSize < 0 | | newSize > 100 ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: Value %1 out of range for %_PanelSize(percent)%. The first parameter has to be >0 and <100 " ) . arg ( newSize ) ) ) ;
return TQString ( ) ;
}
TQValueList < int > panelSizes = MAIN_VIEW - > horiz_splitter - > sizes ( ) ;
int totalSize = panelSizes [ 0 ] + panelSizes [ 1 ] ;
if ( panel = = LEFT_PANEL ) {
panelSizes [ 0 ] = totalSize * newSize / 100 ;
panelSizes [ 1 ] = totalSize * ( 100 - newSize ) / 100 ;
}
else { // == RIGHT_PANEL
panelSizes [ 0 ] = totalSize * ( 100 - newSize ) / 100 ;
panelSizes [ 1 ] = totalSize * newSize / 100 ;
}
MAIN_VIEW - > horiz_splitter - > setSizes ( panelSizes ) ;
return TQString ( ) ; // this doesn't return everything, that's normal!
}
# ifdef __KJSEMBED__
exp_Script : : exp_Script ( ) {
_expression = " Script " ;
_description = i18n ( " Execute a JavaScript Extension... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Location of the script " ) , " " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Set some variables for the execution (optional). \n i.e. \" return=return_var;foo=bar \" , consult the handbook for more information " ) , " " , false ) ) ;
}
TagString exp_Script : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no script specified for %_Script(script)% " ) ) ) ;
return TQString ( ) ;
}
TQString filename = parameter [ 0 ] ;
if ( filename . find ( ' / ' ) & & KURL : : isRelativeURL ( filename ) ) {
// this return the local version of the file if this exists. else the global one is returnd
filename = locate ( " data " , " krusader/js/ " + filename ) ;
}
if ( ! krJS )
krJS = new KrJS ( ) ;
KJS : : ExecState * exec = krJS - > globalExec ( ) ;
TQString jsReturn = TQString ( ) ;
if ( parameter [ 1 ] . lower ( ) = = " yes " ) // to stay compatible with the old-style parameter
jsReturn = " cmd " ;
else {
TQStringList jsVariables = TQStringList : : split ( ' ; ' , parameter [ 1 ] ) ;
TQString jsVariable , jsValue ;
for ( TQStringList : : Iterator it = jsVariables . begin ( ) ; it ! = jsVariables . end ( ) ; + + it ) {
jsVariable = ( * it ) . section ( ' = ' , 0 , 0 ) . stripWhiteSpace ( ) ;
jsValue = ( * it ) . section ( ' = ' , 1 ) ;
if ( jsVariable = = " return " )
jsReturn = jsValue . stripWhiteSpace ( ) ;
else
krJS - > putValue ( jsVariable , KJSEmbed : : convertToValue ( exec , jsValue ) ) ;
}
}
krJS - > runFile ( filename ) ;
if ( ! jsReturn . isEmpty ( ) )
return krJS - > getValue ( jsReturn ) . toString ( krJS - > globalExec ( ) ) . qstring ( ) ;
else
return TQString ( ) ;
}
# endif
exp_View : : exp_View ( ) {
_expression = " View " ;
_description = i18n ( " View File with Krusader's Internal Viewer... " ) ;
_needPanel = false ;
addParameter ( exp_parameter ( i18n ( " Which file to view (normally '%aCurrent%'): " ) , " __placeholder " , true ) ) ;
addParameter ( exp_parameter ( i18n ( " Choose a view mode: " ) , " __choose:generic;text;hex " , false ) ) ;
//addParameter( exp_parameter( i18n("Choose a window-mode"), "__choose:tab;window;panel", false ) );
//TODO: window-mode 'panel' should open the file in the third-hand viewer
addParameter ( exp_parameter ( i18n ( " Choose a window mode: " ) , " __choose:tab;window " , false ) ) ;
}
TagString exp_View : : expFunc ( const ListPanel * , const TQStringList & parameter , const bool & , Expander & exp ) const {
if ( parameter [ 0 ] . isEmpty ( ) ) {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_ARGUMENT , i18n ( " Expander: no file to view in %_View(filename)% " ) ) ) ;
return TQString ( ) ;
}
TQString viewMode , windowMode ;
if ( parameter . count ( ) < = 1 | | parameter [ 1 ] . isEmpty ( ) )
viewMode = " generic " ;
else
viewMode = parameter [ 1 ] ;
if ( parameter . count ( ) < = 2 | | parameter [ 2 ] . isEmpty ( ) )
windowMode = " tab " ;
else
windowMode = parameter [ 2 ] ;
KrViewer : : Mode mode = KrViewer : : Generic ;
if ( viewMode = = " text " ) mode = KrViewer : : Text ;
else if ( viewMode = = " hex " ) mode = KrViewer : : Hex ;
KrViewer : : view ( parameter [ 0 ] , mode , ( windowMode = = " window " ) ) ;
//TODO: Call the viewer with viewMode and windowMode. Filename is in parameter[0].
// It would be nice if parameter[0] could also be a space-separated filename-list (provided if the first parameter is %aList(selected)%)
return TQString ( ) ; // this doesn't return everything, that's normal!
}
/////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////// end of expander classes ////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
TagString exp_simpleplaceholder : : expFunc ( const ListPanel * p , const TagStringList & parameter , const bool & useUrl , Expander & exp ) const
{
TQStringList lst ;
for ( TagStringList : : const_iterator it = parameter . begin ( ) , end = parameter . end ( ) ; it ! = end ; + + it )
if ( ( * it ) . isSimple ( ) )
lst . push_back ( ( * it ) . string ( ) ) ;
else {
setError ( exp , Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " %Each% is not allowed in parameter to %1 " ) . arg ( description ( ) ) ) ) ;
return TQString ( ) ;
}
return expFunc ( p , lst , useUrl , exp ) ;
}
}
ListPanel * Expander : : getPanel ( const char panelIndicator , const exp_placeholder * pl , Expander & exp ) {
switch ( panelIndicator ) {
case ' a ' :
return ACTIVE_PANEL ;
case ' o ' :
return OTHER_PANEL ;
case ' l ' :
return LEFT_PANEL ;
case ' r ' :
return RIGHT_PANEL ;
case ' _ ' :
return 0 ;
default :
exp . setError ( Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Expander: Bad panel specifier %1 in placeholder %2 " ) . arg ( panelIndicator ) . arg ( pl - > description ( ) ) ) ) ;
return 0 ;
}
}
void Expander : : expand ( const TQString & stringToExpand , bool useUrl ) {
TagString result = expandCurrent ( stringToExpand , useUrl ) ;
if ( error ( ) )
return ;
if ( ! result . isSimple ( ) )
resultList = splitEach ( result ) ;
else
resultList . append ( result . string ( ) ) ;
// krOut << resultList[0] << endl;
}
TagString Expander : : expandCurrent ( const TQString & stringToExpand , bool useUrl ) {
TagString result ;
TQString exp = TQString ( ) ;
TagString tmpResult ;
int begin , end , i ;
// int brackets = 0;
// bool inQuotes = false;
unsigned int idx = 0 ;
while ( idx < stringToExpand . length ( ) ) {
if ( ( begin = stringToExpand . find ( ' % ' , idx ) ) = = - 1 ) break ;
if ( ( end = findEnd ( stringToExpand , begin ) ) = = - 1 ) {
setError ( Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Error: unterminated % in Expander::expandCurrent " ) ) ) ;
return TQString ( ) ;
}
result + = stringToExpand . mid ( idx , begin - idx ) ; // copy until the start of %exp%
// get the expression, and expand it using the correct expander function
exp = stringToExpand . mid ( begin + 1 , end - begin - 1 ) ;
// kdDebug() << "------------- exp: '" << exp << "'" << endl;
if ( exp = = " " )
result + = TQString ( TQChar ( ' % ' ) ) ;
else {
TagStringList parameter = separateParameter ( & exp , useUrl ) ;
if ( error ( ) )
return TQString ( ) ;
char panelIndicator = exp . lower ( ) [ 0 ] . latin1 ( ) ;
exp . replace ( 0 , 1 , " " ) ;
for ( i = 0 ; i < placeholderCount ( ) ; + + i )
if ( exp = = placeholder ( i ) - > expression ( ) ) {
// kdDebug() << "---------------------------------------" << endl;
tmpResult = placeholder ( i ) - > expFunc ( getPanel ( panelIndicator , placeholder ( i ) , * this ) , parameter , useUrl , * this ) ;
if ( error ( ) ) {
return TQString ( ) ;
}
else
result + = tmpResult ;
// kdDebug() << "---------------------------------------" << endl;
break ;
}
if ( i = = placeholderCount ( ) ) { // didn't find an expander
setError ( Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Error: unrecognized %%%1%2%% in Expander::expand " ) . arg ( panelIndicator ) . arg ( exp ) ) ) ;
return TQString ( ) ;
}
} //else
idx = end + 1 ;
}
// copy the rest of the string
result + = stringToExpand . mid ( idx ) ;
// kdDebug() << "============== result '" << result << "'" << endl;
return result ;
}
TQStringList Expander : : splitEach ( TagString stringToSplit ) {
if ( stringToSplit . isSimple ( ) ) {
// krOut << stringToSplit.string() << endl;
return stringToSplit . string ( ) ;
}
pair < uint , TQStringList > pl = * stringToSplit . tagsBegin ( ) ;
stringToSplit . eraseTag ( stringToSplit . tagsBegin ( ) ) ;
TQStringList ret ;
for ( TQStringList : : const_iterator it = pl . second . begin ( ) , end = pl . second . end ( ) ; it ! = end ; + + it ) {
TagString s = stringToSplit ;
s . insert ( pl . first , * it ) ;
ret + = splitEach ( s ) ;
}
return ret ;
// kdDebug() << "stringToSplit: " << stringToSplit << endl;
}
TagStringList Expander : : separateParameter ( TQString * const exp , bool useUrl ) {
TagStringList parameter ;
TQStringList parameter1 ;
TQString result ;
int begin , end ;
if ( ( begin = exp - > find ( ' ( ' ) ) ! = - 1 ) {
if ( ( end = exp - > findRev ( ' ) ' ) ) = = - 1 ) {
setError ( Error ( Error : : S_FATAL , Error : : C_SYNTAX , i18n ( " Error: missing ')' in Expander::separateParameter " ) ) ) ;
return TagStringList ( ) ;
}
result = exp - > mid ( begin + 1 , end - begin - 1 ) ;
* exp = exp - > left ( begin ) ;
bool inQuotes = false ;
unsigned int idx = 0 ;
begin = 0 ;
while ( idx < result . length ( ) ) {
if ( result [ idx ] . latin1 ( ) = = ' \\ ' ) {
if ( result [ idx + 1 ] . latin1 ( ) = = ' " ' )
result . replace ( idx , 1 , " " ) ;
}
if ( result [ idx ] . latin1 ( ) = = ' " ' )
inQuotes = ! inQuotes ;
if ( result [ idx ] . latin1 ( ) = = ' , ' & & ! inQuotes ) {
parameter1 . append ( result . mid ( begin , idx - begin ) ) ;
begin = idx + 1 ;
// krOut << " ---- parameter: " << parameter.join(";") << endl;
}
idx + + ;
}
parameter1 . append ( result . mid ( begin , idx - begin ) ) ; //don't forget the last one
for ( TQStringList : : Iterator it = parameter1 . begin ( ) ; it ! = parameter1 . end ( ) ; + + it ) {
* it = ( * it ) . stripWhiteSpace ( ) ;
if ( ( * it ) . left ( 1 ) = = " \" " )
* it = ( * it ) . mid ( 1 , ( * it ) . length ( ) - 2 ) ;
parameter . push_back ( expandCurrent ( * it , useUrl ) ) ;
if ( error ( ) )
return TagStringList ( ) ;
}
}
// krOut << "------- exp: " << *exp << " ---- parameter: " << parameter.join(";") << endl;
return parameter ;
}
int Expander : : findEnd ( const TQString & str , int start ) {
int end = str . find ( ' % ' , start + 1 ) ;
if ( end = = - 1 )
return end ;
int bracket = str . find ( ' ( ' , start + 1 ) ;
if ( end < bracket | | bracket = = - 1 )
return end ;
unsigned int idx = bracket + 1 ;
bool inQuotes = false ;
int depth = 1 ;
while ( idx < str . length ( ) ) {
switch ( str [ idx ] . latin1 ( ) ) {
case ' \\ ' :
idx + + ;
break ;
case ' " ' :
inQuotes = ! inQuotes ;
break ;
case ' ( ' :
if ( ! inQuotes )
depth + + ;
break ;
case ' ) ' :
if ( ! inQuotes )
- - depth ;
break ;
case ' % ' :
if ( depth = = 0 )
return idx ;
} //switch
idx + + ;
} //while
// failsafe
return - 1 ;
}