summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-14 15:28:03 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-14 15:28:03 +0000
commit8cf77f91fa81823af6c84ed7ca97a3a21dc89d6b (patch)
tree6713bc4871635c34605f8fb79a84237dc97004a0
parent841de73928538038496f15467aba9001b47a2d9c (diff)
Generate HTML to satisfy HTML paths
-rw-r--r--mammoth/html_generation.py17
-rw-r--r--tests/html_generation_tests.py37
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())