浏览代码

Move <stylesheet> to <header>

Kandrashin Denis 12 年之前
父节点
当前提交
14d5c3d1cd
共有 3 个文件被更改,包括 88 次插入16 次删除
  1. 58 15
      source/fb2read.cpp
  2. 22 1
      source/fb2read.hpp
  3. 8 0
      source/fb2save.hpp

+ 58 - 15
source/fb2read.cpp

@@ -90,24 +90,80 @@ bool FbReadThread::parse()
 //  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)
     : BaseHandler(owner, name)
+    , m_head(true)
 {
-    writer().writeStartElement("body");
 }
 
 FbXmlHandler::NodeHandler * FbReadHandler::RootHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
-    if (name == "binary") return new BinaryHandler(m_owner, name, atts);
+    switch (toKeyword(name)) {
+        case Binary: return new BinaryHandler(m_owner, name, atts);
+        case Style: return new StyleHandler(m_owner, name, m_style);
+        default: ;
+    }
+
+    if (m_head) {
+        writeHeader();
+        m_head = false;
+    }
+
     return new TextHandler(m_owner, name, atts, "fb:" + name);
 }
 
 void FbReadHandler::RootHandler::EndTag(const QString &name)
 {
     Q_UNUSED(name);
+    if (!m_head) writer().writeEndElement();
+}
+
+void FbReadHandler::RootHandler::writeScript(const QString &src)
+{
+    writer().writeStartElement("script");
+    writer().writeAttribute("type", "text/javascript");
+    writer().writeAttribute("src", src);
+    writer().writeCharacters(" ");
     writer().writeEndElement();
 }
 
+void FbReadHandler::RootHandler::writeHeader()
+{
+    writer().writeStartElement("head");
+    writeScript("qrc:/js/jquery.js");
+    writeScript("qrc:/js/location.js");
+    if (!m_style.isEmpty()) {
+        writer().writeStartElement("style");
+        writer().writeAttribute("type", "text/css");
+        writer().writeCharacters(m_style);
+        writer().writeEndElement();
+    }
+    writer().writeEndElement();
+    writer().writeStartElement("body");
+}
+
+//---------------------------------------------------------------------------
+//  FbReadHandler::StyleHandler
+//---------------------------------------------------------------------------
+
+FbReadHandler::StyleHandler::StyleHandler(FbReadHandler &owner, const QString &name, QString &text)
+    : BaseHandler(owner, name)
+    , m_text(text)
+{
+}
+
+void FbReadHandler::StyleHandler::TxtTag(const QString &text)
+{
+    m_text += text;
+}
+
 //---------------------------------------------------------------------------
 //  FbReadHandler::TextHandler
 //---------------------------------------------------------------------------
@@ -246,10 +302,6 @@ FbReadHandler::FbReadHandler(FbReadThread &thread, QXmlStreamWriter &writer)
     m_writer.setAutoFormatting(true);
     m_writer.setAutoFormattingIndent(2);
     m_writer.writeStartElement("html");
-    m_writer.writeStartElement("head");
-    writeScript("qrc:/js/jquery.js");
-    writeScript("qrc:/js/location.js");
-    m_writer.writeEndElement();
 }
 
 FbReadHandler::~FbReadHandler()
@@ -257,15 +309,6 @@ FbReadHandler::~FbReadHandler()
     m_writer.writeEndElement();
 }
 
-void FbReadHandler::writeScript(const QString &src)
-{
-    m_writer.writeStartElement("script");
-    m_writer.writeAttribute("type", "text/javascript");
-    m_writer.writeAttribute("src", src);
-    m_writer.writeCharacters(" ");
-    m_writer.writeEndElement();
-}
-
 FbXmlHandler::NodeHandler * FbReadHandler::CreateRoot(const QString &name, const QXmlAttributes &atts)
 {
     Q_UNUSED(atts);

+ 22 - 1
source/fb2read.hpp

@@ -69,11 +69,33 @@ private:
 
     class RootHandler : public BaseHandler
     {
+        FB2_BEGIN_KEYLIST
+            Style,
+            Descr,
+            Body,
+            Binary,
+       FB2_END_KEYLIST
     public:
         explicit RootHandler(FbReadHandler &owner, const QString &name);
     protected:
         virtual NodeHandler * NewTag(const QString & name, const QXmlAttributes &atts);
         virtual void EndTag(const QString &name);
+    private:
+        void writeScript(const QString &src);
+        void writeHeader();
+    private:
+        QString m_style;
+        bool m_head;
+    };
+
+    class StyleHandler : public BaseHandler
+    {
+    public:
+        explicit StyleHandler(FbReadHandler &owner, const QString &name, QString &text);
+    protected:
+        virtual void TxtTag(const QString &text);
+    private:
+        QString &m_text;
     };
 
     class TextHandler : public BaseHandler
@@ -125,7 +147,6 @@ protected:
 
 private:
     void addFile(const QString &name, const QByteArray &data);
-    void writeScript(const QString &src);
 
 private:
     typedef QHash<QString, QString> StringHash;

+ 8 - 0
source/fb2save.hpp

@@ -137,6 +137,14 @@ private:
         FbSaveWriter &m_writer;
     };
 
+    class HeadHandler : public TextHandler
+    {
+    public:
+        explicit HeadHandler(FbSaveWriter &writer, const QString &name, const QXmlAttributes &atts);
+    protected:
+        virtual void EndTag(const QString &name);
+    };
+
     class BodyHandler : public TextHandler
     {
     public: