[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kbibtex] /: Various minor fixes and updates for ISBNdb search
From:       Thomas Fischer <fischer () unix-ag ! uni-kl ! de>
Date:       2014-01-31 21:40:47
Message-ID: E1W9LpP-0000er-4H () scm ! kde ! org
[Download RAW message or body]

Git commit ad35283b292b728f7d24a3d026e9fea78d20b441 by Thomas Fischer.
Committed on 31/01/2014 at 21:40.
Pushed by thomasfischer into branch 'master'.

Various minor fixes and updates for ISBNdb search

M  +27   -25   src/networking/onlinesearch/onlinesearchisbndb.cpp
M  +33   -2    xslt/isbndb2bibtex.xsl

http://commits.kde.org/kbibtex/ad35283b292b728f7d24a3d026e9fea78d20b441

diff --git a/src/networking/onlinesearch/onlinesearchisbndb.cpp \
b/src/networking/onlinesearch/onlinesearchisbndb.cpp index dc304c9..383ab22 100644
--- a/src/networking/onlinesearch/onlinesearchisbndb.cpp
+++ b/src/networking/onlinesearch/onlinesearchisbndb.cpp
@@ -34,13 +34,13 @@ private:
     static const QString accessKey;
     static const QString booksUrl, authorsUrl;
 
-    QString cachedPersonId;
-
 public:
     XSLTransform *xslt;
+    KUrl queryUrl;
+    int currentPage, maxPage;
 
     OnlineSearchIsbnDBPrivate(OnlineSearchIsbnDB *parent)
-            : p(parent), xslt() {
+            : p(parent), xslt(), currentPage(0), maxPage(0) {
         xslt = XSLTransform::createXSLTransform(KStandardDirs::locate("data", \
"kbibtex/isbndb2bibtex.xsl"));  }
 
@@ -49,25 +49,22 @@ public:
     }
 
     KUrl buildBooksUrl(const QMap<QString, QString> &query, int numResults) {
-        Q_UNUSED(numResults)
+        currentPage = 1;
+        maxPage = (numResults + 9) / 10;
 
-        KUrl queryUrl(booksUrl);
+        queryUrl = KUrl(booksUrl);
         queryUrl.addQueryItem(QLatin1String("access_key"), accessKey);
-        queryUrl.addQueryItem(QLatin1String("results"), \
QLatin1String("details,texts")); +        \
queryUrl.addQueryItem(QLatin1String("results"), QLatin1String("texts,authors"));  
         QString index1, value1;
         if (query[queryKeyFreeText].isEmpty() && query[queryKeyAuthor].isEmpty() && \
!query[queryKeyTitle].isEmpty()) {  /// only searching for title
             index1 = QLatin1String("title");
             value1 = query[queryKeyTitle];
-        } else if (!cachedPersonId.isEmpty() && query[queryKeyFreeText].isEmpty() && \
                !query[queryKeyAuthor].isEmpty() && query[queryKeyTitle].isEmpty()) {
-            /// only searching for author
-            index1 = QLatin1String("person_id");
-            value1 = cachedPersonId;
         } else {
             /// multiple different values given
             index1 = QLatin1String("full");
-            value1 = query[queryKeyFreeText] + QChar(' ') + query[queryKeyAuthor] + \
QChar(' ') + query[queryKeyTitle]; +            value1 = query[queryKeyFreeText] + \
QLatin1Char(' ') + query[queryKeyAuthor] + QLatin1Char(' ') + query[queryKeyTitle];  \
}  queryUrl.addQueryItem(QLatin1String("index1"), index1);
         queryUrl.addQueryItem(QLatin1String("value1"), value1);
@@ -95,12 +92,12 @@ void OnlineSearchIsbnDB::startSearch(const QMap<QString, QString> \
&query, int nu  {
     m_hasBeenCanceled = false;
 
+    emit progress(0, d->maxPage);
+
     QNetworkRequest request(d->buildBooksUrl(query, numResults));
     QNetworkReply *reply = InternalNetworkAccessManager::self()->get(request);
     InternalNetworkAccessManager::self()->setNetworkReplyTimeout(reply);
     connect(reply, SIGNAL(finished()), this, SLOT(downloadDone()));
-
-    emit progress(0, 2);
 }
 
 void OnlineSearchIsbnDB::startSearch()
@@ -137,7 +134,7 @@ void OnlineSearchIsbnDB::cancel()
 
 void OnlineSearchIsbnDB::downloadDone()
 {
-    emit progress(1, 2);
+    emit progress(d->currentPage, d->maxPage);
 
     QNetworkReply *reply = static_cast<QNetworkReply *>(sender());
 
@@ -145,12 +142,8 @@ void OnlineSearchIsbnDB::downloadDone()
         /// ensure proper treatment of UTF-8 characters
         const QString xmlCode = QString::fromUtf8(reply->readAll().data());
 
-        dumpToFile("xml.xml", xmlCode);
-
         /// use XSL transformation to get BibTeX document from XML result
-        QString bibtexCode = \
d->xslt->transform(xmlCode).replace(QLatin1String("<?xml version=\"1.0\" \
                encoding=\"UTF-8\"?>"), QString());
-
-        dumpToFile("bib.bib", bibtexCode);
+        const QString bibtexCode = \
d->xslt->transform(xmlCode).remove(QLatin1String("<?xml version=\"1.0\" \
encoding=\"UTF-8\"?>")).replace(QLatin1String("&amp;"), QLatin1String("&"));  
         FileImporterBibTeX importer;
         File *bibtexFile = importer.fromString(bibtexCode);
@@ -161,18 +154,27 @@ void OnlineSearchIsbnDB::downloadDone()
                 QSharedPointer<Entry> entry = (*it).dynamicCast<Entry>();
                 hasEntries |= publishEntry(entry);
             }
+            delete bibtexFile;
 
-            if (!hasEntries)
+            if (!hasEntries) {
                 kDebug() << "No hits found in" << reply->url().toString();
-            emit stoppedSearch(resultNoError);
-
-            delete bibtexFile;
+                emit stoppedSearch(resultNoError);
+            } else if (d->currentPage >= d->maxPage)
+                emit stoppedSearch(resultNoError);
+            else {
+                ++d->currentPage;
+                KUrl nextUrl = d->queryUrl;
+                nextUrl.addQueryItem(QLatin1String("page_number"), \
QString::number(d->currentPage)); +                QNetworkRequest request(nextUrl);
+                QNetworkReply *nextReply = \
InternalNetworkAccessManager::self()->get(request); +                \
InternalNetworkAccessManager::self()->setNetworkReplyTimeout(nextReply); +            \
connect(nextReply, SIGNAL(finished()), this, SLOT(downloadDone())); +                \
return; +            }
         } else {
             kWarning() << "No valid BibTeX file results returned on request on" << \
reply->url().toString();  emit stoppedSearch(resultUnspecifiedError);
         }
     } else
         kDebug() << "url was" << reply->url().toString();
-
-    emit progress(2, 2);
 }
diff --git a/xslt/isbndb2bibtex.xsl b/xslt/isbndb2bibtex.xsl
index 90e474e..fb0b451 100644
--- a/xslt/isbndb2bibtex.xsl
+++ b/xslt/isbndb2bibtex.xsl
@@ -59,13 +59,44 @@
 <xsl:text>}</xsl:text>
 </xsl:if>
 
-<!-- authors (no detailed parsing here) -->
-<xsl:if test="AuthorsText and string-length(AuthorsText)>2">
+<!-- authors -->
+<xsl:choose>
+<xsl:when test="AuthorsText and string-length(AuthorsText)>2">
 <xsl:text>,
     author = {{</xsl:text>
 <xsl:value-of select="AuthorsText" />
 <xsl:text>}}</xsl:text>
+</xsl:when>
+<xsl:otherwise>
+<xsl:if test="Authors/Person and string-length(Authors/Person)>2">
+<xsl:text>,
+    author = {</xsl:text>
+<xsl:for-each select="Authors/Person">
+<xsl:apply-templates select="."/>
+<xsl:if test="position()!=last()"><xsl:text> and </xsl:text></xsl:if>
+</xsl:for-each>
+<xsl:text>}</xsl:text>
+</xsl:if>
+</xsl:otherwise>
+</xsl:choose>
+
+<!-- ISBN -->
+<xsl:choose>
+<xsl:when test="@isbn13 and string-length(@isbn13)>2">
+<xsl:text>,
+    isbn = {</xsl:text>
+<xsl:value-of select="@isbn13" />
+<xsl:text>}</xsl:text>
+</xsl:when>
+<xsl:otherwise>
+<xsl:if test="@isbn and string-length(@isbn)>2">
+<xsl:text>,
+    isbn = {</xsl:text>
+<xsl:value-of select="@isbn" />
+<xsl:text>}</xsl:text>
 </xsl:if>
+</xsl:otherwise>
+</xsl:choose>
 
 <!-- closing entry -->
 <xsl:text>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic