std::string encode_field(str_ref v, bool add_br) { std::string r; r.reserve(v.size() << 1); while (v) { if (boost::istarts_with(v, "ftp://") || boost::istarts_with(v, "http://") || boost::istarts_with(v, "https://") || boost::istarts_with(v, "mailto:")) { size_t p = 0; while (p < v.size() && !isspace(v[p] & 0xff) && v[p] != '\"' && v[p] != '<' && v[p] != '>' && v[p] != '[' && v[p] != ']') p++; if (v[p - 1] == '!' || v[p - 1] == ',' || v[p - 1] == '.' || v[p - 1] == '?') p--; if (v[p - 1] == ')') p--; str_ref url = v.substr(0, p); if (boost::istarts_with(v, "ftp.")) r += web_link(url, "ftp://" + url.s()); else if (boost::istarts_with(v, "www.")) r += web_link(url, "http://" + url.s()); else r += web_link(boost::istarts_with(v, "mailto:") ? url.substr(7) : url, url); while (p--) v.pop_front(); } else { switch (v.front()) { case '\n': r += add_br ? "<br>" : " "; break; case '\r': break; case '&': r += "&"; break; case '<': r += "<"; break; default: r += v.front(); } v.pop_front(); } } return r; }
static std::string web_encode(str_ref v) { std::string d; d.reserve(v.size() << 1); while (v) { switch (v.front()) { case '"': d += """; break; case '&': d += "&"; break; case '<': d += "<"; break; default: d += v.front(); } v.pop_front(); } return d; }
bb_t get_next(str_ref& s, str_ref& a0) { if (!s) return bb_end; if (s.front() != '[') { auto a = std::find(s.begin(), s.end(), '['); if (a == s.end()) { a0 = s; s.clear(); } else { a0 = str_ref(s.begin(), a); s.set_begin(a); } return bb_literal; } auto a = std::find(s.begin(), s.end(), ']'); if (a == s.end()) { a0 = s; s.clear(); return bb_literal; } str_ref tag = { &s[1], a }; s.set_begin(a + 1); a0.clear(); if (tag == "b") return bb_bold; if (tag == "/b") return bb_bold_close; if (tag == "center") return bb_center; if (tag == "/center") return bb_center_close; if (boost::starts_with(tag, "color=")) { a0 = tag.substr(6); return bb_color; } if (tag == "/color") return bb_color_close; if (boost::starts_with(tag, "font=") || tag == "/font") return bb_none; if (tag == "i" || tag == "/i") return bb_none; if (tag == "img" || tag == "IMG" || tag == "/img" || tag == "/IMG") return bb_none; if (boost::starts_with(tag, "img=")) { a0 = tag.substr(4); return bb_literal; } if (tag == "q" || tag == "quote") return bb_quote; if (boost::starts_with(tag, "quote=")) { a0 = tag.substr(6); return bb_quote; } if (tag == "/q" || tag == "/quote") return bb_quote_close; if (tag == "s") return bb_strike; if (tag == "/s") return bb_strike_close; if (boost::starts_with(tag, "size=") || tag == "/size") return bb_none; if (tag == "u") return bb_underline; if (tag == "/u") return bb_underline_close; if (boost::starts_with(tag, "url=")) { a0 = tag.substr(4); return bb_url; } if (tag == "/url") return bb_none; if (boost::starts_with(tag, "video=")) { a0 = tag.substr(6); return bb_video; } a0 = tag; return bb_unknown; }