1
0
Эх сурвалжийг харах

Class Fb2Scintilla: fold all images by default

Kandrashin Denis 13 жил өмнө
parent
commit
56661624cd

+ 7 - 1
source/fb2code.cpp

@@ -8,6 +8,7 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #include <Qsci/qscilexerxml.h>
+#include <QtDebug>
 
 Fb2Scintilla::Fb2Scintilla(QWidget *parent) :
     QsciScintilla(parent)
@@ -77,8 +78,13 @@ void Fb2Scintilla::linesChanged()
     setMarginWidth(0, width);
 }
 
-void Fb2Scintilla::load(const QByteArray &array)
+void Fb2Scintilla::load(const QByteArray &array, const QList<int> &folds)
 {
     SendScintilla(SCI_SETTEXT, array.constData());
     SendScintilla(SCI_EMPTYUNDOBUFFER);
+    foldAll(false);
+    foldLine(1);
+    for (QList<int>::const_iterator it = folds.constBegin(); it != folds.constEnd(); it++) {
+        foldLine(*it);
+    }
 }

+ 3 - 2
source/fb2code.h

@@ -2,13 +2,14 @@
 #define FB2CODE_H
 
 #include <Qsci/qsciscintilla.h>
+#include <QList>
 
 class Fb2Scintilla : public QsciScintilla
 {
     Q_OBJECT
 public:
     explicit Fb2Scintilla(QWidget *parent = 0);
-    void load(const QByteArray &array);
+    void load(const QByteArray &array, const QList<int> &folds);
     
 signals:
 
@@ -16,7 +17,7 @@ public slots:
 
 private slots:
     void linesChanged();
-    
+
 };
 
 #endif // FB2CODE_H

+ 1 - 1
source/fb2main.cpp

@@ -617,7 +617,7 @@ void Fb2MainWindow::viewCode()
     if (!codeEdit) {
         codeEdit = new Fb2Scintilla;
     }
-    if (load) codeEdit->load(xml);
+    if (load) codeEdit->load(xml, folds);
     setCentralWidget(codeEdit);
     codeEdit->setFocus();
 

+ 1 - 0
source/fb2read.cpp

@@ -260,6 +260,7 @@ void Fb2ReadHandler::TextHandler::Init(const QXmlAttributes &atts)
         if (m_style == "body" && Value(atts, "name").toLower() == "notes") m_style = "notes";
         writer().writeAttribute("class", m_style);
     }
+    if (!id.isEmpty()) writer().writeAttribute("id", id);
 }
 
 Fb2XmlHandler::NodeHandler * Fb2ReadHandler::TextHandler::NewTag(const QString &name, const QXmlAttributes &atts)

+ 61 - 22
source/fb2save.cpp

@@ -12,6 +12,7 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QByteArray *array, QList<int> *fo
     : QXmlStreamWriter(array)
     , m_folds(folds)
     , m_view(view)
+    , m_line(0)
 {
     Init();
 }
@@ -20,6 +21,7 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QIODevice *device)
     : QXmlStreamWriter(device)
     , m_folds(0)
     , m_view(view)
+    , m_line(0)
 {
     Init();
 }
@@ -28,14 +30,13 @@ Fb2SaveWriter::Fb2SaveWriter(Fb2WebView &view, QString *string)
     : QXmlStreamWriter(string)
     , m_folds(0)
     , m_view(view)
+    , m_line(0)
 {
     Init();
 }
 
 void Fb2SaveWriter::Init()
 {
-    setAutoFormatting(true);
-    setAutoFormattingIndent(2);
     writeStartDocument();
 }
 
@@ -44,6 +45,26 @@ Fb2SaveWriter::~Fb2SaveWriter()
     writeEndDocument();
 }
 
+void Fb2SaveWriter::writeStartElement(const QString &name, int level)
+{
+    if (level) writeLineEnd();
+    for (int i = 1; i < level; i++) writeCharacters("  ");
+    QXmlStreamWriter::writeStartElement(name);
+}
+
+void Fb2SaveWriter::writeEndElement(int level)
+{
+    if (level) writeLineEnd();
+    for (int i = 1; i < level; i++) writeCharacters("  ");
+    QXmlStreamWriter::writeEndElement();
+}
+
+void Fb2SaveWriter::writeLineEnd()
+{
+    writeCharacters("\n");
+    m_line++;
+}
+
 QString Fb2SaveWriter::getFile(const QString &path)
 {
     StringHash::const_iterator it = m_files.find(path);
@@ -70,20 +91,20 @@ void Fb2SaveWriter::writeFiles()
         if (name.isEmpty()) continue;
         QString data = getData(name);
         if (data.isEmpty()) continue;
-        writeStartElement("binary");
+        writeStartElement("binary", 2);
+        if (m_folds) m_folds->append(m_line);
         writeAttribute("id", name);
-        writeCharacters("\n");
+        writeLineEnd();
         int pos = 0;
         while (true) {
             QString text = data.mid(pos, 76);
             if (text.isEmpty()) break;
             writeCharacters(text);
-            writeCharacters("\n");
+            writeLineEnd();
             pos += 76;
         }
-        writeCharacters(" ");
-        writeCharacters(" ");
-        writeEndElement();
+        writeCharacters("  ");
+        QXmlStreamWriter::writeEndElement();
     }
 }
 
@@ -105,20 +126,22 @@ FB2_BEGIN_KEYHASH(Fb2SaveHandler::BodyHandler)
     FB2_KEY( Code    , "tt"     );
 FB2_END_KEYHASH
 
-Fb2SaveHandler::BodyHandler::BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style)
+Fb2SaveHandler::BodyHandler::BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag)
     : NodeHandler(name)
     , m_writer(writer)
     , m_tag(tag)
-    , m_style(style)
+    , m_level(1)
+    , m_hasChild(false)
 {
     Init(atts);
 }
 
-Fb2SaveHandler::BodyHandler::BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style)
+Fb2SaveHandler::BodyHandler::BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag)
     : NodeHandler(name)
     , m_writer(parent->m_writer)
     , m_tag(tag)
-    , m_style(style)
+    , m_level(parent->nextLevel())
+    , m_hasChild(false)
 {
     Init(atts);
 }
@@ -126,18 +149,29 @@ Fb2SaveHandler::BodyHandler::BodyHandler(BodyHandler *parent, const QString &nam
 void Fb2SaveHandler::BodyHandler::Init(const QXmlAttributes &atts)
 {
     if (m_tag.isEmpty()) return;
-    m_writer.writeStartElement(m_tag);
+    if (m_tag == "notes") {
+        m_writer.writeStartElement("section", m_level);
+        m_writer.writeAttribute("name", "notes");
+    } else if (m_tag == "note") {
+        m_writer.writeStartElement("section", m_level);
+    } else {
+        m_writer.writeStartElement(m_tag, m_level);
+    }
     int count = atts.count();
     for (int i = 0; i < count; i++) {
         QString name = atts.qName(i);
-        if (name.left(4) != "fb2:") continue;
-        m_writer.writeAttribute(name.mid(4), atts.value(i));
+        if (name == "id") {
+            m_writer.writeAttribute(name, atts.value(i));
+        } else if (name.left(4) == "fb2:") {
+            m_writer.writeAttribute(name.mid(4), atts.value(i));
+        }
     }
 }
 
 Fb2XmlHandler::NodeHandler * Fb2SaveHandler::BodyHandler::NewTag(const QString &name, const QXmlAttributes &atts)
 {
-    QString tag, style;
+    m_hasChild = true;
+    QString tag = QString();
     switch (toKeyword(name)) {
         case Section   : tag = atts.value("class") ; break;
         case Anchor    : return new AnchorHandler(this, name, atts);
@@ -151,7 +185,7 @@ Fb2XmlHandler::NodeHandler * Fb2SaveHandler::BodyHandler::NewTag(const QString &
         case Sup       : tag = "sup"           ; break;
         default: ;
     }
-    return new BodyHandler(this, name, atts, tag, style);
+    return new BodyHandler(this, name, atts, tag);
 }
 
 void Fb2SaveHandler::BodyHandler::TxtTag(const QString &text)
@@ -163,7 +197,12 @@ void Fb2SaveHandler::BodyHandler::EndTag(const QString &name)
 {
     Q_UNUSED(name);
     if (m_tag.isEmpty()) return;
-    m_writer.writeEndElement();
+    m_writer.writeEndElement(m_hasChild ? m_level : 0);
+}
+
+int Fb2SaveHandler::BodyHandler::nextLevel() const
+{
+    return m_level ? m_level + 1 : 0;
 }
 
 //---------------------------------------------------------------------------
@@ -205,7 +244,7 @@ Fb2SaveHandler::ImageHandler::ImageHandler(BodyHandler *parent, const QString &n
     QString file = m_writer.getFile(href);
     file.prepend('#');
     m_writer.writeAttribute("l:href", file);
-    m_writer.writeEndElement();
+    m_writer.writeEndElement(0);
 }
 
 //---------------------------------------------------------------------------
@@ -237,15 +276,15 @@ void Fb2SaveHandler::ParagHandler::TxtTag(const QString &text)
 void Fb2SaveHandler::ParagHandler::EndTag(const QString &name)
 {
     Q_UNUSED(name);
-    if (m_empty) m_writer.writeStartElement("empty-line");
-    m_writer.writeEndElement();
+    if (m_empty) m_writer.writeStartElement("empty-line", m_level);
+    m_writer.writeEndElement(0);
 }
 
 void Fb2SaveHandler::ParagHandler::start()
 {
     if (!m_empty) return;
     QString tag = m_parent == "stanza" ? "v" : "p";
-    m_writer.writeStartElement(tag);
+    m_writer.writeStartElement(tag, m_level);
     m_empty = false;
 }
 

+ 12 - 4
source/fb2save.h

@@ -20,6 +20,9 @@ public:
     explicit Fb2SaveWriter(Fb2WebView &view, QIODevice *device);
     explicit Fb2SaveWriter(Fb2WebView &view, QString *string);
     virtual ~Fb2SaveWriter();
+    void writeStartElement(const QString &name, int level);
+    void writeEndElement(int level);
+    void writeLineEnd();
     QString getFile(const QString &path);
     QString getData(const QString &name);
     void writeFiles();
@@ -32,6 +35,7 @@ private:
     typedef QList<QString> StringList;
     StringHash m_files;
     StringList m_names;
+    int m_line;
 };
 
 class Fb2SaveHandler : public Fb2XmlHandler
@@ -57,8 +61,8 @@ private:
             Code,
        FB2_END_KEYLIST
     public:
-        explicit BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
-        explicit BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
+        explicit BodyHandler(Fb2SaveWriter &writer, const QString &name, const QXmlAttributes &atts, const QString &tag);
+        explicit BodyHandler(BodyHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag);
         const QString & tag() { return m_tag; }
     protected:
         virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
@@ -66,10 +70,13 @@ private:
         virtual void EndTag(const QString &name);
     protected:
         void Init(const QXmlAttributes &atts);
+        virtual int nextLevel() const;
     protected:
         Fb2SaveWriter &m_writer;
-        QString m_tag;
-        QString m_style;
+        const QString m_tag;
+        const int m_level;
+    private:
+        bool m_hasChild;
     };
 
     class RootHandler : public BodyHandler
@@ -103,6 +110,7 @@ private:
         virtual void TxtTag(const QString &text);
         virtual void EndTag(const QString &name);
     private:
+        virtual int nextLevel() const { return 0; }
         void start();
     private:
         const QString m_parent;

+ 2 - 0
source/fb2view.cpp

@@ -81,6 +81,8 @@ void Fb2WebView::fixContents()
 
 void Fb2WebView::linkHovered(const QString &link, const QString &title, const QString &textContent)
 {
+    Q_UNUSED(title);
+    Q_UNUSED(textContent);
     QToolTip::showText(QPoint(100, 100), link);
 }