You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeio-apt/src/parsers/show.cpp

195 lines
5.3 KiB

/***************************************************************************
* 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>";
}
}