kpimutils
spellingfilter.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00032 #include "spellingfilter.h"
00033
00034 using namespace KPIMUtils;
00035
00040
00041 class KPIMUtils::SpellingFilter::Private
00042 {
00043 public:
00044 QString mOriginal;
00045 QString mFiltered;
00046 };
00047
00048
00049
00050
00051
00052
00053 SpellingFilter::SpellingFilter( const QString &text,
00054 const QString "ePrefix,
00055 UrlFiltering filterUrls,
00056 EmailAddressFiltering filterEmailAddresses,
00057 const QStringList &filterStrings )
00058 : d( new KPIMUtils::SpellingFilter::Private )
00059 {
00060 d->mOriginal = text;
00061 TextCensor c( text );
00062
00063 if ( !quotePrefix.isEmpty() ) {
00064 c.censorQuotations( quotePrefix );
00065 }
00066
00067 if ( filterUrls ) {
00068 c.censorUrls();
00069 }
00070
00071 if ( filterEmailAddresses ) {
00072 c.censorEmailAddresses();
00073 }
00074
00075 QStringList::const_iterator iter = filterStrings.begin();
00076 while ( iter != filterStrings.end() ) {
00077 c.censorString( *iter );
00078 ++iter;
00079 }
00080
00081 d->mFiltered = c.censoredText();
00082 }
00083
00084 SpellingFilter::~SpellingFilter()
00085 {
00086 delete d;
00087 }
00088
00089 QString SpellingFilter::originalText() const
00090 {
00091 return d->mOriginal;
00092 }
00093
00094 QString SpellingFilter::filteredText() const
00095 {
00096 return d->mFiltered;
00097 }
00098
00099
00100
00101
00102
00103 SpellingFilter::TextCensor::TextCensor( const QString &s )
00104 : LinkLocator( s )
00105 {
00106 }
00107
00108 void SpellingFilter::TextCensor::censorQuotations( const QString "ePrefix )
00109 {
00110 mPos = 0;
00111 while ( mPos < mText.length() ) {
00112
00113 findQuotation( quotePrefix );
00114 if ( mPos < mText.length() ) {
00115 int start = mPos;
00116 skipQuotation( quotePrefix );
00117
00118
00119 int len = mPos - start;
00120 QString spaces;
00121 spaces.fill( ' ', len );
00122 mText.replace( start, len, spaces );
00123 }
00124 }
00125 }
00126
00127 void SpellingFilter::TextCensor::censorUrls()
00128 {
00129 mPos = 0;
00130 while ( mPos < mText.length() ) {
00131
00132 QString url;
00133 while ( mPos < mText.length() && url.isEmpty() ) {
00134 url = getUrl();
00135 ++mPos;
00136 }
00137
00138 if ( mPos < mText.length() && !url.isEmpty() ) {
00139 int start = mPos - url.length();
00140
00141
00142 url.fill( ' ' );
00143 mText.replace( start, url.length(), url );
00144 }
00145 }
00146 }
00147
00148 void SpellingFilter::TextCensor::censorEmailAddresses()
00149 {
00150 mPos = 0;
00151 while ( mPos < mText.length() ) {
00152
00153 findEmailAddress();
00154 if ( mPos < mText.length() ) {
00155 QString address = getEmailAddress();
00156 ++mPos;
00157 if ( !address.isEmpty() ) {
00158 int start = mPos - address.length();
00159
00160
00161 address.fill( ' ' );
00162 mText.replace( start, address.length(), address );
00163 }
00164 }
00165 }
00166 }
00167
00168 void SpellingFilter::TextCensor::censorString( const QString &s )
00169 {
00170 mPos = 0;
00171 while ( mPos != -1 ) {
00172
00173 mPos = mText.indexOf( s, mPos );
00174 if ( mPos != -1 ) {
00175
00176 QString spaces;
00177 spaces.fill( ' ', s.length() );
00178 mText.replace( mPos, s.length(), spaces );
00179 mPos += s.length();
00180 }
00181 }
00182 }
00183
00184 QString SpellingFilter::TextCensor::censoredText() const
00185 {
00186 return mText;
00187 }
00188
00189
00190
00191
00192
00193 bool SpellingFilter::TextCensor::atLineStart() const
00194 {
00195 return
00196 ( mPos == 0 && mText.length() > 0 ) ||
00197 ( mText[mPos - 1] == '\n' );
00198 }
00199
00200 void SpellingFilter::TextCensor::skipLine()
00201 {
00202 mPos = mText.indexOf( '\n', mPos );
00203 if ( mPos == -1 ) {
00204 mPos = mText.length();
00205 } else {
00206 ++mPos;
00207 }
00208 }
00209
00210 bool SpellingFilter::TextCensor::atQuotation( const QString "ePrefix ) const
00211 {
00212 return atLineStart() &&
00213 mText.mid( mPos, quotePrefix.length() ) == quotePrefix;
00214 }
00215
00216 void SpellingFilter::TextCensor::skipQuotation( const QString "ePrefix )
00217 {
00218 while ( atQuotation( quotePrefix ) ) {
00219 skipLine();
00220 }
00221 }
00222
00223 void SpellingFilter::TextCensor::findQuotation( const QString "ePrefix )
00224 {
00225 while ( mPos < mText.length() &&
00226 !atQuotation( quotePrefix ) ) {
00227 skipLine();
00228 }
00229 }
00230
00231 void SpellingFilter::TextCensor::findEmailAddress()
00232 {
00233 while ( mPos < mText.length() && mText[mPos] != '@' ) {
00234 ++mPos;
00235 }
00236 }