[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: &lt;drop theme="//div[@id='foo']"/&gt;
+         <div class="deliverance-error">Deliverance error: no theme matched<br/>rule: &lt;drop theme="//div[@id='foo']"/&gt;
          </div>
        </body>
      </html>
@@ -161,7 +161,7 @@
      <html>
        <body>
          Dummy Content
-         <div class="deliverance-error">Deliverance error: no element found in content<br/>rule: &lt;drop content="//div[@id='foo']"/&gt;
+         <div class="deliverance-error">Deliverance error: no content matched<br/>rule: &lt;drop content="//div[@id='foo']"/&gt;
          </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