def _convert_to_caption(self, buffer, start): # check to see if previous caption needs an end-time if self.scc and self.scc[-1].end == 0: self.scc[-1].end = start # initial variables caption = Caption() caption.start = start caption.end = 0 # Not yet known; filled in later self.open_italic = False self.first_element = True # split into elements (e.g. break, italics, text) for element in buffer.split('<$>'): # skip empty elements if element.strip() == '': continue # handle line breaks elif element == '{break}': self._translate_break(caption) # handle open italics elif element == '{italic}': # add italics caption.nodes.append(CaptionNode.create_style(True, {'italics': True})) # open italics, no longer first element self.open_italic = True self.first_element = False # handle clone italics elif element == '{end-italic}' and self.open_italic: caption.nodes.append(CaptionNode.create_style(False, {'italics': True})) self.open_italic = False # handle text else: # add text caption.nodes.append(CaptionNode.create_text(' '.join(element.split()))) # no longer first element self.first_element = False # close any open italics left over if self.open_italic == True: caption.nodes.append(CaptionNode.create_style(False, {'italics': True})) # remove extraneous italics tags in the same caption self._remove_italics(caption) # only add captions to list if content inside exists if caption.nodes: self.scc.append(caption)
def _translate_span(self, tag): # convert tag attributes args = self._translate_attrs(tag) # only include span tag if attributes returned if args != '': node = CaptionNode.create_style(True, args) self.line.append(node) # recursively call function for any children elements for a in tag.contents: self._translate_tag(a) node = CaptionNode.create_style(False, args) self.line.append(node) else: for a in tag.contents: self._translate_tag(a)
def _translate_tag(self, tag): # convert text if isinstance(tag, NavigableString): self.line.append(CaptionNode.create_text(tag.strip())) # convert line breaks elif tag.name == 'br': self.line.append(CaptionNode.create_break()) # convert italics elif tag.name == 'i': self.line.append(CaptionNode.create_style(True, {'italics': True})) # recursively call function for any children elements for a in tag.contents: self._translate_tag(a) self.line.append( CaptionNode.create_style(False, {'italics': True})) elif tag.name == 'span': self._translate_span(tag) else: # recursively call function for any children elements for a in tag.contents: self._translate_tag(a)
def _translate_break(self, caption): # if break appears at start of caption, skip break if self.first_element == True: return # if the last caption was a break, skip this break elif caption.nodes[-1].type == CaptionNode.BREAK: return # close any open italics elif self.open_italic == True: caption.nodes.append(CaptionNode.create_style(False, {'italics': True})) self.open_italic = False # add line break caption.nodes.append(CaptionNode.create_break())