fb2read.hpp 4.0 KB

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