def build_html(tree, writable): for node in tree: if isinstance(node, ParagraphNode): writable.write("<p>") elif isinstance(node, TextNode): writable.write(node.value) elif isinstance(node, LiteralNode): writable.write(node.value) elif isinstance(node, CommentNode): writable.write(node.value) elif isinstance(node, InlineTagNode): writable.write(node.value) elif isinstance(node, BlockTagNode): writable.write(node.value) elif isinstance(node, SelfClosingTagNode): tag = extract_tag_name(node.value) if tag == 'br': writable.write("<br>\n") else: writable.write(node.value) build_html(node, writable) if isinstance(node, ParagraphNode): writable.write("</p>\n") elif isinstance(node, InlineTagNode): tag = extract_tag_name(node.value) writable.write("</%s>" % tag) elif isinstance(node, BlockTagNode): tag = extract_tag_name(node.value) writable.write("</%s>\n" % tag)
def build_html(parse_tree, writable): for node in parse_tree: traverse_children = True if isinstance(node, ParagraphNode): writable.write("<p>") elif isinstance(node, TextNode): writable.write(node.value) elif isinstance(node, InlineTagNode) or \ isinstance(node, BlockTagNode): tag = extract_tag_name(node.value) handle_tag_node(node, tag, writable) traverse_children = should_traverse_children(tag) elif isinstance(node, SelfClosingTagNode): tag = extract_tag_name(node.value) if tag == 'br': writable.write("<br>\n") if traverse_children: build_html(node, writable) if isinstance(node, ParagraphNode): writable.write("</p>\n") elif isinstance(node, InlineTagNode): tag = extract_tag_name(node.value) writable.write("</%s>" % tag) elif isinstance(node, BlockTagNode): tag = extract_tag_name(node.value) writable.write("</%s>\n" % tag)
def gblock(token_stream): block = BlockTagNode(token_stream.value) tag_name = extract_tag_name(block.value) while True: if accept_token(token_stream, Token.Tag.Close): #assume correctly nested and closed tags skip_token(token_stream) return block elif accept_token(token_stream, Token.Par): skip_token(token_stream) elif accept_token(token_stream, Token.Br): if tag_name in RESPECT_BR: block.append(SelfClosingTagNode('<br>')) skip_token(token_stream) elif accept_token(token_stream, Token.Literal): block.append(LiteralNode(token_stream.value)) elif accept_token(token_stream, Token.Comment): block.append(CommentNode(token_stream.value)) elif accept_token(token_stream, Token.Text): block.append(block_try_p(tag_name, token_stream, TextNode)) elif accept_token(token_stream, Token.Tag.SelfClosingTag): block.append(block_try_p(tag_name, token_stream, SelfClosingTagNode)) elif accept_token(token_stream, Token.Tag.InlineTag): block.append(block_try_p(tag_name, token_stream, InlineTagNode, ginline_tag)) elif accept_token(token_stream, Token.Tag.BlockTag): nested_block = gblock(token_stream) block.append(nested_block) else: return block
def build_plain_text(tree, writable): for node in tree: if isinstance(node, TextNode): writable.write(node.value) elif isinstance(node, ParagraphNode): writable.write(' ') elif isinstance(node, SelfClosingTagNode): tag = extract_tag_name(node.value) if tag == 'br': writable.write(' ') build_plain_text(node, writable)
def empty_pred(node): if isinstance(node, TextNode): return empty_text(node.value) elif isinstance(node, SelfClosingTagNode): return extract_tag_name(node.value) == 'br' return False