diff options
Diffstat (limited to 'parts/documentation/plugins/tdevtoc/doctdevtocplugin.cpp')
| -rw-r--r-- | parts/documentation/plugins/tdevtoc/doctdevtocplugin.cpp | 277 | 
1 files changed, 277 insertions, 0 deletions
| diff --git a/parts/documentation/plugins/tdevtoc/doctdevtocplugin.cpp b/parts/documentation/plugins/tdevtoc/doctdevtocplugin.cpp new file mode 100644 index 00000000..aa603fbd --- /dev/null +++ b/parts/documentation/plugins/tdevtoc/doctdevtocplugin.cpp @@ -0,0 +1,277 @@ +/*************************************************************************** + *   Copyright (C) 2004 by Alexander Dymo                                  * + *   cloudtemple@mksat.net                                                 * + *                                                                         * + *   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.                                   * + *                                                                         * + *   This program is distributed in the hope that it will be useful,       * + *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * + *   GNU General Public License for more details.                          * + *                                                                         * + *   You should have received a copy of the GNU General Public License     * + *   along with this program; if not, write to the                         * + *   Free Software Foundation, Inc.,                                       * + *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.             * + ***************************************************************************/ +#include "doctdevtocplugin.h" + +#include <unistd.h> + +#include <tqdom.h> +#include <tqfile.h> +#include <tqfileinfo.h> +#include <tqdialog.h> + +#include <kurl.h> +#include <tdeaboutdata.h> +#include <tdeconfig.h> +#include <tdelocale.h> +#include <tdelistview.h> +#include <kstandarddirs.h> + +#include <urlutil.h> +#include <tdevgenericfactory.h> +#include <tdevplugininfo.h> + +#include "../../../../config.h" + +class TOCDocumentationCatalogItem: public DocumentationCatalogItem +{ +public: +    TOCDocumentationCatalogItem(const TQString &tocFile, DocumentationPlugin* plugin, +        TDEListView *parent, const TQString &name) +        :DocumentationCatalogItem(plugin, parent, name), m_tocFile(tocFile) +    { +    } +    TOCDocumentationCatalogItem(const TQString &tocFile, DocumentationPlugin* plugin, +        DocumentationItem *parent, const TQString &name) +        :DocumentationCatalogItem(plugin, parent, name), m_tocFile(tocFile) +    { +    } +    TQString tocFile() const { return m_tocFile; } +     +private: +    TQString m_tocFile; +}; + + +static const TDevPluginInfo data("doctdevtocplugin"); +typedef TDevGenericFactory<DocTDevTOCPlugin> DocTDevTOCPluginFactory; +K_EXPORT_COMPONENT_FACTORY( libdoctdevtocplugin, DocTDevTOCPluginFactory(data) ) + +DocTDevTOCPlugin::DocTDevTOCPlugin(TQObject* parent, const char* name, +    const TQStringList /*args*/) +    :DocumentationPlugin(DocTDevTOCPluginFactory::instance()->config(), parent, name) +{ +    setCapabilities(Index); +    autoSetup(); +} + +DocTDevTOCPlugin::~DocTDevTOCPlugin() +{ +} + +TQString DocTDevTOCPlugin::pluginName() const +{ +    return i18n("TDevelopTOC Documentation Collection"); +} + +DocumentationCatalogItem* DocTDevTOCPlugin::createCatalog(TDEListView* contents, const TQString& title, const TQString& url) +{ +    return new TOCDocumentationCatalogItem(url, this, contents, title); +} + +TQPair<KFile::Mode, TQString> DocTDevTOCPlugin::catalogLocatorProps() +{ +    return TQPair<KFile::Mode, TQString>(KFile::File, "*.toc"); +} + +TQString DocTDevTOCPlugin::catalogTitle(const TQString& url) +{ +    TQFileInfo fi(url); +    if (!fi.exists()) +        return TQString(); + +    TQFile f(url); +    if (!f.open(IO_ReadOnly)) +        return TQString(); +     +    TQDomDocument doc; +    if (!doc.setContent(&f) || (doc.doctype().name() != "tdeveloptoc")) +        return TQString(); +    f.close(); + +    TQDomElement titleEl = doc.documentElement().namedItem("title").toElement(); + +    return titleEl.firstChild().toText().data(); +} + + +TQStringList DocTDevTOCPlugin::fullTextSearchLocations() +{ +    return TQStringList(); +} + +bool DocTDevTOCPlugin::needRefreshIndex(DocumentationCatalogItem* /*item*/) +{ +    return false; +} + +void DocTDevTOCPlugin::autoSetupPlugin() +{ +    TQStringList tocsDir = DocTDevTOCPluginFactory::instance()->dirs()->findAllResources("data", "tdevdocumentation/tocs/*.toc"); +     +    for (TQStringList::const_iterator it = tocsDir.begin(); it != tocsDir.end(); ++it) +    { +        config->setGroup("Locations"); +        config->writePathEntry(catalogTitle(*it), *it); +    } +} + +void DocTDevTOCPlugin::createIndex(IndexBox* index, DocumentationCatalogItem* item) +{ +    TOCDocumentationCatalogItem *tocItem = dynamic_cast<TOCDocumentationCatalogItem *>(item); +    if (!tocItem) +        return; +     +    TQFileInfo fi(tocItem->tocFile()); + +    TQFile f(tocItem->tocFile()); +    if (!f.open(IO_ReadOnly)) +    { +        kdDebug(9002) << "Could not read" << tocItem->tocFile() << endl; +        return; +    } +    TQDomDocument doc; +    if (!doc.setContent(&f) || doc.doctype().name() != "tdeveloptoc") +    { +        kdDebug(9002) << "Not a valid tdeveloptoc file: " << tocItem->tocFile() << endl; +        return; +    } +    f.close(); + +    TQDomElement docEl = doc.documentElement(); +    TQDomElement baseEl = docEl.namedItem("base").toElement(); +     +    TQString base; +    if (!baseEl.isNull()) +        base = baseEl.attribute("href", TQString()); +     +    TQDomElement indexEl = docEl.namedItem("index").toElement(); +    TQDomElement childEl = indexEl.firstChild().toElement(); +    while (!childEl.isNull()) +    { +        if (childEl.tagName() == "entry") +        { +            TQString name = childEl.attribute("name"); +            TQString url = childEl.attribute("url"); +             +            IndexItemProto *ii = new IndexItemProto(this, item, index, name, item->text(0)); +            ii->addURL(KURL(constructURL(base, url))); +        } +        childEl = childEl.nextSibling().toElement(); +    } +} + +void DocTDevTOCPlugin::createTOC(DocumentationCatalogItem* item) +{ +    TOCDocumentationCatalogItem *tocItem = dynamic_cast<TOCDocumentationCatalogItem *>(item); +    if (!tocItem) +        return; +     +    TQFileInfo fi(tocItem->tocFile()); + +    TQFile f(tocItem->tocFile()); +    if (!f.open(IO_ReadOnly)) +    { +        kdDebug(9002) << "Could not read" << tocItem->tocFile() << endl; +        return; +    } +    TQDomDocument doc; +    if (!doc.setContent(&f) || doc.doctype().name() != "tdeveloptoc") +    { +        kdDebug(9002) << "Not a valid tdeveloptoc file: " << tocItem->tocFile() << endl; +        return; +    } +    f.close(); + +    TQDomElement docEl = doc.documentElement(); +    TQDomElement baseEl = docEl.namedItem("base").toElement(); +     +    TQString base; +    if (!baseEl.isNull()) +        base = baseEl.attribute("href", TQString()); +     +    TQDomElement childEl = docEl.lastChild().toElement(); +    addTocSect(tocItem, childEl, base, 1); +} + +void DocTDevTOCPlugin::addTocSect(DocumentationItem *parent, TQDomElement childEl, const TQString &base, uint level) +{ +    while (!childEl.isNull()) +    { +        if (childEl.tagName() == TQString("tocsect%1").arg(level)) +        { +            TQString name = childEl.attribute("name"); +            TQString url = childEl.attribute("url"); +             +            DocumentationItem *item = new DocumentationItem(level == 1 ? DocumentationItem::Book : DocumentationItem::Document, parent, name); +            item->setURL(KURL(constructURL(base, url))); + +            TQDomElement grandchildEl = childEl.lastChild().toElement(); +            addTocSect(item, grandchildEl, base, level+1); +        } +        childEl = childEl.previousSibling().toElement(); +    } +} + +void DocTDevTOCPlugin::setCatalogURL(DocumentationCatalogItem* item) +{ +    TOCDocumentationCatalogItem *tocItem = dynamic_cast<TOCDocumentationCatalogItem *>(item); +    if (!tocItem) +        return; +     +    TQFileInfo fi(tocItem->tocFile()); + +    TQFile f(tocItem->tocFile()); +    if (!f.open(IO_ReadOnly)) +    { +        kdDebug(9002) << "Could not read" << tocItem->tocFile() << endl; +        return; +    } +    TQDomDocument doc; +    if (!doc.setContent(&f) || doc.doctype().name() != "tdeveloptoc") +    { +        kdDebug(9002) << "Not a valid tdeveloptoc file: " << tocItem->tocFile() << endl; +        return; +    } +    f.close(); + +    TQDomElement docEl = doc.documentElement(); +    TQDomElement baseEl = docEl.namedItem("base").toElement(); +     +    if (item->url().isEmpty()) +    { +        if (baseEl.isNull()) +            item->setURL(KURL()); +        else +            item->setURL(KURL(constructURL(baseEl.attribute("href", TQString()), +                baseEl.attribute("url", TQString())))); +    } +} + +TQString DocTDevTOCPlugin::constructURL(const TQString &base, const TQString &url) +{ +    if (base.isEmpty() && !url.isEmpty()) +        return url; +    if (!url.isEmpty()) +        return base.endsWith("/") ? base + url : base + "/" + url; +    else +        return base; +} + +#include "doctdevtocplugin.moc" | 
