fb2read.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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_cursor;
  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. virtual BaseHandler * NewTag(const QString & name, const QXmlAttributes &attributes);
  113. protected:
  114. virtual void EndTag(const QString &name);
  115. protected:
  116. Fb2TextCursor & cursor() { return m_cursor; }
  117. Fb2TextCursor & m_cursor;
  118. QTextBlockFormat m_blockFormat;
  119. QTextCharFormat m_charFormat;
  120. };
  121. class BodyHandler : public TextHandler
  122. {
  123. FB2_BEGIN_KEYLIST
  124. Image,
  125. Title,
  126. Epigraph,
  127. Section,
  128. Paragraph,
  129. Poem,
  130. Stanza,
  131. Verse,
  132. FB2_END_KEYLIST
  133. public:
  134. explicit BodyHandler(Fb2TextCursor &cursor, const QString &name);
  135. protected:
  136. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  137. private:
  138. bool m_feed;
  139. };
  140. class ImageHandler : public TextHandler
  141. {
  142. public:
  143. explicit ImageHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  144. protected:
  145. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  146. };
  147. class SectionHandler : public TextHandler
  148. {
  149. FB2_BEGIN_KEYLIST
  150. Title,
  151. Epigraph,
  152. Image,
  153. Annotation,
  154. Section,
  155. Paragraph,
  156. Poem,
  157. Subtitle,
  158. Cite,
  159. Emptyline,
  160. Table,
  161. FB2_END_KEYLIST
  162. public:
  163. explicit SectionHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  164. protected:
  165. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  166. virtual void EndTag(const QString &name);
  167. private:
  168. QTextFrame * m_frame;
  169. bool m_feed;
  170. };
  171. class TitleHandler : public TextHandler
  172. {
  173. FB2_BEGIN_KEYLIST
  174. Paragraph,
  175. Emptyline,
  176. FB2_END_KEYLIST
  177. public:
  178. explicit TitleHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  179. protected:
  180. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  181. virtual void EndTag(const QString &name);
  182. private:
  183. QTextFrame * m_frame;
  184. QTextTable * m_table;
  185. bool m_feed;
  186. };
  187. class PoemHandler : public TextHandler
  188. {
  189. FB2_BEGIN_KEYLIST
  190. Title,
  191. Epigraph,
  192. Stanza,
  193. Author,
  194. Date,
  195. FB2_END_KEYLIST
  196. public:
  197. explicit PoemHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  198. protected:
  199. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  200. virtual void EndTag(const QString &name);
  201. private:
  202. QTextFrame * m_frame;
  203. QTextTable * m_table;
  204. bool m_feed;
  205. };
  206. class StanzaHandler : public TextHandler
  207. {
  208. FB2_BEGIN_KEYLIST
  209. Title,
  210. Subtitle,
  211. Verse,
  212. FB2_END_KEYLIST
  213. public:
  214. explicit StanzaHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes);
  215. protected:
  216. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  217. private:
  218. bool m_feed;
  219. };
  220. class BlockHandler : public TextHandler
  221. {
  222. FB2_BEGIN_KEYLIST
  223. Strong,
  224. Emphasis,
  225. Style,
  226. Anchor,
  227. Strike,
  228. Sub,
  229. Sup,
  230. Code,
  231. Image,
  232. FB2_END_KEYLIST
  233. public:
  234. explicit BlockHandler(TextHandler &parent, const QString &name, const QXmlAttributes &attributes, QTextCharFormat *format = NULL);
  235. protected:
  236. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  237. virtual void TxtTag(const QString &text);
  238. };
  239. class UnknowHandler : public TextHandler
  240. {
  241. public:
  242. explicit UnknowHandler(TextHandler &parent, const QString &name);
  243. protected:
  244. virtual BaseHandler * NewTag(const QString &name, const QXmlAttributes &attributes);
  245. virtual void TxtTag(const QString &text);
  246. private:
  247. TextHandler &m_parent;
  248. };
  249. class BinaryHandler : public BaseHandler
  250. {
  251. public:
  252. explicit BinaryHandler(QTextDocument &document, const QString &name, const QXmlAttributes &attributes);
  253. protected:
  254. virtual void TxtTag(const QString &text);
  255. virtual void EndTag(const QString &name);
  256. private:
  257. QTextDocument & m_document;
  258. QString m_file;
  259. QString m_text;
  260. };
  261. public:
  262. QTextDocument & document() { return m_document; }
  263. private:
  264. QTextDocument & m_document;
  265. RootHandler * m_handler;
  266. QString m_error;
  267. };
  268. #undef FB2_BEGIN_KEYLIST
  269. #undef FB2_END_KEYLIST
  270. #endif // FB2READ_H