[z3-checkins] r44984 - in z3/deliverance/trunk/deliverance: . test-data
ianb at codespeak.net
ianb at codespeak.net
Thu Jul 12 23:05:08 CEST 2007
Author: ianb
Date: Thu Jul 12 23:05:07 2007
New Revision: 44984
Modified:
z3/deliverance/trunk/deliverance/test-data/test_xpath_rules.xml
z3/deliverance/trunk/deliverance/utils.py
Log:
Fix for #429, problem with | (union) in xpath expressions when there's an external reference. Also add support for ||, which selects the first xpath expression that returns something
Modified: z3/deliverance/trunk/deliverance/test-data/test_xpath_rules.xml
==============================================================================
--- z3/deliverance/trunk/deliverance/test-data/test_xpath_rules.xml (original)
+++ z3/deliverance/trunk/deliverance/test-data/test_xpath_rules.xml Thu Jul 12 23:05:07 2007
@@ -42,5 +42,54 @@
</output>
</deliverance-test>
+<deliverance-test>
+ <rules xmlns="http://www.plone.org/deliverance">
+ <copy theme=".//div[@id='foo']"
+ content=".//div || .//body/*" />
+ </rules>
+
+ <theme base="http://example.com">
+ <html><body><div id="foo"></div></body></html>
+ </theme>
+
+ <content>
+ <html><body>
+ <div>some content</div>
+ <span>more content</span>
+ </body></html>
+ </content>
+
+ <output>
+ <html><body><div id="foo">
+ <div>some content</div></div></body></html>
+ </output>
+</deliverance-test>
+
+
+<deliverance-test>
+ <rules xmlns="http://www.plone.org/deliverance">
+ <copy theme=".//div[@id='foo']"
+ content=".//div || .//body/*" />
+ </rules>
+
+ <theme base="http://example.com">
+ <html><body><div id="foo"></div></body></html>
+ </theme>
+
+ <content>
+ <html><body>
+ <span>some content</span>
+ <span>more content</span>
+ </body></html>
+ </content>
+
+ <output>
+ <html><body><div id="foo">
+ <span>some content</span>
+ <span>more content</span>
+ </div></body></html>
+ </output>
+</deliverance-test>
+
</deliverance-test-suite>
Modified: z3/deliverance/trunk/deliverance/utils.py
==============================================================================
--- z3/deliverance/trunk/deliverance/utils.py (original)
+++ z3/deliverance/trunk/deliverance/utils.py Thu Jul 12 23:05:07 2007
@@ -404,7 +404,7 @@
<content>
<document content="http://blah.org/foo">...</document>
- <docuemnt content="deliverance:request-content">
+ <document content="deliverance:request-content">
...
</document>
</content>
@@ -456,6 +456,57 @@
if content_xpath is None:
return None
+
+ content_doc = rule.get(self.RULE_HREF_KEY, self.REQUEST_CONTENT)
+ ored_parts = content_xpath.split('||')
+ ored_parts = [self._translate_content_xpath(part, content_doc)
+ for part in ored_parts]
+ if len(ored_parts) == 1:
+ # Simplest/commonest case, we'll just skip the rest:
+ return ored_parts[0]
+ prev_parts = []
+ new_parts = []
+ for part in ored_parts:
+ for prev_part in prev_parts:
+ part = self._add_xpath_condition(
+ part, 'count(%s) = 0' % (prev_part))
+ new_parts.append(part)
+ prev_parts.append(part)
+ content_xpath = ' | '.join(new_parts)
+ return content_xpath
+
+ def _translate_content_xpath(self, xpath, content_doc):
+ paths = xpath.split('|')
+ new_paths = []
+ for path in paths:
+ path = path.strip()
+ if not path.startswith('/'):
+ path = '/' + path
+ new_paths.append(
+ "/content/document[@content='%s']%s"
+ % (content_doc, path))
+ return ' | '.join(new_paths)
+
+ def _add_xpath_condition(self, xpath, cond, operator='and'):
+ if xpath.endswith(']'):
+ return '%s %s (%s)]' % (
+ xpath[:-1], operator, cond)
+ else:
+ return '%s[%s]' % (xpath, cond)
+
+
+
+
+
+ def x_get_content_xpath(self, rule):
+ """
+ gets the xpath to lookup the content referred to by rule
+ in the aggregated content document
+ """
+ content_xpath = rule.get(self.RULE_CONTENT_KEY)
+
+ if content_xpath is None:
+ return None
if not content_xpath.startswith('/'):
content_xpath = '/%s' % content_xpath
@@ -466,5 +517,3 @@
return new_xpath
-
-
More information about the z3-checkins
mailing list