From 9013e91f2a2af2219a639156389e4e356ec36701 Mon Sep 17 00:00:00 2001 From: Akos Polster Date: Sun, 3 Oct 2010 22:18:19 +0200 Subject: [PATCH] Improve default book. Speed up book parsing. Simplify XML parsing. --- books/2BR02B.epub | Bin 32135 -> 22317 bytes dorian.pro | 291 +++++++++++++++++++++++----------------------- librarydialog.cpp | 4 +- model/book.cpp | 26 +++-- model/book.h | 2 +- model/containerhandler.h | 17 +-- model/extractzip.cpp | 27 +++-- model/extractzip.h | 12 +- model/ncxhandler.h | 26 +---- model/opshandler.h | 31 +---- pkg/changelog | 7 ++ pkg/version.txt | 2 +- 12 files changed, 218 insertions(+), 227 deletions(-) diff --git a/books/2BR02B.epub b/books/2BR02B.epub index fb83a990df4bccd6b8964e4c44005f2d75595c78..8c769fcb081feef1ecb502d033394fd87d6d1aa8 100644 GIT binary patch delta 20233 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 IVgP{u1D^v2i~s-t delta 29993 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

_qDmV)#3< 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

3-#2Su)h7`ySr3Ewb&;_X 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 diff --git a/dorian.pro b/dorian.pro index 538cdcc..72a6be6 100644 --- a/dorian.pro +++ b/dorian.pro @@ -1,145 +1,146 @@ -QT += webkit xml - -INCLUDEPATH += $$PWD \ - $$PWD/model \ - $$PWD/widgets - -SOURCES += \ - main.cpp \ - mainwindow.cpp \ - bookview.cpp \ - model/unzip/unzip.c \ - model/unzip/ioapi.c \ - model/extractzip.cpp \ - model/library.cpp \ - model/book.cpp \ - librarydialog.cpp \ - devtools.cpp \ - infodialog.cpp \ - widgets/translucentbutton.cpp \ - settingswindow.cpp \ - model/settings.cpp \ - bookmarksdialog.cpp \ - model/sortedlibrary.cpp \ - bookmarkinfodialog.cpp \ - widgets/dyalog.cpp \ - chaptersdialog.cpp \ - widgets/fullscreenwindow.cpp \ - trace.cpp \ - widgets/toolbuttonbox.cpp \ - model/bookfinder.cpp \ - widgets/listwindow.cpp \ - widgets/progress.cpp \ - widgets/adopterwindow.cpp - -HEADERS += \ - mainwindow.h \ - bookview.h \ - model/opshandler.h \ - model/unzip/unzip.h \ - model/unzip/ioapi.h \ - model/extractzip.h \ - model/library.h \ - model/book.h \ - librarydialog.h \ - devtools.h \ - infodialog.h \ - widgets/translucentbutton.h \ - settingswindow.h \ - model/settings.h \ - bookmarksdialog.h \ - model/xmlerrorhandler.h \ - model/containerhandler.h \ - model/sortedlibrary.h \ - model/ncxhandler.h \ - bookmarkinfodialog.h \ - widgets/dyalog.h \ - chaptersdialog.h \ - widgets/fullscreenwindow.h \ - trace.h \ - widgets/toolbuttonbox.h \ - model/bookfinder.h \ - widgets/listwindow.h \ - widgets/progress.h \ - widgets/adopterwindow.h \ - widgets/listview.h - -RESOURCES += \ - dorian.qrc - -OTHER_FILES += \ - TODO.txt \ - pkg/acknowledgements.txt \ - pkg/maemo/postinst \ - pkg/maemo/dorian.desktop \ - pkg/maemo/control \ - pkg/maemo/changelog \ - pkg/maemo/build.sh \ - styles/night.css \ - pkg/changelog \ - pkg/maemo/build-scratchbox.sh \ - styles/sand.css \ - styles/default.css \ - pkg/version.txt \ - styles/sand.js \ - styles/night.js \ - styles/default.js \ - styles/day.js \ - www/index.html \ - pkg/maemo/autobuild.sh \ - pkg/maemo/autobuild-scratchbox.sh \ - LICENSE.txt \ - pkg/symbian/book.svg - -DEFINES += \ - USE_FILE32API \ - DORIAN_TEST_MODEL - -include(model/modeltest/modeltest.pri) - -unix { - symbian { - } else { - LIBS += -lz - } -} -win32 { - DEFINES += ZLIB_WINAPI - INCLUDEPATH += $$PWD/model/zlib - LIBS += pkg/win32/zlibstat.lib -} -symbian { - ICON = $$PWD/pkg/symbian/book.svgt - TARGET.UID3 = 0xEA633557 - # TARGET.CAPABILITY = ... - # FIXME: Add OpenC ZLIB? - INCLUDEPATH += C:/NokiaQtSDK/Symbian/SDK/src/3rdparty/zlib \ - c:/Qt/4.7.0/src/3rdparty/zlib -} -maemo5 { - QT += maemo5 dbus - isEmpty(PREFIX) { - PREFIX = /usr - } - BINDIR = $$PREFIX/bin - DATADIR =$$PREFIX/share - DEFINES += DATADIR=\\\"$$DATADIR\\\" PKGDATADIR=\\\"$$PKGDATADIR\\\" - - # For "make install" - - INSTALLS += target desktop icon48 iconscalable - - target.path = $$BINDIR - - desktop.path = $$DATADIR/applications/hildon - desktop.files += pkg/maemo/dorian.desktop - - icon48.path = $$DATADIR/icons/hicolor/48x48/hildon - icon48.files += pkg/maemo/icon-48/dorian.png - - iconscalable.path = $$DATADIR/icons/hicolor/scalable/hildon - iconscalable.files += pkg/maemo/icon-scalable/dorian.png -} -macx { - CONFIG += x86 -} +QT += webkit xml + +INCLUDEPATH += $$PWD \ + $$PWD/model \ + $$PWD/widgets + +SOURCES += \ + main.cpp \ + mainwindow.cpp \ + bookview.cpp \ + model/unzip/unzip.c \ + model/unzip/ioapi.c \ + model/extractzip.cpp \ + model/library.cpp \ + model/book.cpp \ + librarydialog.cpp \ + devtools.cpp \ + infodialog.cpp \ + widgets/translucentbutton.cpp \ + settingswindow.cpp \ + model/settings.cpp \ + bookmarksdialog.cpp \ + model/sortedlibrary.cpp \ + bookmarkinfodialog.cpp \ + widgets/dyalog.cpp \ + chaptersdialog.cpp \ + widgets/fullscreenwindow.cpp \ + trace.cpp \ + widgets/toolbuttonbox.cpp \ + model/bookfinder.cpp \ + widgets/listwindow.cpp \ + widgets/progress.cpp \ + widgets/adopterwindow.cpp + +HEADERS += \ + mainwindow.h \ + bookview.h \ + model/opshandler.h \ + model/unzip/unzip.h \ + model/unzip/ioapi.h \ + model/extractzip.h \ + model/library.h \ + model/book.h \ + librarydialog.h \ + devtools.h \ + infodialog.h \ + widgets/translucentbutton.h \ + settingswindow.h \ + model/settings.h \ + bookmarksdialog.h \ + model/xmlerrorhandler.h \ + model/containerhandler.h \ + model/sortedlibrary.h \ + model/ncxhandler.h \ + bookmarkinfodialog.h \ + widgets/dyalog.h \ + chaptersdialog.h \ + widgets/fullscreenwindow.h \ + trace.h \ + widgets/toolbuttonbox.h \ + model/bookfinder.h \ + widgets/listwindow.h \ + widgets/progress.h \ + widgets/adopterwindow.h \ + widgets/listview.h \ + model/xmlhandler.h + +RESOURCES += \ + dorian.qrc + +OTHER_FILES += \ + TODO.txt \ + pkg/acknowledgements.txt \ + pkg/maemo/postinst \ + pkg/maemo/dorian.desktop \ + pkg/maemo/control \ + pkg/maemo/changelog \ + pkg/maemo/build.sh \ + styles/night.css \ + pkg/changelog \ + pkg/maemo/build-scratchbox.sh \ + styles/sand.css \ + styles/default.css \ + pkg/version.txt \ + styles/sand.js \ + styles/night.js \ + styles/default.js \ + styles/day.js \ + www/index.html \ + pkg/maemo/autobuild.sh \ + pkg/maemo/autobuild-scratchbox.sh \ + LICENSE.txt \ + pkg/symbian/book.svg + +DEFINES += \ + USE_FILE32API \ + DORIAN_TEST_MODEL + +include(model/modeltest/modeltest.pri) + +unix { + symbian { + } else { + LIBS += -lz + } +} +win32 { + DEFINES += ZLIB_WINAPI + INCLUDEPATH += $$PWD/model/zlib + LIBS += pkg/win32/zlibstat.lib +} +symbian { + ICON = $$PWD/pkg/symbian/book.svgt + TARGET.UID3 = 0xEA633557 + # TARGET.CAPABILITY = ... + # FIXME: Add OpenC ZLIB? + INCLUDEPATH += C:/NokiaQtSDK/Symbian/SDK/src/3rdparty/zlib \ + c:/Qt/4.7.0/src/3rdparty/zlib +} +maemo5 { + QT += maemo5 dbus + isEmpty(PREFIX) { + PREFIX = /usr + } + BINDIR = $$PREFIX/bin + DATADIR =$$PREFIX/share + DEFINES += DATADIR=\\\"$$DATADIR\\\" PKGDATADIR=\\\"$$PKGDATADIR\\\" + + # For "make install" + + INSTALLS += target desktop icon48 iconscalable + + target.path = $$BINDIR + + desktop.path = $$DATADIR/applications/hildon + desktop.files += pkg/maemo/dorian.desktop + + icon48.path = $$DATADIR/icons/hicolor/48x48/hildon + icon48.files += pkg/maemo/icon-48/dorian.png + + iconscalable.path = $$DATADIR/icons/hicolor/scalable/hildon + iconscalable.files += pkg/maemo/icon-scalable/dorian.png +} +macx { + CONFIG += x86 +} diff --git a/librarydialog.cpp b/librarydialog.cpp index 767667a..c08c4ae 100644 --- a/librarydialog.cpp +++ b/librarydialog.cpp @@ -221,8 +221,8 @@ void LibraryDialog::onAddFromFolderDone(int added) switch (added) { case 0: msg = tr("No new books found"); break; - case 1: msg = tr("One new book added"); break; - default: msg = tr("%1 new books added").arg(added); + case 1: msg = tr("One book added"); break; + default: msg = tr("%1 books added").arg(added); } progress->reset(); diff --git a/model/book.cpp b/model/book.cpp index 92446f5..8fc6f69 100644 --- a/model/book.cpp +++ b/model/book.cpp @@ -54,7 +54,7 @@ bool Book::open() title = "No book"; return false; } - if (!extract()) { + if (!extract(QStringList())) { return false; } if (!parse()) { @@ -101,7 +101,7 @@ QString Book::tmpDir() const absoluteFilePath(tmpName); } -bool Book::extract() +bool Book::extract(const QStringList &excludedExtensions) { Trace t("Book::extract"); bool ret = false; @@ -139,7 +139,7 @@ bool Book::extract() qCritical() << "Book::extract: Could not change to" << tmp; return false; } - ret = extractZip(bookPath); + ret = extractZip(bookPath, excludedExtensions); if (!ret) { qCritical() << "Book::extract: Extracting ZIP failed"; } @@ -172,15 +172,26 @@ bool Book::parse() chapters = parts; // Load cover image + QString coverPath; QStringList coverKeys; coverKeys << "cover-image" << "img-cover-jpeg" << "cover"; foreach (QString key, coverKeys) { if (content.contains(key)) { - qDebug() << "Loading cover image from" << content[key].href; - cover = makeCover(QDir(rootPath()).absoluteFilePath(content[key].href)); + coverPath = QDir(rootPath()).absoluteFilePath(content[key].href); break; } } + if (coverPath.isEmpty()) { + // Last resort + QString coverJpeg = QDir(rootPath()).absoluteFilePath("cover.jpg"); + if (QFileInfo(coverJpeg).exists()) { + coverPath = coverJpeg; + } + } + if (!coverPath.isEmpty()) { + qDebug() << "Loading cover image from" << coverPath; + cover = makeCover(coverPath); + } // If there is an "ncx" item in content, parse it: That's the real table of // contents @@ -482,6 +493,7 @@ qreal Book::getProgress(int part, qreal position) bool Book::extractMetaData() { - // FIXME - return extract(); + QStringList excludedExtensions; + excludedExtensions << ".html" << ".xhtml" << ".xht" << ".htm"; + return extract(excludedExtensions); } diff --git a/model/book.h b/model/book.h index 5305220..0c8fa4f 100644 --- a/model/book.h +++ b/model/book.h @@ -127,7 +127,7 @@ signals: protected: /** Extract EPUB as ZIP. */ - bool extract(); + bool extract(const QStringList &excludedExtensions); /** Extract metadata from EPUB. */ bool extractMetaData(); diff --git a/model/containerhandler.h b/model/containerhandler.h index d952d53..1fda1a9 100644 --- a/model/containerhandler.h +++ b/model/containerhandler.h @@ -1,25 +1,12 @@ #ifndef CONTAINERHANDLER_H #define CONTAINERHANDLER_H -#include -#include +#include "xmlhandler.h" /** XML content handler for EPUB container format. */ -class ContainerHandler: public QXmlContentHandler +class ContainerHandler: public XmlHandler { public: - bool endDocument() {return true;} - bool endPrefixMapping(const QString &) {return true;} - QString errorString() const {return "";} - bool ignorableWhitespace(const QString &) {return true;} - bool processingInstruction(const QString &, const QString &) { - return true; - } - void setDocumentLocator(QXmlLocator *) {} - bool skippedEntity(const QString &) {return true;} - bool startDocument() {return true;} - bool startPrefixMapping(const QString &, const QString &) {return true;} - bool characters(const QString &) {return true;} bool endElement(const QString &, const QString &, const QString &) { return true; } diff --git a/model/extractzip.cpp b/model/extractzip.cpp index 904f9bf..6f5db8e 100644 --- a/model/extractzip.cpp +++ b/model/extractzip.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include "extractzip.h" #include "unzip/unzip.h" @@ -8,7 +10,7 @@ #define WRITEBUFFERSIZE (8192) #define MAXFILENAME (256) -int doExtractCurrentFile(unzFile uf) +int doExtractCurrentFile(unzFile uf, const QStringList &excludedExtensions) { char fileNameInZip[MAXFILENAME]; char *fileNameWithoutPath; @@ -39,7 +41,7 @@ int doExtractCurrentFile(unzFile uf) p = fileNameWithoutPath = fileNameInZip; while ((*p) != '\0') { if (((*p) == '/') || ((*p) == '\\')) { - fileNameWithoutPath = p+1; + fileNameWithoutPath = p + 1; } p++; } @@ -48,6 +50,15 @@ int doExtractCurrentFile(unzFile uf) dir.mkdir(fileNameInZip); } else { + QString name(fileNameInZip); + for (int i = 0; i < excludedExtensions.length(); i++) { + if (name.endsWith(excludedExtensions[i], Qt::CaseInsensitive)) { + qDebug() << "Skipping" << name; + free(buf); + return UNZ_OK; + } + } + const char *writeFileName; int skip = 0; @@ -104,7 +115,7 @@ int doExtractCurrentFile(unzFile uf) f->close(); } - if (err== UNZ_OK) { + if (err == UNZ_OK) { err = unzCloseCurrentFile(uf); if (err != UNZ_OK) { qDebug() << "doExtractCurrentFile: Error" << err @@ -121,20 +132,20 @@ int doExtractCurrentFile(unzFile uf) return err; } -bool doExtract(unzFile uf) +bool doExtract(unzFile uf, const QStringList &excludedExtensions) { uLong i; unz_global_info64 gi; int err; - err = unzGetGlobalInfo64(uf,&gi); + err = unzGetGlobalInfo64(uf, &gi); if (err != UNZ_OK) { qDebug() << "doExtract: Error" << err << "in unzGetGlobalInfo"; return false; } for (i = 0; i < gi.number_entry; i++) { - if (doExtractCurrentFile(uf) != UNZ_OK) { + if (doExtractCurrentFile(uf, excludedExtensions) != UNZ_OK) { return false; } if ((i + 1) < gi.number_entry) { @@ -149,14 +160,14 @@ bool doExtract(unzFile uf) return true; } -bool extractZip(const QString &zipFile) +bool extractZip(const QString &zipFile, const QStringList &excludedExtensions) { unzFile uf; bool ret = false; uf = unzOpen64(zipFile.toUtf8().constData()); if (uf) { - ret = doExtract(uf); + ret = doExtract(uf, excludedExtensions); unzClose(uf); } return ret; diff --git a/model/extractzip.h b/model/extractzip.h index f5a3de3..872844d 100644 --- a/model/extractzip.h +++ b/model/extractzip.h @@ -2,7 +2,17 @@ #define EXTRACTZIP_H class QString; +class QStringList; -bool extractZip(const QString &path); +/** + * Extract files from a ZIP archive. + * + * @param path ZIP file path. + * @param excludedExtensions Files in the ZIP with matching extensions will + * not be extracted. Items in this list are case + * insensitive, and start with ".". + * @return True (succes) or false (failure). + */ +bool extractZip(const QString &path, const QStringList &excludedExtensions); #endif // EXTRACTZIP_H diff --git a/model/ncxhandler.h b/model/ncxhandler.h index f04ade1..2da3633 100644 --- a/model/ncxhandler.h +++ b/model/ncxhandler.h @@ -1,44 +1,27 @@ #ifndef NCXHANDLER_H #define NCXHANDLER_H -#include - +#include "xmlhandler.h" #include "book.h" #include "trace.h" /** XML content handler for NCX format. */ -class NcxHandler: public QXmlContentHandler +class NcxHandler: public XmlHandler { public: - bool endDocument() {return true;} - bool endPrefixMapping(const QString &) {return true;} - QString errorString() const {return "";} - bool ignorableWhitespace(const QString &) {return true;} - bool processingInstruction(const QString &, const QString &) {return true;} - void setDocumentLocator(QXmlLocator *) {} - bool skippedEntity(const QString &) {return true;} - bool startDocument() {return true;} - bool startPrefixMapping(const QString &, const QString &) {return true;} - NcxHandler(Book &b): book(b) { book.chapters.clear(); } - bool characters(const QString &ch) { - currentText += ch; - return true; - } - bool endElement(const QString &namespaceUri, const QString &name, const QString &qName) { - Trace t("NcxHandler::endElement " + name); (void)namespaceUri; (void)qName; if (name == "text") { contentTitle = currentText; } else if (name == "navPoint") { - qDebug() << "url" << contentUrl << "\ntitle" << contentTitle - << "\nid" << contentId; + qDebug() << "BcxHander::endElement: url" << contentUrl << "title" + << contentTitle << "id" << contentId; Book::ContentItem item; item.href = contentUrl; item.name = contentTitle; @@ -63,7 +46,6 @@ public: private: Book &book; - QString currentText; QString contentId; QString contentUrl; QString contentTitle; diff --git a/model/opshandler.h b/model/opshandler.h index 98d4ae1..8440afb 100644 --- a/model/opshandler.h +++ b/model/opshandler.h @@ -1,32 +1,15 @@ #ifndef OPSHANDLER_H #define OPSHANDLER_H -#include - +#include "xmlhandler.h" #include "book.h" #include "trace.h" /** XML content handler for OPS format. */ -class OpsHandler: public QXmlContentHandler +class OpsHandler: public XmlHandler { public: OpsHandler(Book &b): book(b), partCount(0) {} - bool endDocument() {return true;} - bool endPrefixMapping(const QString &) {return true;} - QString errorString() const {return QString();} - bool ignorableWhitespace(const QString &) {return true;} - bool processingInstruction(const QString &, const QString &) { - return true; - } - void setDocumentLocator(QXmlLocator *) {} - bool skippedEntity(const QString &) {return true;} - bool startDocument() {return true;} - bool startPrefixMapping(const QString &, const QString &) {return true;} - - bool characters(const QString &ch) { - currentText += ch; - return true; - } bool endElement(const QString &namespaceUri, const QString &name, const QString &qName) { @@ -52,7 +35,6 @@ public: bool startElement(const QString &namespaceUri, const QString &name, const QString &qName, const QXmlAttributes &attrs) { - Trace t("OpsHandler::startElement " + name); (void)namespaceUri; (void)qName; currentText = ""; @@ -65,11 +47,11 @@ public: QString key = attrs.value("id"); book.content[key] = item; partCount++; - qDebug() << "name:"<< item.name << "\nhref:" - << attrs.value("href") << "id:" << key; + qDebug() << "OpsHandler::startElement: name" << item.name << "href" + << attrs.value("href") << "id" << key; } else if (name == "itemref") { - qDebug() << "parts[" << book.parts.size() << "]:" - << attrs.value("idref"); + qDebug() << "OpsHandler::startElement: parts[" << book.parts.size() + << "]" << attrs.value("idref"); book.parts.append(attrs.value("idref")); } return true; @@ -77,7 +59,6 @@ public: private: Book &book; - QString currentText; int partCount; }; diff --git a/pkg/changelog b/pkg/changelog index 8b088a6..7eee2bc 100644 --- a/pkg/changelog +++ b/pkg/changelog @@ -1,3 +1,10 @@ +dorian (0.2.2-1) unstable; urgency=low + + * Speed up book parsing + * Improve default book + + -- Akos Polster Thu, 3 Oct 2010 02:00:00 +0200 + dorian (0.2.1-1) unstable; urgency=low * Fix TOC in "The Awakening" (and possibly other Google books) [#6318] diff --git a/pkg/version.txt b/pkg/version.txt index fd32d72..92195dc 100644 --- a/pkg/version.txt +++ b/pkg/version.txt @@ -1 +1 @@ -"0.2.1" +"0.2.2" -- 1.7.9.5