[z3-checkins] r33234 - in z3/deliverance/branches/packaged/deliverance: . test-data

ltucker at codespeak.net ltucker at codespeak.net
Thu Oct 12 18:23:22 CEST 2006


Author: ltucker
Date: Thu Oct 12 18:23:18 2006
New Revision: 33234

Modified:
   z3/deliverance/branches/packaged/deliverance/interpreter.py
   z3/deliverance/branches/packaged/deliverance/test-data/test_appendorreplace.xml
   z3/deliverance/branches/packaged/deliverance/test-data/test_debug.xml
   z3/deliverance/branches/packaged/deliverance/test_wsgi.py
   z3/deliverance/branches/packaged/deliverance/utils.py
   z3/deliverance/branches/packaged/deliverance/xslt.py
Log:
preliminary debugging support for python version, fixes to xslt debugging

Modified: z3/deliverance/branches/packaged/deliverance/interpreter.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/interpreter.py	(original)
+++ z3/deliverance/branches/packaged/deliverance/interpreter.py	Thu Oct 12 18:23:18 2006
@@ -67,12 +67,16 @@
 
         content_els = copy.deepcopy(content.xpath(rule.attrib[self.RULE_CONTENT_KEY]))
 
-        if (len(content_els) == 0):
+        if len(content_els) == 0:
             self.add_to_body_start(theme, self.format_error("no content matched", rule))
             return 
 
+        if self.debug:
+            self.debug_append(theme_el, content_els, rule)
+            return 
+
         non_text_els = self.elements_in(content_els)
-        self.strip_tails(non_text_els)
+        self.strip_tails(non_text_els)        
 
         # the xpath may return a mixture of strings and elements, handle strings 
         # by attaching them to the proper element 
@@ -95,6 +99,20 @@
         self.attach_tails(content_els)
         theme_el.extend(non_text_els)
 
+    def debug_append(self, theme_el, content_els, rule):
+        
+        comment_before,comment_after = self.make_debugging_comments(rule)
+        content_els[:0] = [comment_before]
+        content_els.append(comment_after)
+
+        non_text_els = self.elements_in(content_els)
+        self.strip_tails(non_text_els)        
+            
+        self.attach_tails(content_els)
+        theme_el.extend(non_text_els)
+        
+
+
     def apply_prepend(self,rule,theme,content):
         theme_el = self.get_theme_el(rule,theme)
         if theme_el is None:
@@ -102,10 +120,14 @@
 
         content_els = copy.deepcopy(content.xpath(rule.attrib[self.RULE_CONTENT_KEY]))
 
-        if (len(content_els) == 0):
+        if len(content_els) == 0:
             self.add_to_body_start(theme, self.format_error("no content matched", rule))
             return 
 
+        if self.debug:
+            self.debug_prepend(theme_el, content_els, rule)
+            return 
+
         non_text_els = self.elements_in(content_els)
         
         # if we only get some text, just tack it on and return 
@@ -131,8 +153,7 @@
             theme_el.text = None
             
         self.attach_tails(content_els)
-        for index,el in enumerate(non_text_els):
-            theme_el.insert(index,el)
+        theme_el[:0] = non_text_els
 
         # tack on the previous text of the parent element 
         if old_start_text:
@@ -141,6 +162,22 @@
             else:
                 non_text_els[-1].tail = old_start_text
 
+    def debug_prepend(self, theme_el, content_els, rule):        
+        
+        comment_before,comment_after = self.make_debugging_comments(rule)
+        content_els[:0] = [comment_before]
+        content_els.append(comment_after)
+
+        if theme_el.text:
+            content_els.append(theme_el.text)
+            theme_el.text = None
+
+        non_text_els = self.elements_in(content_els)
+        self.strip_tails(non_text_els)                
+        self.attach_tails(content_els)
+
+        theme_el[:0] = non_text_els
+
     def apply_replace(self,rule,theme,content):
         theme_el = self.get_theme_el(rule,theme)
         if theme_el is None:
@@ -152,6 +189,10 @@
             self.add_to_body_start(theme, self.format_error("no content matched", rule))            
             return       
 
+        if self.debug:
+            self.debug_replace(theme_el,content_els,rule)
+            return 
+
         non_text_els = self.elements_in(content_els)
         self.strip_tails(non_text_els)
 
@@ -178,8 +219,7 @@
         non_text_els[0].tail = None
         parent = non_text_els[0].getparent()
         i = parent.index(non_text_els[0])
-        for index,cel in enumerate(non_text_els[1:]):
-            parent.insert(i + index + 1,cel)
+        parent[i+1:i+1] = non_text_els[1:]
 
         if non_text_els[-1].tail:
             non_text_els[-1].tail += temptail
@@ -192,6 +232,24 @@
                 non_text_els[0].tail = preserve_tail + non_text_els[0].tail
             else:
                 non_text_els[0].tail = preserve_tail
+
+    def debug_replace(self,theme_el,content_els,rule):
+        comment_before,comment_after = self.make_debugging_comments(rule)
+        content_els[:0] = [comment_before]
+        content_els.append(comment_after)
+
+        non_text_els = self.elements_in(content_els)
+        self.strip_tails(non_text_els)                    
+        self.attach_tails(content_els)
+
+        parent = theme_el.getparent()
+
+        if theme_el.tail:
+            comment_after.tail = theme_el.tail 
+
+        parent.replace(theme_el, non_text_els[0])
+        i = parent.index(non_text_els[0])
+        parent[i+1:i+1] = non_text_els[1:]
         
 
     def apply_copy(self,rule,theme,content):
@@ -216,8 +274,18 @@
             theme_el.text = None
 
         self.attach_tails(content_els)
-        theme_el[:] = non_text_els        
-    
+        theme_el[:] = non_text_els  
+
+        if self.debug:
+            comment_before,comment_after = self.make_debugging_comments(rule)
+            parent = theme_el.getparent()
+            index = parent.index(theme_el)
+            parent.insert(index-1,comment_before)
+            parent.insert(index+2,comment_after)
+            comment_after.tail = theme_el.tail
+            theme_el.tail = None
+            
+
     def apply_append_or_replace(self,rule,theme,content):
         theme_el = self.get_theme_el(rule,theme)
         if theme_el is None:
@@ -238,12 +306,19 @@
 
         for el in theme_el:
             if el.tag == remove_tag:
+                self.attach_text_to_previous(el,el.tail)
                 theme_el.remove(el)
 
+
+        if self.debug:
+            self.debug_append(theme_el, content_els, rule)
+            return 
+
         self.strip_tails(content_els)
         theme_el.extend(content_els)
 
 
+
     def elements_in(self, els):
         """
         return a list containing elements from els which are not strings 
@@ -269,3 +344,9 @@
                 index + 1 < len(els) and 
                 type(els[index+1]) is type(str())):
                 el.tail = els[index+1]   
+
+
+    def make_debugging_comments(self, rule):
+        comment_before = etree.Comment("Deliverance: applying rule %s" % etree.tostring(rule))
+        comment_after = etree.Comment("Deliverance: done applying rule %s" % etree.tostring(rule))
+        return comment_before, comment_after

Modified: z3/deliverance/branches/packaged/deliverance/test-data/test_appendorreplace.xml
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/test-data/test_appendorreplace.xml	(original)
+++ z3/deliverance/branches/packaged/deliverance/test-data/test_appendorreplace.xml	Thu Oct 12 18:23:18 2006
@@ -44,6 +44,34 @@
   </output> 
 </deliverance-test>
 
+<!-- test append-or-replace preserves surrounding text of replaced elements --> 
+<deliverance-test>
+  <rules xmlns="http://www.plone.org/deliverance">
+    <append-or-replace theme="//body" content="//body/div" />
+  </rules>
+
+  <theme base="http://example.com"> 
+    <html>
+    <body>
+      before the div<div>in the div</div>after the div
+    </body></html>
+  </theme>
+
+  <content> 
+    <html>
+      <body><div>Real Content</div>
+    </body></html>
+  </content>
+  
+  <output>
+    <html>
+        <body>
+             before the divafter the div
+	     <div>Real Content</div>
+        </body>
+      </html>
+  </output> 
+</deliverance-test>
 
 <!-- tests that an error is raised if append-or-replace command does not find a target element 
      in the theme --> 

Modified: z3/deliverance/branches/packaged/deliverance/test-data/test_debug.xml
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/test-data/test_debug.xml	(original)
+++ z3/deliverance/branches/packaged/deliverance/test-data/test_debug.xml	Thu Oct 12 18:23:18 2006
@@ -135,26 +135,29 @@
 <!-- test debug mode with copy --> 
 <deliverance-test>
   <rules xmlns="http://www.plone.org/deliverance" debug="true">
-    <copy theme="//body" content="//body/div" />
+    <copy theme="//body/span" content="//body/div" />
   </rules>
 
   <theme base="http://example.com"> 
     <html>
     <body>
+      before span<span>inside span</span>after span
     </body></html>
   </theme>
 
   <content> 
     <html>
-      <body><div>Real Content</div>
+      <body><div>Real Content</div> 
     </body></html>
   </content>
   
   <output>
     <html>
-         <!--Deliverance: applying rule <copy theme="//body" content="//body/div"/>
-         --><body><div>Real Content</div></body><!--Deliverance: done applying rule <copy theme="//body" content="//body/div"/>
-         -->
+      <body>before span
+         <!--Deliverance: applying rule <copy theme="//body/span" content="//body/div"/>
+         --><span><div>Real Content</div></span><!--Deliverance: done applying rule <copy theme="//body/span" content="//body/div"/>
+         -->after span
+	   </body>
       </html>
   </output> 
 </deliverance-test>

Modified: z3/deliverance/branches/packaged/deliverance/test_wsgi.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/test_wsgi.py	(original)
+++ z3/deliverance/branches/packaged/deliverance/test_wsgi.py	Thu Oct 12 18:23:18 2006
@@ -59,7 +59,7 @@
     res2 = app.get('/xinclude_expected.html?notheme')
     html_string_compare(res.body, res2.body)
 
-
+4
 def test_nycsr():
     wsgi_app = DeliveranceMiddleware(nycsr_app, 'http://www.nycsr.org','nycsr.xml')
     app = TestApp(wsgi_app)

Modified: z3/deliverance/branches/packaged/deliverance/utils.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/utils.py	(original)
+++ z3/deliverance/branches/packaged/deliverance/utils.py	Thu Oct 12 18:23:18 2006
@@ -92,7 +92,7 @@
         body[:0] = [el]
 
     def replace_element(self,replace, new_el):
-        parent = replace.getparent()
+        parent = replace.getparent()        
         for i in range(len(parent)):
             if parent[i] == replace:
                 new_el.tail = replace.tail 
@@ -177,3 +177,5 @@
                 el.getparent().text += text 
             else:
                 el.getparent().text = text
+
+   

Modified: z3/deliverance/branches/packaged/deliverance/xslt.py
==============================================================================
--- z3/deliverance/branches/packaged/deliverance/xslt.py	(original)
+++ z3/deliverance/branches/packaged/deliverance/xslt.py	Thu Oct 12 18:23:18 2006
@@ -167,6 +167,8 @@
                                           normal_theme_el, 
                                           copy_theme_el)
         self.debug_replace(theme_el,choose,rule)
+        copy_theme_el.tail = None
+        normal_theme_el.tail = None
         
 
    
@@ -230,18 +232,14 @@
         return choose
 
 
-    def debug_append(self, parent, child, rule):
+    def debug_append(self, parent, child, rule):        
         if self.debug:
-            comment_before = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_before.text = "Deliverance: applying rule %s" % etree.tostring(rule)
+            comment_before,comment_after = self.make_debugging_comments(rule)
             parent.append(comment_before)
-
-        parent.append(child)
-
-        if self.debug:
-            comment_after = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_after.text = "Deliverance: done applying rule %s" % etree.tostring(rule)
+            parent.append(child)
             parent.append(comment_after)
+        else:
+            parent.append(child)
 
 
     def debug_replace(self, old_el, new_el, rule):
@@ -250,11 +248,8 @@
         if self.debug:
             parent = new_el.getparent()
             index = parent.index(new_el)
-
-            comment_before = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_before.text = "Deliverance: applying rule %s" % etree.tostring(rule)
-            comment_after = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_after.text = "Deliverance: done applying rule %s" % etree.tostring(rule)
+            
+            comment_before,comment_after = self.make_debugging_comments(rule)
             comment_after.tail = new_el.tail
             new_el.tail = None
 
@@ -267,12 +262,17 @@
         parent.text = None
 
         if self.debug:
-            comment_before = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_before.text = "Deliverance: applying rule %s" % etree.tostring(rule)
-            comment_after = etree.Element("{%s}comment" % nsmap["xsl"])
-            comment_after.text = "Deliverance: done applying rule %s" % etree.tostring(rule)
+            comment_before,comment_after = self.make_debugging_comments(rule)
             comment_after.tail = child.tail
             child.tail = None
 
             parent.insert(0, comment_before)
             parent.insert(2, comment_after)
+
+
+    def make_debugging_comments(self, rule):
+        comment_before = etree.Element("{%s}comment" % nsmap["xsl"])
+        comment_before.text = "Deliverance: applying rule %s" % etree.tostring(rule)
+        comment_after = etree.Element("{%s}comment" % nsmap["xsl"])
+        comment_after.text = "Deliverance: done applying rule %s" % etree.tostring(rule)
+        return comment_before, comment_after


More information about the z3-checkins mailing list