diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-07-14 20:44:01 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-07-14 20:44:01 +0100 |
| commit | 23579be63b69013a9cd27514c38fad3ba2aeb77e (patch) | |
| tree | 3bf9a5bd36979ff10ef53ed6bc0c9ad1f79a5a29 | |
| parent | dd328df9676cabcf024409ab6d8521c80b4ab99c (diff) | |
Support rgba() colour specifiers in Subrip files; not sure if they are strictly allowed but part of WebVTT.
| -rw-r--r-- | src/subrip_reader.cc | 20 | ||||
| -rw-r--r-- | src/subrip_reader.h | 2 | ||||
| -rw-r--r-- | test/subrip_reader_test.cc | 22 |
3 files changed, 42 insertions, 2 deletions
diff --git a/src/subrip_reader.cc b/src/subrip_reader.cc index cfeeade..5e41699 100644 --- a/src/subrip_reader.cc +++ b/src/subrip_reader.cc @@ -25,6 +25,7 @@ #include "exceptions.h" #include "util.h" #include "sub_assert.h" +#include "raw_convert.h" #include <boost/algorithm/string.hpp> #include <boost/lexical_cast.hpp> #include <boost/regex.hpp> @@ -237,13 +238,28 @@ SubripReader::convert_line (string t, RawSubtitle& p) p.underline = false; } else if (boost::starts_with (tag, "font")) { maybe_content (p); - boost::regex re (".*color=\"#([0123456789abcdef]+)\""); + 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 { - throw SubripError (tag, "a colour in the format #rrggbb", _context); + 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); diff --git a/src/subrip_reader.h b/src/subrip_reader.h index 1ee14fb..f6586a4 100644 --- a/src/subrip_reader.h +++ b/src/subrip_reader.h @@ -29,6 +29,7 @@ struct subrip_reader_convert_line_test; struct subrip_reader_convert_time_test; +struct subrip_reader_test5; namespace sub { @@ -42,6 +43,7 @@ private: /* For tests */ friend struct ::subrip_reader_convert_line_test; friend struct ::subrip_reader_convert_time_test; + friend struct ::subrip_reader_test5; SubripReader () {} Time convert_time (std::string t); diff --git a/test/subrip_reader_test.cc b/test/subrip_reader_test.cc index d4befac..affdd75 100644 --- a/test/subrip_reader_test.cc +++ b/test/subrip_reader_test.cc @@ -541,3 +541,25 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test4) BOOST_CHECK (t == "- \"(دريه فابينار)\""); } + +/** Test <font color="rgba(255,255,255,255)"> */ +BOOST_AUTO_TEST_CASE (subrip_reader_test5) +{ + sub::RawSubtitle rs; + sub::SubripReader r; + r.convert_line ("<font color=\"rgba(255,128,64,15)\">Foo bar</font>", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); + BOOST_CHECK_CLOSE (r._subs.front().colour.r, 255.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.g, 128.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.b, 64.0 / 255, 0.1); + r._subs.clear (); + + rs = sub::RawSubtitle (); + r.convert_line ("<font color=\"rgba(1, 2 , 3, 4)\">Foo bar</font>", rs); + BOOST_REQUIRE_EQUAL (r._subs.size(), 1); + BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); + BOOST_CHECK_CLOSE (r._subs.front().colour.r, 1.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.g, 2.0 / 255, 0.1); + BOOST_CHECK_CLOSE (r._subs.front().colour.b, 3.0 / 255, 0.1); +} |
