fb2html.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "fb2html.h"
  2. #include "fb2utils.h"
  3. #include "fb2text.hpp"
  4. //---------------------------------------------------------------------------
  5. // FbTextElement
  6. //---------------------------------------------------------------------------
  7. void FbTextElement::getChildren(FbElementList &list)
  8. {
  9. FbTextElement child = firstChild();
  10. while (!child.isNull()) {
  11. QString tag = child.tagName().toLower();
  12. if (tag == "div") {
  13. if (child.hasAttribute("class")) list << child;
  14. } else if (tag == "img") {
  15. list << child;
  16. } else {
  17. child.getChildren(list);
  18. }
  19. child = child.nextSibling();
  20. }
  21. }
  22. QString FbTextElement::location()
  23. {
  24. static const QString javascript = FB2::read(":/js/get_location.js").prepend("var element=this;");
  25. return evaluateJavaScript(javascript).toString();
  26. }
  27. void FbTextElement::select()
  28. {
  29. static const QString javascript = FB2::read(":/js/set_cursor.js");
  30. evaluateJavaScript(javascript);
  31. }
  32. bool FbTextElement::hasChild(const QString &style) const
  33. {
  34. FbTextElement child = firstChild();
  35. while (!child.isNull()) {
  36. if (child.tagName() == "DIV" && child.attribute("class").toLower() == style) return true;
  37. child = child.nextSibling();
  38. }
  39. return false;
  40. }
  41. bool FbTextElement::isDiv(const QString &style) const
  42. {
  43. return tagName() == "DIV" && attribute("class").toLower() == style;
  44. }
  45. bool FbTextElement::isBody() const
  46. {
  47. return isDiv("body");
  48. }
  49. bool FbTextElement::isSection() const
  50. {
  51. return isDiv("section");
  52. }
  53. bool FbTextElement::isTitle() const
  54. {
  55. return isDiv("title");
  56. }
  57. bool FbTextElement::isStanza() const
  58. {
  59. return isDiv("stanza");
  60. }
  61. bool FbTextElement::hasTitle() const
  62. {
  63. return FbTextElement(firstChild()).isTitle();
  64. }
  65. //---------------------------------------------------------------------------
  66. // FbInsertCmd
  67. //---------------------------------------------------------------------------
  68. FbInsertCmd::FbInsertCmd(const FbTextElement &element)
  69. : QUndoCommand()
  70. , m_element(element)
  71. , m_parent(element.previousSibling())
  72. , m_inner(false)
  73. {
  74. if (m_parent.isNull()) {
  75. m_parent = m_element.parent();
  76. m_inner = true;
  77. }
  78. }
  79. void FbInsertCmd::redo()
  80. {
  81. if (m_inner) {
  82. m_parent.prependInside(m_element);
  83. } else {
  84. m_parent.appendOutside(m_element);
  85. }
  86. m_element.select();
  87. }
  88. void FbInsertCmd::undo()
  89. {
  90. m_element.takeFromDocument();
  91. }
  92. //---------------------------------------------------------------------------
  93. // FbDeleteCmd
  94. //---------------------------------------------------------------------------
  95. FbDeleteCmd::FbDeleteCmd(const FbTextElement &element)
  96. : QUndoCommand()
  97. , m_element(element)
  98. , m_parent(element.previousSibling())
  99. , m_inner(false)
  100. {
  101. if (m_parent.isNull()) {
  102. m_parent = element.parent();
  103. m_inner = true;
  104. }
  105. }
  106. void FbDeleteCmd::redo()
  107. {
  108. m_element.takeFromDocument();
  109. }
  110. void FbDeleteCmd::undo()
  111. {
  112. if (m_inner) {
  113. m_parent.prependInside(m_element);
  114. } else {
  115. m_parent.appendOutside(m_element);
  116. }
  117. m_element.select();
  118. }
  119. //---------------------------------------------------------------------------
  120. // FbMoveUpCmd
  121. //---------------------------------------------------------------------------
  122. FbMoveUpCmd::FbMoveUpCmd(const FbTextElement &element)
  123. : QUndoCommand()
  124. , m_element(element)
  125. {
  126. }
  127. void FbMoveUpCmd::redo()
  128. {
  129. FbTextElement subling = m_element.previousSibling();
  130. subling.prependOutside(m_element.takeFromDocument());
  131. }
  132. void FbMoveUpCmd::undo()
  133. {
  134. FbTextElement subling = m_element.nextSibling();
  135. subling.appendOutside(m_element.takeFromDocument());
  136. }
  137. //---------------------------------------------------------------------------
  138. // FbMoveLeftCmd
  139. //---------------------------------------------------------------------------
  140. FbMoveLeftCmd::FbMoveLeftCmd(const FbTextElement &element)
  141. : QUndoCommand()
  142. , m_element(element)
  143. , m_subling(element.previousSibling())
  144. , m_parent(element.parent())
  145. {
  146. }
  147. void FbMoveLeftCmd::redo()
  148. {
  149. m_parent.appendOutside(m_element.takeFromDocument());
  150. }
  151. void FbMoveLeftCmd::undo()
  152. {
  153. if (m_subling.isNull()) {
  154. m_parent.prependInside(m_element.takeFromDocument());
  155. } else {
  156. m_subling.appendOutside(m_element.takeFromDocument());
  157. }
  158. }
  159. //---------------------------------------------------------------------------
  160. // FbMoveRightCmd
  161. //---------------------------------------------------------------------------
  162. FbMoveRightCmd::FbMoveRightCmd(const FbTextElement &element)
  163. : QUndoCommand()
  164. , m_element(element)
  165. , m_subling(element.previousSibling())
  166. {
  167. }
  168. void FbMoveRightCmd::redo()
  169. {
  170. m_subling.appendInside(m_element.takeFromDocument());
  171. }
  172. void FbMoveRightCmd::undo()
  173. {
  174. m_subling.appendOutside(m_element.takeFromDocument());
  175. }