From 2920e3642ccc1afcd22cf5d4de5fd92f2cee5003 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 14 Dec 2013 15:38:28 +0000 Subject: Match class names when satisfying HTML paths --- mammoth/html_generation.py | 19 +++++++++++++++++-- tests/html_generation_tests.py | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/mammoth/html_generation.py b/mammoth/html_generation.py index a4d716e..563e2d6 100644 --- a/mammoth/html_generation.py +++ b/mammoth/html_generation.py @@ -49,6 +49,9 @@ class HtmlGenerator(object): class _Element(object): def __init__(self, name, attributes): + if attributes is None: + attributes = {} + self.name = name self.attributes = attributes self.written = False @@ -76,13 +79,25 @@ def satisfy_html_path(generator, path): for element in path.elements[first_unsatisfied_index:]: attributes = {} if element.class_names: - attributes["class"] = " ".join(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 generated_element.name not in path_element.names or path_element.fresh: + 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 index c39f886..25b4803 100644 --- a/tests/html_generation_tests.py +++ b/tests/html_generation_tests.py @@ -147,3 +147,25 @@ class SatisfyPathTests(object): satisfy_html_path(generator, path) generator.text("Hello") assert_equal('

Hello', generator.html_string()) + + + @istest + def elements_do_not_match_if_class_names_do_not_match(self): + generator = HtmlGenerator() + 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('

Help

Tip', generator.html_string()) + + + @istest + def class_names_match_if_they_are_the_same(self): + generator = HtmlGenerator() + 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('

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