fb2save.hpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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 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 QObject, public FbXmlHandler
  33. {
  34. Q_OBJECT
  35. public:
  36. explicit FbHtmlHandler() {}
  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 FbSaveWriter : public QXmlStreamWriter
  49. {
  50. public:
  51. explicit FbSaveWriter(FbTextEdit &view, QByteArray *array);
  52. explicit FbSaveWriter(FbTextEdit &view, QIODevice *device);
  53. explicit FbSaveWriter(FbTextEdit &view, QString *string);
  54. FbTextEdit & view() { return m_view; }
  55. QString filename(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. void writeStyle();
  62. private:
  63. QByteArray downloadFile(const QUrl &url);
  64. void writeContentType(const QString &name, QByteArray &data);
  65. private:
  66. FbTextEdit &m_view;
  67. QStringList m_names;
  68. QString m_style;
  69. };
  70. class FbSaveHandler : public FbHtmlHandler
  71. {
  72. public:
  73. explicit FbSaveHandler(FbSaveWriter &writer);
  74. virtual bool comment(const QString& ch);
  75. bool save();
  76. private:
  77. class TextHandler : public NodeHandler
  78. {
  79. FB2_BEGIN_KEYLIST
  80. Origin,
  81. Anchor,
  82. Table,
  83. Image,
  84. Span,
  85. Parag,
  86. Strong,
  87. Emphas,
  88. Strike,
  89. Sub,
  90. Sup,
  91. Code,
  92. FB2_END_KEYLIST
  93. public:
  94. explicit TextHandler(FbSaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag);
  95. explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
  96. const QString & tag() { return m_tag; }
  97. protected:
  98. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  99. virtual void TxtTag(const QString &text);
  100. virtual void EndTag(const QString &name);
  101. protected:
  102. virtual void writeAtts(const QXmlAttributes &atts);
  103. virtual int nextLevel() const;
  104. protected:
  105. FbSaveWriter &m_writer;
  106. const QString m_tag;
  107. const int m_level;
  108. private:
  109. bool m_hasChild;
  110. };
  111. class RootHandler : public NodeHandler
  112. {
  113. public:
  114. explicit RootHandler(FbSaveWriter &writer, const QString &name);
  115. protected:
  116. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  117. protected:
  118. FbSaveWriter &m_writer;
  119. };
  120. class BodyHandler : public TextHandler
  121. {
  122. public:
  123. explicit BodyHandler(FbSaveWriter &writer, const QString &name, const QXmlAttributes &atts);
  124. protected:
  125. virtual void EndTag(const QString &name);
  126. };
  127. class SpanHandler : public TextHandler
  128. {
  129. public:
  130. explicit SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  131. };
  132. class ParagHandler : public TextHandler
  133. {
  134. public:
  135. explicit ParagHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
  136. protected:
  137. virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
  138. virtual void TxtTag(const QString &text);
  139. virtual void EndTag(const QString &name);
  140. private:
  141. virtual int nextLevel() const { return 0; }
  142. void start();
  143. private:
  144. const QString m_parent;
  145. QXmlAttributes m_atts;
  146. QString m_class;
  147. bool m_empty;
  148. };
  149. protected:
  150. virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
  151. private:
  152. void setDocumentInfo(QWebFrame *frame);
  153. private:
  154. FbSaveWriter & m_writer;
  155. };
  156. #endif // FB2SAVE_H