diff options
| -rw-r--r-- | mammoth/html_generation.py | 104 | ||||
| -rw-r--r-- | tests/html_generation_tests.py | 199 |
2 files changed, 0 insertions, 303 deletions
diff --git a/mammoth/html_generation.py b/mammoth/html_generation.py deleted file mode 100644 index e538f6e..0000000 --- a/mammoth/html_generation.py +++ /dev/null @@ -1,104 +0,0 @@ -from __future__ import unicode_literals - - -class HtmlGenerator(object): - def __init__(self, create_writer): - self._stack = [] - self._create_writer = create_writer - self._writer = create_writer() - - def text(self, text): - if text: - self.write_all() - self._writer.text(text) - - def start(self, name, attributes=None, always_write=False): - self._stack.append(_Element(name, attributes)) - - if always_write: - self.write_all() - - def end(self): - element = self._stack.pop() - if element.written: - self._writer.end(element.name) - - def end_all(self): - while self._stack: - self.end() - - def self_closing(self, name, attributes=None): - self._writer.self_closing(name, attributes) - - def write_all(self): - for element in self._stack: - if not element.written: - element.written = True - self._write_element(element) - - def _write_element(self, element): - self._writer.start(element.name, element.attributes) - - def append(self, other): - other_string = other.as_string() - if other_string: - self.write_all() - self._writer.append(other_string) - - def as_string(self): - return self._writer.as_string() - - def child(self): - return HtmlGenerator(self._create_writer) - - -class _Element(object): - def __init__(self, name, attributes): - if attributes is None: - attributes = {} - - self.name = name - self.attributes = attributes - self.written = False - - -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:]: - _append_element(generator, element) - - -def append_html_path(generator, path): - for element in path.elements: - _append_element(generator, element) - - -def _append_element(generator, element): - attributes = {} - if element.class_names: - attributes["class"] = _generate_class_attribute(element) - generator.start(element.names[0], attributes=attributes) - - - -def _find_first_unsatisfied_index(generator, path): - for index, (generated_element, path_element) in enumerate(zip(generator._stack, path.elements)): - if not _is_element_match(generated_element, path_element): - return index - - return len(generator._stack) - - -def _is_element_match(generated_element, path_element): - return ( - not path_element.fresh and - generated_element.name in path_element.names and - generated_element.attributes.get("class", "") == _generate_class_attribute(path_element) - ) - - -def _generate_class_attribute(path_element): - return " ".join(path_element.class_names) diff --git a/tests/html_generation_tests.py b/tests/html_generation_tests.py deleted file mode 100644 index 0608a30..0000000 --- a/tests/html_generation_tests.py +++ /dev/null @@ -1,199 +0,0 @@ -from nose.tools import istest, assert_equal - -from mammoth.html_generation import HtmlGenerator, satisfy_html_path, append_html_path -from mammoth import html_paths -from mammoth.writers import HtmlWriter - - -@istest -def generates_empty_string_when_newly_created(): - generator = _create_html_generator() - assert_equal("", generator.as_string()) - - -@istest -def html_escapes_text(): - generator = _create_html_generator() - generator.text("<") - assert_equal("<", generator.as_string()) - - -@istest -def self_closing_tag_is_self_closing(): - generator = _create_html_generator() - generator.self_closing("br") - assert_equal("<br />", generator.as_string()) - - -@istest -def all_elements_are_closed_by_end_all(): - generator = _create_html_generator() - generator.start("p") - generator.start("span") - generator.text("Hello!") - generator.end_all() - assert_equal("<p><span>Hello!</span></p>", generator.as_string()) - - -@istest -def elements_with_no_text_are_not_generator(): - generator = _create_html_generator() - generator.start("p") - generator.start("span") - generator.end_all() - assert_equal("", generator.as_string()) - - -@istest -def elements_with_empty_string_text_are_not_generator(): - generator = _create_html_generator() - generator.start("p") - generator.start("span") - generator.text("") - generator.end_all() - assert_equal("", generator.as_string()) - - -@istest -def self_closing_tag_can_have_attributes(): - generator = _create_html_generator() - generator.self_closing("br", {"data-blah": "42"}) - assert_equal('<br data-blah="42" />', generator.as_string()) - - -@istest -def attribute_values_are_escaped(): - generator = _create_html_generator() - generator.self_closing("br", {"data-blah": "<"}) - assert_equal('<br data-blah="<" />', generator.as_string()) - - -@istest -def opening_tag_can_have_attributes(): - generator = _create_html_generator() - generator.start("p", {"data-blah": "42"}) - generator.text("Hello!") - generator.end() - assert_equal('<p data-blah="42">Hello!</p>', generator.as_string()) - - -@istest -def appending_another_html_generator_does_nothing_if_empty(): - generator = _create_html_generator() - generator.start("p") - generator.append(_create_html_generator()) - assert_equal('', generator.as_string()) - - -@istest -def appending_another_html_generator_writes_out_elements_if_other_generator_is_not_empty(): - generator = _create_html_generator() - generator.start("p") - other = _create_html_generator() - other.text("Hello!") - generator.append(other) - assert_equal('<p>Hello!', generator.as_string()) - - -@istest -class SatisfyPathTests(object): - @istest - def plain_elements_are_generated_to_satisfy_plain_path_elements(self): - generator = _create_html_generator() - path = html_paths.path([html_paths.element(["p"])]) - satisfy_html_path(generator, path) - generator.text("Hello!") - assert_equal('<p>Hello!', generator.as_string()) - - - @istest - def no_elements_are_generated_if_all_path_elements_are_already_satisfied(self): - generator = _create_html_generator() - generator.start("p") - generator.text("Hello") - path = html_paths.path([html_paths.element(["p"])]) - satisfy_html_path(generator, path) - generator.text("there") - assert_equal('<p>Hellothere', generator.as_string()) - - - @istest - def only_missing_elements_are_generated_to_satisfy_plain_path_elements(self): - generator = _create_html_generator() - 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.as_string()) - - - @istest - def mismatched_elements_are_closed_to_satisfy_plain_path_elements(self): - generator = _create_html_generator() - 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.as_string()) - - - @istest - def fresh_element_matches_nothing(self): - generator = _create_html_generator() - generator.start("blockquote") - generator.start("p") - generator.text("Hello") - path = html_paths.path([html_paths.element(["blockquote"]), html_paths.element(["p"], fresh=True)]) - satisfy_html_path(generator, path) - generator.text("there") - assert_equal('<blockquote><p>Hello</p><p>there', generator.as_string()) - - - @istest - def attributes_are_generated_when_satisfying_elements(self): - generator = _create_html_generator() - path = html_paths.path([html_paths.element(["p"], class_names=["tip"])]) - satisfy_html_path(generator, path) - generator.text("Hello") - assert_equal('<p class="tip">Hello', generator.as_string()) - - - @istest - def elements_do_not_match_if_class_names_do_not_match(self): - generator = _create_html_generator() - generator.start("p", {"class": "help"}) - generator.text("Help") - path = html_paths.path([html_paths.element(["p"], class_names=["tip"])]) - satisfy_html_path(generator, path) - generator.text("Tip") - assert_equal('<p class="help">Help</p><p class="tip">Tip', generator.as_string()) - - - @istest - def class_names_match_if_they_are_the_same(self): - generator = _create_html_generator() - generator.start("p", {"class": "tip"}) - generator.text("Help") - path = html_paths.path([html_paths.element(["p"], class_names=["tip"])]) - satisfy_html_path(generator, path) - generator.text("Tip") - assert_equal('<p class="tip">HelpTip', generator.as_string()) - - -@istest -class AppendPathTests(object): - @istest - def already_opened_elements_are_not_closed(self): - generator = _create_html_generator() - generator.start("strong") - path = html_paths.path([html_paths.element(["em"])]) - append_html_path(generator, path) - generator.text("Hello!") - assert_equal('<strong><em>Hello!', generator.as_string()) - - -def _create_html_generator(): - return HtmlGenerator(HtmlWriter) |
