Don't lose pages. Handle fragments in chapter URLs.
[dorian] / model / ncxhandler.h
1 #ifndef NCXHANDLER_H
2 #define NCXHANDLER_H
3
4 #include <QXmlContentHandler>
5
6 #include "book.h"
7 #include "trace.h"
8
9 /** XML content handler for NCX format. */
10 class NcxHandler: public QXmlContentHandler
11 {
12 public:
13     bool endDocument() {return true;}
14     bool endPrefixMapping(const QString &) {return true;}
15     QString errorString() const {return "";}
16     bool ignorableWhitespace(const QString &) {return true;}
17     bool processingInstruction(const QString &, const QString &) {return true;}
18     void setDocumentLocator(QXmlLocator *) {}
19     bool skippedEntity(const QString &) {return true;}
20     bool startDocument() {return true;}
21     bool startPrefixMapping(const QString &, const QString &) {return true;}
22
23     NcxHandler(Book &b): book(b) {
24         book.chapters.clear();
25     }
26
27     bool characters(const QString &ch) {
28         currentText += ch;
29         return true;
30     }
31
32     bool endElement(const QString &namespaceUri, const QString &name,
33                     const QString &qName) {
34         Trace t("NcxHandler::endElement" + name);
35         (void)namespaceUri;
36         (void)qName;
37         if (name == "text") {
38             t.trace(currentText);
39             contentTitle = currentText;
40         } else if (name == "navPoint") {
41             t.trace(QString("url: ") + contentUrl);
42             t.trace(QString("title: ") + contentTitle);
43             t.trace(QString("id:") + contentId);
44             Book::ContentItem item;
45             item.href = book.rootPath() + "/" + contentUrl;
46             item.name = contentTitle;
47             book.content[contentId] = item;
48             book.chapters.append(contentId);
49         }
50         return true;
51     }
52
53     bool startElement(const QString &namespaceUri, const QString &name,
54                       const QString &qName, const QXmlAttributes &attrs) {
55         (void)namespaceUri;
56         (void)qName;
57         currentText = "";
58         if (name == "navPoint") {
59             contentId = attrs.value("id");
60         } else if (name == "content") {
61             contentUrl = attrs.value("src");
62         }
63         return true;
64     }
65
66 private:
67     Book &book;
68     QString currentText;
69     QString contentId;
70     QString contentUrl;
71     QString contentTitle;
72 };
73
74 #endif // NCXHANDLER_H