aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-12 21:57:49 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-12 21:57:49 +0000
commitd745ac4b6d65e6729b3d70ddaa23a95bb59fbd39 (patch)
tree4a8891a371ca84f5cbb657f3382284992df86b6c
parente2a87dbda6d32200b5fa68ba2f5e48aa526499f2 (diff)
Support choice of element
-rw-r--r--mammoth/html_paths.py6
-rw-r--r--mammoth/style_reader.py19
-rw-r--r--setup.py3
-rw-r--r--tests/style_reader_tests.py17
4 files changed, 40 insertions, 5 deletions
diff --git a/mammoth/html_paths.py b/mammoth/html_paths.py
index bc4eba1..cb53968 100644
--- a/mammoth/html_paths.py
+++ b/mammoth/html_paths.py
@@ -5,9 +5,9 @@ def path(elements):
return HtmlPath(elements)
-def element(name):
- return HtmlPathElement(name)
+def element(names):
+ return HtmlPathElement(names)
HtmlPath = collections.namedtuple("HtmlPath", ["elements"])
-HtmlPathElement = collections.namedtuple("HtmlPathElement", ["name"])
+HtmlPathElement = collections.namedtuple("HtmlPathElement", ["names"])
diff --git a/mammoth/style_reader.py b/mammoth/style_reader.py
index 18c848d..0c27bd8 100644
--- a/mammoth/style_reader.py
+++ b/mammoth/style_reader.py
@@ -1,5 +1,22 @@
+from parsimonious.grammar import Grammar
+
from . import html_paths
def read_html_path(string):
- return html_paths.path([html_paths.element(string)])
+ root_node = _grammar.parse(string)
+ tag_names = [root_node.children[0].text]
+
+ for choice_node in root_node.children[1].children:
+ tag_names.append(choice_node.children[1].text)
+
+ return html_paths.path([html_paths.element(tag_names)])
+
+
+_grammar = Grammar("""
+
+tag_names = identifier ("|" identifier)*
+
+identifier = ~"[A-Z0-9]*"i
+
+""")
diff --git a/setup.py b/setup.py
index 2f8f030..29d161f 100644
--- a/setup.py
+++ b/setup.py
@@ -16,5 +16,8 @@ setup(
url='http://github.com/mwilliamson/python-mammoth',
packages=['mammoth', 'mammoth.docx'],
keywords="docx word office clean html",
+ install_requires=[
+ "parsimonious>=0.5,<0.6",
+ ]
)
diff --git a/tests/style_reader_tests.py b/tests/style_reader_tests.py
index df2b622..43bb3db 100644
--- a/tests/style_reader_tests.py
+++ b/tests/style_reader_tests.py
@@ -9,6 +9,21 @@ class ReadHtmlPathTests(object):
@istest
def can_read_single_element(self):
assert_equal(
- html_paths.path([html_paths.element("p")]),
+ html_paths.path([html_paths.element(["p"])]),
read_html_path("p")
)
+
+ @istest
+ def can_read_choice_of_two_elements(self):
+ assert_equal(
+ html_paths.path([html_paths.element(["ul", "ol"])]),
+ read_html_path("ul|ol")
+ )
+
+
+ @istest
+ def can_read_choice_of_three_elements(self):
+ assert_equal(
+ html_paths.path([html_paths.element(["ul", "ol", "p"])]),
+ read_html_path("ul|ol|p")
+ )