fb2read.h 8.9 KB

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