Split up into RawSubtitle and Subtitle, with collect(). Hopefully cleaner.
[libsub.git] / src / collect.cc
1 /*
2     Copyright (C) 2014 Carl Hetherington <cth@carlh.net>
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include "raw_subtitle.h"
21 #include "subtitle.h"
22 #include "collect.h"
23
24 using std::list;
25 using boost::optional;
26 using namespace sub;
27
28 list<Subtitle>
29 sub::collect (list<RawSubtitle> raw)
30 {
31         raw.sort ();
32
33         list<Subtitle> out;
34
35         optional<Subtitle> current;
36         for (list<RawSubtitle>::const_iterator i = raw.begin (); i != raw.end(); ++i) {
37                 if (current && current->same_metadata (*i)) {
38                         /* This RawSubtitle can be added to current... */
39                         if (!current->lines.empty() && current->lines.back().same_metadata (*i)) {
40                                 /* ... and indeed to its last line */
41                                 current->lines.back().blocks.push_back (Block (*i));
42                         } else {
43                                 /* ... as a new line */
44                                 current->lines.push_back (Line (*i));
45                         }
46                 } else {
47                         /* We must start a new Subtitle */
48                         if (current) {
49                                 out.push_back (current.get ());
50                         }
51                         current = Subtitle (*i);
52                 }
53         }
54
55         if (current) {
56                 out.push_back (current.get ());
57         }
58
59         return out;
60 }