Browse Source

Optimize FB2 reading

Kandrashin Denis 12 years ago
parent
commit
8a305ee66b
3 changed files with 39 additions and 338 deletions
  1. 34 181
      source/fb2read.cpp
  2. 2 76
      source/fb2read.hpp
  3. 3 81
      source/res/style.css

+ 34 - 181
source/fb2read.cpp

@@ -86,30 +86,10 @@ bool FbReadThread::parse()
 
 
 #endif
 #endif
 
 
-//---------------------------------------------------------------------------
-//  FbReadHandler::BaseHandler
-//---------------------------------------------------------------------------
-
-void FbReadHandler::BaseHandler::writeAttributes(const QXmlAttributes &atts)
-{
-    int count = atts.count();
-    for (int i = 0; i < count; i++) {
-        if (atts.localName(i) == "href") continue;
-        writer().writeAttribute(atts.qName(i), atts.value(i));
-    }
-}
-
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  FbReadHandler::RootHandler
 //  FbReadHandler::RootHandler
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 
 
-FB2_BEGIN_KEYHASH(FbReadHandler::RootHandler)
-    FB2_KEY( Style  , "stylesheet"  );
-    FB2_KEY( Descr  , "description" );
-    FB2_KEY( Body   , "body"        );
-    FB2_KEY( Binary , "binary"      );
-FB2_END_KEYHASH
-
 FbReadHandler::RootHandler::RootHandler(FbReadHandler &owner, const QString &name)
 FbReadHandler::RootHandler::RootHandler(FbReadHandler &owner, const QString &name)
     : BaseHandler(owner, name)
     : BaseHandler(owner, name)
 {
 {
@@ -118,13 +98,8 @@ FbReadHandler::RootHandler::RootHandler(FbReadHandler &owner, const QString &nam
 
 
 FbXmlHandler::NodeHandler * FbReadHandler::RootHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 FbXmlHandler::NodeHandler * FbReadHandler::RootHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
 {
-    switch (toKeyword(name)) {
-        case Body   : return new TextHandler(m_owner, name, atts, "fb:body");
-        case Descr  : return new DescrHandler(m_owner, name, atts);
-        case Style  : return new StyleHandler(m_owner, name, atts);
-        case Binary : return new BinaryHandler(m_owner, name, atts);
-        default: return NULL;
-    }
+    if (name == "binary") return new BinaryHandler(m_owner, name, atts);
+    return new TextHandler(m_owner, name, atts, "fb:" + name);
 }
 }
 
 
 void FbReadHandler::RootHandler::EndTag(const QString &name)
 void FbReadHandler::RootHandler::EndTag(const QString &name)
@@ -133,108 +108,6 @@ void FbReadHandler::RootHandler::EndTag(const QString &name)
     writer().writeEndElement();
     writer().writeEndElement();
 }
 }
 
 
-//---------------------------------------------------------------------------
-//  FbReadHandler::StyleHandler
-//---------------------------------------------------------------------------
-
-FbReadHandler::StyleHandler::StyleHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-    : BaseHandler(owner, name)
-    , m_empty(true)
-{
-    writer().writeStartElement("fb:" + name);
-    writeAttributes(atts);
-}
-
-void FbReadHandler::StyleHandler::TxtTag(const QString &text)
-{
-    writer().writeCharacters(text);
-    m_empty = false;
-}
-
-void FbReadHandler::StyleHandler::EndTag(const QString &name)
-{
-    Q_UNUSED(name);
-    if (m_empty) writer().writeCharacters(" ");
-    writer().writeEndElement();
-}
-
-//---------------------------------------------------------------------------
-//  FbReadHandler::HeadHandler
-//---------------------------------------------------------------------------
-
-FB2_BEGIN_KEYHASH(FbReadHandler::HeadHandler)
-    FB2_KEY( Image , "image" );
-FB2_END_KEYHASH
-
-FbReadHandler::HeadHandler::HeadHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-    : BaseHandler(owner, name)
-    , m_empty(true)
-{
-    writer().writeStartElement("fb:" + name);
-    writeAttributes(atts);
-}
-
-FbXmlHandler::NodeHandler * FbReadHandler::HeadHandler::NewTag(const QString &name, const QXmlAttributes &atts)
-{
-    Q_UNUSED(atts);
-    m_empty = false;
-    switch (toKeyword(name)) {
-        case Image: return new ImageHandler(m_owner, name, atts);
-        default: return new HeadHandler(m_owner, name, atts);
-    }
-}
-
-void FbReadHandler::HeadHandler::TxtTag(const QString &text)
-{
-    m_empty = false;
-    writer().writeCharacters(text);
-}
-
-void FbReadHandler::HeadHandler::EndTag(const QString &name)
-{
-    Q_UNUSED(name);
-    if (m_empty) writer().writeCharacters(" ");
-    writer().writeEndElement();
-}
-
-//---------------------------------------------------------------------------
-//  FbReadHandler::DescrHandler
-//---------------------------------------------------------------------------
-
-FB2_BEGIN_KEYHASH(FbReadHandler::DescrHandler)
-    FB2_KEY( Title    , "title-info"    );
-    FB2_KEY( Document , "document-info" );
-    FB2_KEY( Publish  , "publish-info"  );
-    FB2_KEY( Custom   , "custom-info"   );
-FB2_END_KEYHASH
-
-FbXmlHandler::NodeHandler * FbReadHandler::DescrHandler::NewTag(const QString &name, const QXmlAttributes &atts)
-{
-    Q_UNUSED(atts);
-    switch (toKeyword(name)) {
-        case Title :
-        case Document :
-        case Publish :
-            return new TitleHandler(m_owner, name, atts);
-        case Custom :
-            return new HeadHandler(m_owner, name, atts);
-        default:
-            return NULL;
-    }
-}
-
-//---------------------------------------------------------------------------
-//  FbReadHandler::TitleHandler
-//---------------------------------------------------------------------------
-
-FbXmlHandler::NodeHandler * FbReadHandler::TitleHandler::NewTag(const QString &name, const QXmlAttributes &atts)
-{
-    if (name == "annotation" || name == "history") {
-        return new TextHandler(m_owner, name, atts, "fb:" + name);
-    }
-    return new HeadHandler(m_owner, name, atts);
-}
-
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  FbReadHandler::TextHandler
 //  FbReadHandler::TextHandler
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
@@ -261,44 +134,55 @@ FbReadHandler::TextHandler::TextHandler(FbReadHandler &owner, const QString &nam
     : BaseHandler(owner, name)
     : BaseHandler(owner, name)
     , m_parent(NULL)
     , m_parent(NULL)
     , m_tag(tag)
     , m_tag(tag)
+    , m_empty(true)
 {
 {
-    Init(atts);
+    Init(name, atts);
 }
 }
 
 
 FbReadHandler::TextHandler::TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag)
 FbReadHandler::TextHandler::TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag)
     : BaseHandler(parent->m_owner, name)
     : BaseHandler(parent->m_owner, name)
     , m_parent(parent)
     , m_parent(parent)
     , m_tag(tag)
     , m_tag(tag)
+    , m_empty(true)
 {
 {
-    Init(atts);
-    if (name == "empty-line") {
-        writer().writeEmptyElement("br");
-    }
+    Init(name, atts);
 }
 }
 
 
-void FbReadHandler::TextHandler::Init(const QXmlAttributes &atts)
+void FbReadHandler::TextHandler::Init(const QString &name, const QXmlAttributes &atts)
 {
 {
-    if (m_tag.isEmpty()) return;
+    Keyword key = toKeyword(name);
     writer().writeStartElement(m_tag);
     writer().writeStartElement(m_tag);
-    QString id = Value(atts, "id");
-    writeAttributes(atts);
+    int count = atts.count();
+    for (int i = 0; i < count; i++) {
+        QString name = atts.qName(i);
+        switch (key) {
+            case Anchor: { if (atts.localName(i) == "href") name = "href"; break; }
+            case Image:  { if (atts.localName(i) == "href") name = "src"; break; }
+        }
+        writer().writeAttribute(name, atts.value(i));
+    }
+    if (name == "empty-line") {
+        writer().writeEmptyElement("br");
+        m_empty = false;
+    }
 }
 }
 
 
 FbXmlHandler::NodeHandler * FbReadHandler::TextHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 FbXmlHandler::NodeHandler * FbReadHandler::TextHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
 {
+    m_empty = false;
     QString tag;
     QString tag;
     switch (toKeyword(name)) {
     switch (toKeyword(name)) {
-        case Anchor : return new AnchorHandler(this, name, atts);
-        case Image  : return new ImageHandler(m_owner, name, atts);
-        case Parag  : tag = "p";   break;
-        case Strong : tag = "b";   break;
-        case Emphas : tag = "i";   break;
-        case Strike : tag = "s";   break;
-        case Code   : tag = "tt";  break;
-        case Sub    : tag = "sub"; break;
-        case Sup    : tag = "sup"; break;
+        case Anchor : tag = "a";    break;
+        case Image  : tag = "img";  break;
+        case Parag  : tag = "p";    break;
+        case Strong : tag = "b";    break;
+        case Emphas : tag = "i";    break;
+        case Strike : tag = "s";    break;
+        case Code   : tag = "tt";   break;
+        case Sub    : tag = "sub";  break;
+        case Sup    : tag = "sup";  break;
         case Style  : tag = "span"; break;
         case Style  : tag = "span"; break;
-        default:    ; tag = "fb:" + name;
+        default     : tag = "fb:" + name;
     }
     }
     return new TextHandler(this, name, atts, tag);
     return new TextHandler(this, name, atts, tag);
 }
 }
@@ -306,13 +190,13 @@ FbXmlHandler::NodeHandler * FbReadHandler::TextHandler::NewTag(const QString &na
 void FbReadHandler::TextHandler::TxtTag(const QString &text)
 void FbReadHandler::TextHandler::TxtTag(const QString &text)
 {
 {
     writer().writeCharacters(text);
     writer().writeCharacters(text);
+    m_empty = false;
 }
 }
 
 
 void FbReadHandler::TextHandler::EndTag(const QString &name)
 void FbReadHandler::TextHandler::EndTag(const QString &name)
 {
 {
     Q_UNUSED(name);
     Q_UNUSED(name);
-    if (m_tag.isEmpty()) return;
-    if (m_tag.left(3) == "fb:") writer().writeCharacters(" ");
+    if (m_empty) writer().writeCharacters(" ");
     writer().writeEndElement();
     writer().writeEndElement();
 }
 }
 
 
@@ -322,37 +206,6 @@ bool FbReadHandler::TextHandler::isNotes() const
     return m_parent ? m_parent->isNotes() : false;
     return m_parent ? m_parent->isNotes() : false;
 }
 }
 
 
-//---------------------------------------------------------------------------
-//  FbReadHandler::SpanHandler
-//---------------------------------------------------------------------------
-
-FbReadHandler::SpanHandler::SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts)
-    : TextHandler(parent, name, atts, "span")
-{
-}
-
-//---------------------------------------------------------------------------
-//  FbReadHandler::AnchorHandler
-//---------------------------------------------------------------------------
-
-FbReadHandler::AnchorHandler::AnchorHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts)
-    : TextHandler(parent, name, atts, "a")
-{
-    QString href = Value(atts, "href");
-    writer().writeAttribute("href", href);
-}
-
-//---------------------------------------------------------------------------
-//  FbReadHandler::ImageHandler
-//---------------------------------------------------------------------------
-
-FbReadHandler::ImageHandler::ImageHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-    : TextHandler(owner, name, atts, "img")
-{
-    QString href = Value(atts, "href");
-    writer().writeAttribute("src", href);
-}
-
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------
 //  FbReadHandler::BinaryHandler
 //  FbReadHandler::BinaryHandler
 //---------------------------------------------------------------------------
 //---------------------------------------------------------------------------

+ 2 - 76
source/fb2read.hpp

@@ -63,19 +63,12 @@ private:
             : NodeHandler(name), m_owner(owner) {}
             : NodeHandler(name), m_owner(owner) {}
     protected:
     protected:
         QXmlStreamWriter & writer() { return m_owner.writer(); }
         QXmlStreamWriter & writer() { return m_owner.writer(); }
-        void writeAttributes(const QXmlAttributes &atts);
     protected:
     protected:
         FbReadHandler &m_owner;
         FbReadHandler &m_owner;
     };
     };
 
 
     class RootHandler : public BaseHandler
     class RootHandler : public BaseHandler
     {
     {
-        FB2_BEGIN_KEYLIST
-            Style,
-            Descr,
-            Body,
-            Binary,
-        FB2_END_KEYLIST
     public:
     public:
         explicit RootHandler(FbReadHandler &owner, const QString &name);
         explicit RootHandler(FbReadHandler &owner, const QString &name);
     protected:
     protected:
@@ -83,56 +76,6 @@ private:
         virtual void EndTag(const QString &name);
         virtual void EndTag(const QString &name);
     };
     };
 
 
-    class StyleHandler : public BaseHandler
-    {
-    public:
-        explicit StyleHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts);
-    protected:
-        virtual void TxtTag(const QString &text);
-        virtual void EndTag(const QString &name);
-    private:
-        bool m_empty;
-    };
-
-    class HeadHandler : public BaseHandler
-    {
-        FB2_BEGIN_KEYLIST
-            Image,
-        FB2_END_KEYLIST
-    public:
-        explicit HeadHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts);
-    protected:
-        virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
-        virtual void TxtTag(const QString &text);
-        virtual void EndTag(const QString &name);
-    private:
-        bool m_empty;
-    };
-
-    class DescrHandler : public HeadHandler
-    {
-        FB2_BEGIN_KEYLIST
-            Title,
-            Document,
-            Publish,
-            Custom,
-        FB2_END_KEYLIST
-    public:
-        explicit DescrHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-            : HeadHandler(owner, name, atts) {}
-    protected:
-        virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
-    };
-
-    class TitleHandler : public HeadHandler
-    {
-    public:
-        explicit TitleHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts)
-            : HeadHandler(owner, name, atts) {}
-    protected:
-        virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
-    };
-
     class TextHandler : public BaseHandler
     class TextHandler : public BaseHandler
     {
     {
         FB2_BEGIN_KEYLIST
         FB2_BEGIN_KEYLIST
@@ -156,30 +99,13 @@ private:
         virtual void TxtTag(const QString &text);
         virtual void TxtTag(const QString &text);
         virtual void EndTag(const QString &name);
         virtual void EndTag(const QString &name);
     protected:
     protected:
-        void Init(const QXmlAttributes &atts);
+        void Init(const QString &name, const QXmlAttributes &atts);
         bool isNotes() const;
         bool isNotes() const;
     protected:
     protected:
         TextHandler *m_parent;
         TextHandler *m_parent;
         QString m_tag;
         QString m_tag;
         QString m_style;
         QString m_style;
-    };
-
-    class SpanHandler : public TextHandler
-    {
-    public:
-        explicit SpanHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
-    };
-
-    class AnchorHandler : public TextHandler
-    {
-    public:
-        explicit AnchorHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts);
-    };
-
-    class ImageHandler : public TextHandler
-    {
-    public:
-        explicit ImageHandler(FbReadHandler &owner, const QString &name, const QXmlAttributes &atts);
+        bool m_empty;
     };
     };
 
 
     class BinaryHandler : public BaseHandler
     class BinaryHandler : public BaseHandler

+ 3 - 81
source/res/style.css

@@ -2,93 +2,15 @@ body {
   font-family: serif;
   font-family: serif;
 }
 }
 
 
-fb\:stylesheet{
+body fb\:description {
   display: none;
   display: none;
 }
 }
 
 
-fb\:description div {
+body fb\:stylesheet {
   display: none;
   display: none;
 }
 }
 
 
-fb\:description fb\:title-info {
-  display: block;
-}
-
-fb\:description fb\:title-info div {
-  display: none;
-}
-
-fb\:description fb\:title-info fb\:annotation {
-  display: block;
-  padding-left: 10;
-  padding-right: 10;
-  border-width: thin;
-  border-style: solid;
-  border-color: blue;
-  border-top-left-radius: 10;
-  border-top-right-radius: 10;
-  border-bottom-left-radius: 10;
-  border-bottom-right-radius: 10;
-  margin-top: 0;
-  margin-bottom: 1em;
-}
-
-fb\:annotation:before {
-    color: gray;
-    text-align: right;
-    content: "<annotation>";
-    display: inline-block;
-    position: relative;
-    font-size: 0.8em;
-    width: 100%;
-    margin-top: 0;
-    margin-bottom: -1em;
-}
-
-fb\:description fb\:title-info fb\:annotation div {
-  display: block;
-}
-
-fb\:description fb\:document-info {
-  display: block;
-}
-
-fb\:description fb\:document-info div {
-  display: none;
-}
-
-fb\:description fb\:document-info fb\:history {
-  display: block;
-  padding-left: 10;
-  padding-right: 10;
-  border-width: thin;
-  border-style: solid;
-  border-color: blue;
-  border-top-left-radius: 10;
-  border-top-right-radius: 10;
-  border-bottom-left-radius: 10;
-  border-bottom-right-radius: 10;
-  margin-top: 1em;
-  margin-bottom: 1em;
-}
-
-fb\:history:before {
-    color: gray;
-    text-align: right;
-    content: "<history>";
-    display: inline-block;
-    position: relative;
-    font-size: 0.8em;
-    width: 100%;
-    margin-top: 0;
-    margin-bottom: -1em;
-}
-
-fb\:description fb\:document-info fb\:history div {
-  display: block;
-}
-
-fb\:body {
+body+fb\:body {
   display: block;
   display: block;
 }
 }