}
+string escapeChar(char c)
+{
+ string str;
+ switch (c) {
+ case ' ':
+ str += " ";
+ break;
+ case '&':
+ str += "&";
+ break;
+ case '<':
+ str += "<";
+ break;
+ case '>':
+ str += ">";
+ break;
+ default:
+ str += c;
+ break;
+ }
+ return str;
+}
+
+
+// escape what needs escaping
+string htmlize(string const & str) {
+ ostringstream d;
+ string::const_iterator it = str.begin();
+ string::const_iterator en = str.end();
+ for (; it != en; ++it)
+ d << escapeChar(*it);
+ return d.str();
+}
+
+
bool isFontTag(string const & s)
{
return s == "em" || s == "strong"; // others?
{
string output = "<" + tag_;
if (!attr_.empty())
- output += " " + attr_;
+ output += " " + html::htmlize(attr_);
output += ">";
return from_utf8(output);
}
{
string output = "<" + tag_;
if (!attr_.empty())
- output += " " + attr_;
+ output += " " + html::htmlize(attr_);
output += " />";
return from_utf8(output);
}
////////////////////////////////////////////////////////////////
XHTMLStream::XHTMLStream(odocstream & os)
- :os_(os)
+ : os_(os), nextraw_(false)
{}
XHTMLStream & XHTMLStream::operator<<(docstring const & d)
{
clearTagDeque();
- os_ << html::htmlize(d);
+ if (nextraw_) {
+ os_ << d;
+ nextraw_ = false;
+ } else
+ os_ << html::htmlize(d);
return *this;
}
XHTMLStream & XHTMLStream::operator<<(const char * s)
{
clearTagDeque();
- os_ << html::htmlize(from_ascii(s));
+ docstring const d = from_ascii(s);
+ if (nextraw_) {
+ os_ << d;
+ nextraw_ = false;
+ } else
+ os_ << html::htmlize(d);
return *this;
}
XHTMLStream & XHTMLStream::operator<<(char_type c)
{
clearTagDeque();
- os_ << html::escapeChar(c);
+ if (nextraw_) {
+ os_ << c;
+ nextraw_ = false;
+ } else
+ os_ << html::escapeChar(c);
+ return *this;
+}
+
+
+XHTMLStream & XHTMLStream::operator<<(NextRaw const &)
+{
+ nextraw_ = true;
return *this;
}
xs.cr();
}
if (!deferred.empty()) {
- xs << deferred;
+ xs << XHTMLStream::NextRaw() << deferred;
xs.cr();
}
}