[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