diff options
| -rw-r--r-- | src/exceptions.cc | 5 | ||||
| -rw-r--r-- | src/exceptions.h | 7 | ||||
| -rw-r--r-- | src/subrip_reader.cc | 16 | ||||
| -rw-r--r-- | src/subrip_reader.h | 2 | ||||
| -rw-r--r-- | test/subrip_reader_test.cc | 46 |
5 files changed, 42 insertions, 34 deletions
diff --git a/src/exceptions.cc b/src/exceptions.cc index d09be61..df9ae9a 100644 --- a/src/exceptions.cc +++ b/src/exceptions.cc @@ -31,8 +31,9 @@ ProgrammingError::ProgrammingError (string file, int line) } -SubripError::SubripError (string saw, string expecting, list<string> context) - : runtime_error ("Error in SubRip file: saw " + (saw.empty() ? "an empty string" : saw) + " when expecting " + expecting) +SubripError::SubripError(int line_number, string saw, string expecting, list<string> context) + : runtime_error(String::compose("Error in SubRip file line %1: saw %2 when expecting %3", line_number, saw.empty() ? "an empty string" : saw, expecting).c_str()) + , _line_number(line_number) , _context (context) { diff --git a/src/exceptions.h b/src/exceptions.h index 3b2961d..58659ad 100644 --- a/src/exceptions.h +++ b/src/exceptions.h @@ -55,13 +55,18 @@ public: class SubripError : public std::runtime_error { public: - SubripError (std::string saw, std::string expecting, std::list<std::string> context); + SubripError(int line_number, std::string saw, std::string expecting, std::list<std::string> context); std::list<std::string> context () const { return _context; } + int line_number() const { + return _line_number; + } + private: + int _line_number; std::list<std::string> _context; }; diff --git a/src/subrip_reader.cc b/src/subrip_reader.cc index 0e948f9..b95e6be 100644 --- a/src/subrip_reader.cc +++ b/src/subrip_reader.cc @@ -79,9 +79,11 @@ SubripReader::read (function<optional<string> ()> get_line) RawSubtitle rs; prepare(rs); + int line_number = 0; while (true) { auto line = get_line (); + ++line_number; if (!line) { break; } @@ -123,19 +125,19 @@ SubripReader::read (function<optional<string> ()> get_line) _context.push_back (*ex); } } - throw SubripError (*line, "a time/position line", _context); + throw SubripError(line_number, *line, "a time/position line", _context); } string expected; auto from = convert_time(p[0], ",", &expected); if (!from) { - throw SubripError(p[0], expected, _context); + throw SubripError(line_number, p[0], expected, _context); } rs.from = *from; auto to = convert_time(p[2], ",", &expected); if (!to) { - throw SubripError(p[2], expected, _context); + throw SubripError(line_number, p[2], expected, _context); } rs.to = *to; @@ -154,7 +156,7 @@ SubripReader::read (function<optional<string> ()> get_line) */ boost::algorithm::split_regex(sub_lines, *line, boost::regex("\xe2\x80\xa8")); for (auto sub_line: sub_lines) { - convert_line(sub_line, rs); + convert_line(line_number, sub_line, rs); rs.vertical_position.line = rs.vertical_position.line.get() + 1; rs.text.clear(); } @@ -221,7 +223,7 @@ SubripReader::convert_time(string t, string milliseconds_separator, string* expe } void -SubripReader::convert_line (string t, RawSubtitle& p) +SubripReader::convert_line(int line_number, string t, RawSubtitle& p) { vector<Colour> colours; colours.push_back (Colour (1, 1, 1)); @@ -276,7 +278,7 @@ SubripReader::convert_line (string t, RawSubtitle& p) p.colour = Colour::from_rgba_hex(match[1]); colours.push_back(p.colour); } else { - throw SubripError(tag, "a colour in the format #rrggbb #rrggbbaa or rgba(rr,gg,bb,aa)", _context); + throw SubripError(line_number, tag, "a colour in the format #rrggbb #rrggbbaa or rgba(rr,gg,bb,aa)", _context); } } else { re = boost::regex ( @@ -293,7 +295,7 @@ SubripReader::convert_line (string t, RawSubtitle& p) 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 #rrggbbaa or rgba(rr,gg,bb,aa)", _context); + throw SubripError(line_number, tag, "a colour in the format #rrggbb #rrggbbaa or rgba(rr,gg,bb,aa)", _context); } } } else if (has_next(t, i, "</font>")) { diff --git a/src/subrip_reader.h b/src/subrip_reader.h index 83fefdf..bf438ed 100644 --- a/src/subrip_reader.h +++ b/src/subrip_reader.h @@ -51,7 +51,7 @@ private: friend struct ::subrip_reader_test6; SubripReader () {} - void convert_line (std::string t, RawSubtitle& p); + void convert_line(int line_number, std::string t, RawSubtitle& p); void maybe_content (RawSubtitle& p); void read (boost::function<boost::optional<std::string> ()> get_line); diff --git a/test/subrip_reader_test.cc b/test/subrip_reader_test.cc index afd2579..ad48b6e 100644 --- a/test/subrip_reader_test.cc +++ b/test/subrip_reader_test.cc @@ -242,55 +242,55 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) sub::SubripReader r; sub::RawSubtitle rs; - r.convert_line ("Hello world", rs); + r.convert_line(0, "Hello world", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<b>Hello world</b>", rs); + r.convert_line(0, "<b>Hello world</b>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().bold, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<i>Hello world</i>", rs); + r.convert_line(0, "<i>Hello world</i>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().italic, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<u>Hello world</u>", rs); + r.convert_line(0, "<u>Hello world</u>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().underline, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("{b}Hello world{/b}", rs); + r.convert_line(0, "{b}Hello world{/b}", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().bold, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("{i}Hello world{/i}", rs); + r.convert_line(0, "{i}Hello world{/i}", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().italic, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("{u}Hello world{/u}", rs); + r.convert_line(0, "{u}Hello world{/u}", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_CHECK_EQUAL (r._subs.front().underline, true); r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<b>This is <i>nesting</i> of subtitles</b>", rs); + r.convert_line(0, "<b>This is <i>nesting</i> of subtitles</b>", rs); BOOST_CHECK_EQUAL(r._subs.size(), 3U); auto i = r._subs.begin(); BOOST_CHECK_EQUAL (i->text, "This is "); @@ -308,7 +308,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<B>This is <I>nesting</I> of subtitles</B>", rs); + r.convert_line(0, "<B>This is <I>nesting</I> of subtitles</B>", rs); BOOST_CHECK_EQUAL(r._subs.size(), 3U); i = r._subs.begin(); BOOST_CHECK_EQUAL (i->text, "This is "); @@ -326,7 +326,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<font color=\"#ff00ff\">simple color</font>", rs); + r.convert_line(0, "<font color=\"#ff00ff\">simple color</font>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "simple color"); BOOST_CHECK_EQUAL (r._subs.front().bold, false); @@ -337,7 +337,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) /* single quotes are apparently also allowed */ rs = sub::RawSubtitle(); - r.convert_line("<font color=\'#ff00ff\'>simple color</font>", rs); + r.convert_line(0, "<font color=\'#ff00ff\'>simple color</font>", rs); BOOST_CHECK_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL(r._subs.front().text, "simple color"); BOOST_CHECK_EQUAL(r._subs.front().bold, false); @@ -347,7 +347,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear(); rs = sub::RawSubtitle(); - r.convert_line ("<font color=\"#FF00FF\">simple color in capitals</font>", rs); + r.convert_line(0, "<font color=\"#FF00FF\">simple color in capitals</font>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "simple color in capitals"); BOOST_CHECK_EQUAL (r._subs.front().bold, false); @@ -357,7 +357,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<font color=\"#ff0000\">some red text <b>in bold</b></font>", rs); + r.convert_line(0, "<font color=\"#ff0000\">some red text <b>in bold</b></font>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 2U); i = r._subs.begin (); BOOST_CHECK_EQUAL (i->text, "some red text "); @@ -374,7 +374,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<Font color=\"#ff0000\">some red text <b>in bold</b></font>", rs); + r.convert_line(0, "<Font color=\"#ff0000\">some red text <b>in bold</b></font>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 2U); i = r._subs.begin (); BOOST_CHECK_EQUAL (i->text, "some red text "); @@ -391,7 +391,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line ("<font color=\"#0000ff\">some blue text <b>in bold</b></font>", rs); + r.convert_line(0, "<font color=\"#0000ff\">some blue text <b>in bold</b></font>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 2U); i = r._subs.begin (); BOOST_CHECK_EQUAL (i->text, "some blue text "); @@ -408,7 +408,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear (); rs = sub::RawSubtitle(); - r.convert_line("<font color=\"#0000ffdd\">some blue text with alpha</font>", rs); + r.convert_line(0, "<font color=\"#0000ffdd\">some blue text with alpha</font>", rs); BOOST_CHECK_EQUAL(r._subs.size(), 1U); i = r._subs.begin(); BOOST_CHECK_EQUAL(i->text, "some blue text with alpha"); @@ -419,7 +419,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_convert_line_test) r._subs.clear(); rs = sub::RawSubtitle(); - r.convert_line ("<< angle brackets but no HTML >>", rs); + r.convert_line(0, "<< angle brackets but no HTML >>", rs); BOOST_CHECK_EQUAL (r._subs.size(), 1U); i = r._subs.begin (); BOOST_CHECK_EQUAL (i->text, "<< angle brackets but no HTML >>"); @@ -610,7 +610,7 @@ 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); + r.convert_line(0, "<font color=\"rgba(255,128,64,15)\">Foo bar</font>", rs); BOOST_REQUIRE_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); BOOST_CHECK_CLOSE (r._subs.front().colour.r, 255.0 / 255, 0.1); @@ -619,7 +619,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test5) r._subs.clear (); rs = sub::RawSubtitle (); - r.convert_line ("<font color=\"rgba(1, 2 , 3, 4)\">Foo bar</font>", rs); + r.convert_line(0, "<font color=\"rgba(1, 2 , 3, 4)\">Foo bar</font>", rs); BOOST_REQUIRE_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Foo bar"); BOOST_CHECK_CLOSE (r._subs.front().colour.r, 1.0 / 255, 0.1); @@ -635,7 +635,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test6) rs.vertical_position.line = 0; rs.vertical_position.reference = sub::TOP_OF_SUBTITLE; sub::SubripReader r; - r.convert_line ("Hello world", rs); + r.convert_line(0, "Hello world", rs); BOOST_REQUIRE_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello world"); BOOST_REQUIRE (r._subs.front().vertical_position.line); @@ -646,7 +646,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test6) rs = sub::RawSubtitle (); rs.vertical_position.line = 0; - r.convert_line ("{\\an1}Hello", rs); + r.convert_line(0, "{\\an1}Hello", rs); BOOST_REQUIRE_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "Hello"); BOOST_REQUIRE (r._subs.front().vertical_position.line); @@ -659,7 +659,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test6) rs = sub::RawSubtitle (); rs.vertical_position.line = 0; - r.convert_line ("{\\an2}to", rs); + r.convert_line(0, "{\\an2}to", rs); BOOST_REQUIRE_EQUAL(r._subs.size(), 1U); BOOST_CHECK_EQUAL (r._subs.front().text, "to"); BOOST_REQUIRE (r._subs.front().vertical_position.line); @@ -672,7 +672,7 @@ BOOST_AUTO_TEST_CASE (subrip_reader_test6) rs = sub::RawSubtitle (); rs.vertical_position.line = 0; - r.convert_line ("{\\an3}you", rs); + r.convert_line(0, "{\\an3}you", rs); BOOST_CHECK_EQUAL (r._subs.front().text, "you"); BOOST_REQUIRE (r._subs.front().vertical_position.line); BOOST_CHECK_EQUAL (r._subs.front().vertical_position.line.get(), 0); |
