X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fxml.h;h=346e42d78cd803d9cf99c7a06afd9db3058d9670;hb=26ba2a65838731ce639a09539f617cb0f0be3b22;hp=6da53ada99cffe9c869c82ab517ea264258c3bfd;hpb=0fe3d05344c3680c090c6a57a776ef7a49d4ab2b;p=lyx.git diff --git a/src/xml.h b/src/xml.h index 6da53ada99..346e42d78c 100644 --- a/src/xml.h +++ b/src/xml.h @@ -25,12 +25,13 @@ class Paragraph; class OutputParams; // Inspiration for the *Tag structs and for XMLStream -// came from MathStream and its cousins. +// came from MathMLStream and its cousins. namespace xml { struct StartTag; struct EndTag; struct CompTag; +struct NullTag; struct ParTag; struct FontTag; struct CR; @@ -67,6 +68,8 @@ public: /// XMLStream & operator<<(char); /// + XMLStream & operator<<(xml::NullTag const &); + /// XMLStream & operator<<(xml::StartTag const &); /// XMLStream & operator<<(xml::EndTag const &); @@ -101,7 +104,7 @@ public: /// Is the last tag that was added to the stream a new line (CR)? This is mostly to known /// whether a new line must be added. Therefore, consider that an empty stream just had a CR, /// that simplifies the logic using this code. - bool isLastTagCR() const { return is_last_tag_cr_; }; + bool isLastTagCR() const { return is_last_tag_cr_; } /// void writeError(std::string const &); /// @@ -143,6 +146,7 @@ namespace xml { docstring escapeChar(char_type c, XMLStream::EscapeSettings e); /// Escape the given character, if necessary, to an entity. +/// \param c must be ASCII docstring escapeChar(char c, XMLStream::EscapeSettings e); /// Escape a word instead of a single character @@ -151,9 +155,6 @@ docstring escapeString(docstring const & raw, XMLStream::EscapeSettings e=XMLStr /// cleans \param str for use as an attribute by replacing all non-altnum by "_" docstring cleanAttr(docstring const & str); -/// \p c must be ASCII -docstring escapeChar(char c, XMLStream::EscapeSettings e); - /// replaces illegal characters from ID attributes docstring cleanID(docstring const &orig); @@ -198,14 +199,6 @@ struct StartTag /// virtual FontTag const * asFontTag() const { return nullptr; } /// - virtual bool operator==(StartTag const & rhs) const - { return tag_ == rhs.tag_; } - /// - virtual bool operator!=(StartTag const & rhs) const - { return !(*this == rhs); } - /// - virtual bool operator==(FontTag const & rhs) const; - /// docstring tag_; /// docstring attr_; @@ -231,12 +224,6 @@ struct EndTag /// virtual docstring writeEndTag() const; /// - bool operator==(StartTag const & rhs) const - { return tag_ == rhs.tag_; } - /// - bool operator!=(StartTag const & rhs) const - { return !(*this == rhs); } - /// virtual EndFontTag const * asFontTag() const { return nullptr; } /// docstring tag_; @@ -255,11 +242,20 @@ struct CompTag explicit CompTag(std::string const & tag) : tag_(from_utf8(tag)), tagtype_("none") {} /// + explicit CompTag(docstring const & tag) + : tag_(tag), tagtype_("none") {} + /// explicit CompTag(std::string const & tag, std::string const & attr, std::string const & tagtype = "none") : tag_(from_utf8(tag)), attr_(from_utf8(attr)), tagtype_(tagtype) {} /// explicit CompTag(std::string const & tag, docstring const & attr, std::string const & tagtype = "none") : tag_(from_utf8(tag)), attr_(attr), tagtype_(tagtype) {} + /// + explicit CompTag(docstring const & tag, std::string const & attr, std::string const & tagtype = "none") + : tag_(tag), attr_(from_utf8(attr)), tagtype_(tagtype) {} + /// + explicit CompTag(docstring const & tag, docstring const & attr, std::string const & tagtype = "none") + : tag_(tag), attr_(attr), tagtype_(tagtype) {} /// docstring writeTag() const; /// @@ -281,6 +277,16 @@ struct ParTag : public StartTag }; +/// A special tag that doesn't produce any XML output, but makes the XMLStream behave as it it output some text. +struct NullTag : public StartTag +{ + /// + NullTag(): StartTag("NULLTAG", from_utf8(""), true) {} + /// + ~NullTag() override = default; +}; + + /// enum FontTypes { // ranges @@ -335,8 +341,6 @@ struct FontTag : public StartTag /// FontTag const * asFontTag() const override { return this; } /// - bool operator==(StartTag const &) const override; - /// FontTypes font_type_; }; @@ -375,8 +379,52 @@ void closeTag(odocstream & os, std::string const & name); /// Close tag void closeTag(odocstream & os, Paragraph const & par); +// Convenience functions to open and close tags. First, very low-level ones to ensure a consistent new-line behaviour. +// Block style: +// Content before +// +// Contents of the block. +// +// Content after +// Paragraph style: +// Content before +// Contents of the paragraph. +// Content after +// Inline style: +// Content beforeContents of the paragraph.Content after + +/// +void openTag(XMLStream & xs, const docstring & tag, const docstring & attr, const std::string & tagtype); +/// +void openTag(XMLStream & xs, const std::string & tag, const std::string & attr, const std::string & tagtype); +/// +void openTag(XMLStream & xs, const docstring & tag, const std::string & attr, const std::string & tagtype); +/// +void openTag(XMLStream & xs, const std::string & tag, const docstring & attr, const std::string & tagtype); +/// +void closeTag(XMLStream & xs, const docstring & tag, const std::string & tagtype); +/// +void closeTag(XMLStream & xs, const std::string & tag, const std::string & tagtype); +/// +void compTag(XMLStream & xs, const docstring & tag, const docstring & attr, const std::string & tagtype); +/// +void compTag(XMLStream & xs, const std::string & tag, const std::string & attr, const std::string & tagtype); +/// +void compTag(XMLStream & xs, const docstring & tag, const std::string & attr, const std::string & tagtype); +/// +void compTag(XMLStream & xs, const std::string & tag, const docstring & attr, const std::string & tagtype); + } // namespace xml + +/// Comparison operators for tags. They are defined as free functions, otherwise comparison of casts does not work. +/// For font tags, do not only compare the XML tag, but also the font type: several fonts can be using the same tag. +/// In XHTML, ; in DocBook, . +bool operator==(xml::StartTag const & lhs, xml::StartTag const & rhs); +bool operator==(xml::EndTag const & lhs, xml::StartTag const & rhs); +bool operator!=(xml::EndTag const & lhs, xml::StartTag const & rhs); +bool operator!=(xml::StartTag const & lhs, xml::StartTag const & rhs); + } // namespace lyx #endif // XML_H