fb2html.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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::isDiv(const QString &style) const
  33. {
  34. return tagName() == "DIV" && attribute("class").toLower() == style;
  35. }
  36. bool FbTextElement::isBody() const
  37. {
  38. return isDiv("body");
  39. }
  40. bool FbTextElement::isSection() const
  41. {
  42. return isDiv("section");
  43. }
  44. bool FbTextElement::isTitle() const
  45. {
  46. return isDiv("title");
  47. }
  48. bool FbTextElement::isStanza() const
  49. {
  50. return isDiv("stanza");
  51. }
  52. bool FbTextElement::hasTitle() const
  53. {
  54. return FbTextElement(firstChild()).isTitle();
  55. }
  56. //---------------------------------------------------------------------------
  57. // FbInsertCmd
  58. //---------------------------------------------------------------------------
  59. FbInsertCmd::FbInsertCmd(const FbTextElement &element)
  60. : QUndoCommand()
  61. , m_element(element)
  62. , m_parent(element.previousSibling())
  63. , m_inner(false)
  64. {
  65. if (m_parent.isNull()) {
  66. m_parent = m_element.parent();
  67. m_inner = true;
  68. }
  69. }
  70. void FbInsertCmd::redo()
  71. {
  72. if (m_inner) {
  73. m_parent.prependInside(m_element);
  74. } else {
  75. m_parent.appendOutside(m_element);
  76. }
  77. m_element.select();
  78. }
  79. void FbInsertCmd::undo()
  80. {
  81. m_element.takeFromDocument();
  82. }
  83. //---------------------------------------------------------------------------
  84. // FbDeleteCmd
  85. //---------------------------------------------------------------------------
  86. FbDeleteCmd::FbDeleteCmd(const FbTextElement &element)
  87. : QUndoCommand()
  88. , m_element(element)
  89. , m_parent(element.previousSibling())
  90. , m_inner(false)
  91. {
  92. if (m_parent.isNull()) {
  93. m_parent = element.parent();
  94. m_inner = true;
  95. }
  96. }
  97. void FbDeleteCmd::redo()
  98. {
  99. m_element.takeFromDocument();
  100. }
  101. void FbDeleteCmd::undo()
  102. {
  103. if (m_inner) {
  104. m_parent.prependInside(m_element);
  105. } else {
  106. m_parent.appendOutside(m_element);
  107. }
  108. m_element.select();
  109. }
  110. //---------------------------------------------------------------------------
  111. // FbMoveUpCmd
  112. //---------------------------------------------------------------------------
  113. FbMoveUpCmd::FbMoveUpCmd(const FbTextElement &element)
  114. : QUndoCommand()
  115. , m_element(element)
  116. {
  117. }
  118. void FbMoveUpCmd::redo()
  119. {
  120. FbTextElement subling = m_element.previousSibling();
  121. subling.prependOutside(m_element.takeFromDocument());
  122. }
  123. void FbMoveUpCmd::undo()
  124. {
  125. FbTextElement subling = m_element.nextSibling();
  126. subling.appendOutside(m_element.takeFromDocument());
  127. }
  128. //---------------------------------------------------------------------------
  129. // FbMoveLeftCmd
  130. //---------------------------------------------------------------------------
  131. FbMoveLeftCmd::FbMoveLeftCmd(const FbTextElement &element)
  132. : QUndoCommand()
  133. , m_element(element)
  134. , m_subling(element.previousSibling())
  135. , m_parent(element.parent())
  136. {
  137. }
  138. void FbMoveLeftCmd::redo()
  139. {
  140. m_parent.appendOutside(m_element.takeFromDocument());
  141. }
  142. void FbMoveLeftCmd::undo()
  143. {
  144. if (m_subling.isNull()) {
  145. m_parent.prependInside(m_element.takeFromDocument());
  146. } else {
  147. m_subling.appendOutside(m_element.takeFromDocument());
  148. }
  149. }
  150. //---------------------------------------------------------------------------
  151. // FbMoveRightCmd
  152. //---------------------------------------------------------------------------
  153. FbMoveRightCmd::FbMoveRightCmd(const FbTextElement &element)
  154. : QUndoCommand()
  155. , m_element(element)
  156. , m_subling(element.previousSibling())
  157. {
  158. }
  159. void FbMoveRightCmd::redo()
  160. {
  161. m_subling.appendInside(m_element.takeFromDocument());
  162. }
  163. void FbMoveRightCmd::undo()
  164. {
  165. m_subling.appendOutside(m_element.takeFromDocument());
  166. }