fb2save.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 codec() const;
  25. private:
  26. void init();
  27. private:
  28. QComboBox * combo;
  29. QLabel * label;
  30. };
  31. class Fb2HtmlHandler : public QObject, public Fb2XmlHandler
  32. {
  33. Q_OBJECT
  34. public:
  35. explicit Fb2HtmlHandler() {}
  36. public slots:
  37. void onAttr(const QString &name, const QString &value);
  38. void onNew(const QString &name);
  39. void onEnd(const QString &name);
  40. void onTxt(const QString &text);
  41. private:
  42. static QString local(const QString &name);
  43. private:
  44. QXmlAttributes m_atts;
  45. };
  46. class Fb2SaveWriter : public QXmlStreamWriter
  47. {
  48. public:
  49. explicit Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
  50. explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
  51. explicit Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds = 0);
  52. virtual ~Fb2SaveWriter();
  53. QString getFileName(const QString &src);
  54. void writeStartElement(const QString &name, int level);
  55. void writeEndElement(int level);
  56. void writeLineEnd();
  57. void writeFiles();
  58. private:
  59. void Init();
  60. QByteArray downloadFile(const QUrl &url);
  61. QByteArray getFileData(const QString &name);
  62. QString newFileName(const QString &path);
  63. private:
  64. QList<int> *m_folds;
  65. Fb2WebView &m_view;
  66. Fb2TemporaryList m_files;
  67. QStringList m_names;
  68. int m_line;
  69. };
  70. class Fb2SaveHandler : public Fb2HtmlHandler
  71. {
  72. public:
  73. explicit Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
  74. explicit Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
  75. bool save();
  76. private:
  77. class BodyHandler : public NodeHandler
  78. {
  79. FB2_BEGIN_KEYLIST
  80. Section,
  81. Anchor,
  82. Table,
  83. Image,
  84. Parag,
  85. Strong,
  86. Emphas,
  87. Strike,
  88. Sub,
  89. Sup,
  90. Code,
  91. FB2_END_KEYLIST
  92. public:
  93. explicit BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag);
  94. explicit BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
  95. const QString & tag() { return m_tag; }
  96. protected:
  97. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  98. virtual void TxtTag(const QString &text);
  99. virtual void EndTag(const QString &name);
  100. protected:
  101. void Init(const QXmlAttributes &atts);
  102. virtual int nextLevel() const;
  103. protected:
  104. Fb2SaveWriter &m_writer;
  105. const QString m_tag;
  106. const int m_level;
  107. private:
  108. bool m_hasChild;
  109. };
  110. class RootHandler : public BodyHandler
  111. {
  112. public:
  113. explicit RootHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts);
  114. protected:
  115. virtual void EndTag(const QString &name);
  116. };
  117. class AnchorHandler : public BodyHandler
  118. {
  119. public:
  120. explicit AnchorHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  121. };
  122. class ImageHandler : public BodyHandler
  123. {
  124. public:
  125. explicit ImageHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  126. protected:
  127. virtual void EndTag(const QString &name) { Q_UNUSED(name); }
  128. };
  129. class ParagHandler : public BodyHandler
  130. {
  131. public:
  132. explicit ParagHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  133. protected:
  134. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  135. virtual void TxtTag(const QString &text);
  136. virtual void EndTag(const QString &name);
  137. private:
  138. virtual int nextLevel() const { return 0; }
  139. void start();
  140. private:
  141. const QString m_parent;
  142. bool m_empty;
  143. };
  144. protected:
  145. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  146. private:
  147. Fb2SaveWriter m_writer;
  148. Fb2WebView & m_view;
  149. };
  150. #endif // Fb2Save_H