Răsfoiți Sursa

Fix XML text selection

Kandrashin Denis 12 ani în urmă
părinte
comite
eb0c07c28a
3 a modificat fișierele cu 8 adăugiri și 4 ștergeri
  1. 3 2
      source/fb2save.cpp
  2. 4 1
      source/fb2save.hpp
  3. 1 1
      source/js/export.js

+ 3 - 2
source/fb2save.cpp

@@ -119,6 +119,7 @@ void FbHtmlHandler::onNew(const QString &name)
 
 void FbHtmlHandler::onTxt(const QString &text)
 {
+    m_lastTextLength = text.length();
     characters(text);
 }
 
@@ -534,12 +535,12 @@ bool FbSaveHandler::comment(const QString& ch)
 
 void FbSaveHandler::onAnchor(int offset)
 {
-    m_writer.setAnchor(offset);
+    m_writer.setAnchor(offset - m_lastTextLength);
 }
 
 void FbSaveHandler::onFocus(int offset)
 {
-    m_writer.setFocus(offset);
+    m_writer.setFocus(offset - m_lastTextLength);
 }
 
 FbXmlHandler::NodeHandler * FbSaveHandler::CreateRoot(const QString &name, const QXmlAttributes &atts)

+ 4 - 1
source/fb2save.hpp

@@ -47,7 +47,7 @@ class FbHtmlHandler : public FbXmlHandler
     Q_OBJECT
 
 public:
-    explicit FbHtmlHandler() {}
+    explicit FbHtmlHandler(): m_lastTextLength(0) {}
 
 public slots:
     void onAttr(const QString &name, const QString &value);
@@ -56,6 +56,9 @@ public slots:
     void onTxt(const QString &text);
     void onCom(const QString &text);
 
+protected:
+    int m_lastTextLength;
+
 private:
     static QString local(const QString &name);
 

+ 1 - 1
source/js/export.js

@@ -4,9 +4,9 @@
     var focusNode = selection.focusNode;
     var f = function(node) {
         if (node.nodeName === "#text") {
+            handler.onTxt(node.data);
             if (anchorNode === node) handler.onAnchor(selection.anchorOffset);
             if (focusNode === node) handler.onFocus(selection.focusOffset);
-            handler.onTxt(node.data);
         } else if (node.nodeName === "#comment") {
             handler.onCom(node.data);
         } else {