summaryrefslogtreecommitdiff
path: root/src/subtitle_asset.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2012-09-09 18:12:32 +0100
committerCarl Hetherington <cth@carlh.net>2012-09-09 18:12:32 +0100
commit8411002d2c768dfaaa4b89cf6a2b12b3967f1f69 (patch)
tree35f43d5f12ca34868c7b64de1671ca72b38177b1 /src/subtitle_asset.cc
parentc1798d06bb87eddfb08945893b0b9166fd097f93 (diff)
Clean up and fix subtitle parsing a bit.
Diffstat (limited to 'src/subtitle_asset.cc')
-rw-r--r--src/subtitle_asset.cc100
1 files changed, 62 insertions, 38 deletions
diff --git a/src/subtitle_asset.cc b/src/subtitle_asset.cc
index ac222638..b7586207 100644
--- a/src/subtitle_asset.cc
+++ b/src/subtitle_asset.cc
@@ -19,6 +19,7 @@
#include <boost/lexical_cast.hpp>
#include "subtitle_asset.h"
+#include "util.h"
using namespace std;
using namespace boost;
@@ -42,71 +43,93 @@ SubtitleAsset::SubtitleAsset (string directory, string xml)
in a sane way.
*/
- list<shared_ptr<FontNode> > current_font_nodes;
- list<shared_ptr<SubtitleNode> > current_subtitle_nodes;
- current_subtitle_nodes.push_back (shared_ptr<SubtitleNode> ());
- examine_font_nodes (font_nodes, current_font_nodes, current_subtitle_nodes);
+ ParseState parse_state;
+ examine_font_nodes (font_nodes, parse_state);
}
void
SubtitleAsset::examine_font_nodes (
list<shared_ptr<FontNode> > const & font_nodes,
- list<shared_ptr<FontNode> >& current_font_nodes,
- list<shared_ptr<SubtitleNode> >& current_subtitle_nodes
+ ParseState& parse_state
)
{
for (list<shared_ptr<FontNode> >::const_iterator i = font_nodes.begin(); i != font_nodes.end(); ++i) {
-
- current_font_nodes.push_back (*i);
+
+ parse_state.font_nodes.push_back (*i);
+ maybe_add_subtitle ((*i)->text, parse_state);
for (list<shared_ptr<SubtitleNode> >::iterator j = (*i)->subtitle_nodes.begin(); j != (*i)->subtitle_nodes.end(); ++j) {
- current_subtitle_nodes.push_back (*j);
- examine_text_nodes (*j, (*j)->text_nodes, current_font_nodes);
- examine_font_nodes ((*j)->font_nodes, current_font_nodes, current_subtitle_nodes);
- current_subtitle_nodes.pop_back ();
+ parse_state.subtitle_nodes.push_back (*j);
+ examine_text_nodes ((*j)->text_nodes, parse_state);
+ examine_font_nodes ((*j)->font_nodes, parse_state);
+ parse_state.subtitle_nodes.pop_back ();
}
- examine_font_nodes ((*i)->font_nodes, current_font_nodes, current_subtitle_nodes);
- examine_text_nodes (current_subtitle_nodes.back (), (*i)->text_nodes, current_font_nodes);
+ examine_font_nodes ((*i)->font_nodes, parse_state);
+ examine_text_nodes ((*i)->text_nodes, parse_state);
- current_font_nodes.pop_back ();
+ parse_state.font_nodes.pop_back ();
}
}
void
SubtitleAsset::examine_text_nodes (
- shared_ptr<SubtitleNode> subtitle_node,
list<shared_ptr<TextNode> > const & text_nodes,
- list<shared_ptr<FontNode> >& current_font_nodes
+ ParseState& parse_state
)
{
for (list<shared_ptr<TextNode> >::const_iterator i = text_nodes.begin(); i != text_nodes.end(); ++i) {
- FontNode effective (current_font_nodes);
- _subtitles.push_back (
- shared_ptr<Subtitle> (
- new Subtitle (
- font_id_to_name (effective.id),
- effective.italic.get(),
- effective.color.get(),
- effective.size,
- subtitle_node->in,
- subtitle_node->out,
- (*i)->v_position,
- (*i)->v_align,
- (*i)->text,
- effective.effect.get(),
- effective.effect_color.get(),
- subtitle_node->fade_up_time,
- subtitle_node->fade_down_time
- )
- )
- );
+ parse_state.text_nodes.push_back (*i);
+ maybe_add_subtitle ((*i)->text, parse_state);
+ examine_font_nodes ((*i)->font_nodes, parse_state);
+ parse_state.text_nodes.pop_back ();
}
}
+void
+SubtitleAsset::maybe_add_subtitle (string text, ParseState const & parse_state)
+{
+ if (empty_or_white_space (text)) {
+ return;
+ }
+
+ if (parse_state.text_nodes.empty() || parse_state.subtitle_nodes.empty ()) {
+ return;
+ }
+
+ assert (!parse_state.text_nodes.empty ());
+ assert (!parse_state.subtitle_nodes.empty ());
+
+ FontNode effective_font (parse_state.font_nodes);
+ TextNode effective_text (*parse_state.text_nodes.back ());
+ SubtitleNode effective_subtitle (*parse_state.subtitle_nodes.back ());
+
+ _subtitles.push_back (
+ shared_ptr<Subtitle> (
+ new Subtitle (
+ font_id_to_name (effective_font.id),
+ effective_font.italic.get(),
+ effective_font.color.get(),
+ effective_font.size,
+ effective_subtitle.in,
+ effective_subtitle.out,
+ effective_text.v_position,
+ effective_text.v_align,
+ text,
+ effective_font.effect.get(),
+ effective_font.effect_color.get(),
+ effective_subtitle.fade_up_time,
+ effective_subtitle.fade_down_time
+ )
+ )
+ );
+}
+
FontNode::FontNode (xmlpp::Node const * node)
: XMLNode (node)
{
+ text = content ();
+
id = optional_string_attribute ("Id");
size = optional_int64_attribute ("Size");
italic = optional_bool_attribute ("Italic");
@@ -209,8 +232,9 @@ TextNode::TextNode (xmlpp::Node const * node)
} else if (v == "bottom") {
v_align = BOTTOM;
}
-}
+ font_nodes = sub_nodes<FontNode> ("Font");
+}
list<shared_ptr<Subtitle> >
SubtitleAsset::subtitles_at (Time t) const