}
-bool StartTag::operator==(FontTag const &rhs) const
-{
- return rhs == *this;
-}
-
-
docstring EndTag::writeEndTag() const
{
return from_utf8("</") + tag_ + from_utf8(">");
return output;
}
-
-bool FontTag::operator==(StartTag const & tag) const
-{
- FontTag const * const ftag = tag.asFontTag();
- if (!ftag)
- return false;
- return (font_type_ == ftag->font_type_);
-}
-
} // namespace xml
}
+bool operator==(xml::StartTag const & lhs, xml::StartTag const & rhs)
+{
+ xml::FontTag const * const lhs_ft = lhs.asFontTag();
+ xml::FontTag const * const rhs_ft = rhs.asFontTag();
+
+ if ((!lhs_ft && rhs_ft) || (lhs_ft && !rhs_ft))
+ return false;
+ if (!lhs_ft && !rhs_ft)
+ return lhs.tag_ == rhs.tag_;
+ return lhs_ft->tag_ == rhs_ft->tag_ && lhs_ft->font_type_ == rhs_ft->font_type_;
+}
+
+
+bool operator==(xml::EndTag const & lhs, xml::StartTag const & rhs)
+{
+ xml::EndFontTag const * const lhs_ft = lhs.asFontTag();
+ xml::FontTag const * const rhs_ft = rhs.asFontTag();
+
+ if ((!lhs_ft && rhs_ft) || (lhs_ft && !rhs_ft))
+ return false;
+ if (!lhs_ft && !rhs_ft)
+ return lhs.tag_ == rhs.tag_;
+ return lhs_ft->tag_ == rhs_ft->tag_ && lhs_ft->font_type_ == rhs_ft->font_type_;
+}
+
+
+bool operator!=(xml::EndTag const & lhs, xml::StartTag const & rhs)
+{
+ return !(lhs == rhs);
+}
+
+
+bool operator!=(xml::StartTag const & lhs, xml::StartTag const & rhs)
+{
+ return !(lhs == rhs);
+}
+
+
void xml::openTag(odocstream & os, string const & name, string const & attribute)
{
// FIXME UNICODE
void xml::openTag(XMLStream & xs, const docstring & tag, const docstring & attr, const std::string & tagtype)
{
- if (tag.empty() || tag == "NONE") // Common check to be performed elsewhere, if it was not here.
+ if (tag.empty() || tag == from_ascii("NONE")) // Common check to be performed elsewhere, if it was not here.
return;
- if (tag == "para" || tagtype == "paragraph") // Special case for <para>: always considered as a paragraph.
+ if (tag == from_ascii("para") || tagtype == "paragraph") // Special case for <para>: always considered as a paragraph.
openParTag(xs, tag, attr);
else if (tagtype == "block")
openBlockTag(xs, tag, attr);
///
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_;
///
FontTag const * asFontTag() const override { return this; }
///
- bool operator==(StartTag const &) const override;
- ///
FontTypes font_type_;
};
} // 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