You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tellico/src/translators/grs1importer.cpp

131 lines
4.8 KiB

/***************************************************************************
copyright : (C) 2006 by Robby Stephenson
email : robby@periapsis.org
***************************************************************************/
/***************************************************************************
* *
* 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 "grs1importer.h"
#include "../collections/bibtexcollection.h"
#include "../entry.h"
#include "../field.h"
#include "../latin1literal.h"
#include "../tellico_debug.h"
using Tellico::Import::GRS1Importer;
GRS1Importer::TagMap* GRS1Importer::s_tagMap = 0;
// static
void GRS1Importer::initTagMap() {
if(!s_tagMap) {
s_tagMap = new TagMap();
// BT is special and is handled separately
s_tagMap->insert(TagPair(2, 1), TQString::fromLatin1("title"));
s_tagMap->insert(TagPair(2, 2), TQString::fromLatin1("author"));
s_tagMap->insert(TagPair(2, 4), TQString::fromLatin1("year"));
s_tagMap->insert(TagPair(2, 7), TQString::fromLatin1("publisher"));
s_tagMap->insert(TagPair(2, 31), TQString::fromLatin1("publisher"));
s_tagMap->insert(TagPair(2, 20), TQString::fromLatin1("language"));
s_tagMap->insert(TagPair(2, 21), TQString::fromLatin1("keyword"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("isbn/issn")), TQString::fromLatin1("isbn"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("isbn")), TQString::fromLatin1("isbn"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("notes")), TQString::fromLatin1("note"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("note")), TQString::fromLatin1("note"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("series")), TQString::fromLatin1("series"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("physical description")), TQString::fromLatin1("note"));
s_tagMap->insert(TagPair(3, TQString::fromLatin1("subtitle")), TQString::fromLatin1("subtitle"));
}
}
GRS1Importer::GRS1Importer(const TQString& text_) : TextImporter(text_) {
initTagMap();
}
bool GRS1Importer::canImport(int type) const {
return type == Data::Collection::Bibtex;
}
Tellico::Data::CollPtr GRS1Importer::collection() {
Data::CollPtr coll = new Data::BibtexCollection(true);
Data::FieldPtr f = new Data::Field(TQString::fromLatin1("isbn"), i18n("ISBN#"));
f->setCategory(i18n("Publishing"));
f->setDescription(i18n("International Standard Book Number"));
coll->addField(f);
f = new Data::Field(TQString::fromLatin1("language"), i18n("Language"));
f->setCategory(i18n("Publishing"));
f->setFlags(Data::Field::AllowCompletion | Data::Field::AllowGrouped | Data::Field::AllowMultiple);
coll->addField(f);
Data::EntryPtr e = new Data::Entry(coll);
bool empty = true;
// in format "(tag, tag) value"
TQRegExp rx(TQString::fromLatin1("\\s*\\((\\d+),\\s*(.+)\\s*\\)\\s*(.+)\\s*"));
// rx.setMinimal(true);
TQRegExp dateRx(TQString::fromLatin1(",[^,]*\\d{3,4}[^,]*")); // remove dates from authors
TQRegExp pubRx(TQString::fromLatin1("([^:]+):([^,]+),?")); // split location and publisher
bool ok;
int n;
TQVariant v;
TQString tmp, field, val, str = text();
if(str.isEmpty()) {
return 0;
}
TQTextStream t(&str, IO_ReadOnly);
for(TQString line = t.readLine(); !line.isNull(); line = t.readLine()) {
// myDebug() << line << endl;
if(!rx.exactMatch(line)) {
continue;
}
n = rx.cap(1).toInt();
v = rx.cap(2).toInt(&ok);
if(!ok) {
v = rx.cap(2).lower();
}
field = (*s_tagMap)[TagPair(n, v)];
if(field.isEmpty()) {
continue;
}
// myDebug() << "field is " << field << endl;
// assume if multiple values, it's allowed
val = rx.cap(3).stripWhiteSpace();
if(val.isEmpty()) {
continue;
}
empty = false;
if(field == Latin1Literal("title")) {
val = val.section('/', 0, 0).stripWhiteSpace(); // only take portion of title before slash
} else if(field == Latin1Literal("author")) {
val.replace(dateRx, TQString());
} else if(field == Latin1Literal("publisher")) {
int pos = val.find(pubRx);
if(pos > -1) {
e->setField(TQString::fromLatin1("address"), pubRx.cap(1));
val = pubRx.cap(2);
}
}
tmp = e->field(field);
if(!tmp.isEmpty()) {
tmp += TQString::fromLatin1("; ");
}
e->setField(field, tmp + val);
}
if(!empty) {
coll->addEntries(e);
}
return coll;
}
#include "grs1importer.moc"