fb2save.hpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #ifndef FB2SAVE_H
  2. #define FB2SAVE_H
  3. #include "fb2xml.hpp"
  4. #include "fb2imgs.hpp"
  5. #include <QByteArray>
  6. #include <QFileDialog>
  7. #include <QStringList>
  8. #include <QXmlStreamWriter>
  9. QT_BEGIN_NAMESPACE
  10. class QComboBox;
  11. class QLabel;
  12. QT_END_NAMESPACE
  13. #include "fb2imgs.hpp"
  14. class FbTextEdit;
  15. class FbSaveDialog : public QFileDialog
  16. {
  17. Q_OBJECT
  18. public:
  19. explicit FbSaveDialog(QWidget *parent, Qt::WindowFlags f);
  20. explicit FbSaveDialog(QWidget *parent = 0,
  21. const QString &caption = QString(),
  22. const QString &directory = QString(),
  23. const QString &filter = QString());
  24. QString fileName() const;
  25. QString codec() const;
  26. private:
  27. void init();
  28. private:
  29. QComboBox * combo;
  30. QLabel * label;
  31. };
  32. class FbHtmlHandler : public FbXmlHandler
  33. {
  34. Q_OBJECT
  35. public:
  36. explicit FbHtmlHandler(): m_lastTextLength(0) {}
  37. public slots:
  38. void onAttr(const QString &name, const QString &value);
  39. void onNew(const QString &name);
  40. void onEnd(const QString &name);
  41. void onTxt(const QString &text);
  42. void onCom(const QString &text);
  43. protected:
  44. int m_lastTextLength;
  45. private:
  46. static QString local(const QString &name);
  47. private:
  48. QXmlStreamAttributes m_atts;
  49. };
  50. class FbSaveWriter : public QXmlStreamWriter
  51. {
  52. public:
  53. explicit FbSaveWriter(FbTextEdit &view, QByteArray *array);
  54. explicit FbSaveWriter(FbTextEdit &view, QIODevice *device);
  55. explicit FbSaveWriter(FbTextEdit &view, QString *string);
  56. FbTextEdit & view() { return m_view; }
  57. QString filename(const QString &src);
  58. void writeStartDocument();
  59. void writeStartElement(const QString &name, int level);
  60. void writeEndElement(int level);
  61. void writeComment(const QString &ch);
  62. void writeLineEnd();
  63. void writeFiles();
  64. void writeStyle();
  65. public:
  66. int anchor() const { return m_anchor; }
  67. int focus() const { return m_focus; }
  68. void setAnchor(int offset);
  69. void setFocus(int offset);
  70. private:
  71. QByteArray downloadFile(const QUrl &url);
  72. void writeContentType(const QString &name, QByteArray &data);
  73. QString append(const QString &name);
  74. private:
  75. FbTextEdit &m_view;
  76. QStringList m_names;
  77. QString *m_string;
  78. QString m_style;
  79. int m_anchor;
  80. int m_focus;
  81. };
  82. class FbSaveHandler : public FbHtmlHandler
  83. {
  84. Q_OBJECT
  85. public:
  86. explicit FbSaveHandler(FbSaveWriter &writer);
  87. virtual bool comment(const QString& ch);
  88. bool save();
  89. public slots:
  90. void onAnchor(int offset);
  91. void onFocus(int offset);
  92. private:
  93. class TextHandler : public NodeHandler
  94. {
  95. FB2_BEGIN_KEYLIST
  96. Origin,
  97. Anchor,
  98. Table,
  99. Image,
  100. Span,
  101. Parag,
  102. Strong,
  103. Emphas,
  104. Strike,
  105. Sub,
  106. Sup,
  107. Code,
  108. FB2_END_KEYLIST
  109. public:
  110. explicit TextHandler(FbSaveWriter &writer, const QString &name, const QXmlStreamAttributes &atts, const QString &tag);
  111. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlStreamAttributes &atts, const QString &tag);
  112. const QString & tag() { return m_tag; }
  113. protected:
  114. virtual NodeHandler * NewTag(const QString &name, const QXmlStreamAttributes &atts);
  115. virtual void TxtTag(const QString &text);
  116. virtual void EndTag(const QString &name);
  117. protected:
  118. virtual void writeAtts(const QXmlStreamAttributes &atts);
  119. virtual int nextLevel() const;
  120. protected:
  121. FbSaveWriter &m_writer;
  122. const QString m_tag;
  123. const int m_level;
  124. private:
  125. bool m_hasChild;
  126. };
  127. class RootHandler : public NodeHandler
  128. {
  129. public:
  130. explicit RootHandler(FbSaveWriter &writer, const QString &name);
  131. protected:
  132. virtual NodeHandler * NewTag(const QString &name, const QXmlStreamAttributes &atts);
  133. protected:
  134. FbSaveWriter &m_writer;
  135. };
  136. class BodyHandler : public TextHandler
  137. {
  138. public:
  139. explicit BodyHandler(FbSaveWriter &writer, const QString &name);
  140. protected:
  141. virtual void EndTag(const QString &name);
  142. };
  143. class SpanHandler : public TextHandler
  144. {
  145. public:
  146. explicit SpanHandler(TextHandler *parent, const QString &name, const QXmlStreamAttributes &atts);
  147. };
  148. class ParagHandler : public TextHandler
  149. {
  150. public:
  151. explicit ParagHandler(TextHandler *parent, const QString &name, const QXmlStreamAttributes &atts);
  152. protected:
  153. virtual NodeHandler * NewTag(const QString &name, const QXmlStreamAttributes &atts);
  154. virtual void TxtTag(const QString &text);
  155. virtual void EndTag(const QString &name);
  156. private:
  157. virtual int nextLevel() const { return 0; }
  158. void start();
  159. private:
  160. const QString m_parent;
  161. QXmlStreamAttributes m_atts;
  162. QString m_class;
  163. bool m_empty;
  164. };
  165. protected:
  166. virtual NodeHandler * CreateRoot(const QString &name, const QXmlStreamAttributes &atts);
  167. private:
  168. void setDocumentInfo(QWebFrame *frame);
  169. private:
  170. FbSaveWriter & m_writer;
  171. };
  172. #endif // FB2SAVE_H