/*************************************************************************** * Copyright (C) 2003 by Sylvain Joyeux * * sylvain.joyeux@m4x.org * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include "parsers.h" #include "../apt.h" #include #include static const QString html_attribute_begin("%1\n\t\n\t\t"), html_attribute_classed("%2\n\t\n\t\t"), html_attribute_end("\n\t\n\n"); // Converts the special chars in orig into its HTML equivalents static QString text2html(const QString& orig) { QString ret(orig); ret = ret.replace("<(?!a href)", "<"); //ret = ret.replace( QRegExp("\n"), "
\n"); return ret; } static void close_indent(int indent, QString& buffer) { if (buffer.isEmpty()) return; if (indent) buffer += "\n\t\t"; } static void close_item(int indent, QString& buffer) { if (buffer.isEmpty()) return; close_indent(indent, buffer); buffer += html_attribute_end; } static void close_table(const QString& version, int indent, QString& buffer) { if (buffer.isEmpty()) return; close_item(indent, buffer); buffer = version + "\n" + buffer + "
\n"; } static QString version_header_link(const KURL& url, const QString& name) { return QString("\t" + name + "\n"); } namespace Parsers { Show::Show(const QString& package, const QString& installed_version, bool act) : m_package(package), m_installed(installed_version), m_act(false) { m_act = act; } void Show::operator() (AptProtocol* slave, const QString& tag, const QString& value) { // Since we want to show the version first, we should wait for it // before sending anything static QString version; static QString buffer; static QString attribute; static int indent; static bool multiline = false; static bool first_line = false, new_paragraph = true; if (tag == "begin" || tag == "package" || tag == "end") { if (multiline && !new_paragraph) buffer += "

"; if (tag == "begin") m_result_count = 0; else { m_result_count += (tag == "package"); close_table(version, indent, buffer); if (!buffer.isEmpty()) *slave << buffer; } // init the state variables for the next package buffer = ""; indent = 0; first_line = false; new_paragraph = true; } else if (tag == "field") { if (multiline && !new_paragraph) buffer += "

"; attribute = value; if (value == "Depends" || value == "Description") { close_item(indent, buffer); buffer += html_attribute_begin.arg(value) + " "; close_item(indent, buffer); buffer += html_attribute_begin.arg(" "); } else if (value != "Version" && value != "Package") { close_item(indent, buffer); buffer += html_attribute_begin.arg(value); } if (value == "Description") { multiline = true; new_paragraph = true; first_line = true; } else { multiline = false; } } else if (tag == "indent") { close_indent(indent, buffer); int new_indent = value.toInt(); if (new_indent) buffer += "\n\t
"; indent = new_indent; } else if (tag == "data" && attribute == "Version") { KURL action ("apt:/get"); QString item_id = mangle_version(value); if (value == m_installed) { action.setQuery("remove"); version = QString("
").arg(item_id) + i18n("Installed version %1").arg(value); } else { action.setQuery("install"); version = QString("
").arg(item_id) + i18n("Version %1").arg(value); } action.addQueryItem("package", m_package); action.addQueryItem("version", value); if (m_act) { if (value == m_installed) version += version_header_link(action, i18n("Remove")); else version += version_header_link(action, i18n("Install")); } version += "
\n"; } else if (tag == "data") { if (multiline) { static const QRegExp rx_empty("^\\s*$"); if (rx_empty.exactMatch(value)) { buffer += "

"; new_paragraph = true; } else if (first_line) { new_paragraph = true; first_line = false; } else if (new_paragraph) { buffer += "

"; new_paragraph = false; } } buffer += text2html(QString(value).replace(QRegExp("(http://\\S+)"),QString("\\1"))); } else if (tag == "package_link") buffer += "buildURL("show", value).htmlURL() + "\">" + value + ""; } }