From eab369b5721b933c080516fd1dcdfa67e6e2dfcd Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 12 Dec 2013 22:19:46 +0000 Subject: Read classes on HTML path elements --- mammoth/html_paths.py | 8 +++++--- mammoth/style_reader.py | 19 +++++++++++++++++-- tests/style_reader_tests.py | 16 ++++++++++++++++ 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/mammoth/html_paths.py b/mammoth/html_paths.py index cb53968..0f2184d 100644 --- a/mammoth/html_paths.py +++ b/mammoth/html_paths.py @@ -5,9 +5,11 @@ def path(elements): return HtmlPath(elements) -def element(names): - return HtmlPathElement(names) +def element(names, class_names=None): + if class_names is None: + class_names = [] + return HtmlPathElement(names, class_names) HtmlPath = collections.namedtuple("HtmlPath", ["elements"]) -HtmlPathElement = collections.namedtuple("HtmlPathElement", ["names"]) +HtmlPathElement = collections.namedtuple("HtmlPathElement", ["names", "class_names"]) diff --git a/mammoth/style_reader.py b/mammoth/style_reader.py index 7a7474f..4418dbb 100644 --- a/mammoth/style_reader.py +++ b/mammoth/style_reader.py @@ -18,7 +18,9 @@ def _read_path_node(path_node): def _read_element_node(node): - return html_paths.element(_read_tag_names_node(node)) + tag_names = _read_tag_names_node(node.children[0]) + class_names = _read_class_names_node(node.children[1]) + return html_paths.element(tag_names, class_names=class_names) def _read_tag_names_node(node): @@ -28,6 +30,17 @@ def _read_tag_names_node(node): ] +def _read_class_names_node(class_names_node): + return [ + _read_class_name_node(node) + for node in class_names_node.children + ] + + +def _read_class_name_node(node): + return node.children[1].text + + def _repeated_children_with_separator(node, has_whitespace): yield node.children[0] @@ -45,7 +58,9 @@ _grammar = Grammar(r""" path = element whitespace* (">" whitespace* element)* -element = tag_names +element = tag_names class_name* + +class_name = "." identifier tag_names = identifier ("|" identifier)* diff --git a/tests/style_reader_tests.py b/tests/style_reader_tests.py index 595ece1..a25d7ce 100644 --- a/tests/style_reader_tests.py +++ b/tests/style_reader_tests.py @@ -35,3 +35,19 @@ class ReadHtmlPathTests(object): html_paths.path([html_paths.element(["ul"]), html_paths.element(["li"])]), read_html_path("ul > li") ) + + + @istest + def can_read_class_on_element(self): + assert_equal( + html_paths.path([html_paths.element(["p"], class_names=["tip"])]), + read_html_path("p.tip") + ) + + + @istest + def can_read__multiple_classes_on_element(self): + assert_equal( + html_paths.path([html_paths.element(["p"], class_names=["tip", "help"])]), + read_html_path("p.tip.help") + ) -- cgit v1.2.3