Improve default book. Speed up book parsing. Simplify XML parsing.
[dorian] / model / opshandler.h
1 #ifndef OPSHANDLER_H
2 #define OPSHANDLER_H
3
4 #include "xmlhandler.h"
5 #include "book.h"
6 #include "trace.h"
7
8 /** XML content handler for OPS format. */
9 class OpsHandler: public XmlHandler
10 {
11 public:
12     OpsHandler(Book &b): book(b), partCount(0) {}
13
14     bool endElement(const QString &namespaceUri, const QString &name,
15                     const QString &qName) {
16         (void)namespaceUri;
17         (void)qName;
18         if (currentText.size()) {
19             if (name == "title") {
20                 book.title = currentText;
21             } else if (name == "creator") {
22                 book.creators.append(currentText);
23             } else if (name == "publisher") {
24                 book.publisher = currentText;
25             } else if (name == "subject") {
26                 book.subject = currentText;
27             } else if (name == "source") {
28                 book.source = currentText;
29             } else if (name == "rights") {
30                 book.rights = currentText;
31             }
32         }
33         return true;
34     }
35
36     bool startElement(const QString &namespaceUri, const QString &name,
37                       const QString &qName, const QXmlAttributes &attrs) {
38         (void)namespaceUri;
39         (void)qName;
40         currentText = "";
41
42         if (name == "item") {
43             Book::ContentItem item;
44             item.href = attrs.value("href");
45             item.name = QString("Part %1").arg(partCount + 1);
46             item.size = 0;
47             QString key = attrs.value("id");
48             book.content[key] = item;
49             partCount++;
50             qDebug() << "OpsHandler::startElement: name" << item.name << "href"
51                     << attrs.value("href") << "id" << key;
52         } else if (name == "itemref") {
53             qDebug() << "OpsHandler::startElement: parts[" << book.parts.size()
54                     << "]" << attrs.value("idref");
55             book.parts.append(attrs.value("idref"));
56         }
57         return true;
58     }
59
60 private:
61     Book &book;
62     int partCount;
63 };
64
65 #endif // OPSHANDLER_H