|
|
|
/***************************************************************************
|
|
|
|
* 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 <tdelocale.h>
|
|
|
|
#include <tqregexp.h>
|
|
|
|
|
|
|
|
static const TQString
|
|
|
|
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 TQString text2html(const TQString& orig)
|
|
|
|
{ TQString ret(orig);
|
|
|
|
ret = ret.replace("<(?!a href)", "<");
|
|
|
|
//ret = ret.replace( TQRegExp("\n"), "<br />\n");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void close_indent(int indent, TQString& buffer)
|
|
|
|
{
|
|
|
|
if (buffer.isEmpty()) return;
|
|
|
|
if (indent)
|
|
|
|
buffer += "\n\t\t</div>";
|
|
|
|
}
|
|
|
|
static void close_item(int indent, TQString& buffer)
|
|
|
|
{
|
|
|
|
if (buffer.isEmpty()) return;
|
|
|
|
close_indent(indent, buffer);
|
|
|
|
buffer += html_attribute_end;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void close_table(const TQString& version, int indent, TQString& buffer)
|
|
|
|
{
|
|
|
|
if (buffer.isEmpty()) return;
|
|
|
|
close_item(indent, buffer);
|
|
|
|
buffer = version + "<table class=\"version\">\n" + buffer + "</table>\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
static TQString version_header_link(const KURL& url, const TQString& name)
|
|
|
|
{ return TQString("\t<a class=\"links\" href=\"" + url.htmlURL() + "\">" + name + "</a>\n"); }
|
|
|
|
|
|
|
|
namespace Parsers
|
|
|
|
{
|
|
|
|
|
|
|
|
Show::Show(const TQString& package, const TQString& installed_version, bool act)
|
|
|
|
: m_package(package), m_installed(installed_version), m_act(false)
|
|
|
|
{
|
|
|
|
m_act = act;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Show::operator() (AptProtocol* slave, const TQString& tag, const TQString& value)
|
|
|
|
{
|
|
|
|
// Since we want to show the version first, we should wait for it
|
|
|
|
// before sending anything
|
|
|
|
static TQString version;
|
|
|
|
static TQString buffer;
|
|
|
|
static TQString 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)
|
|
|
|
+ " ";
|
|
|
|
|
|
|
|
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<div style=\"margin-left: " + value + "em\">";
|
|
|
|
indent = new_indent;
|
|
|
|
}
|
|
|
|
else if (tag == "data" && attribute == "Version")
|
|
|
|
{
|
|
|
|
KURL action ("apt:/get");
|
|
|
|
|
|
|
|
TQString item_id = mangle_version(value);
|
|
|
|
if (value == m_installed)
|
|
|
|
{
|
|
|
|
action.setQuery("remove");
|
|
|
|
version = TQString("<div class=\"version-header-installed\" id=\"%1\">").arg(item_id)
|
|
|
|
+ i18n("Installed version %1").arg(value);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
action.setQuery("install");
|
|
|
|
version = TQString("<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 TQRegExp 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(TQString(value).replace(TQRegExp("(http://\\S+)"),TQString("<a href=\"\\1\">\\1</a>")));
|
|
|
|
}
|
|
|
|
else if (tag == "package_link")
|
|
|
|
buffer += "<a href=\"" + slave->buildURL("show", value).htmlURL() + "\">" + value + "</a>";
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|