fb2save.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #include <QtGui>
  2. #include <QtDebug>
  3. #include "fb2save.h"
  4. #include "fb2view.h"
  5. //---------------------------------------------------------------------------
  6. // Fb2SaveWriter
  7. //---------------------------------------------------------------------------
  8. Fb2SaveWriter::Fb2SaveWriter(QIODevice &device)
  9. : QXmlStreamWriter(&device)
  10. {
  11. setAutoFormatting(true);
  12. setAutoFormattingIndent(2);
  13. }
  14. //---------------------------------------------------------------------------
  15. // Fb2SaveHandler::BodyHandler
  16. //---------------------------------------------------------------------------
  17. FB2_BEGIN_KEYHASH(Fb2SaveHandler::BodyHandler)
  18. FB2_KEY( Section , "div" );
  19. FB2_KEY( Section , "annotation" );
  20. FB2_KEY( Section , "author" );
  21. FB2_KEY( Section , "cite" );
  22. FB2_KEY( Section , "date" );
  23. FB2_KEY( Section , "epigraph" );
  24. FB2_KEY( Section , "poem" );
  25. FB2_KEY( Section , "section" );
  26. FB2_KEY( Section , "stanza" );
  27. FB2_KEY( Section , "subtitle" );
  28. FB2_KEY( Section , "title" );
  29. FB2_KEY( Anchor , "a" );
  30. FB2_KEY( Table , "table" );
  31. FB2_KEY( Image , "image" );
  32. FB2_KEY( Parag , "empty-line" );
  33. FB2_KEY( Parag , "p" );
  34. FB2_KEY( Parag , "v" );
  35. FB2_KEY( Strong , "b" );
  36. FB2_KEY( Emphas , "i" );
  37. FB2_KEY( Strike , "strike" );
  38. FB2_KEY( Sub , "sub" );
  39. FB2_KEY( Sup , "sup" );
  40. FB2_KEY( Code , "tt" );
  41. FB2_END_KEYHASH
  42. Fb2SaveHandler::BodyHandler::BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style)
  43. : NodeHandler(name)
  44. , m_writer(writer)
  45. , m_tag(tag)
  46. , m_style(style)
  47. {
  48. Init(atts);
  49. }
  50. Fb2SaveHandler::BodyHandler::BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style)
  51. : NodeHandler(name)
  52. , m_writer(parent->m_writer)
  53. , m_tag(tag)
  54. , m_style(style)
  55. {
  56. Init(atts);
  57. }
  58. void Fb2SaveHandler::BodyHandler::Init(const QXmlAttributes &atts)
  59. {
  60. if (m_tag.isEmpty()) return;
  61. m_writer.writeStartElement(m_tag);
  62. /*
  63. QString id = Value(atts, "id");
  64. if (!id.isEmpty()) {
  65. if (m_style == "section" && isNotes()) m_style = "note";
  66. m_writer.writeAttribute("id", id);
  67. } else if (m_tag == "div" || m_tag == "img") {
  68. m_writer.writeAttribute("id", m_writer.newId());
  69. }
  70. if (!m_style.isEmpty()) {
  71. if (m_style == "body" && Value(atts, "name").toLower() == "notes") m_style = "notes";
  72. m_writer.writeAttribute("class", m_style);
  73. }
  74. */
  75. }
  76. Fb2XmlHandler::NodeHandler * Fb2SaveHandler::BodyHandler::NewTag(const QString &name, const QXmlAttributes &atts)
  77. {
  78. QString tag, style;
  79. switch (toKeyword(name)) {
  80. case Anchor : return new AnchorHandler(this, name, atts);
  81. case Image : return new ImageHandler(this, name, atts);
  82. case Section : tag = "div"; style = name; break;
  83. case Parag : tag = "p"; break;
  84. case Strong : tag = "strong" ; break;
  85. case Emphas : tag = "emphasis" ; break;
  86. case Strike : tag = "strikethrough" ; break;
  87. case Code : tag = "cide" ; break;
  88. case Sub : tag = "sub" ; break;
  89. case Sup : tag = "sup" ; break;
  90. }
  91. return new BodyHandler(this, name, atts, tag, style);
  92. }
  93. void Fb2SaveHandler::BodyHandler::TxtTag(const QString &text)
  94. {
  95. m_writer.writeCharacters(text);
  96. }
  97. void Fb2SaveHandler::BodyHandler::EndTag(const QString &name)
  98. {
  99. Q_UNUSED(name);
  100. if (m_tag.isEmpty()) return;
  101. if (m_tag == "div") m_writer.writeCharacters(" ");
  102. m_writer.writeEndElement();
  103. }
  104. //---------------------------------------------------------------------------
  105. // Fb2SaveHandler::AnchorHandler
  106. //---------------------------------------------------------------------------
  107. Fb2SaveHandler::AnchorHandler::AnchorHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts)
  108. : BodyHandler(parent, name, atts, "a")
  109. {
  110. QString href = Value(atts, "href");
  111. m_writer.writeAttribute("href", href);
  112. }
  113. //---------------------------------------------------------------------------
  114. // Fb2SaveHandler::ImageHandler
  115. //---------------------------------------------------------------------------
  116. Fb2SaveHandler::ImageHandler::ImageHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts)
  117. : BodyHandler(parent, name, atts, "img")
  118. {
  119. /*
  120. QString href = Value(atts, "href");
  121. while (href.left(1) == "#") href.remove(0, 1);
  122. QString path = m_writer.getFile(href);
  123. m_writer.writeAttribute("src", path);
  124. m_writer.writeAttribute("alt", href);
  125. */
  126. }
  127. //---------------------------------------------------------------------------
  128. // Fb2SaveHandler
  129. //---------------------------------------------------------------------------
  130. Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QIODevice &device)
  131. : Fb2XmlHandler()
  132. , m_writer(device)
  133. , m_view(view)
  134. {
  135. }
  136. Fb2XmlHandler::NodeHandler * Fb2SaveHandler::CreateRoot(const QString &name, const QXmlAttributes &atts)
  137. {
  138. if (name == "body") return new BodyHandler(m_writer, name, atts, "fictionbook");
  139. m_error = QObject::tr("The tag <body> was not found.");
  140. return 0;
  141. }