1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
// Copyright (C) 2004 Shintaro Matsuoka <[email protected]>
// Copyright (C) 2006 Martin Aumueller <[email protected]>
// See COPYING file for licensing information
#ifndef AMAROK_TQSTRINGX_H
#define AMAROK_TQSTRINGX_H
#include <tqglobal.h>
#include <tqregexp.h>
#include <tqstring.h>
#include <tqstringlist.h>
#include <tqmap.h>
namespace Amarok
{
class QStringx : public TQString
{
public:
QStringx() {};
QStringx( TQChar ch ) : TQString( ch ) {};
QStringx( const TQString& s ) : TQString( s ) {};
QStringx( const TQByteArray& ba ) : TQString( ba ) {};
QStringx( const TQChar* tqunicode, uint length ) : TQString( tqunicode, length ) {};
QStringx( const char* str ) : TQString( str ) {};
virtual ~QStringx() {};
// the numbers following % obviously are not taken into account
TQString args( const TQStringList& args ) const
{
const TQStringList text = TQStringList::split( TQRegExp( "%\\d+" ), *this, true );
TQValueListConstIterator<TQString> itrText = text.begin();
TQValueListConstIterator<TQString> itrArgs = args.begin();
TQString merged = (*itrText);
++itrText;
while ( itrText != text.end() && itrArgs != args.end() )
{
merged += (*itrArgs) + (*itrText);
++itrText;
++itrArgs;
}
Q_ASSERT( itrText == text.end() && itrArgs == args.end() );
return merged;
}
// %something gets replaced by the value corresponding to key "something" in args
TQString namedArgs( const TQMap<TQString, TQString> args, bool opt=false ) const
{
TQRegExp rxArg( "%[a-zA-Z0-9]+" );
TQString result;
int start = 0;
for( int pos = rxArg.search( *this );
pos != -1;
pos = rxArg.search( *this, start ) )
{
int len = rxArg.matchedLength();
TQString p = rxArg.capturedTexts()[0].mid(1, len-1);
result += mid( start, pos-start );
if( args[p] != TQString() )
result += args[p];
else if( opt )
return TQString();
start = pos + len;
}
result += mid( start );
return result;
}
// %something gets replaced by the value corresponding to key "something" in args,
// however, if key "something" is not available,
// then replace everything within surrounding { } by an empty string
TQString namedOptArgs( const TQMap<TQString, TQString> args ) const
{
TQRegExp rxOptArg( "\\{.*%[a-zA-Z0-9_]+.*\\}" );
rxOptArg.setMinimal( true );
TQString result;
int start = 0;
for( int pos = rxOptArg.search( *this );
pos != -1;
pos = rxOptArg.search( *this, start ) )
{
int len = rxOptArg.matchedLength();
QStringx opt = TQString(rxOptArg.capturedTexts()[0].mid(1, len-2));
result += QStringx(mid( start, pos-start )).namedArgs( args );
result += opt.namedArgs( args, true );
start = pos + len;
}
result += QStringx( mid( start ) ).namedArgs( args );
return result;
}
};
} // namespace Amarok
#endif // AMAROK_TQSTRINGX_H
|