[z3-checkins] r33986 - in z3/deliverance/branches/packaged/deliverance: . test-data
ltucker at codespeak.net
ltucker at codespeak.net
Tue Oct 31 20:43:42 CET 2006
Author: ltucker
Date: Tue Oct 31 20:43:38 2006
New Revision: 33986
Modified:
z3/deliverance/branches/packaged/deliverance/interpreter.py
z3/deliverance/branches/packaged/deliverance/test-data/test_drop.xml
z3/deliverance/branches/packaged/deliverance/utils.py
z3/deliverance/branches/packaged/deliverance/xslt.py
Log:
Drop rules now apply first. Added support for content dropping to xslt renderer. Content dropping happens in as a separate transform of the content. We should look at folding this into the normal transform if possible
Modified: z3/deliverance/branches/packaged/deliverance/interpreter.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/interpreter.py (original)
+++ z3/deliverance/branches/packaged/deliverance/interpreter.py Tue Oct 31 20:43:38 2006
@@ -37,7 +37,14 @@
def apply_rules(self, rules, theme, content):
- for rule in rules:
+
+ drop_rules, other_rules = self.separate_drop_rules(rules)
+
+ # process all drop rules first
+ for rule in drop_rules:
+ self.apply_rule(rule, theme, content)
+
+ for rule in other_rules:
self.apply_rule(rule, theme, content)
@@ -361,7 +368,7 @@
removed = True
if not removed and rule.attrib.get(self.NOCONTENT_KEY) != 'ignore':
self.add_to_body_start(
- theme, self.format_error("no element found in %s" % context, rule))
+ theme, self.format_error("no %s matched" % context, rule))
def elements_in(self, els):
"""
Modified: z3/deliverance/branches/packaged/deliverance/test-data/test_drop.xml
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/test-data/test_drop.xml (original)
+++ z3/deliverance/branches/packaged/deliverance/test-data/test_drop.xml Tue Oct 31 20:43:38 2006
@@ -136,7 +136,7 @@
<html>
<body>
Dummy Content
- <div class="deliverance-error">Deliverance error: no element found in theme<br/>rule: <drop theme="//div[@id='foo']"/>
+ <div class="deliverance-error">Deliverance error: no theme matched<br/>rule: <drop theme="//div[@id='foo']"/>
</div>
</body>
</html>
@@ -161,7 +161,7 @@
<html>
<body>
Dummy Content
- <div class="deliverance-error">Deliverance error: no element found in content<br/>rule: <drop content="//div[@id='foo']"/>
+ <div class="deliverance-error">Deliverance error: no content matched<br/>rule: <drop content="//div[@id='foo']"/>
</div>
</body>
</html>
Modified: z3/deliverance/branches/packaged/deliverance/utils.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/utils.py (original)
+++ z3/deliverance/branches/packaged/deliverance/utils.py Tue Oct 31 20:43:38 2006
@@ -181,6 +181,24 @@
for el in elts:
el.attrib[attr] = urlparse.urljoin(base_uri, el.attrib[attr])
+ def separate_drop_rules(self, rules):
+ """
+ separates out drop rules from a list of rules, returns two
+ lists.
+
+ first the list of all drop rules, second all other rules
+ order is preserved.
+ """
+ regular_rules = []
+ drop_rules = []
+ for rule in rules:
+ if rule.tag == self.DROP_RULE_TAG:
+ drop_rules.append(rule)
+ else:
+ regular_rules.append(rule)
+ return drop_rules, regular_rules
+
+
CSS_URL_PAT = re.compile(r'url\([\"\']*(.*?)[\"\']*\)',re.I)
CSS_IMPORT_PAT = re.compile(r'\@import\s*[\"\'](.*?)[\"\']',re.I)
Modified: z3/deliverance/branches/packaged/deliverance/xslt.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/xslt.py (original)
+++ z3/deliverance/branches/packaged/deliverance/xslt.py Tue Oct 31 20:43:38 2006
@@ -14,6 +14,19 @@
</xsl:template>
</xsl:transform>"""
+xslt_dropper_skel = """
+<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <!-- match nodes that do dropping are inserted here -->
+
+ <xsl:template match="node()|@*">
+ <xsl:copy>
+ <xsl:apply-templates select="node()|@*"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:transform>
+"""
nsmap = {
"dv": "http://www.plone.org/deliverance",
@@ -45,7 +58,9 @@
else:
self.debug = False
+ self.transform_drop = None
self.apply_rules(self.rules,theme_copy)
+
xslt_wrapper = etree.XML(xslt_wrapper_skel)
insertion_point = xslt_wrapper.xpath("//xsl:transform/xsl:template[@match='/']",
nsmap)[0]
@@ -57,15 +72,29 @@
def render(self,content):
if content:
+ if self.transform_drop:
+ content = self.transform_drop(content)
+
return self.transform(content).getroot()
+
else:
return self.transform(etree.Element("dummy")).getroot()
def apply_rules(self,rules,theme):
- for rule in rules:
+
+ drop_rules, other_rules = self.separate_drop_rules(rules)
+
+ if len(drop_rules):
+ self.xslt_dropper = etree.XML(xslt_dropper_skel)
+ for rule in drop_rules:
+ self.apply_drop(rule, theme)
+ self.transform_drop = etree.XSLT(self.xslt_dropper)
+
+ for rule in other_rules:
self.apply_rule(rule,theme)
+
def apply_rule(self,rule,theme):
if rule.tag == self.APPEND_RULE_TAG:
self.apply_append(rule,theme)
@@ -214,7 +243,7 @@
if rule.get(self.NOCONTENT_KEY) == 'ignore':
return
else:
- e = self.format_error("no element found in theme", rule)
+ e = self.format_error("no theme matched", rule)
self.add_to_body_start(theme, e)
return
@@ -223,23 +252,16 @@
self.attach_text_to_previous(el, el.tail)
el.getparent().remove(el)
+ if self.RULE_CONTENT_KEY in rule.attrib:
+ drop_template = etree.Element("{%s}template" % nsmap["xsl"])
+ drop_template.set("match", rule.attrib[self.RULE_CONTENT_KEY])
+ self.xslt_dropper[0:0] = [drop_template]
+
+ # add an element that produces an error if
+ # no content is matched
+ self.add_conditional_missing_content_error(theme,rule)
-# if 'content' in rule.attrib:
-# self.add_conditional_missing_content_error(theme,rule)
-
-
-
-# copier = etree.Element("{%s}copy-of" % nsmap["xsl"])
-# copier.set("select",rule.attrib[self.RULE_CONTENT_KEY])
-
-
-# # if content is matched, replace the theme element, otherwise, keep the
-# # theme element
-# choose = self.make_when_otherwise("count(%s)=0" %
-# rule.attrib[self.RULE_CONTENT_KEY],
-# copy.deepcopy(theme_el),
-# copier)
More information about the z3-checkins
mailing list