00001
00023
#include <kdebug.h>
00024
#include "spellingfilter.h"
00025
00026
00027
00028
00029
00030 SpellingFilter::SpellingFilter(
const QString& text,
const QString& quotePrefix,
00031 UrlFiltering filterUrls, EmailAddressFiltering filterEmailAddresses,
00032
const QStringList& filterStrings)
00033 : mOriginal(text)
00034 {
00035 TextCensor c(text);
00036
00037
if(!quotePrefix.isEmpty())
00038 c.censorQuotations(quotePrefix);
00039
00040
if(filterUrls)
00041 c.censorUrls();
00042
00043
if(filterEmailAddresses)
00044 c.censorEmailAddresses();
00045
00046 QStringList::const_iterator iter = filterStrings.begin();
00047
while(iter != filterStrings.end())
00048 {
00049 c.censorString(*iter);
00050 ++iter;
00051 }
00052
00053 mFiltered = c.censoredText();
00054 }
00055
00056
QString SpellingFilter::originalText()
const
00057
{
00058
return mOriginal;
00059 }
00060
00061
QString SpellingFilter::filteredText()
const
00062
{
00063
return mFiltered;
00064 }
00065
00066
00067
00068
00069
00070 SpellingFilter::TextCensor::TextCensor(
const QString& s)
00071 :
LinkLocator(s)
00072 {
00073
00074 }
00075
00076
void SpellingFilter::TextCensor::censorQuotations(
const QString& quotePrefix)
00077 {
00078 mPos = 0;
00079
while(mPos < static_cast<int>(mText.length()))
00080 {
00081
00082 findQuotation(quotePrefix);
00083
if(mPos < static_cast<int>(mText.length()))
00084 {
00085
int start = mPos;
00086 skipQuotation(quotePrefix);
00087
00088
00089
int len = mPos - start;
00090
QString spaces;
00091 spaces.fill(
' ', len);
00092 mText.replace(start, len, spaces);
00093
00094
00095
00096 }
00097 }
00098 }
00099
00100
void SpellingFilter::TextCensor::censorUrls()
00101 {
00102 mPos = 0;
00103
while(mPos < static_cast<int>(mText.length()))
00104 {
00105
00106
QString url;
00107
while(mPos < static_cast<int>(mText.length()) && url.isEmpty())
00108 {
00109 url = getUrl();
00110 ++mPos;
00111 }
00112
00113
if(mPos < static_cast<int>(mText.length()) && !url.isEmpty())
00114 {
00115
int start = mPos - url.length();
00116
00117
00118 url.fill(
' ');
00119 mText.replace(start, url.length(), url);
00120
00121
00122
00123 }
00124 }
00125 }
00126
00127
void SpellingFilter::TextCensor::censorEmailAddresses()
00128 {
00129 mPos = 0;
00130
while(mPos < static_cast<int>(mText.length()))
00131 {
00132
00133 findEmailAddress();
00134
if(mPos < static_cast<int>(mText.length()))
00135 {
00136
QString address = getEmailAddress();
00137 ++mPos;
00138
if(!address.isEmpty())
00139 {
00140
int start = mPos - address.length();
00141
00142
00143 address.fill(
' ');
00144 mText.replace(start, address.length(), address);
00145
00146
00147
00148 }
00149 }
00150 }
00151 }
00152
00153
void SpellingFilter::TextCensor::censorString(
const QString& s)
00154 {
00155 mPos = 0;
00156
while(mPos != -1)
00157 {
00158
00159 mPos = mText.find(s, mPos);
00160
if(mPos != -1)
00161 {
00162
00163
QString spaces;
00164 spaces.fill(
' ', s.length());
00165 mText.replace(mPos, s.length(), spaces);
00166 mPos += s.length();
00167
00168
00169
00170 }
00171 }
00172 }
00173
00174
QString SpellingFilter::TextCensor::censoredText()
const
00175
{
00176
return mText;
00177 }
00178
00179
00180
00181
00182
00183
bool SpellingFilter::TextCensor::atLineStart()
const
00184
{
00185
return (mPos == 0 && static_cast<int>(mText.length()) > 0) || (mText[mPos - 1] ==
'\n');
00186 }
00187
00188
void SpellingFilter::TextCensor::skipLine()
00189 {
00190 mPos = mText.find(
'\n', mPos);
00191
if(mPos == -1)
00192 mPos = static_cast<int>(mText.length());
00193
else
00194 ++mPos;
00195 }
00196
00197
bool SpellingFilter::TextCensor::atQuotation(
const QString& quotePrefix)
const
00198
{
00199
return atLineStart() &&
00200 mText.mid(mPos, quotePrefix.length()) == quotePrefix;
00201 }
00202
00203
void SpellingFilter::TextCensor::skipQuotation(
const QString& quotePrefix)
00204 {
00205
while(atQuotation(quotePrefix))
00206 skipLine();
00207 }
00208
00209
void SpellingFilter::TextCensor::findQuotation(
const QString& quotePrefix)
00210 {
00211
while(mPos < static_cast<int>(mText.length()) && !atQuotation(quotePrefix))
00212 skipLine();
00213 }
00214
00215
void SpellingFilter::TextCensor::findEmailAddress()
00216 {
00217
while(mPos < static_cast<int>(mText.length()) && mText[mPos] !=
'@')
00218 ++mPos;
00219 }
00220