fb2read.hpp 5.0 KB

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