Блок задач

5. Один класс

Темы
Сложность 4

Задача «Разбор SRT-субтитров»

Разработать класс SrtParser, осуществляющий разбор и упорядочивание субтитров, прочитанных из файла в простом формате SRT.

Входные данные

Файл в формате SRT.

Пример.

1 
00:00:01,000 --> 00:00:05,500
Раз
два
три

2 
00:00:06,000 --> 00:00:09,500
четыре пять

3
00:00:10,000 --> 00:00:15,500
вышел 
зайчик 
погулять

4
00:00:11,000 --> 00:00:19,500
белый зайчик

5
00:00:12,000 --> 00:00:14,500
наглый зайчик

6
00:00:13,000 --> 00:00:16,500
вышел
и ушел

7
00:00:15,000 --> 00:00:17,500
топтун

8
00:00:19,500 --> 00:00:19,600
вот и всё

Задача

Необходимо реализовать класс, который вычитывает субтитры из файла, и превращает их в отсортированный по времени набор команд SHOW TEXT \ HIDE TEXT (см. пример в выходных данных). При этом не гарантируется, что во входном файле субтитры будут в корректном, отсортированном по времени порядке. Так же допускается наличие во входном файле "пересекающихся" и даже "вложенных" по времени субтитров (см. пример во входных данных).

Интерфейс:

  1. Прочитать файл. Метод принимает в качестве входного параметра ссылку на открытый поток ввода (std::istream &).
  2. Упорядочить. Метод упорядочивает субтитры по времени показа, разбивает "пересекающиеся" и "вложенные друг в друга" субтитры и возвращает результат в виде std::vector< std::pair<double, std::string> >.

Тестирование

Необходимо реализовать набор тестов, проверяющих работу класса SrtParser. В частности необходимо проверить корректность методов чтения и упорядочивания субтитров для ряда частных случаев:

  • некорректные номера записей,
  • некорректные времена показа / скрытия,
  • отсутствие в конце файла 2 пустых строк,
  • пересечение времён показа двух и более записей (обратить внимание на порядок объединения строк),
  • "вложенность" времён показа двух и более записей,

и другие случаи на усмотрение студента.

Выходные данные

Файл с командами показа / скрытия субтитров.

Для приведённого выше примера вывод должен быть примерно следующим:

at 1,00 show 'Раз
два
три'
at 5,50 show ''
at 6,00 show 'четыре пять'
at 9,50 show ''
at 10,00 show 'вышел
зайчик
погулять'
at 11,00 show 'вышел
зайчик
погулять
белый зайчик'
at 12,00 show 'вышел
зайчик
погулять
белый зайчик
наглый зайчик'
at 13,00 show 'вышел
зайчик
погулять
белый зайчик
наглый зайчик
вышел
и ушел'
at 14,50 show 'вышел
зайчик
погулять
белый зайчик
вышел
и ушел'
at 15,00 show 'вышел
зайчик
погулять
белый зайчик
вышел
и ушел
топтун'
at 15,50 show 'белый зайчик
вышел
и ушел
топтун'
at 16,50 show 'белый зайчик
топтун'
at 17,50 show 'белый зайчик'
at 19,50 show 'вот и всё'
at 19,60 show ''

Возможное усложнение

Можно возвращать не готовый вектор с упорядоченными записями, а итератор (на основе forward iterator из stl). Такой подход позволяет использовать концепцию ленивых вычислений при упорядочивании записей.