+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();
+}
+
+
+string cleanAttr(string const & str)
+{
+ string newname;
+ string::const_iterator it = str.begin();
+ string::const_iterator en = str.end();
+ for (; it != en; ++it)
+ newname += isalnum(*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)
+ if (isalnum(*it))
+ newname += *it;
+ else
+ newname += '_';
+ return newname;
+}
+
+