from .timing import TimingValidationMixin
from .base import SemanticValidationMixin, IDMixin
from ebu_tt_live.errors import DiscardElement
from pyxb.binding.basis import NonElementContent
[docs]class ContentContainerMixin(object):
[docs] def is_empty(self):
"""
This check is made necessary by some splitting edge cases of content. To make empty containers are not included
one should check if there really was anything useful in the container. This function is meant to be
implemented by the subclasses of this class to make sure the container checks for the right constraints.
:return:
"""
raise NotImplementedError()
[docs] def _assert_empty_container(self):
if self.is_empty():
raise DiscardElement()
[docs]class SubtitleContentContainer(
ContentContainerMixin, IDMixin, TimingValidationMixin, SemanticValidationMixin):
[docs] def contains_subtitles(self):
if len(self.br):
return True
if len(self.span):
return True
for item in self.orderedContent():
# Last resort check for text content
if isinstance(item, NonElementContent):
if not item.value.isspace():
return True
return False
[docs] def is_empty(self):
return not self.contains_subtitles()
[docs] def content_to_string(self, begin=None, end=None):
str_lines = []
if end is not None:
if end <= self.computed_begin_time:
str_lines.append(
u'{} Timings: [({} - {})({} -{})(discarded)]'.format(
self.__class__.__name__,
self.begin,
self.end,
self.computed_begin_time,
self.computed_end_time
)
)
else:
if self.computed_end_time is not None and end < self.computed_end_time:
res_end_time = end
elif self.computed_end_time is None:
res_end_time = end
else:
res_end_time = self.computed_end_time
str_lines.append(
u'{} Timings: [({} - {})({} - {})({} - {})]'.format(
self.__class__.__name__,
self.begin,
self.end,
self.computed_begin_time,
self.computed_end_time,
begin if begin is not None and begin > self.computed_begin_time else self.computed_begin_time,
res_end_time
)
)
for item in self.orderedContent():
if isinstance(item, NonElementContent):
str_lines.append(u'{}'.format(item.value))
else:
str_lines.append(item.value.content_to_string(begin=begin, end=end))
return u'\n'.join(str_lines)