def handle_starttag(self, name, attrs, state, contentstate): # forcibly close any block that illegally contains this one state.current_block = None attr_dict = dict(attrs) # convert attrs from list of (name, value) tuples to a dict entity = self.create_entity(name, attr_dict, state, contentstate) key = contentstate.add_entity(entity) block = Block('atomic', depth=state.list_depth) contentstate.blocks.append(block) block.text = ' ' entity_range = EntityRange(key) entity_range.offset = 0 entity_range.length = 1 block.entity_ranges.append(entity_range)
def handle_starttag(self, name, attrs, state, contentstate): # forcibly close any block that illegally contains this one state.current_block = None if not state.has_preceding_nonatomic_block: # if this block is NOT preceded by a non-atomic block, # need to insert a spacer paragraph add_paragraph_block(state, contentstate) attr_dict = dict(attrs) # convert attrs from list of (name, value) tuples to a dict entity = self.create_entity(name, attr_dict, state, contentstate) key = contentstate.add_entity(entity) block = Block('atomic', depth=state.list_depth) contentstate.blocks.append(block) block.text = ' ' entity_range = EntityRange(key) entity_range.offset = 0 entity_range.length = 1 block.entity_ranges.append(entity_range) state.has_preceding_nonatomic_block = False
def handle_starttag(self, name, attrs, state, contentstate): if state.current_block: # Placing an atomic block inside another block (e.g. a paragraph) is invalid in # contentstate; we will recover from this by forcibly closing the block along with all # of its inline styles / entities, and opening a new identical one afterwards. # Construct a new block of the same type and depth as the currently open one; this will # become the new 'current block' after we've added the atomic block. next_block = Block(state.current_block.type, depth=state.current_block.depth) for inline_style_range in state.current_inline_styles: # set this inline style to end at the current text position inline_style_range.length = len(state.current_block.text) - inline_style_range.offset # start a new one of the same type, which will begin at the next block new_inline_style = InlineStyleRange(inline_style_range.style) new_inline_style.offset = 0 next_block.inline_style_ranges.append(new_inline_style) for entity_range in state.current_entity_ranges: # set this inline entity to end at the current text position entity_range.length = len(state.current_block.text) - entity_range.offset # start a new entity range, pointing to the same entity, to begin at the next block new_entity_range = EntityRange(entity_range.key) new_entity_range.offset = 0 next_block.entity_ranges.append(new_entity_range) state.current_block = None else: next_block = None if not state.has_preceding_nonatomic_block: # if this block is NOT preceded by a non-atomic block, # need to insert a spacer paragraph add_paragraph_block(state, contentstate) # immediately set this as not the current block, so that any subsequent invocations # of this handler don't think we're inside it state.current_block = None attr_dict = dict(attrs) # convert attrs from list of (name, value) tuples to a dict entity = self.create_entity(name, attr_dict, state, contentstate) key = contentstate.add_entity(entity) block = Block('atomic', depth=state.list_depth) contentstate.blocks.append(block) block.text = ' ' entity_range = EntityRange(key) entity_range.offset = 0 entity_range.length = 1 block.entity_ranges.append(entity_range) state.has_preceding_nonatomic_block = False if next_block: # take the replica that we made of the previous block and its inline styles / entities, # and make that the new current block. Now, when we encounter the closing tags for # those styles/entities further on in the document, they will close the range that # began here. contentstate.blocks.append(next_block) state.current_block = next_block state.current_inline_styles = next_block.inline_style_ranges.copy() state.current_entity_ranges = next_block.entity_ranges.copy() state.has_preceding_nonatomic_block = True state.leading_whitespace = STRIP_WHITESPACE