23
23
#include <ZLStringUtil.h>
25
25
#include "FB2DescriptionReader.h"
26
#include "FB2TagManager.h"
27
28
FB2DescriptionReader::FB2DescriptionReader(BookDescription &description) : myDescription(description) {
28
29
myDescription.clearAuthor();
29
30
myDescription.title().erase();
30
31
myDescription.language().erase();
32
myDescription.removeAllTags();
33
35
void FB2DescriptionReader::characterDataHandler(const char *text, int len) {
34
if (myReadSomething) {
36
switch (myReadState) {
36
38
myDescription.title().append(text, len);
37
} else if (myReadLanguage) {
38
41
myDescription.language().append(text, len);
40
for (int i = 0; i < 3; ++i) {
41
if (myReadAuthorName[i]) {
42
myAuthorNames[i].append(text, len);
43
case READ_AUTHOR_NAME_0:
44
myAuthorNames[0].append(text, len);
46
case READ_AUTHOR_NAME_1:
47
myAuthorNames[1].append(text, len);
49
case READ_AUTHOR_NAME_2:
50
myAuthorNames[2].append(text, len);
53
myGenreBuffer.append(text, len);
57
myReadSomething = true;
67
myReadState = READ_SOMETHING;
70
if (myReadState == READ_SOMETHING) {
71
myReadState = READ_TITLE;
75
if (myReadState == READ_SOMETHING) {
76
myReadState = READ_GENRE;
80
if (myReadState == READ_SOMETHING) {
81
myReadState = READ_AUTHOR;
66
myReadLanguage = true;
85
if (myReadState == READ_SOMETHING) {
86
myReadState = READ_LANGUAGE;
70
myReadAuthorName[0] = true;
90
if (myReadState == READ_AUTHOR) {
91
myReadState = READ_AUTHOR_NAME_0;
75
myReadAuthorName[1] = true;
95
if (myReadState == READ_AUTHOR) {
96
myReadState = READ_AUTHOR_NAME_1;
80
myReadAuthorName[2] = true;
100
if (myReadState == READ_AUTHOR) {
101
myReadState = READ_AUTHOR_NAME_2;
84
if (myReadSomething) {
105
if (myReadState == READ_SOMETHING) {
85
106
const char *name = attributeValue(attributes, "name");
87
std::string sequenceName = name;
88
ZLStringUtil::stripWhiteSpaces(sequenceName);
89
myDescription.sequenceName() = sequenceName;
108
std::string seriesName = name;
109
ZLStringUtil::stripWhiteSpaces(seriesName);
110
myDescription.seriesName() = seriesName;
90
111
const char *number = attributeValue(attributes, "number");
91
myDescription.numberInSequence() = (number != 0) ? atoi(number) : 0;
112
myDescription.numberInSeries() = (number != 0) ? atoi(number) : 0;
100
121
void FB2DescriptionReader::endElementHandler(int tag) {
102
123
case _TITLE_INFO:
103
myReadSomething = false;
124
myReadState = READ_NOTHING;
105
126
case _BOOK_TITLE:
127
if (myReadState == READ_TITLE) {
128
myReadState = READ_SOMETHING;
132
if (myReadState == READ_GENRE) {
133
ZLStringUtil::stripWhiteSpaces(myGenreBuffer);
134
if (!myGenreBuffer.empty()) {
135
const std::vector<std::string> &tags =
136
FB2TagManager::instance().humanReadableTags(myGenreBuffer);
138
for (std::vector<std::string>::const_iterator it = tags.begin(); it != tags.end(); ++it) {
139
myDescription.addTag(*it, false);
142
myDescription.addTag(myGenreBuffer);
144
myGenreBuffer.erase();
146
myReadState = READ_SOMETHING;
109
if (myReadSomething) {
150
if (myReadState == READ_AUTHOR) {
110
151
ZLStringUtil::stripWhiteSpaces(myAuthorNames[0]);
111
152
ZLStringUtil::stripWhiteSpaces(myAuthorNames[1]);
112
153
ZLStringUtil::stripWhiteSpaces(myAuthorNames[2]);
123
164
myAuthorNames[0].erase();
124
165
myAuthorNames[1].erase();
125
166
myAuthorNames[2].erase();
126
myReadAuthor = false;
167
myReadState = READ_SOMETHING;
130
myReadLanguage = false;
171
if (myReadState == READ_LANGUAGE) {
172
myReadState = READ_SOMETHING;
132
175
case _FIRST_NAME:
133
myReadAuthorName[0] = false;
176
if (myReadState == READ_AUTHOR_NAME_0) {
177
myReadState = READ_AUTHOR;
135
180
case _MIDDLE_NAME:
136
myReadAuthorName[1] = false;
181
if (myReadState == READ_AUTHOR_NAME_1) {
182
myReadState = READ_AUTHOR;
139
myReadAuthorName[2] = false;
186
if (myReadState == READ_AUTHOR_NAME_2) {
187
myReadState = READ_AUTHOR;
146
195
bool FB2DescriptionReader::readDescription(const std::string &fileName) {
147
myReadSomething = false;
149
myReadAuthor = false;
150
myReadLanguage = false;
196
myReadState = READ_NOTHING;
151
197
for (int i = 0; i < 3; ++i) {
152
myReadAuthorName[i] = false;
198
myAuthorNames[i].erase();
200
myGenreBuffer.erase();
154
201
return readDocument(fileName);