fb2read.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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 FbReadThread : public QThread
  9. {
  10. Q_OBJECT
  11. public:
  12. FbReadThread(const QString &html, QObject *parent = 0);
  13. signals:
  14. void html(const QString &html, const QUrl &url);
  15. protected:
  16. void run();
  17. private:
  18. const QString m_html;
  19. };
  20. class FbTextPage;
  21. /*
  22. class FbReadThread : public QThread
  23. {
  24. Q_OBJECT
  25. public:
  26. FbReadThread(QObject *parent, const QString &filename, const QString &xml = QString());
  27. ~FbReadThread();
  28. public:
  29. void setPage(FbTextPage *page) { m_page = page; }
  30. FbTextPage * page() const { return m_page; }
  31. QObject * temp() const { return m_temp; }
  32. QString * data() { return &m_html; }
  33. signals:
  34. void html(QString name);
  35. public slots:
  36. void stop();
  37. protected:
  38. void run();
  39. private:
  40. bool parse();
  41. private:
  42. FbTextPage *m_page;
  43. QObject *m_temp;
  44. const QString m_filename;
  45. const QString m_xml;
  46. QString m_html;
  47. bool m_abort;
  48. QMutex mutex;
  49. };
  50. */
  51. class FbReadHandler : public QObject, public FbXmlHandler
  52. {
  53. Q_OBJECT
  54. public:
  55. static bool load(QObject *page, QXmlInputSource &source, QString &html);
  56. explicit FbReadHandler(QXmlStreamWriter &writer);
  57. virtual ~FbReadHandler();
  58. virtual bool comment(const QString& ch);
  59. QXmlStreamWriter & writer() { return m_writer; }
  60. private:
  61. class BaseHandler : public NodeHandler
  62. {
  63. public:
  64. explicit BaseHandler(FbReadHandler &owner, const QString &name)
  65. : NodeHandler(name), m_owner(owner) {}
  66. protected:
  67. QXmlStreamWriter & writer() { return m_owner.writer(); }
  68. protected:
  69. FbReadHandler &m_owner;
  70. };
  71. class RootHandler : public BaseHandler
  72. {
  73. FB2_BEGIN_KEYLIST
  74. Style,
  75. Descr,
  76. Body,
  77. Binary,
  78. FB2_END_KEYLIST
  79. public:
  80. explicit RootHandler(FbReadHandler &owner, const QString &name);
  81. protected:
  82. virtual NodeHandler * NewTag(const QString & name, const QXmlAttributes &atts);
  83. virtual void EndTag(const QString &name);
  84. private:
  85. void writeScript(const QString &src);
  86. void writeHeader();
  87. private:
  88. QString m_style;
  89. bool m_head;
  90. };
  91. class StyleHandler : public BaseHandler
  92. {
  93. public:
  94. explicit StyleHandler(FbReadHandler &owner, const QString &name, QString &text);
  95. protected:
  96. virtual void TxtTag(const QString &text);
  97. private:
  98. QString &m_text;
  99. };
  100. class TextHandler : public BaseHandler
  101. {
  102. FB2_BEGIN_KEYLIST
  103. Origin,
  104. Anchor,
  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(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts, const QString &tag);
  117. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
  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 QString &name, const QXmlAttributes &atts);
  124. bool isNotes() const;
  125. protected:
  126. TextHandler *m_parent;
  127. QString m_tag;
  128. QString m_style;
  129. bool m_empty;
  130. };
  131. class BinaryHandler : public BaseHandler
  132. {
  133. public:
  134. explicit BinaryHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts);
  135. protected:
  136. virtual void TxtTag(const QString &text);
  137. virtual void EndTag(const QString &name);
  138. private:
  139. QString m_file;
  140. QString m_text;
  141. };
  142. signals:
  143. void binary(const QString &name, const QByteArray &data);
  144. protected:
  145. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  146. private:
  147. void addFile(const QString &name, const QByteArray &data);
  148. private:
  149. typedef QHash<QString, QString> StringHash;
  150. QXmlStreamWriter &m_writer;
  151. StringHash m_hash;
  152. };
  153. #endif // FB2READ_H