From 8cf77f91fa81823af6c84ed7ca97a3a21dc89d6b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Dec 2013 15:28:03 +0000 Subject: Generate HTML to satisfy HTML paths --- mammoth/html_generation.py | 17 +++++++++++++++++ tests/html_generation_tests.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/mammoth/html_generation.py b/mammoth/html_generation.py index e276bdc..90a1401 100644 --- a/mammoth/html_generation.py +++ b/mammoth/html_generation.py @@ -66,3 +66,20 @@ def _generate_attribute_string(attributes): ' {0}="{1}"'.format(key, _escape_html(value)) for key, value in attributes.iteritems() ) + + +def satisfy_html_path(generator, path): + first_unsatisfied_index = _find_first_unsatisfied_index(generator, path) + while len(generator._stack) > first_unsatisfied_index: + generator.end() + + for element in path.elements[first_unsatisfied_index:]: + generator.start(element.names[0]) + + +def _find_first_unsatisfied_index(generator, path): + for index, (generated_element, path_element) in enumerate(zip(generator._stack, path.elements)): + if generated_element.name not in path_element.names: + return index + + return len(generator._stack) diff --git a/tests/html_generation_tests.py b/tests/html_generation_tests.py index f32b713..4a8a43c 100644 --- a/tests/html_generation_tests.py +++ b/tests/html_generation_tests.py @@ -1,6 +1,7 @@ from nose.tools import istest, assert_equal -from mammoth.html_generation import HtmlGenerator +from mammoth.html_generation import HtmlGenerator, satisfy_html_path +from mammoth import html_paths @istest @@ -91,3 +92,37 @@ def appending_another_html_generator_writes_out_elements_if_other_generator_is_n other.text("Hello!") generator.append(other) assert_equal('

Hello!', generator.html_string()) + + +@istest +class SatisfyPathTests(object): + @istest + def plain_elements_are_generated_to_satisfy_plain_path_elements(self): + generator = HtmlGenerator() + path = html_paths.path([html_paths.element(["p"])]) + satisfy_html_path(generator, path) + generator.text("Hello!") + assert_equal('

Hello!', generator.html_string()) + + + @istest + def only_missing_elements_are_generated_to_satisfy_plain_path_elements(self): + generator = HtmlGenerator() + generator.start("blockquote") + generator.text("Hello") + path = html_paths.path([html_paths.element(["blockquote"]), html_paths.element(["p"])]) + satisfy_html_path(generator, path) + generator.text("there") + assert_equal('

Hello

there', generator.html_string()) + + + @istest + def mismatched_elements_are_closed_to_satisfy_plain_path_elements(self): + generator = HtmlGenerator() + generator.start("blockquote") + generator.start("span") + generator.text("Hello") + path = html_paths.path([html_paths.element(["blockquote"]), html_paths.element(["p"])]) + satisfy_html_path(generator, path) + generator.text("there") + assert_equal('

Hello

there', generator.html_string()) -- cgit v1.2.3