fb2save.hpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #ifndef Fb2Save_H
  2. #define Fb2Save_H
  3. #include "fb2xml.h"
  4. #include "fb2temp.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 "fb2temp.hpp"
  14. class Fb2WebView;
  15. class Fb2SaveDialog : public QFileDialog
  16. {
  17. Q_OBJECT
  18. public:
  19. explicit Fb2SaveDialog(QWidget *parent, Qt::WindowFlags f);
  20. explicit Fb2SaveDialog(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 Fb2HtmlHandler : public QObject, public Fb2XmlHandler
  33. {
  34. Q_OBJECT
  35. public:
  36. explicit Fb2HtmlHandler() {}
  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. private:
  44. static QString local(const QString &name);
  45. private:
  46. QXmlAttributes m_atts;
  47. };
  48. class Fb2SaveWriter : public QXmlStreamWriter
  49. {
  50. public:
  51. explicit Fb2SaveWriter(Fb2WebView &view, QByteArray *array);
  52. explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device);
  53. explicit Fb2SaveWriter(Fb2WebView &view, QString *string);
  54. Fb2WebView & view() { return m_view; }
  55. QString getFileName(const QString &src);
  56. void writeStartElement(const QString &name, int level);
  57. void writeEndElement(int level);
  58. void writeComment(const QString &ch);
  59. void writeLineEnd();
  60. void writeFiles();
  61. private:
  62. QByteArray downloadFile(const QUrl &url);
  63. void writeContentType(const QString &name, QByteArray &data);
  64. private:
  65. Fb2WebView &m_view;
  66. QStringList m_names;
  67. };
  68. class Fb2SaveHandler : public Fb2HtmlHandler
  69. {
  70. public:
  71. explicit Fb2SaveHandler(Fb2SaveWriter &writer);
  72. virtual bool comment(const QString& ch);
  73. bool save();
  74. private:
  75. class TextHandler : public NodeHandler
  76. {
  77. FB2_BEGIN_KEYLIST
  78. Section,
  79. Anchor,
  80. Table,
  81. Image,
  82. Span,
  83. Parag,
  84. Strong,
  85. Emphas,
  86. Strike,
  87. Sub,
  88. Sup,
  89. Code,
  90. FB2_END_KEYLIST
  91. public:
  92. explicit TextHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag);
  93. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
  94. const QString & tag() { return m_tag; }
  95. protected:
  96. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  97. virtual void TxtTag(const QString &text);
  98. virtual void EndTag(const QString &name);
  99. protected:
  100. void Init(const QXmlAttributes &atts);
  101. virtual int nextLevel() const;
  102. protected:
  103. Fb2SaveWriter &m_writer;
  104. const QString m_tag;
  105. const int m_level;
  106. private:
  107. bool m_hasChild;
  108. };
  109. class RootHandler : public NodeHandler
  110. {
  111. public:
  112. explicit RootHandler(Fb2SaveWriter &writer, const QString &name);
  113. protected:
  114. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  115. protected:
  116. Fb2SaveWriter &m_writer;
  117. };
  118. class BodyHandler : public TextHandler
  119. {
  120. public:
  121. explicit BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts);
  122. protected:
  123. virtual void EndTag(const QString &name);
  124. };
  125. class SpanHandler : public TextHandler
  126. {
  127. public:
  128. explicit SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  129. };
  130. class AnchorHandler : public TextHandler
  131. {
  132. public:
  133. explicit AnchorHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  134. };
  135. class ImageHandler : public TextHandler
  136. {
  137. public:
  138. explicit ImageHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  139. protected:
  140. virtual void EndTag(const QString &name) { Q_UNUSED(name); }
  141. };
  142. class ParagHandler : public TextHandler
  143. {
  144. public:
  145. explicit ParagHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  146. protected:
  147. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  148. virtual void TxtTag(const QString &text);
  149. virtual void EndTag(const QString &name);
  150. private:
  151. virtual int nextLevel() const { return 0; }
  152. void start();
  153. private:
  154. const QString m_parent;
  155. bool m_empty;
  156. };
  157. protected:
  158. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  159. private:
  160. Fb2SaveWriter & m_writer;
  161. };
  162. #endif // Fb2Save_H