summaryrefslogtreecommitdiffstats
path: root/src/parsers/show.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parsers/show.cpp')
-rw-r--r--src/parsers/show.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/parsers/show.cpp b/src/parsers/show.cpp
new file mode 100644
index 0000000..0a1c503
--- /dev/null
+++ b/src/parsers/show.cpp
@@ -0,0 +1,194 @@
+/***************************************************************************
+ * 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 <klocale.h>
+#include <qregexp.h>
+
+static const QString
+ html_attribute_begin("<tr><td class=\"attname\">%1</td>\n\t<td>\n\t\t"),
+ html_attribute_classed("<tr class=\"%1\"><td class=\"attname\">%2</td>\n\t<td>\n\t\t"),
+ html_attribute_end("\n\t</td>\n</tr>\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)", "&lt;");
+ //ret = ret.replace( QRegExp("\n"), "<br />\n");
+ return ret;
+}
+
+static void close_indent(int indent, QString& buffer)
+{
+ if (buffer.isEmpty()) return;
+ if (indent)
+ buffer += "\n\t\t</div>";
+}
+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 + "<table class=\"version\">\n" + buffer + "</table>\n";
+}
+
+static QString version_header_link(const KURL& url, const QString& name)
+{ return QString("\t<a class=\"links\" href=\"" + url.htmlURL() + "\">" + name + "</a>\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 += "</p>";
+
+ 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 += "</p>";
+
+ attribute = value;
+ if (value == "Depends" || value == "Description")
+ {
+ close_item(indent, buffer);
+ buffer +=
+ html_attribute_begin.arg(value)
+ + "&nbsp;";
+
+ close_item(indent, buffer);
+ buffer += html_attribute_begin.arg("&nbsp;");
+ }
+ 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<div style=\"margin-left: " + value + "em\">";
+ 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("<div class=\"version-header-installed\" id=\"%1\">").arg(item_id)
+ + i18n("Installed version %1").arg(value);
+ }
+ else
+ {
+ action.setQuery("install");
+ version = QString("<div class=\"version-header\" id=\"%1\">").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 += "</div>\n";
+
+ }
+ else if (tag == "data")
+ {
+ if (multiline)
+ {
+ static const QRegExp rx_empty("^\\s*$");
+ if (rx_empty.exactMatch(value))
+ {
+ buffer += "</p>";
+ new_paragraph = true;
+ }
+ else if (first_line)
+ {
+ new_paragraph = true;
+ first_line = false;
+ }
+ else if (new_paragraph)
+ {
+ buffer += "<p>";
+ new_paragraph = false;
+ }
+ }
+ buffer += text2html(QString(value).replace(QRegExp("(http://\\S+)"),QString("<a href=\"\\1\">\\1</a>")));
+ }
+ else if (tag == "package_link")
+ buffer += "<a href=\"" + slave->buildURL("show", value).htmlURL() + "\">" + value + "</a>";
+}
+
+}