fb2read.h 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. #ifndef FB2READ_H
  2. #define FB2READ_H
  3. #include "fb2doc.h"
  4. #include <QMutex>
  5. #include <QThread>
  6. #include <QXmlDefaultHandler>
  7. #include <QTextCursor>
  8. #include <QStringList>
  9. #include <QTextFrameFormat>
  10. #include <QTextBlockFormat>
  11. #include <QTextCharFormat>
  12. QT_BEGIN_NAMESPACE
  13. class QTextEdit;
  14. QT_END_NAMESPACE
  15. class Fb2MainDocumen;
  16. class Fb2ReadThread : public QThread
  17. {
  18. Q_OBJECT
  19. public:
  20. Fb2ReadThread(QObject *parent, const QString &filename);
  21. ~Fb2ReadThread();
  22. void Read(const QString &filename);
  23. QTextDocument * doc();
  24. const QString & file();
  25. signals:
  26. void sendDocument();
  27. public slots:
  28. void stop();
  29. protected:
  30. void run();
  31. private:
  32. const QString m_filename;
  33. QTextDocument * m_document;
  34. bool m_abort;
  35. QMutex mutex;
  36. };
  37. #define FB2_BEGIN_KEYLIST private: enum Keyword {
  38. #define FB2_END_KEYLIST None }; \
  39. class KeywordHash : public QHash<QString, Keyword> { public: KeywordHash(); }; \
  40. static Keyword toKeyword(const QString &name); private:
  41. class Fb2Handler : public QXmlDefaultHandler
  42. {
  43. public:
  44. explicit Fb2Handler(QTextDocument & document);
  45. virtual ~Fb2Handler();
  46. bool startElement(const QString &namespaceURI, const QString &localName, const QString &qName, const QXmlAttributes &attributes);
  47. bool endElement(const QString &namespaceURI, const QString &localName, const QString &qName);
  48. bool characters(const QString &str);
  49. bool fatalError(const QXmlParseException &exception);
  50. QString errorString() const;
  51. private:
  52. class Fb2TextCursor : public QTextCursor
  53. {
  54. public:
  55. explicit Fb2TextCursor(QTextDocument *document, bool foot)
  56. : QTextCursor(document), m_foot(foot) {}
  57. bool foot()
  58. { return m_foot; }
  59. private:
  60. const bool m_foot;
  61. };
  62. class BaseHandler
  63. {
  64. public:
  65. explicit BaseHandler(const QString &name) : m_name(name), m_handler(NULL), m_closed(false) {}
  66. virtual ~BaseHandler();
  67. bool doStart(const QString &name, const QXmlAttributes &attributes);
  68. bool doText(const QString &text);
  69. bool doEnd(const QString &name, bool & found);
  70. protected:
  71. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes)
  72. { Q_UNUSED(name); Q_UNUSED(attributes); return NULL; }
  73. virtual void TxtTag(const QString &text)
  74. { Q_UNUSED(text); }
  75. virtual void EndTag(const QString &name)
  76. { Q_UNUSED(name); }
  77. private:
  78. const QString m_name;
  79. BaseHandler * m_handler;
  80. bool m_closed;
  81. };
  82. class RootHandler : public BaseHandler
  83. {
  84. FB2_BEGIN_KEYLIST
  85. Style,
  86. Descr,
  87. Body,
  88. Binary,
  89. FB2_END_KEYLIST
  90. public:
  91. explicit RootHandler(QTextDocument &document, const QString &name);
  92. virtual ~RootHandler();
  93. protected:
  94. virtual BaseHandler * NewTag(const QString & name, const QXmlAttributes &attributes);
  95. private:
  96. QTextDocument &m_document;
  97. Fb2TextCursor m_cursor1;
  98. bool m_empty;
  99. };
  100. class DescrHandler : public BaseHandler
  101. {
  102. public:
  103. explicit DescrHandler(const QString &name) : BaseHandler(name) {}
  104. protected:
  105. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  106. };
  107. class TextHandler : public BaseHandler
  108. {
  109. public:
  110. explicit TextHandler(Fb2TextCursor &cursor, const QString &name);
  111. explicit TextHandler(TextHandler &parent, const QString &name);
  112. protected:
  113. virtual void EndTag(const QString &name);
  114. protected:
  115. Fb2TextCursor & cursor() { return m_cursor; }
  116. Fb2TextCursor & m_cursor;
  117. QTextBlockFormat m_blockFormat;
  118. QTextCharFormat m_charFormat;
  119. };
  120. class BodyHandler : public TextHandler
  121. {
  122. FB2_BEGIN_KEYLIST
  123. Image,
  124. Title,
  125. Epigraph,
  126. Section,
  127. Paragraph,
  128. Poem,
  129. Stanza,
  130. Verse,
  131. FB2_END_KEYLIST
  132. public:
  133. explicit BodyHandler(Fb2TextCursor &cursor, const QString &name);
  134. protected:
  135. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  136. private:
  137. bool m_feed;
  138. };
  139. class ImageHandler : public TextHandler
  140. {
  141. public:
  142. explicit ImageHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  143. protected:
  144. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  145. };
  146. class SectionHandler : public TextHandler
  147. {
  148. FB2_BEGIN_KEYLIST
  149. Title,
  150. Epigraph,
  151. Image,
  152. Annotation,
  153. Section,
  154. Paragraph,
  155. Poem,
  156. Subtitle,
  157. Cite,
  158. Emptyline,
  159. Table,
  160. FB2_END_KEYLIST
  161. public:
  162. explicit SectionHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  163. protected:
  164. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  165. virtual void EndTag(const QString &name);
  166. private:
  167. QTextFrame * m_frame;
  168. bool m_feed;
  169. };
  170. class TitleHandler : public TextHandler
  171. {
  172. FB2_BEGIN_KEYLIST
  173. Paragraph,
  174. Emptyline,
  175. FB2_END_KEYLIST
  176. public:
  177. explicit TitleHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  178. protected:
  179. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  180. virtual void EndTag(const QString &name);
  181. private:
  182. QTextFrame * m_frame;
  183. QTextTable * m_table;
  184. bool m_feed;
  185. };
  186. class PoemHandler : public TextHandler
  187. {
  188. FB2_BEGIN_KEYLIST
  189. Title,
  190. Epigraph,
  191. Stanza,
  192. Author,
  193. Date,
  194. FB2_END_KEYLIST
  195. public:
  196. explicit PoemHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  197. protected:
  198. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  199. virtual void EndTag(const QString &name);
  200. private:
  201. QTextFrame * m_frame;
  202. QTextTable * m_table;
  203. bool m_feed;
  204. };
  205. class StanzaHandler : public TextHandler
  206. {
  207. FB2_BEGIN_KEYLIST
  208. Title,
  209. Subtitle,
  210. Verse,
  211. FB2_END_KEYLIST
  212. public:
  213. explicit StanzaHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  214. protected:
  215. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  216. private:
  217. bool m_feed;
  218. };
  219. class BlockHandler : public TextHandler
  220. {
  221. FB2_BEGIN_KEYLIST
  222. Strong,
  223. Emphasis,
  224. Style,
  225. Anchor,
  226. Strikethrough,
  227. Sub,
  228. Sup,
  229. Code,
  230. Image,
  231. FB2_END_KEYLIST
  232. public:
  233. explicit BlockHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  234. protected:
  235. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  236. virtual void TxtTag(const QString &text);
  237. };
  238. class BinaryHandler : public BaseHandler
  239. {
  240. public:
  241. explicit BinaryHandler(QTextDocument &document, const QString &name, const QXmlAttributes &attributes);
  242. protected:
  243. virtual void TxtTag(const QString &text);
  244. virtual void EndTag(const QString &name);
  245. private:
  246. QTextDocument & m_document;
  247. QString m_file;
  248. QString m_text;
  249. };
  250. public:
  251. QTextDocument & document() { return m_document; }
  252. private:
  253. QTextDocument & m_document;
  254. RootHandler * m_handler;
  255. QString m_error;
  256. };
  257. #undef FB2_BEGIN_KEYLIST
  258. #undef FB2_END_KEYLIST
  259. #endif // FB2READ_H