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);