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.
131 lines
4.8 KiB
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"
|