24#include "personimpl.h"
30#include <QtCore/QByteArray>
31#include <QtCore/QDateTime>
32#include <QtCore/QRegExp>
33#include <QtCore/QString>
41unsigned int calcHash(
const QString& str)
43 return calcHash(str.toUtf8());
46unsigned int calcHash(
const QByteArray& array)
54 const char* s = array.data();
55 unsigned int hash = 5381;
57 while ( ( c = *s++ ) ) hash = ((hash << 5) + hash) + c;
64static time_t toTimeT(KDateTime& kdt)
67 if (kdt.isDateOnly()) {
68 kdt.setTimeSpec(KDateTime::UTC);
69 kdt.setTime(QTime(12, 0));
71 return kdt.toTime_t();
76time_t parseISODate(
const QString& str)
78 KDateTime kdt = KDateTime::fromString(str, KDateTime::ISODate);
82time_t parseRFCDate(
const QString& str)
84 KDateTime kdt = KDateTime::fromString(str, KDateTime::RFCDate);
88time_t parseDate(
const QString& str, DateFormat hint)
95 time_t t = parseRFCDate(str);
96 return t != 0 ? t : parseISODate(str);
100 time_t t = parseISODate(str);
101 return t != 0 ? t : parseRFCDate(str);
105QString dateTimeToString(time_t date)
112 return dt.toUTC().toString();
115QString calcMD5Sum(
const QString& str)
118 md5Machine.update(str.toUtf8());
119 return QLatin1String(md5Machine.hexDigest().constData());
122QString resolveEntities(
const QString& str)
124 return KCharsets::resolveEntities(str);
127QString escapeSpecialCharacters(
const QString& strp)
130 str.replace(QLatin1Char(
'&'), QLatin1String(
"&"));
131 str.replace(QLatin1Char(
'\"'), QLatin1String(
"""));
132 str.replace(QLatin1Char(
'<'), QLatin1String(
"<"));
133 str.replace(QLatin1Char(
'>'), QLatin1String(
">"));
134 str.replace(QLatin1Char(
'\''), QLatin1String(
"'"));
135 return str.trimmed();
138QString convertNewlines(
const QString& strp)
141 str.replace(QLatin1Char(
'\n'), QLatin1String(
"<br/>"));
145QString plainTextToHtml(
const QString& plainText)
147 QString str(plainText);
148 str.replace(QLatin1Char(
'&'), QLatin1String(
"&"));
149 str.replace(QLatin1Char(
'\"'), QLatin1String(
"""));
150 str.replace(QLatin1Char(
'<'), QLatin1String(
"<"));
152 str.replace(QLatin1Char(
'\n'), QLatin1String(
"<br/>"));
153 return str.trimmed();
156QString htmlToPlainText(
const QString& html)
160 str.remove(QRegExp(QLatin1String(
"<[^>]*>")));
161 str = resolveEntities(str);
162 return str.trimmed();
166 static QRegExp tagRegExp;
167 static bool tagRegExpSet =
false;
170bool stringContainsMarkup(
const QString& str)
173 if (str.contains(QRegExp(QLatin1String(
"&[a-zA-Z0-9#]+;"))))
176 const int ltc = str.count(QLatin1Char(
'<'));
182 tagRegExp = QRegExp(QLatin1String(
"<\\w+.*/?>"));
185 return str.contains(tagRegExp);
188bool isHtml(
const QString& str)
191 if (str.contains(QRegExp(QLatin1String(
"&[a-zA-Z0-9#]+;"))))
194 const int ltc = str.count(QLatin1Char(
'<'));
200 tagRegExp = QRegExp(QLatin1String(
"<\\w+.*/?>"));
203 if (str.contains(tagRegExp))
209QString normalize(
const QString& str)
211 return isHtml(str) ? str.trimmed() : plainTextToHtml(str);
214QString normalize(
const QString& strp,
bool isCDATA,
bool containsMarkup)
217 return strp.trimmed();
222 QString str = resolveEntities(strp);
223 str = escapeSpecialCharacters(str);
224 str = convertNewlines(str);
230 QString str = escapeSpecialCharacters(strp);
237PersonPtr personFromString(
const QString& strp)
239 QString str = strp.trimmed();
241 return PersonPtr(
new PersonImpl());
243 str = resolveEntities(str);
251 QRegExp remail(QLatin1String(
"<?([^@\\s<]+@[^>\\s]+)>?"));
254 int pos = remail.indexIn(str);
257 QString all = remail.cap(0);
258 email = remail.cap(1);
263 email.remove(QLatin1String(
"mailto:"));
264 email.remove(QRegExp(QLatin1String(
"[\\(\\)]")));
268 name = str.simplified();
276 QRegExp rename(QLatin1String(
"^\\(([^\\)]*)\\)"));
278 if (rename.exactMatch(name))
280 name = rename.cap(1);
283 name = name.isEmpty() ? QString() : name;
284 email = email.isEmpty() ? QString() : email;
285 uri = uri.isEmpty() ? QString() : uri;
287 if (name.isEmpty() && email.isEmpty() && uri.isEmpty())
288 return PersonPtr(
new PersonImpl());
290 return PersonPtr(
new PersonImpl(name, uri, email));
293ElementType::ElementType(
const QString& localnamep,
294 const QString& nsp) : ns(nsp), localname(localnamep)
298bool ElementType::operator==(
const ElementType& other)
const
300 return localname == other.localname && ns == other.ns;