#include "common.hh" #include "htmlutil.hh" namespace html { namespace { constexpr const std::string_view kBodyChars = "&<>"; constexpr const std::string_view kAttributeChars = "&<>\"'"; } // namespace std::string escape(std::string_view in, EscapeTarget target) { std::string out; escape(in, &out, target); return out; } void escape(std::string_view in, std::string* out, EscapeTarget target) { std::string_view chars; switch (target) { case EscapeTarget::BODY: chars = kBodyChars; break; case EscapeTarget::ATTRIBUTE: chars = kAttributeChars; break; } size_t last = 0; while (true) { auto next = in.find_first_of(chars, last); if (next == std::string::npos) { out->append(in, last); break; } out->append(in, last, next - last); switch (in[next]) { case '&': out->append("&"); break; case '<': out->append("<"); break; case '>': out->append(">"); break; case '"': out->append("""); break; case '\'': out->append("'"); break; } last = next + 1; } } } // namespace html