20time_t parseISO8601Date(
const TQString &s)
23 if (s.stripWhiteSpace().left(4).toInt() < 1000)
27 if (s.find(
'T') != -1)
28 return KRFCDate::parseDateISO8601(s);
30 return KRFCDate::parseDateISO8601(s +
"T12:00:00");
33TQString childNodesAsXML(
const TQDomNode& parent)
35 TQDomNodeList list = parent.childNodes();
37 TQTextStream ts( &str, IO_WriteOnly );
38 for (uint i = 0; i < list.count(); ++i)
40 return str.stripWhiteSpace();
43static TQString plainTextToHtml(
const TQString& plainText)
45 TQString str(plainText);
46 str.replace(
"&",
"&");
47 str.replace(
"\"",
""");
48 str.replace(
"<",
"<");
50 str.replace(
"\n",
"<br/>");
54enum ContentFormat { Text, HTML, XML, Binary };
56static ContentFormat mapTypeToFormat(
const TQString& modep,
const TQString& typep,
const TQString& src)
58 TQString mode = modep.isNull() ?
"escaped" : modep;
59 TQString type = typep;
64 if (type.isNull() && src.isEmpty())
65 type = TQString::fromUtf8(
"text");
67 if (type == TQString::fromUtf8(
"html")
68 || type == TQString::fromUtf8(
"text/html"))
71 if (type == TQString::fromUtf8(
"text")
72 || (type.startsWith(TQString::fromUtf8(
"text/"),
false)
73 && !type.startsWith(TQString::fromUtf8(
"text/xml"),
false))
77 TQStringList xmltypes;
78 xmltypes.append(TQString::fromUtf8(
"xhtml"));
80 xmltypes.append(TQString::fromUtf8(
"text/xml"));
81 xmltypes.append(TQString::fromUtf8(
"application/xml"));
82 xmltypes.append(TQString::fromUtf8(
"text/xml-external-parsed-entity"));
83 xmltypes.append(TQString::fromUtf8(
"application/xml-external-parsed-entity"));
84 xmltypes.append(TQString::fromUtf8(
"application/xml-dtd"));
87 if (xmltypes.contains(type)
88 || type.endsWith(TQString::fromUtf8(
"+xml"),
false)
89 || type.endsWith(TQString::fromUtf8(
"/xml"),
false))
95static TQString extractAtomContent(
const TQDomElement& e)
97 ContentFormat format = mapTypeToFormat(e.attribute(
"mode"),
105 const bool hasPre = e.text().contains(
"<pre>",
false ) || e.text().contains(
"<pre ",
false );
106 return KCharsets::resolveEntities( hasPre ? e.text() : e.text().simplifyWhiteSpace() );
109 return plainTextToHtml(e.text().stripWhiteSpace());
111 return childNodesAsXML(e).simplifyWhiteSpace();
120TQDomElement extractElementNS(
const TQDomNode &parent,
const TQString &nameSpace,
const TQString &localName)
122 TQDomElement element;
129 TQDomNodeList children = parent.childNodes();
130 for (
size_t i = 0; i < children.count(); ++i)
132 TQDomNode node = children.item(i);
133 if (node.isElement() && node.namespaceURI() == nameSpace && node.localName() == localName)
135 element = node.toElement();
143TQString extractElementTextNS(
const TQDomNode &parent,
const TQString &namespaceURI,
const TQString &localName,
bool isInlined)
145 TQDomElement element = extractElementNS(parent, namespaceURI, localName);
147 if (element.isNull())
149 return TQString::null;
152 TQString result = element.text().stripWhiteSpace();
153 if (localName ==
"content")
156 result = extractAtomContent(element);
162 bool hasPre = result.contains(
"<pre>",
false) || result.contains(
"<pre ",
false);
163 bool hasHtml = hasPre || result.contains(
"<");
164 if (!isInlined && !hasHtml)
165 result = result = result.replace(TQChar(
'\n'),
"<br />");
167 result = result.simplifyWhiteSpace();
170 return result.isEmpty() ? TQString::null : result;
173TQString extractNode(
const TQDomNode &parent,
const TQString &elemName,
bool isInlined)
175 TQDomNode node = parent.namedItem(elemName);
179 TQDomElement e = node.toElement();
180 TQString result = e.text().stripWhiteSpace();
182 if (elemName ==
"content")
184 result = extractAtomContent(e);
188 bool hasPre = result.contains(
"<pre>",
false) || result.contains(
"<pre ",
false);
189 bool hasHtml = hasPre || result.contains(
"<");
190 if(!isInlined && !hasHtml)
191 result = result = result.replace(TQChar(
'\n'),
"<br />");
193 result = result.simplifyWhiteSpace();
196 return result.isEmpty() ? TQString() : result;
199TQString extractTitle(
const TQDomNode & parent)
201 TQDomNode node = parent.namedItem(TQString::fromLatin1(
"title"));
205 TQString result = node.toElement().text();
207 result = KCharsets::resolveEntities(KCharsets::resolveEntities(result).replace(TQRegExp(
"<[^>]*>"),
"").remove(
"\\"));
208 result = result.simplifyWhiteSpace();
210 if (result.isEmpty())
216static void authorFromString(
const TQString& strp, TQString& name, TQString& email)
218 TQString str = strp.stripWhiteSpace();
225 TQRegExp remail(
"<?([^@\\s<]+@[^>\\s]+)>?");
228 int pos = remail.search(str);
231 TQString all = remail.cap(0);
232 email = remail.cap(1);
233 str.replace(all,
"");
238 name = str.simplifyWhiteSpace();
246 TQRegExp rename(
"^\\(([^\\)]*)\\)");
248 pos = rename.search(name);
252 name = rename.cap(1);
255 name = name.isEmpty() ? TQString() : name;
256 email = email.isEmpty() ? TQString() : email;
259TQString parseItemAuthor(
const TQDomElement& element, Format format, Version version)
264 TQDomElement dcCreator = extractElementNS(element, DublinCoreNamespace,
"creator");
266 if (!dcCreator.isNull())
267 authorFromString(dcCreator.text(), name, email);
268 else if (format == AtomFeed)
270 TQDomElement atomAuthor = element.namedItem(
"author").toElement();
271 if (atomAuthor.isNull())
272 atomAuthor = extractElementNS(element, AtomNamespace,
"author");
273 if (!atomAuthor.isNull())
275 TQDomElement atomName = atomAuthor.namedItem(
"name").toElement();
276 if (atomName.isNull())
277 atomName = extractElementNS(atomAuthor, AtomNamespace,
"name");
278 name = atomName.text().stripWhiteSpace();
280 TQDomElement atomEmail = atomAuthor.namedItem(
"email").toElement();
281 if (atomEmail.isNull())
282 atomEmail = extractElementNS(atomAuthor, AtomNamespace,
"email");
283 email = atomEmail.text().stripWhiteSpace();
286 else if (format == RSSFeed)
288 authorFromString(element.namedItem(
"author").toElement().text(), name, email);
295 return TQString(
"<a href=\"mailto:%1\">%2</a>").arg(email).arg(name);