]> git.lyx.org Git - features.git/blobdiff - src/output_xhtml.h
Reorganize the TagStack objects.
[features.git] / src / output_xhtml.h
index 4c389bd0aabfa1683d4b713c74262b12dda71c7a..99d07be9d755df9418d352602006ec976aacdda7 100644 (file)
@@ -13,7 +13,9 @@
 #define OUTPUT_XHTML_H
 
 #include "LayoutEnums.h"
+
 #include "support/docstream.h"
+#include "support/shared_ptr.h"
 #include "support/strfwd.h"
 
 #include <deque>
@@ -83,6 +85,7 @@ struct CompTag {
        std::string attr_;
 };
 
+
 // trivial struct for output of newlines
 struct CR{};
 
@@ -103,7 +106,7 @@ public:
        bool closeFontTags();
        /// call at start of paragraph. sets a mark so we know what tags
        /// to close at the end. 
-       void startParagraph();
+       void startParagraph(bool keep_empty);
        /// call at end of paragraph to clear that mark. note that this
        /// will also close any tags still open. 
        void endParagraph();
@@ -134,23 +137,43 @@ public:
        /// Sets what we are going to escape on the NEXT write.
        /// Everything is reset for the next time.
        XHTMLStream & operator<<(EscapeSettings);
+#if 0
+       /// This routine is for debugging the tag stack, etc. Code
+       /// for it is disabled by default, however, so you will need
+       /// to enable it if you want to use it.
+       void dumpTagStack(std::string const & msg) const;
+#endif
 private:
        ///
        void clearTagDeque();
        ///
-       bool isTagOpen(std::string const &);
+       bool isTagOpen(std::string const &) const;
        ///
-       void writeError(std::string const &);
+       bool isTagPending(std::string const &) const;
        ///
-       odocstream & os_;
+       void writeError(std::string const &) const;
        ///
-       typedef std::deque<html::StartTag> TagStack;
-       /// holds start tags until we know there is content in them.
-       TagStack pending_tags_;
-       /// remembers the history, so we can make sure we nest properly.
-       TagStack tag_stack_;
+       odocstream & os_;
        /// 
        EscapeSettings escape_;
+       // What we would really like to do here is simply use a
+       // deque<StartTag>. But we want to store both StartTags and
+       // sub-classes thereof on this stack, which means we run into the 
+       // so-called polymorphic class problem with the STL. We therefore have
+       // to use a deque<StartTag *>, which leads to the question who will
+       // own these pointers and how they will be deleted, so we use shared
+       // pointers.
+       ///
+       typedef shared_ptr<html::StartTag> TagPtr;
+       typedef std::deque<TagPtr> TagDeque;
+       ///
+       template <typename T> 
+       shared_ptr<T> makeTagPtr(T const & tag) 
+               { return shared_ptr<T>(new T(tag)); }
+       ///
+       TagDeque pending_tags_;
+       ///
+       TagDeque tag_stack_;
 };
 
 ///