123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #ifndef FB2READ_H
- #define FB2READ_H
- #include "fb2xml.h"
- #include <QByteArray>
- #include <QMutex>
- #include <QThread>
- #include <QXmlDefaultHandler>
- class Fb2ReadThread : public QThread
- {
- Q_OBJECT
- public:
- Fb2ReadThread(QObject *parent, const QString &filename, const QString &xml = QString());
- ~Fb2ReadThread();
- QString * data() { return &m_html; }
- signals:
- void html(QString name, QString html);
- public slots:
- void stop();
- protected:
- void run();
- private:
- bool parse();
- private:
- const QString m_filename;
- const QString m_xml;
- QString m_html;
- bool m_abort;
- QMutex mutex;
- };
- class Fb2ReadHandler : public Fb2XmlHandler
- {
- public:
- explicit Fb2ReadHandler(Fb2ReadThread &thread, QXmlStreamWriter &writer);
- virtual ~Fb2ReadHandler();
- virtual bool comment(const QString& ch);
- Fb2ReadThread & thread() { return m_thread; }
- QXmlStreamWriter & writer() { return m_writer; }
- private:
- class BaseHandler : public NodeHandler
- {
- public:
- explicit BaseHandler(Fb2ReadHandler &owner, const QString &name)
- : NodeHandler(name), m_owner(owner) {}
- protected:
- QXmlStreamWriter & writer() { return m_owner.writer(); }
- void writeAttributes(const QXmlAttributes &atts);
- protected:
- Fb2ReadHandler &m_owner;
- };
- class RootHandler : public BaseHandler
- {
- FB2_BEGIN_KEYLIST
- Style,
- Descr,
- Body,
- Binary,
- FB2_END_KEYLIST
- public:
- explicit RootHandler(Fb2ReadHandler &owner, const QString &name);
- protected:
- virtual NodeHandler * NewTag(const QString & name, const QXmlAttributes &atts);
- virtual void EndTag(const QString &name);
- };
- class StyleHandler : public BaseHandler
- {
- public:
- explicit StyleHandler(Fb2ReadHandler &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(Fb2ReadHandler &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(Fb2ReadHandler &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(Fb2ReadHandler &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
- {
- FB2_BEGIN_KEYLIST
- Section,
- Anchor,
- Table,
- Image,
- Parag,
- Style,
- Strong,
- Emphas,
- Strike,
- Sub,
- Sup,
- Code,
- FB2_END_KEYLIST
- public:
- explicit TextHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
- explicit TextHandler(TextHandler *parent, const QString &name, const QXmlAttributes &atts, const QString &tag, const QString &style = QString());
- protected:
- virtual NodeHandler * NewTag(const QString &name, const QXmlAttributes &atts);
- virtual void TxtTag(const QString &text);
- virtual void EndTag(const QString &name);
- protected:
- void Init(const QXmlAttributes &atts);
- bool isNotes() const;
- protected:
- TextHandler *m_parent;
- QString m_tag;
- 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(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
- };
- class BinaryHandler : public BaseHandler
- {
- public:
- explicit BinaryHandler(Fb2ReadHandler &owner, const QString &name, const QXmlAttributes &atts);
- protected:
- virtual void TxtTag(const QString &text);
- virtual void EndTag(const QString &name);
- private:
- QString m_file;
- QString m_text;
- };
- protected:
- virtual NodeHandler * CreateRoot(const QString &name, const QXmlAttributes &atts);
- private:
- void addFile(const QString &name, const QByteArray &data);
- QString getFile(const QString &name);
- private:
- typedef QHash<QString, QString> StringHash;
- Fb2ReadThread &m_thread;
- QXmlStreamWriter &m_writer;
- StringHash m_hash;
- };
- #endif // FB2READ_H
|