1
0

fb2read.hpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. virtual ~Fb2ReadHandler();
  35. virtual bool comment(const QString& ch);
  36. Fb2ReadThread & thread() { return m_thread; }
  37. QXmlStreamWriter & writer() { return m_writer; }
  38. private:
  39. class BaseHandler : public NodeHandler
  40. {
  41. public:
  42. explicit BaseHandler(Fb2ReadHandler &owner, const QString &name)
  43. : NodeHandler(name), m_owner(owner) {}
  44. protected:
  45. QXmlStreamWriter & writer() { return m_owner.writer(); }
  46. void writeAttributes(const QXmlAttributes &atts);
  47. protected:
  48. Fb2ReadHandler &m_owner;
  49. };
  50. class RootHandler : public BaseHandler
  51. {
  52. FB2_BEGIN_KEYLIST
  53. Style,
  54. Descr,
  55. Body,
  56. Binary,
  57. FB2_END_KEYLIST
  58. public:
  59. explicit RootHandler(Fb2ReadHandler &owner, const QString &name);
  60. protected:
  61. virtual NodeHandler * NewTag(const QString & name, const QXmlAttributes &atts);
  62. virtual void EndTag(const QString &name);
  63. };
  64. class StyleHandler : public BaseHandler
  65. {
  66. public:
  67. explicit StyleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  68. protected:
  69. virtual void TxtTag(const QString &text);
  70. virtual void EndTag(const QString &name);
  71. private:
  72. bool m_empty;
  73. };
  74. class HeadHandler : public BaseHandler
  75. {
  76. FB2_BEGIN_KEYLIST
  77. Image,
  78. FB2_END_KEYLIST
  79. public:
  80. explicit HeadHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  81. protected:
  82. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  83. virtual void TxtTag(const QString &text);
  84. virtual void EndTag(const QString &name);
  85. private:
  86. bool m_empty;
  87. };
  88. class DescrHandler : public HeadHandler
  89. {
  90. FB2_BEGIN_KEYLIST
  91. Title,
  92. Document,
  93. Publish,
  94. Custom,
  95. FB2_END_KEYLIST
  96. public:
  97. explicit DescrHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
  98. : HeadHandler(owner, name, atts) {}
  99. protected:
  100. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  101. };
  102. class TitleHandler : public HeadHandler
  103. {
  104. public:
  105. explicit TitleHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts)
  106. : HeadHandler(owner, name, atts) {}
  107. protected:
  108. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  109. };
  110. class TextHandler : public BaseHandler
  111. {
  112. FB2_BEGIN_KEYLIST
  113. Section,
  114. Anchor,
  115. Table,
  116. Image,
  117. Parag,
  118. Style,
  119. Strong,
  120. Emphas,
  121. Strike,
  122. Sub,
  123. Sup,
  124. Code,
  125. FB2_END_KEYLIST
  126. public:
  127. explicit TextHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
  128. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
  129. protected:
  130. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  131. virtual void TxtTag(const QString &text);
  132. virtual void EndTag(const QString &name);
  133. protected:
  134. void Init(const QXmlAttributes &atts);
  135. bool isNotes() const;
  136. protected:
  137. TextHandler *m_parent;
  138. QString m_tag;
  139. QString m_style;
  140. };
  141. class SpanHandler : public TextHandler
  142. {
  143. public:
  144. explicit SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  145. };
  146. class AnchorHandler : public TextHandler
  147. {
  148. public:
  149. explicit AnchorHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  150. };
  151. class ImageHandler : public TextHandler
  152. {
  153. public:
  154. explicit ImageHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  155. };
  156. class BinaryHandler : public BaseHandler
  157. {
  158. public:
  159. explicit BinaryHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  160. protected:
  161. virtual void TxtTag(const QString &text);
  162. virtual void EndTag(const QString &name);
  163. private:
  164. QString m_file;
  165. QString m_text;
  166. };
  167. protected:
  168. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  169. private:
  170. void addFile(const QString &name, const QByteArray &data);
  171. QString getFile(const QString &name);
  172. private:
  173. typedef QHash<QString, QString> StringHash;
  174. Fb2ReadThread &m_thread;
  175. QXmlStreamWriter &m_writer;
  176. StringHash m_hash;
  177. };
  178. #endif // FB2READ_H