From 2c57c1014ae8e44e62021ea2cc36c54352389632 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 14 Mar 2016 20:46:13 +0000 Subject: Implement collapsing using HTML AST --- mammoth/html/__init__.py | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) (limited to 'mammoth/html') diff --git a/mammoth/html/__init__.py b/mammoth/html/__init__.py index 54bb87d..889ec68 100644 --- a/mammoth/html/__init__.py +++ b/mammoth/html/__init__.py @@ -6,15 +6,7 @@ def text(value): return TextNode(value) -def element(tag_name, attributes=None, children=None): - return _element(tag_name, attributes, children, collapsible=False) - - -def collapsible_element(tag_name, attributes=None, children=None): - return _element(tag_name, attributes, children, collapsible=True) - - -def _element(tag_names, attributes, children, collapsible): +def element(tag_names, attributes=None, children=None, collapsible=False): if not isinstance(tag_names, list): tag_names = [tag_names] if attributes is None: @@ -22,6 +14,10 @@ def _element(tag_names, attributes, children, collapsible): if children is None: children = [] return Element(tag_names, attributes, children, collapsible=collapsible) + + +def collapsible_element(tag_names, attributes=None, children=None): + return element(tag_names, attributes, children, collapsible=True) def self_closing_element(tag_name, attributes=None): @@ -120,3 +116,31 @@ def _try_collapse(collapsed, node): def _is_match(first, second): return first.tag_name in second.tag_names and first.attributes == second.attributes + + +def write(writer, nodes): + visitor = _NodeWriter(writer) + visitor.visit_all(nodes) + + +class _NodeWriter(NodeVisitor): + def __init__(self, writer): + self._writer = writer + + def visit_text_node(self, node): + self._writer.text(node.value) + + def visit_element(self, element): + self._writer.start(element.tag_name, element.attributes) + self.visit_all(element.children) + self._writer.end(element.tag_name) + + def visit_self_closing_element(self, element): + self._writer.self_closing(element.tag_name, element.attributes) + + def visit_force_write(self, element): + pass + + def visit_all(self, nodes): + for node in nodes: + self.visit(node) -- cgit v1.2.3