From 786ec885264fda5b1b2e1cee22a7d62f5ad90d3f Mon Sep 17 00:00:00 2001 From: Gilbert Assaf Date: Wed, 31 May 2017 13:13:48 +0200 Subject: [PATCH] Bug 236688 - Sort pages according to TOC in CHM Files All pages in a CHM File are now ordered accordingly to TOC Data. If a page is not in TOC, it will be added at the end. Testing Done: I created a small example chm file to test this. I can provide the file, if someone would like to have it. Bugs closed: 236688 Reviewed at https://git.reviewboard.kde.org/r/130078/ --- generators/chm/CMakeLists.txt | 10 ++ generators/chm/autotests/chmgeneratortest.cpp | 104 ++++++++++++++++++ generators/chm/autotests/data/test.chm | Bin 0 -> 17472 bytes generators/chm/generator_chm.cpp | 26 ++++- 4 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 generators/chm/autotests/chmgeneratortest.cpp create mode 100644 generators/chm/autotests/data/test.chm diff --git a/generators/chm/CMakeLists.txt b/generators/chm/CMakeLists.txt index 22015955d..83abe4e24 100644 --- a/generators/chm/CMakeLists.txt +++ b/generators/chm/CMakeLists.txt @@ -22,6 +22,16 @@ set(okularGenerator_chmlib_SRCS okular_add_generator(okularGenerator_chmlib ${okularGenerator_chmlib_SRCS}) target_link_libraries(okularGenerator_chmlib okularcore ${CHM_LIBRARY} KF5::KHtml) +########### autotests ############### + +add_definitions( -DKDESRCDIR="${CMAKE_CURRENT_SOURCE_DIR}/" ) +ecm_add_test(autotests/chmgeneratortest.cpp + TEST_NAME "chmgeneratortest" + LINK_LIBRARIES Qt5::Test KF5::CoreAddons okularcore +) + +target_compile_definitions(chmgeneratortest PRIVATE -DGENERATOR_PATH="$") + ########### install files ############### install( FILES okularChm.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) install( PROGRAMS okularApplication_chm.desktop org.kde.mobile.okular_chm.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) diff --git a/generators/chm/autotests/chmgeneratortest.cpp b/generators/chm/autotests/chmgeneratortest.cpp new file mode 100644 index 000000000..6b0b8efc7 --- /dev/null +++ b/generators/chm/autotests/chmgeneratortest.cpp @@ -0,0 +1,104 @@ +/*************************************************************************** + * Copyright (C) 2017 by Gilbert Assaf * + * * + * 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 + +#include "core/document.h" +#include "core/page.h" +#include "settings_core.h" +#include "core/textpage.h" + + +class ChmGeneratorTest +: public QObject +{ + Q_OBJECT + + private slots: + void initTestCase(); + void testDocumentStructure(); + void testDocumentContent(); + void cleanupTestCase(); + + private: + Okular::Document *m_document; +}; + +void ChmGeneratorTest::initTestCase() +{ + Okular::SettingsCore::instance( QStringLiteral("ChmGeneratorTest") ); + m_document = new Okular::Document( 0 ); + const QString testFile = QStringLiteral(KDESRCDIR "autotests/data/test.chm"); + QMimeDatabase db; + const QMimeType mime = db.mimeTypeForFile( testFile ); + QCOMPARE( m_document->openDocument(testFile, QUrl(), mime), Okular::Document::OpenSuccess ); +} + + +void ChmGeneratorTest::cleanupTestCase() +{ + m_document->closeDocument(); + delete m_document; +} + +void ChmGeneratorTest::testDocumentStructure() +{ + unsigned int expectedPageNr = 6; + QCOMPARE( m_document->pages(), expectedPageNr); + QCOMPARE( m_document->metaData(QLatin1String("DocumentTitle")).toString(), QStringLiteral("okular test chm") ); + + const Okular::DocumentSynopsis *docSyn = m_document->documentSynopsis(); + QDomElement heading1 = docSyn->documentElement(); + QCOMPARE( heading1.tagName(), QStringLiteral("Heading 1") ); + + QDomElement topic1 = heading1.firstChildElement(); + QCOMPARE( topic1.tagName(), QStringLiteral("Topic 1") ); + + QDomElement heading1_1 = topic1.nextSiblingElement(); + QCOMPARE( heading1_1.tagName(), QStringLiteral("Heading 1.1") ); + + QDomElement topic1_1 = heading1_1.firstChildElement(); + QCOMPARE( topic1_1.tagName(), QStringLiteral("Topic 1.1") ); + + QDomElement heading2 = heading1.nextSiblingElement(); + QCOMPARE( heading2.tagName(), QStringLiteral("Heading 2") ); +} + +void ChmGeneratorTest::testDocumentContent() +{ + const Okular::Page *page0 = m_document->page(0); + QCOMPARE( page0->number(), 0); + m_document->requestTextPage( page0->number() ); + QVERIFY( page0->hasTextPage() ); + QCOMPARE( page0->text(), QStringLiteral("Heading 1This is an example Text.") ); + + const Okular::Page *page1 = m_document->page(1); + QCOMPARE( page1->number(), 1); + m_document->requestTextPage( page1->number() ); + QVERIFY( page1->hasTextPage() ); + QCOMPARE( page1->text(), QStringLiteral("Topic 1This is an example Text.") ); + + const Okular::Page *page2 = m_document->page(2); + QCOMPARE( page2->number(), 2); + m_document->requestTextPage( page2->number() ); + QVERIFY( page2->hasTextPage() ); + QCOMPARE( page2->text(), QStringLiteral("Heading 1.1With html title.") ); + + //Test page, who doesn't have an TOC entry, but one in chm index + const Okular::Page *indexPage1 = m_document->page(5); + QCOMPARE( indexPage1->number(), 5); + m_document->requestTextPage( indexPage1->number() ); + QVERIFY( indexPage1->hasTextPage() ); + QCOMPARE( indexPage1->text(), QStringLiteral("Index 1This is an example Text.") ); +} + +QTEST_MAIN( ChmGeneratorTest ) +#include "chmgeneratortest.moc" + +/* kate: replace-tabs on; tab-width 4; */ diff --git a/generators/chm/autotests/data/test.chm b/generators/chm/autotests/data/test.chm new file mode 100644 index 0000000000000000000000000000000000000000..fb566369dba8fc6a84638a048c928cebb9588320 GIT binary patch literal 17472 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 cKRDo?UQwZa8h`)d<&Ny1@2vR$lmC lastIndentElement; + QMap tmpPageList; + int pageNum = 0; + foreach(const LCHMParsedEntry &e, topics) { QDomElement item = m_docSyn.createElement(e.name); @@ -87,6 +90,11 @@ bool CHMGenerator::loadDocument( const QString & fileName, QVector< Okular::Page if (url.contains(QChar::fromLatin1('%'))) url = QString::fromUtf8(QByteArray::fromPercentEncoding(url.toUtf8())); item.setAttribute(QStringLiteral("ViewportName"), url); + if(!tmpPageList.contains(url)) + {//add a page only once + tmpPageList.insert(url, pageNum); + pageNum++; + } } item.setAttribute(QStringLiteral("Icon"), e.imageid); if (e.indent == 0) m_docSyn.appendChild(item); @@ -95,12 +103,13 @@ bool CHMGenerator::loadDocument( const QString & fileName, QVector< Okular::Page } // fill m_urlPage and m_pageUrl - int pageNum = 0; QStringList pageList; m_file->enumerateFiles(&pageList); const QString home = m_file->homeUrl(); if (home != QLatin1String("/")) pageList.prepend(home); + m_pageUrl.resize(pageNum); + foreach (const QString &url, pageList) { const QString urlLower = url.toLower(); @@ -108,15 +117,22 @@ bool CHMGenerator::loadDocument( const QString & fileName, QVector< Okular::Page continue; int pos = url.indexOf (QLatin1Char(('#'))); + // insert the url into the maps, but insert always the variant without the #ref part QString tmpUrl = pos == -1 ? url : url.left(pos); // url already there, abort insertion if (m_urlPage.contains(tmpUrl)) continue; - // insert the url into the maps, but insert always the variant without the #ref part - m_urlPage.insert(tmpUrl, pageNum); - m_pageUrl.append(tmpUrl); - pageNum++; + int foundPage = tmpPageList.value(tmpUrl, -1); + if (foundPage != -1 ) { + m_urlPage.insert(tmpUrl, foundPage); + m_pageUrl[foundPage] = tmpUrl; + } else { + //add pages not present in toc + m_urlPage.insert(tmpUrl, pageNum); + m_pageUrl.append(tmpUrl); + pageNum++; + } } pagesVector.resize(m_pageUrl.count()); -- GitLab