Browse Source

Replace: linxml2 HTML parsing => webkit DOM pocessing

Kandrashin Denis 13 years ago
parent
commit
999fd5e127
5 changed files with 73 additions and 64 deletions
  1. 38 8
      source/fb2save.cpp
  2. 25 5
      source/fb2save.h
  3. 8 35
      source/fb2view.cpp
  4. 0 14
      source/fb2view.hpp
  5. 2 2
      source/js/export.js

+ 38 - 8
source/fb2save.cpp

@@ -9,6 +9,36 @@
 #include <QNetworkRequest>
 #include <QScopedPointer>
 
+//---------------------------------------------------------------------------
+//  Fb2HtmlHandler
+//---------------------------------------------------------------------------
+
+QString Fb2HtmlHandler::local(const QString &name)
+{
+    return name.mid(name.lastIndexOf(":"));
+}
+
+void Fb2HtmlHandler::onAttr(const QString &name, const QString &value)
+{
+    m_atts.append(name, "", local(name), value);
+}
+
+void Fb2HtmlHandler::onNew(const QString &name)
+{
+    startElement("", local(name), name, m_atts);
+    m_atts.clear();
+}
+
+void Fb2HtmlHandler::onTxt(const QString &text)
+{
+    characters(text);
+}
+
+void Fb2HtmlHandler::onEnd(const QString &name)
+{
+    endElement("", local(name), name);
+}
+
 //---------------------------------------------------------------------------
 //  Fb2SaveWriter
 //---------------------------------------------------------------------------
@@ -22,18 +52,18 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *fo
     Init();
 }
 
-Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QIODevice *device)
+Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds)
     : QXmlStreamWriter(device)
-    , m_folds(0)
+    , m_folds(folds)
     , m_view(view)
     , m_line(0)
 {
     Init();
 }
 
-Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QString *string)
+Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds)
     : QXmlStreamWriter(string)
-    , m_folds(0)
+    , m_folds(folds)
     , m_view(view)
     , m_line(0)
 {
@@ -335,14 +365,14 @@ void Fb2SaveHandler::ParagHandler::start()
 //  Fb2SaveHandler
 //---------------------------------------------------------------------------
 
-Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QIODevice *device)
-    : Fb2XmlHandler()
-    , m_writer(view, device)
+Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds)
+    : Fb2HtmlHandler()
+    , m_writer(view, device, folds)
 {
 }
 
 Fb2SaveHandler::Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds)
-    : Fb2XmlHandler()
+    : Fb2HtmlHandler()
     , m_writer(view, array, folds)
 {
 }

+ 25 - 5
source/fb2save.h

@@ -14,12 +14,32 @@
 
 class Fb2WebView;
 
+class Fb2HtmlHandler : public QObject, public Fb2XmlHandler
+{
+    Q_OBJECT
+
+public:
+    explicit Fb2HtmlHandler() {}
+
+public slots:
+    void onAttr(const QString &name, const QString &value);
+    void onNew(const QString &name);
+    void onEnd(const QString &name);
+    void onTxt(const QString &text);
+
+private:
+    static QString local(const QString &name);
+
+private:
+    QXmlAttributes m_atts;
+};
+
 class Fb2SaveWriter : public QXmlStreamWriter
 {
 public:
     explicit Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
-    explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device);
-    explicit Fb2SaveWriter(Fb2WebView &view, QString *string);
+    explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
+    explicit Fb2SaveWriter(Fb2WebView &view, QString *string, QList<int> *folds = 0);
     virtual ~Fb2SaveWriter();
     QString getFileName(const QString &src);
     void writeStartElement(const QString &name, int level);
@@ -39,11 +59,11 @@ private:
     int m_line;
 };
 
-class Fb2SaveHandler : public Fb2XmlHandler
+class Fb2SaveHandler : public Fb2HtmlHandler
 {
 public:
-    explicit Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds);
-    explicit Fb2SaveHandler(Fb2WebView &view, QIODevice *device);
+    explicit Fb2SaveHandler(Fb2WebView &view, QByteArray *array, QList<int> *folds = 0);
+    explicit Fb2SaveHandler(Fb2WebView &view, QIODevice *device, QList<int> *folds = 0);
 
 private:
     class BodyHandler : public NodeHandler

+ 8 - 35
source/fb2view.cpp

@@ -15,26 +15,6 @@
 #include <QWebFrame>
 #include <QWebPage>
 
-void Fb2HtmlHandler::onNew(const QString &name)
-{
-    qCritical() << "New: " << name;
-}
-
-void Fb2HtmlHandler::onTxt(const QString &text)
-{
-    qCritical() << "Txt: " << text;
-}
-
-void Fb2HtmlHandler::onEnd(const QString &name)
-{
-    qCritical() << "End: " << name;
-}
-
-void Fb2HtmlHandler::attr(const QString &name, const QString &value)
-{
-    qCritical() << "Attr: " << name << " = " << value;
-}
-
 //---------------------------------------------------------------------------
 //  Fb2NoteView
 //---------------------------------------------------------------------------
@@ -198,23 +178,19 @@ void Fb2WebView::load(const QString &filename, const QString &xml)
 bool Fb2WebView::save(QIODevice *device)
 {
     Fb2SaveHandler handler(*this, device);
-    QXmlInputSource source;
-    source.setData(toBodyXml());
-    XML2::HtmlReader reader;
-    reader.setContentHandler(&handler);
-    reader.setErrorHandler(&handler);
-    return reader.parse(source);
+    static const QString javascript = FB2::read(":/js/export.js");
+    page()->mainFrame()->addToJavaScriptWindowObject("handler", &handler);
+    page()->mainFrame()->evaluateJavaScript(javascript);
+    return true;
 }
 
 bool Fb2WebView::save(QByteArray *array, QList<int> *folds)
 {
     Fb2SaveHandler handler(*this, array, folds);
-    QXmlInputSource source;
-    source.setData(toBodyXml());
-    XML2::HtmlReader reader;
-    reader.setContentHandler(&handler);
-    reader.setErrorHandler(&handler);
-    return reader.parse(source);
+    static const QString javascript = FB2::read(":/js/export.js");
+    page()->mainFrame()->addToJavaScriptWindowObject("handler", &handler);
+    page()->mainFrame()->evaluateJavaScript(javascript);
+    return true;
 }
 
 bool Fb2WebView::save(QString *string)
@@ -331,9 +307,6 @@ void Fb2WebView::insertNote()
 
 void Fb2WebView::insertLink()
 {
-    static const QString javascript = FB2::read(":/js/export.js");
-    page()->mainFrame()->addToJavaScriptWindowObject("handler", &handler);
-    page()->mainFrame()->evaluateJavaScript(javascript);
 }
 
 void Fb2WebView::execCommand(const QString &cmd, const QString &arg)

+ 0 - 14
source/fb2view.hpp

@@ -15,19 +15,6 @@ QT_END_NAMESPACE
 
 class Fb2NoteView;
 
-class Fb2HtmlHandler : public QObject
-{
-    Q_OBJECT
-
-public:
-    Fb2HtmlHandler() {}
-public slots:
-    void onNew(const QString &name);
-    void onTxt(const QString &text);
-    void onEnd(const QString &name);
-    void attr(const QString &name, const QString &value);
-};
-
 class Fb2BaseWebView : public QWebView
 {
     Q_OBJECT
@@ -123,7 +110,6 @@ private:
     QWebElement doc();
 
 private:
-    Fb2HtmlHandler handler;
     QWebInspector * m_inspector;
     Fb2TemporaryList m_files;
     Fb2NoteView *m_noteView;

+ 2 - 2
source/js/export.js

@@ -2,10 +2,10 @@
     if (node.nodeName === "#text") {
         handler.onTxt(node.data);
     } else {
-        handler.onNew(node.nodeName);
         var atts = node.attributes;
         var count = atts.length;
-        for (var i = 0; i < count; i++) handler.attr(atts[i].name, atts[i].value);
+        for (var i = 0; i < count; i++) handler.onAttr(atts[i].name, atts[i].value);
+        handler.onNew(node.nodeName);
         for (var n = node.firstChild; n !== null; n = n.nextSibling) f(n);
         handler.onEnd(node.nodeName);
     }