diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-12-14 15:28:03 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-12-14 15:28:03 +0000 |
| commit | 8cf77f91fa81823af6c84ed7ca97a3a21dc89d6b (patch) | |
| tree | 6713bc4871635c34605f8fb79a84237dc97004a0 | |
| parent | 841de73928538038496f15467aba9001b47a2d9c (diff) | |
Generate HTML to satisfy HTML paths
| -rw-r--r-- | mammoth/html_generation.py | 17 | ||||
| -rw-r--r-- | tests/html_generation_tests.py | 37 |
2 files changed, 53 insertions, 1 deletions
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('<p>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('<p>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('<blockquote>Hello<p>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('<blockquote><span>Hello</span><p>there', generator.html_string()) |
