summaryrefslogtreecommitdiffstats
path: root/src/translators/bibtexmlimporter.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 19:17:32 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-03-01 19:17:32 +0000
commite38d2351b83fa65c66ccde443777647ef5cb6cff (patch)
tree1897fc20e9f73a81c520a5b9f76f8ed042124883 /src/translators/bibtexmlimporter.cpp
downloadtellico-e38d2351b83fa65c66ccde443777647ef5cb6cff.tar.gz
tellico-e38d2351b83fa65c66ccde443777647ef5cb6cff.zip
Added KDE3 version of Tellico
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/tellico@1097620 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'src/translators/bibtexmlimporter.cpp')
-rw-r--r--src/translators/bibtexmlimporter.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/src/translators/bibtexmlimporter.cpp b/src/translators/bibtexmlimporter.cpp
new file mode 100644
index 0000000..2feb2f2
--- /dev/null
+++ b/src/translators/bibtexmlimporter.cpp
@@ -0,0 +1,163 @@
+/***************************************************************************
+ copyright : (C) 2003-2006 by Robby Stephenson
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of version 2 of the GNU General Public License as *
+ * published by the Free Software Foundation; *
+ * *
+ ***************************************************************************/
+
+#include "bibtexmlimporter.h"
+#include "tellico_xml.h"
+#include "bibtexhandler.h"
+#include "../collections/bibtexcollection.h"
+#include "../field.h"
+#include "../entry.h"
+#include "../latin1literal.h"
+#include "../tellico_strings.h"
+#include "../progressmanager.h"
+#include "../tellico_debug.h"
+
+#include <kapplication.h>
+
+using Tellico::Import::BibtexmlImporter;
+
+bool BibtexmlImporter::canImport(int type) const {
+ return type == Data::Collection::Bibtex;
+}
+
+Tellico::Data::CollPtr BibtexmlImporter::collection() {
+ if(!m_coll) {
+ loadDomDocument();
+ }
+ return m_coll;
+}
+
+void BibtexmlImporter::loadDomDocument() {
+ QDomElement root = domDocument().documentElement();
+ if(root.isNull() || root.localName() != Latin1Literal("file")) {
+ setStatusMessage(i18n(errorLoad).arg(url().fileName()));
+ return;
+ }
+
+ const QString& ns = XML::nsBibtexml;
+ m_coll = new Data::BibtexCollection(true);
+
+ QDomNodeList entryelems = root.elementsByTagNameNS(ns, QString::fromLatin1("entry"));
+// kdDebug() << "BibtexmlImporter::loadDomDocument - found " << entryelems.count() << " entries" << endl;
+
+ const uint count = entryelems.count();
+ const uint stepSize = QMAX(s_stepSize, count/100);
+ const bool showProgress = options() & ImportProgress;
+
+ ProgressItem& item = ProgressManager::self()->newProgressItem(this, progressLabel(), true);
+ item.setTotalSteps(count);
+ connect(&item, SIGNAL(signalCancelled(ProgressItem*)), SLOT(slotCancel()));
+ ProgressItem::Done done(this);
+
+ for(uint j = 0; !m_cancelled && j < entryelems.count(); ++j) {
+ readEntry(entryelems.item(j));
+
+ if(showProgress && j%stepSize == 0) {
+ ProgressManager::self()->setProgress(this, j);
+ kapp->processEvents();
+ }
+ } // end entry loop
+}
+
+void BibtexmlImporter::readEntry(const QDomNode& entryNode_) {
+ QDomNode node = const_cast<QDomNode&>(entryNode_);
+
+ Data::EntryPtr entry = new Data::Entry(m_coll);
+
+/* The Bibtexml format looks like
+ <entry id="...">
+ <book>
+ <authorlist>
+ <author>...</author>
+ </authorlist>
+ <publisher>...</publisher> */
+
+ QString type = node.firstChild().toElement().tagName();
+ entry->setField(QString::fromLatin1("entry-type"), type);
+ QString id = node.toElement().attribute(QString::fromLatin1("id"));
+ entry->setField(QString::fromLatin1("bibtex-key"), id);
+
+ QString name, value;
+ // field values are first child of first child of entry node
+ for(QDomNode n = node.firstChild().firstChild(); !n.isNull(); n = n.nextSibling()) {
+ // n could be something like authorlist, with multiple authors, or just
+ // a plain element with a single text child...
+ // second case first
+ if(n.firstChild().isText()) {
+ name = n.toElement().tagName();
+ value = n.toElement().text();
+ } else {
+ // is either titlelist, authorlist, editorlist, or keywords
+ QString parName = n.toElement().tagName();
+ if(parName == Latin1Literal("titlelist")) {
+ for(QDomNode n2 = node.firstChild(); !n2.isNull(); n2 = n2.nextSibling()) {
+ name = n2.toElement().tagName();
+ value = n2.toElement().text();
+ if(!name.isEmpty() && !value.isEmpty()) {
+ BibtexHandler::setFieldValue(entry, name, value.simplifyWhiteSpace());
+ }
+ }
+ name.truncate(0);
+ value.truncate(0);
+ } else {
+ name = n.firstChild().toElement().tagName();
+ if(name == Latin1Literal("keyword")) {
+ name = QString::fromLatin1("keywords");
+ }
+ value.truncate(0);
+ for(QDomNode n2 = n.firstChild(); !n2.isNull(); n2 = n2.nextSibling()) {
+ // n2 could have first, middle, lastname elements...
+ if(name == Latin1Literal("person")) {
+ QStringList names;
+ names << QString::fromLatin1("initials") << QString::fromLatin1("first")
+ << QString::fromLatin1("middle") << QString::fromLatin1("prelast")
+ << QString::fromLatin1("last") << QString::fromLatin1("lineage");
+ for(QStringList::ConstIterator it = names.begin(); it != names.end(); ++it) {
+ QDomNodeList list = n2.toElement().elementsByTagName(*it);
+ if(list.count() > 1) {
+ value += list.item(0).toElement().text();
+ }
+ if(*it != names.last()) {
+ value += QString::fromLatin1(" ");
+ }
+ }
+ }
+ for(QDomNode n3 = n2.firstChild(); !n3.isNull(); n3 = n3.nextSibling()) {
+ if(n3.isElement()) {
+ value += n3.toElement().text();
+ } else if(n3.isText()) {
+ value += n3.toText().data();
+ }
+ if(n3 != n2.lastChild()) {
+ value += QString::fromLatin1(" ");
+ }
+ }
+ if(n2 != n.lastChild()) {
+ value += QString::fromLatin1("; ");
+ }
+ }
+ }
+ }
+ if(!name.isEmpty() && !value.isEmpty()) {
+ BibtexHandler::setFieldValue(entry, name, value.simplifyWhiteSpace());
+ }
+ }
+
+ m_coll->addEntries(entry);
+}
+
+void BibtexmlImporter::slotCancel() {
+ m_cancelled = true;
+}
+
+#include "bibtexmlimporter.moc"