1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/***************************************************************************
copyright : (C) 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 "dcimporter.h"
#include "../collections/bookcollection.h"
#include "tellico_xml.h"
#include "../tellico_debug.h"
using Tellico::Import::DCImporter;
DCImporter::DCImporter(const KURL& url_) : XMLImporter(url_) {
}
DCImporter::DCImporter(const QString& text_) : XMLImporter(text_) {
}
DCImporter::DCImporter(const QDomDocument& dom_) : XMLImporter(dom_) {
}
Tellico::Data::CollPtr DCImporter::collection() {
const QString& dc = XML::nsDublinCore;
const QString& zing = XML::nsZing;
Data::CollPtr c = new Data::BookCollection(true);
QDomDocument doc = domDocument();
QRegExp authorDateRX(QString::fromLatin1(",?(\\s+\\d{4}-?(?:\\d{4})?\\.?)(.*)$"));
QRegExp dateRX(QString::fromLatin1("\\d{4}"));
QDomNodeList recordList = doc.elementsByTagNameNS(zing, QString::fromLatin1("recordData"));
myDebug() << "DCImporter::collection() - number of records: " << recordList.count() << endl;
enum { UnknownNS, UseNS, NoNS } useNS = UnknownNS;
#define GETELEMENTS(s) (useNS == NoNS) \
? elem.elementsByTagName(QString::fromLatin1(s)) \
: elem.elementsByTagNameNS(dc, QString::fromLatin1(s))
for(uint i = 0; i < recordList.count(); ++i) {
Data::EntryPtr e = new Data::Entry(c);
QDomElement elem = recordList.item(i).toElement();
QDomNodeList nodeList = GETELEMENTS("title");
if(nodeList.count() == 0) { // no title, skip
if(useNS == UnknownNS) {
nodeList = elem.elementsByTagName(QString::fromLatin1("title"));
if(nodeList.count() > 0) {
useNS = NoNS;
} else {
myDebug() << "DCImporter::collection() - no title, skipping" << endl;
continue;
}
} else {
myDebug() << "DCImporter::collection() - no title, skipping" << endl;
continue;
}
} else if(useNS == UnknownNS) {
useNS = UseNS;
}
QString s = nodeList.item(0).toElement().text();
s.replace('\n', ' ');
s = s.simplifyWhiteSpace();
e->setField(QString::fromLatin1("title"), s);
nodeList = GETELEMENTS("creator");
QStringList creators;
for(uint j = 0; j < nodeList.count(); ++j) {
QString s = nodeList.item(j).toElement().text();
if(authorDateRX.search(s) > -1) {
// check if anything after date like [publisher]
if(authorDateRX.cap(2).stripWhiteSpace().isEmpty()) {
s.remove(authorDateRX);
s = s.simplifyWhiteSpace();
creators << s;
} else {
myDebug() << "DCImporter::collection() - weird creator, skipping: " << s << endl;
}
} else {
creators << s;
}
}
e->setField(QString::fromLatin1("author"), creators.join(QString::fromLatin1("; ")));
nodeList = GETELEMENTS("publisher");
QStringList publishers;
for(uint j = 0; j < nodeList.count(); ++j) {
publishers << nodeList.item(j).toElement().text();
}
e->setField(QString::fromLatin1("publisher"), publishers.join(QString::fromLatin1("; ")));
nodeList = GETELEMENTS("subject");
QStringList keywords;
for(uint j = 0; j < nodeList.count(); ++j) {
keywords << nodeList.item(j).toElement().text();
}
e->setField(QString::fromLatin1("keyword"), keywords.join(QString::fromLatin1("; ")));
nodeList = GETELEMENTS("date");
if(nodeList.count() > 0) {
QString s = nodeList.item(0).toElement().text();
if(dateRX.search(s) > -1) {
e->setField(QString::fromLatin1("pub_year"), dateRX.cap());
}
}
nodeList = GETELEMENTS("description");
if(nodeList.count() > 0) { // no title, skip
e->setField(QString::fromLatin1("comments"), nodeList.item(0).toElement().text());
}
c->addEntries(e);
}
#undef GETELEMENTS
return c;
}
|