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;
///
XMLStream & operator<<(char);
///
+ XMLStream & operator<<(xml::NullTag const &);
+ ///
XMLStream & operator<<(xml::StartTag const &);
///
XMLStream & operator<<(xml::EndTag const &);
/// 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 &);
///
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
/// 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);
///
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_;
/// </tag_>
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_;
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) {}
/// <tag_ attr_ />
docstring writeTag() const;
///
};
+/// 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
///
FontTag const * asFontTag() const override { return this; }
///
- bool operator==(StartTag const &) const override;
- ///
FontTypes font_type_;
};
/// 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
+// <blocktag>
+// Contents of the block.
+// </blocktag>
+// Content after
+// Paragraph style:
+// Content before
+// <paratag>Contents of the paragraph.</paratag>
+// Content after
+// Inline style:
+// Content before<inlinetag>Contents of the paragraph.</inlinetag>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, <span>; in DocBook, <emphasis>.
+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