fb2save.hpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #ifndef Fb2Save_H
  2. #define Fb2Save_H
  3. #include "fb2xml.h"
  4. #include "fb2temp.hpp"
  5. #include <QByteArray>
  6. #include <QStringList>
  7. #include <QXmlStreamWriter>
  8. #include "fb2temp.hpp"
  9. class Fb2WebView;
  10. class Fb2HtmlHandler : public QObject, public Fb2XmlHandler
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit Fb2HtmlHandler() {}
  15. public slots:
  16. void onAttr(const QString &name, const QString &value);
  17. void onNew(const QString &name);
  18. void onEnd(const QString &name);
  19. void onTxt(const QString &text);
  20. private:
  21. static QString local(const QString &name);
  22. private:
  23. QXmlAttributes m_atts;
  24. };
  25. class Fb2SaveWriter : public QXmlStreamWriter
  26. {
  27. public:
  28. explicit Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
  29. explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
  30. explicit Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds = 0);
  31. virtual ~Fb2SaveWriter();
  32. QString getFileName(const QString &src);
  33. void writeStartElement(const QString &name, int level);
  34. void writeEndElement(int level);
  35. void writeLineEnd();
  36. void writeFiles();
  37. private:
  38. void Init();
  39. QByteArray downloadFile(const QUrl &url);
  40. QByteArray getFileData(const QString &name);
  41. QString newFileName(const QString &path);
  42. private:
  43. QList<int> *m_folds;
  44. Fb2WebView &m_view;
  45. Fb2TemporaryList m_files;
  46. QStringList m_names;
  47. int m_line;
  48. };
  49. class Fb2SaveHandler : public Fb2HtmlHandler
  50. {
  51. public:
  52. explicit Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
  53. explicit Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
  54. bool save();
  55. private:
  56. class BodyHandler : public NodeHandler
  57. {
  58. FB2_BEGIN_KEYLIST
  59. Section,
  60. Anchor,
  61. Table,
  62. Image,
  63. Parag,
  64. Strong,
  65. Emphas,
  66. Strike,
  67. Sub,
  68. Sup,
  69. Code,
  70. FB2_END_KEYLIST
  71. public:
  72. explicit BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag);
  73. explicit BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
  74. const QString & tag() { return m_tag; }
  75. protected:
  76. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  77. virtual void TxtTag(const QString &text);
  78. virtual void EndTag(const QString &name);
  79. protected:
  80. void Init(const QXmlAttributes &atts);
  81. virtual int nextLevel() const;
  82. protected:
  83. Fb2SaveWriter &m_writer;
  84. const QString m_tag;
  85. const int m_level;
  86. private:
  87. bool m_hasChild;
  88. };
  89. class RootHandler : public BodyHandler
  90. {
  91. public:
  92. explicit RootHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts);
  93. protected:
  94. virtual void EndTag(const QString &name);
  95. };
  96. class AnchorHandler : public BodyHandler
  97. {
  98. public:
  99. explicit AnchorHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  100. };
  101. class ImageHandler : public BodyHandler
  102. {
  103. public:
  104. explicit ImageHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  105. protected:
  106. virtual void EndTag(const QString &name) { Q_UNUSED(name); }
  107. };
  108. class ParagHandler : public BodyHandler
  109. {
  110. public:
  111. explicit ParagHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts);
  112. protected:
  113. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  114. virtual void TxtTag(const QString &text);
  115. virtual void EndTag(const QString &name);
  116. private:
  117. virtual int nextLevel() const { return 0; }
  118. void start();
  119. private:
  120. const QString m_parent;
  121. bool m_empty;
  122. };
  123. protected:
  124. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  125. private:
  126. Fb2SaveWriter m_writer;
  127. Fb2WebView & m_view;
  128. };
  129. #endif // Fb2Save_H