fb2read.hpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #ifndef FB2READ_H
  2. #define FB2READ_H
  3. #include "fb2xml.h"
  4. #include <QByteArray>
  5. #include <QMutex>
  6. #include <QThread>
  7. #include <QXmlDefaultHandler>
  8. class Fb2ReadThread : public QThread
  9. {
  10. Q_OBJECT
  11. public:
  12. Fb2ReadThread(QObject *parent, const QString &filename, const QString &xml = QString());
  13. ~Fb2ReadThread();
  14. QString * data() { return &m_html; }
  15. signals:
  16. void html(QString name, QString html);
  17. public slots:
  18. void stop();
  19. protected:
  20. void run();
  21. private:
  22. bool parse();
  23. private:
  24. const QString m_filename;
  25. const QString m_xml;
  26. QString m_html;
  27. bool m_abort;
  28. QMutex mutex;
  29. };
  30. class Fb2ReadHandler : public Fb2XmlHandler
  31. {
  32. public:
  33. explicit Fb2ReadHandler(Fb2ReadThread &thread, QXmlStreamWriter &writer);
  34. Fb2ReadThread & thread() { return m_thread; }
  35. QXmlStreamWriter & writer() { return m_writer; }
  36. private:
  37. class BaseHandler : public NodeHandler
  38. {
  39. public:
  40. explicit BaseHandler(Fb2ReadHandler &owner, const QString &name)
  41. : NodeHandler(name), m_owner(owner) {}
  42. protected:
  43. QXmlStreamWriter & writer() { return m_owner.writer(); }
  44. protected:
  45. Fb2ReadHandler &m_owner;
  46. };
  47. class RootHandler : public BaseHandler
  48. {
  49. FB2_BEGIN_KEYLIST
  50. Style,
  51. Descr,
  52. Body,
  53. Binary,
  54. FB2_END_KEYLIST
  55. public:
  56. explicit RootHandler(Fb2ReadHandler &owner, const QString &name);
  57. protected:
  58. virtual NodeHandler * NewTag(const QString & name, const QXmlAttributes &atts);
  59. virtual void EndTag(const QString &name);
  60. };
  61. class HeadHandler : public BaseHandler
  62. {
  63. FB2_BEGIN_KEYLIST
  64. Image,
  65. FB2_END_KEYLIST
  66. public:
  67. explicit HeadHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  68. protected:
  69. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  70. virtual void TxtTag(const QString &text);
  71. virtual void EndTag(const QString &name);
  72. private:
  73. bool m_empty;
  74. };
  75. class DescrHandler : public HeadHandler
  76. {
  77. FB2_BEGIN_KEYLIST
  78. Title,
  79. Document,
  80. Publish,
  81. Custom,
  82. FB2_END_KEYLIST
  83. public:
  84. explicit DescrHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
  85. : HeadHandler(owner, name, atts) {}
  86. protected:
  87. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  88. };
  89. class TitleHandler : public HeadHandler
  90. {
  91. public:
  92. explicit TitleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
  93. : HeadHandler(owner, name, atts) {}
  94. protected:
  95. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  96. };
  97. class TextHandler : public BaseHandler
  98. {
  99. FB2_BEGIN_KEYLIST
  100. Section,
  101. Anchor,
  102. Table,
  103. Image,
  104. Parag,
  105. Style,
  106. Strong,
  107. Emphas,
  108. Strike,
  109. Sub,
  110. Sup,
  111. Code,
  112. FB2_END_KEYLIST
  113. public:
  114. explicit TextHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
  115. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
  116. protected:
  117. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  118. virtual void TxtTag(const QString &text);
  119. virtual void EndTag(const QString &name);
  120. protected:
  121. void Init(const QXmlAttributes &atts);
  122. bool isNotes() const;
  123. protected:
  124. TextHandler *m_parent;
  125. QString m_tag;
  126. QString m_style;
  127. };
  128. class AnchorHandler : public TextHandler
  129. {
  130. public:
  131. explicit AnchorHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  132. };
  133. class ImageHandler : public TextHandler
  134. {
  135. public:
  136. explicit ImageHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  137. };
  138. class BinaryHandler : public BaseHandler
  139. {
  140. public:
  141. explicit BinaryHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  142. protected:
  143. virtual void TxtTag(const QString &text);
  144. virtual void EndTag(const QString &name);
  145. private:
  146. QString m_file;
  147. QString m_text;
  148. };
  149. protected:
  150. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  151. private:
  152. void addFile(const QString &name, const QByteArray &data);
  153. QString getFile(const QString &name);
  154. private:
  155. typedef QHash<QString, QString> StringHash;
  156. Fb2ReadThread &m_thread;
  157. QXmlStreamWriter &m_writer;
  158. StringHash m_hash;
  159. };
  160. #endif // FB2READ_H