- break;
- case TAG:
- if (t[i] == '>' || t[i] == '}') {
- if (tag == "b") {
- maybe_content (p);
- p.bold = true;
- } else if (tag == "/b") {
- maybe_content (p);
- p.bold = false;
- } else if (tag == "i") {
- maybe_content (p);
- p.italic = true;
- } else if (tag == "/i") {
- maybe_content (p);
- p.italic = false;
- } else if (tag == "u") {
- maybe_content (p);
- p.underline = true;
- } else if (tag == "/u") {
- maybe_content (p);
- p.underline = false;
- } else if (boost::starts_with (tag, "font")) {
- maybe_content (p);
- boost::regex re (".*color=\"?#([[:xdigit:]]+)\"?");
- boost::smatch match;
- if (boost::regex_search (tag, match, re) && string (match[1]).size() == 6) {
- p.colour = Colour::from_rgb_hex (match[1]);
- colours.push_back (p.colour);
- } else {
- re = boost::regex (
- ".*color=\"rgba\\("
- "[[:space:]]*([[:digit:]]+)[[:space:]]*,"
- "[[:space:]]*([[:digit:]]+)[[:space:]]*,"
- "[[:space:]]*([[:digit:]]+)[[:space:]]*,"
- "[[:space:]]*([[:digit:]]+)[[:space:]]*"
- "\\)\""
- );
- if (boost::regex_search (tag, match, re) && match.size() == 5) {
- p.colour.r = raw_convert<int>(string(match[1])) / 255.0;
- p.colour.g = raw_convert<int>(string(match[2])) / 255.0;
- p.colour.b = raw_convert<int>(string(match[3])) / 255.0;
- colours.push_back (p.colour);
- } else {
- throw SubripError (tag, "a colour in the format #rrggbb or rgba(rr,gg,bb,aa)", _context);
- }
- }
- } else if (tag == "/font") {
- maybe_content (p);
- SUB_ASSERT (!colours.empty());
- colours.pop_back ();
- p.colour = colours.back ();
- } else if (tag.size() > 0 && tag[0] == '\\') {
- SSAReader::parse_style (p, tag, 288, 288);
- }
- tag.clear ();
- state = TEXT;