2
This file is part of the Grantlee template system.
4
Copyright (c) 2009,2010 Stephen Kelly <steveire@gmail.com>
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Lesser General Public
8
License as published by the Free Software Foundation; either version
9
2 of the Licence, or (at your option) any later version.
11
This library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
Library General Public License for more details.
16
You should have received a copy of the GNU Lesser General Public
17
License along with this library. If not, see <http://www.gnu.org/licenses/>.
21
#include "safestring.h"
23
#include <QtCore/QStringList>
25
using namespace Grantlee;
27
SafeString::SafeString()
28
: m_nestedString( this ),
29
m_safety( IsNotSafe ),
30
m_needsescape( false )
35
SafeString::SafeString( const Grantlee::SafeString& safeString )
36
: m_nestedString( safeString.get(), this ),
37
m_safety( safeString.m_safety ),
38
m_needsescape( safeString.m_needsescape )
43
SafeString::SafeString( const QString &str, bool safe )
44
: m_nestedString( str, this ),
45
m_safety( safe ? IsSafe : IsNotSafe ),
46
m_needsescape( false )
51
SafeString::SafeString( const QString &str, Safety safety )
52
: m_nestedString( str, this ),
54
m_needsescape( false )
59
SafeString::~SafeString()
63
void SafeString::setNeedsEscape( bool needsEscape )
65
m_needsescape = needsEscape;
68
bool SafeString::needsEscape() const
73
void SafeString::setSafety( Grantlee::SafeString::Safety safety )
78
bool SafeString::isSafe() const
80
return m_safety == IsSafe;
83
SafeString::NestedString::NestedString( SafeString *safeString )
84
: m_safeString( safeString )
89
SafeString::NestedString::NestedString( const QString &content, SafeString *safeString )
91
m_safeString( safeString )
96
SafeString& SafeString::operator=( const SafeString &str )
98
m_nestedString = str.m_nestedString;
99
m_nestedString.m_safeString = this;
100
m_safety = str.m_safety;
101
m_needsescape = str.m_needsescape;
105
SafeString SafeString::operator+( const QString &str )
107
return SafeString( m_nestedString + str, IsNotSafe );
110
SafeString SafeString::operator+( const SafeString &str )
113
return SafeString( m_nestedString + str.get(), IsNotSafe );
114
return SafeString( m_nestedString + str.get(), m_safety );
117
SafeString &SafeString::operator+=( const QString &str )
119
m_safety = IsNotSafe;
121
m_nestedString += str;
125
SafeString &SafeString::operator+=( const SafeString &str )
128
m_safety = IsNotSafe;
130
m_nestedString += str.get();
134
bool SafeString::operator==( const Grantlee::SafeString &other ) const
136
// Don't compare safety or account for future escaping here.
137
// See TestBuiltins testEscaping
138
return m_nestedString == other.get();
141
bool SafeString::operator==( const QString &other ) const
143
return m_nestedString == other;
146
SafeString& SafeString::NestedString::append( const SafeString &str )
148
QString::append( str.get() );
150
m_safeString->m_safety = IsNotSafe;
152
return *m_safeString;
155
SafeString& SafeString::NestedString::append( const QString &str )
157
QString::append( str );
158
m_safeString->m_safety = IsNotSafe;
159
return *m_safeString;
162
SafeString& SafeString::NestedString::append( const QStringRef &reference )
164
QString::append( reference );
165
m_safeString->m_safety = IsNotSafe;
166
return *m_safeString;
169
SafeString& SafeString::NestedString::append( const QLatin1String &str )
171
QString::append( str );
172
m_safeString->m_safety = IsNotSafe;
173
return *m_safeString;
176
SafeString& SafeString::NestedString::append( const QByteArray &ba )
178
QString::append( ba );
179
m_safeString->m_safety = IsNotSafe;
180
return *m_safeString;
183
SafeString& SafeString::NestedString::append( const char *str )
185
QString::append( str );
186
m_safeString->m_safety = IsNotSafe;
187
return *m_safeString;
190
SafeString& SafeString::NestedString::append( const QChar ch )
192
QString::append( ch );
193
m_safeString->m_safety = IsNotSafe;
194
return *m_safeString;
197
void SafeString::NestedString::chop( int n )
200
m_safeString->m_safety = IsNotSafe;
203
SafeString& SafeString::NestedString::fill( QChar ch, int size )
205
QString::fill( ch, size );
206
m_safeString->m_safety = IsNotSafe;
207
return *m_safeString;
210
SafeString& SafeString::NestedString::insert( int position, const Grantlee::SafeString &str )
212
QString::insert( position, str.get() );
214
m_safeString->m_safety = IsNotSafe;
216
return *m_safeString;
219
SafeString& SafeString::NestedString::insert( int position, const QString &str )
221
QString::insert( position, str );
222
return *m_safeString;
225
SafeString& SafeString::NestedString::insert( int position, const QLatin1String &str )
227
QString::insert( position, str );
228
return *m_safeString;
231
SafeString& SafeString::NestedString::insert( int position, const QChar *unicode, int size )
233
QString::insert( position, unicode, size );
234
return *m_safeString;
237
SafeString& SafeString::NestedString::insert( int position, QChar ch )
239
QString::insert( position, ch );
240
return *m_safeString;
243
SafeString SafeString::NestedString::left( int n ) const
245
return SafeString( QString::left( n ), m_safeString->m_safety );
248
SafeString SafeString::NestedString::leftJustified( int width, QChar fill, bool truncate ) const
250
return SafeString( QString::leftJustified( width, fill, truncate ), m_safeString->m_safety );
253
SafeString SafeString::NestedString::mid( int position, int n ) const
255
return SafeString( QString::mid( position, n ), m_safeString->m_safety );
258
SafeString SafeString::NestedString::normalized( QString::NormalizationForm mode ) const
260
return SafeString( QString::normalized( mode ), m_safeString->m_safety );
263
SafeString SafeString::NestedString::normalized( QString::NormalizationForm mode, QChar::UnicodeVersion version ) const
265
return SafeString( QString::normalized( mode, version ), m_safeString->m_safety );
268
SafeString& SafeString::NestedString::prepend( const Grantlee::SafeString &str )
270
QString::prepend( str.get() );
272
m_safeString->m_safety = IsNotSafe;
274
return *m_safeString;
277
SafeString& SafeString::NestedString::prepend( const QString &str )
279
QString::prepend( str );
280
m_safeString->m_safety = IsNotSafe;
281
return *m_safeString;
284
SafeString& SafeString::NestedString::prepend( const QLatin1String &str )
286
QString::prepend( str );
287
m_safeString->m_safety = IsNotSafe;
288
return *m_safeString;
291
SafeString& SafeString::NestedString::prepend( const QByteArray &ba )
293
QString::prepend( ba );
294
m_safeString->m_safety = IsNotSafe;
295
return *m_safeString;
298
SafeString& SafeString::NestedString::prepend( const char *str )
300
QString::prepend( str );
301
m_safeString->m_safety = IsNotSafe;
302
return *m_safeString;
305
SafeString& SafeString::NestedString::prepend( QChar ch )
307
QString::prepend( ch );
308
m_safeString->m_safety = IsNotSafe;
309
return *m_safeString;
312
void SafeString::NestedString::push_back( const Grantlee::SafeString &other )
314
QString::push_back( other.get() );
315
m_safeString->m_safety = other.m_safety;
318
void SafeString::NestedString::push_front( const Grantlee::SafeString &other )
320
QString::push_front( other.get() );
321
m_safeString->m_safety = other.m_safety;
324
SafeString& SafeString::NestedString::remove( int position, int n )
326
QString::remove( position, n );
327
m_safeString->m_safety = IsNotSafe;
328
return *m_safeString;
331
SafeString& SafeString::NestedString::remove( QChar ch, Qt::CaseSensitivity cs )
333
QString::remove( ch, cs );
334
m_safeString->m_safety = IsNotSafe;
335
return *m_safeString;
338
SafeString& SafeString::NestedString::remove( const Grantlee::SafeString &str, Qt::CaseSensitivity cs )
340
QString::remove( str, cs );
341
m_safeString->m_safety = IsNotSafe;
342
return *m_safeString;
345
SafeString& SafeString::NestedString::remove( const QString &str, Qt::CaseSensitivity cs )
347
QString::remove( str, cs );
348
m_safeString->m_safety = IsNotSafe;
349
return *m_safeString;
352
SafeString& SafeString::NestedString::remove( const QRegExp &rx )
354
QString::remove( rx );
355
m_safeString->m_safety = IsNotSafe;
356
return *m_safeString;
359
SafeString SafeString::NestedString::repeated( int times ) const
361
return SafeString( QString::repeated( times ), m_safeString->m_safety );
364
SafeString& SafeString::NestedString::replace( int position, int n, const Grantlee::SafeString &after )
366
QString::replace( position, n, after.get() );
367
m_safeString->m_safety = after.m_safety;
368
return *m_safeString;
371
SafeString& SafeString::NestedString::replace( int position, int n, const QString &after )
373
QString::replace( position, n, after );
374
m_safeString->m_safety = IsNotSafe;
375
return *m_safeString;
378
SafeString& SafeString::NestedString::replace( int position, int n, const QChar *unicode, int size )
380
QString::replace( position, n, unicode, size );
381
m_safeString->m_safety = IsNotSafe;
382
return *m_safeString;
385
SafeString& SafeString::NestedString::replace( int position, int n, QChar after )
387
QString::replace( position, n, after );
388
m_safeString->m_safety = IsNotSafe;
389
return *m_safeString;
392
SafeString& SafeString::NestedString::replace( const Grantlee::SafeString &before, const Grantlee::SafeString &after, Qt::CaseSensitivity cs )
394
QString::replace( before.get(), after.get(), cs );
395
m_safeString->m_safety = after.m_safety;
396
return *m_safeString;
399
SafeString& SafeString::NestedString::replace( const QString &before, const Grantlee::SafeString &after, Qt::CaseSensitivity cs )
401
QString::replace( before, after.get(), cs );
402
m_safeString->m_safety = IsNotSafe;
403
return *m_safeString;
406
SafeString& SafeString::NestedString::replace( const Grantlee::SafeString &before, const QString &after, Qt::CaseSensitivity cs )
408
QString::replace( before.get(), after, cs );
409
m_safeString->m_safety = IsNotSafe;
410
return *m_safeString;
413
SafeString& SafeString::NestedString::replace( const QString &before, const QString &after, Qt::CaseSensitivity cs )
415
QString::replace( before, after, cs );
416
m_safeString->m_safety = IsNotSafe;
417
return *m_safeString;
420
SafeString& SafeString::NestedString::replace( const QChar *before, int blen, const QChar *after, int alen, Qt::CaseSensitivity cs )
422
QString::replace( before, blen, after, alen, cs );
423
m_safeString->m_safety = IsNotSafe;
424
return *m_safeString;
427
SafeString& SafeString::NestedString::replace( QChar ch, const SafeString &after, Qt::CaseSensitivity cs )
429
QString::replace( ch, after.get(), cs );
430
m_safeString->m_safety = after.m_safety;
431
return *m_safeString;
434
SafeString& SafeString::NestedString::replace( QChar ch, const QString &after, Qt::CaseSensitivity cs )
436
QString::replace( ch, after, cs );
437
m_safeString->m_safety = IsNotSafe;
438
return *m_safeString;
441
SafeString& SafeString::NestedString::replace( QChar before, QChar after, Qt::CaseSensitivity cs )
443
QString::replace( before, after, cs );
444
m_safeString->m_safety = IsNotSafe;
445
return *m_safeString;
448
SafeString& SafeString::NestedString::replace( const QLatin1String &before, const QLatin1String &after, Qt::CaseSensitivity cs )
450
QString::replace( before, after, cs );
451
m_safeString->m_safety = IsNotSafe;
452
return *m_safeString;
455
SafeString& SafeString::NestedString::replace( const QLatin1String &before, const Grantlee::SafeString &after, Qt::CaseSensitivity cs )
457
QString::replace( before, after.get(), cs );
458
m_safeString->m_safety = after.m_safety;
459
return *m_safeString;
462
SafeString& SafeString::NestedString::replace( const QLatin1String &before, const QString &after, Qt::CaseSensitivity cs )
464
QString::replace( before, after, cs );
465
m_safeString->m_safety = IsNotSafe;
466
return *m_safeString;
469
SafeString& SafeString::NestedString::replace( const Grantlee::SafeString &before, const QLatin1String &after, Qt::CaseSensitivity cs )
471
QString::replace( before.get(), after, cs );
472
m_safeString->m_safety = before.m_safety;
473
return *m_safeString;
476
SafeString& SafeString::NestedString::replace( const QString &before, const QLatin1String &after, Qt::CaseSensitivity cs )
478
QString::replace( before, after, cs );
479
m_safeString->m_safety = IsNotSafe;
480
return *m_safeString;
483
SafeString& SafeString::NestedString::replace( QChar c, const QLatin1String &after, Qt::CaseSensitivity cs )
485
QString::replace( c, after, cs );
486
m_safeString->m_safety = IsNotSafe;
487
return *m_safeString;
490
SafeString& SafeString::NestedString::replace( const QRegExp &rx, const Grantlee::SafeString &after )
492
QString::replace( rx, after.get() );
493
m_safeString->m_safety = after.m_safety;
494
return *m_safeString;
497
SafeString& SafeString::NestedString::replace( const QRegExp &rx, const QString &after )
499
QString::replace( rx, after );
500
m_safeString->m_safety = IsNotSafe;
501
return *m_safeString;
504
SafeString SafeString::NestedString::right( int n ) const
506
return SafeString( QString::right( n ), m_safeString->m_safety );
509
SafeString SafeString::NestedString::rightJustified( int width, QChar fill, bool truncate ) const
511
return SafeString( QString::rightJustified( width, fill, truncate ), m_safeString->m_safety );
514
SafeString SafeString::NestedString::section( const QRegExp ®, int start, int end, QString::SectionFlags flags ) const
516
return SafeString( QString::section( reg, start, end, flags ), m_safeString->m_safety );
519
SafeString SafeString::NestedString::section( QChar sep, int start, int end, QString::SectionFlags flags ) const
521
return SafeString( QString::section( sep, start, end, flags ), m_safeString->m_safety );
524
SafeString SafeString::NestedString::section( const Grantlee::SafeString &sep, int start, int end, QString::SectionFlags flags ) const
526
return SafeString( QString::section( sep, start, end, flags ), m_safeString->m_safety );
529
SafeString SafeString::NestedString::section( const QString &sep, int start, int end, QString::SectionFlags flags ) const
531
return SafeString( QString::section( sep, start, end, flags ), m_safeString->m_safety );
534
SafeString& SafeString::NestedString::setNum( int n, int base )
536
QString::setNum( n, base );
537
m_safeString->m_safety = IsNotSafe;
538
return *m_safeString;
541
SafeString& SafeString::NestedString::setNum( uint n, int base )
543
QString::setNum( n, base );
544
m_safeString->m_safety = IsNotSafe;
545
return *m_safeString;
548
SafeString& SafeString::NestedString::setNum( long int n, int base )
550
QString::setNum( n, base );
551
m_safeString->m_safety = IsNotSafe;
552
return *m_safeString;
555
SafeString& SafeString::NestedString::setNum( ulong n, int base )
557
QString::setNum( n, base );
558
m_safeString->m_safety = IsNotSafe;
559
return *m_safeString;
562
SafeString& SafeString::NestedString::setNum( qlonglong n, int base )
564
QString::setNum( n, base );
565
m_safeString->m_safety = IsNotSafe;
566
return *m_safeString;
569
SafeString& SafeString::NestedString::setNum( qulonglong n, int base )
571
QString::setNum( n, base );
572
m_safeString->m_safety = IsNotSafe;
573
return *m_safeString;
576
SafeString& SafeString::NestedString::setNum( short int n, int base )
578
QString::setNum( n, base );
579
m_safeString->m_safety = IsNotSafe;
580
return *m_safeString;
583
SafeString& SafeString::NestedString::setNum( ushort n, int base )
585
QString::setNum( n, base );
586
m_safeString->m_safety = IsNotSafe;
587
return *m_safeString;
590
SafeString& SafeString::NestedString::setNum( double n, char format, int precision )
592
QString::setNum( n, format, precision );
593
m_safeString->m_safety = IsNotSafe;
594
return *m_safeString;
597
SafeString& SafeString::NestedString::setNum( float n, char format, int precision )
599
QString::setNum( n, format, precision );
600
m_safeString->m_safety = IsNotSafe;
601
return *m_safeString;
604
SafeString& SafeString::NestedString::setUnicode( const QChar *unicode, int size )
606
QString::setUnicode( unicode, size );
607
m_safeString->m_safety = IsNotSafe;
608
return *m_safeString;
611
SafeString& SafeString::NestedString::setUtf16( const ushort *unicode, int size )
613
QString::setUtf16( unicode, size );
614
m_safeString->m_safety = IsNotSafe;
615
return *m_safeString;
618
SafeString SafeString::NestedString::simplified() const
620
return SafeString( QString::simplified(), m_safeString->m_safety );
623
QStringList SafeString::NestedString::split( const Grantlee::SafeString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs ) const
625
return QString::split( sep.get(), behavior, cs );
628
QStringList SafeString::NestedString::split( const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs ) const
630
return QString::split( sep, behavior, cs );
633
QStringList SafeString::NestedString::split( const QChar &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs ) const
635
return QString::split( sep, behavior, cs );
638
QStringList SafeString::NestedString::split( const QRegExp &rx, QString::SplitBehavior behavior ) const
640
return QString::split( rx, behavior );
643
SafeString SafeString::NestedString::toLower() const
645
return SafeString( QString::toLower(), IsNotSafe );
648
SafeString SafeString::NestedString::toUpper() const
650
return SafeString( QString::toUpper(), IsNotSafe );
653
SafeString SafeString::NestedString::trimmed() const
655
return SafeString( QString::trimmed(), m_safeString->m_safety );