File khelpcenter-gnome-support.patch of Package kdebase4-runtime
Subject: parse and display gnome apps' help files
From: wstephenson@suse.de
Patch-upstream: no
Index: khelpcenter/table-of-contents.xslt
===================================================================
--- khelpcenter/table-of-contents.xslt.orig
+++ khelpcenter/table-of-contents.xslt
@@ -8,6 +8,12 @@
</table-of-contents>
</xsl:template>
+<xsl:template match="article">
+<table-of-contents>
+<xsl:apply-templates select="sect1"/>
+</table-of-contents>
+</xsl:template>
+
<xsl:template match="chapter">
<chapter>
<title><xsl:value-of select="title"/></title>
@@ -20,7 +26,15 @@
<section>
<title><xsl:value-of select="title"/></title>
<anchor><xsl:value-of select="@id"/></anchor>
+<xsl:apply-templates select="sect2"/>
</section>
</xsl:template>
+<xsl:template match="sect2">
+<subsection>
+<title><xsl:value-of select="title"/></title>
+<anchor><xsl:value-of select="@id"/></anchor>
+</subsection>
+</xsl:template>
+
</xsl:stylesheet>
Index: khelpcenter/navigatorappitem.cpp
===================================================================
--- khelpcenter/navigatorappitem.cpp.orig
+++ khelpcenter/navigatorappitem.cpp
@@ -21,6 +21,8 @@
#include "navigatorappitem.h"
#include "docentry.h"
+#include <stdlib.h>
+
#include <KDebug>
#include <KService>
#include <KServiceGroup>
@@ -132,6 +134,37 @@ void NavigatorAppItem::populate( bool re
QString NavigatorAppItem::documentationURL( const KService *s )
{
+ static QString desktop;
+ if (desktop.isNull()) {
+ QString win_man = getenv("WINDOWMANAGER");
+ if (win_man.contains ("gnome", Qt::CaseInsensitive))
+ desktop = "GNOME";
+ else if (win_man.contains ("kde", Qt::CaseInsensitive))
+ desktop = "KDE";
+ else
+ desktop = "";
+ kDebug() << desktop << endl;
+ };
+
+ QString onlyShowIn = s->property("OnlyShowIn", QVariant::String).toString();
+
+ kDebug() << onlyShowIn << endl;
+
+ if ( !onlyShowIn.isNull() ) {
+ if (desktop.isEmpty())
+ return QString();
+ QStringList list = onlyShowIn.split (QLatin1Char(';'));
+ if ( ! list.contains (desktop) )
+ return QString();
+ }
+
+ QString notShowIn = s->property("NotShowIn", QVariant::String).toString();
+ if ( !notShowIn.isNull() ) {
+ QStringList list = notShowIn.split (QLatin1Char(';'));
+ if ( list.contains (desktop) )
+ return QString();
+ }
+
QString docPath = s->property( QLatin1String("DocPath") ).toString();
if ( docPath.isEmpty() ) {
docPath = s->property( QLatin1String("X-DocPath") ).toString();
@@ -140,7 +173,7 @@ QString NavigatorAppItem::documentationU
}
}
- if ( docPath.startsWith( QLatin1String("file:")) || docPath.startsWith( QLatin1String("http:") ) )
+ if ( docPath.startsWith( QLatin1String("file:")) || docPath.startsWith( QLatin1String("http:") ) || docPath.startsWith( "ghelp:" ))
return docPath;
return QLatin1String( "help:/" ) + docPath;
Index: khelpcenter/docentry.h
===================================================================
--- khelpcenter/docentry.h.orig
+++ khelpcenter/docentry.h
@@ -4,12 +4,14 @@
#include <QString>
#include <QList>
+#include <KDesktopFile>
namespace KHC {
class DocEntry
{
public:
+ static bool isForRunningDesktopEnvironment(const KDesktopFile & desktopFile);
typedef QList<DocEntry *> List;
DocEntry();
Index: khelpcenter/docentry.cpp
===================================================================
--- khelpcenter/docentry.cpp.orig
+++ khelpcenter/docentry.cpp
@@ -2,6 +2,7 @@
#include <QRegExp>
#include <QFileInfo>
+#include <stdlib.h>
#include <KDebug>
#include <KDesktopFile>
@@ -14,6 +15,43 @@
using namespace KHC;
+bool DocEntry::isForRunningDesktopEnvironment(const KDesktopFile & desktopFile)
+{
+ bool result = true;
+ static QString desktop;
+ if (desktop.isNull()) {
+ QString win_man = getenv("WINDOWMANAGER");
+ if (win_man.contains ("gnome", Qt::CaseInsensitive))
+ desktop = "GNOME";
+ else if (win_man.contains ("kde", Qt::CaseInsensitive))
+ desktop = "KDE";
+ else
+ desktop = "";
+ kDebug() << "Navigator::desktop = " << desktop << endl;
+ };
+
+ KConfigGroup desktopGroup = desktopFile.desktopGroup();
+ QString onlyShowIn = desktopGroup.readEntry ("OnlyShowIn");
+
+ kDebug() << desktopFile.fileName() << " onlyShowIn = " << onlyShowIn << endl;
+
+ if ( !onlyShowIn.isEmpty() ) {
+ if (desktop.isEmpty())
+ result = false;;
+ QStringList list = onlyShowIn.split (QLatin1Char(';'));
+ if ( ! list.contains (desktop) )
+ result = false;;
+ }
+
+ QString notShowIn = desktopGroup.readEntry ("NotShowIn");
+ if ( !notShowIn.isEmpty() ) {
+ QStringList list = notShowIn.split (QLatin1Char(';'));
+ if ( list.contains (desktop) )
+ result = false;;
+ }
+ return result;
+}
+
DocEntry::DocEntry()
{
init();
@@ -204,6 +242,9 @@ bool DocEntry::isDirectory() const
bool DocEntry::readFromFile( const QString &fileName )
{
KDesktopFile file( fileName );
+ if (!isForRunningDesktopEnvironment(file)) {
+ return false;
+ }
KConfigGroup desktopGroup = file.desktopGroup();
mName = file.readName();
Index: khelpcenter/navigator.cpp
===================================================================
--- khelpcenter/navigator.cpp.orig
+++ khelpcenter/navigator.cpp
@@ -65,6 +65,7 @@
#include "searchwidget.h"
#include "searchengine.h"
#include "docmetainfo.h"
+#include "docentry.h"
#include "docentrytraverser.h"
#include "glossary.h"
#include "toc.h"
@@ -268,6 +269,11 @@ void Navigator::createItemFromDesktopFil
const QString &file )
{
KDesktopFile desktopFile( file );
+
+ if (!DocEntry::isForRunningDesktopEnvironment(desktopFile)) {
+ return;
+ }
+
QString docPath = desktopFile.readDocPath();
if ( !docPath.isNull() ) {
// First parameter is ignored if second is an absolute path
@@ -310,6 +316,9 @@ void Navigator::selectItem( const KUrl &
{
alternativeURL.setQuery("anchor="+url.ref());
alternativeURL.setRef(QString());
+ } else if (url.url().endsWith("/index.html"))
+ {
+ alternativeURL = KUrl (url.url().left (url.url().length() - strlen ("/index.html")));
}
// If the navigator already has the given URL selected, do nothing.
Index: khelpcenter/navigatoritem.cpp
===================================================================
--- khelpcenter/navigatoritem.cpp.orig
+++ khelpcenter/navigatoritem.cpp
@@ -96,14 +96,42 @@ void NavigatorItem::scheduleTOCBuild()
mToc = new TOC( this );
kDebug( 1400 ) << "Trying to build TOC for " << entry()->name() << endl;
- mToc->setApplication( url.directory() );
+ if (url.directory() != "/")
+ mToc->setApplication( url.directory() );
+ else
+ mToc->setApplication( url.path() );
QString doc = View::langLookup( url.path() );
// Enforce the original .docbook version, in case langLookup returns a
// cached version
if ( !doc.isNull() ) {
- int pos = doc.indexOf( ".html" );
- if ( pos >= 0 ) {
- doc.replace( pos, 5, ".docbook" );
+ if (doc.endsWith( ".html" )) {
+ doc = doc.left (doc.length() - 5) + ".docbook";
+ }
+
+ QFileInfo di (doc);
+ if (!di.isFile()) {
+
+ int last_slash = doc.lastIndexOf ('/');
+ if (last_slash >= 1) {
+
+ QString filename = doc.right(doc.length() - last_slash - 1);
+ if (filename == "index.html" || filename == "") {
+
+ int slash2 = doc.lastIndexOf('/', last_slash -1);
+ if (slash2 != -1 && slash2 != 0) {
+
+ int slash3 = doc.lastIndexOf('/', slash2 - 1);
+ if (slash3 != -1) {
+ QString xml_file = doc.left(last_slash) + "/" + doc.mid(slash3 + 1, slash2 - (slash3 + 1)) + ".xml";
+ kDebug() << "xml_file " << xml_file << endl;
+ QFileInfo fi(xml_file);
+ if (fi.exists())
+ doc = xml_file;
+
+ }
+ }
+ }
+ }
}
kDebug( 1400 ) << "doc = " << doc;