diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-03-01 19:17:32 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-03-01 19:17:32 +0000 |
commit | e38d2351b83fa65c66ccde443777647ef5cb6cff (patch) | |
tree | 1897fc20e9f73a81c520a5b9f76f8ed042124883 /src/translators/bibtexmlimporter.cpp | |
download | tellico-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.cpp | 163 |
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 + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * 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" |