+string escapeChar(char c, XHTMLStream::EscapeSettings e)
+{
+ string str;
+ switch (e) {
+ case XHTMLStream::ESCAPE_NONE:
+ str += c;
+ break;
+ case XHTMLStream::ESCAPE_ALL:
+ if (c == '<') {
+ str += "<";
+ break;
+ } else if (c == '>') {
+ str += ">";
+ break;
+ }
+ // fall through
+ case XHTMLStream::ESCAPE_AND:
+ if (c == '&')
+ str += "&";
+ else
+ str +=c ;
+ break;
+ }
+ return str;
+}
+
+
+// escape what needs escaping
+string htmlize(string const & str, XHTMLStream::EscapeSettings e)
+{
+ ostringstream d;
+ string::const_iterator it = str.begin();
+ string::const_iterator en = str.end();
+ for (; it != en; ++it)
+ d << escapeChar(*it, e);
+ return d.str();
+}
+
+
+string cleanAttr(string const & str)
+{
+ string newname;
+ string::const_iterator it = str.begin();
+ string::const_iterator en = str.end();
+ for (; it != en; ++it)
+ newname += isAlnumASCII(*it) ? *it : '_';
+ return newname;
+}
+
+
+docstring cleanAttr(docstring const & str)
+{
+ docstring newname;
+ docstring::const_iterator it = str.begin();
+ docstring::const_iterator en = str.end();
+ for (; it != en; ++it) {
+ char_type const c = *it;
+ newname += isAlnumASCII(c) ? c : char_type('_');
+ }
+ return newname;
+}
+
+