changeset 258:da3a27589559 trunk

Fix for #56: an include inside a matched element wasn't seeing the correct context data frames.
author cmlenz
date Thu, 21 Sep 2006 16:28:09 +0000
parents 693a228bf1c7
children fe8dbe9066c1
files genshi/template.py genshi/tests/filters.py
diffstat 2 files changed, 49 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template.py
+++ b/genshi/template.py
@@ -13,6 +13,7 @@
 
 """Implementation of the template engine."""
 
+from itertools import chain
 try:
     from collections import deque
 except ImportError:
@@ -849,7 +850,7 @@
             stream = filter_(iter(stream), ctxt)
         return Stream(stream)
 
-    def _eval(self, stream, ctxt=None):
+    def _eval(self, stream, ctxt):
         """Internal stream filter that evaluates any expressions in `START` and
         `TEXT` events.
         """
@@ -905,7 +906,7 @@
             else:
                 yield kind, data, pos
 
-    def _flatten(self, stream, ctxt=None):
+    def _flatten(self, stream, ctxt):
         """Internal stream filter that expands `SUB` events in the stream."""
         for kind, data, pos in stream:
             if kind is SUB:
@@ -1049,7 +1050,7 @@
 
         return stream
 
-    def _match(self, stream, ctxt=None, match_templates=None):
+    def _match(self, stream, ctxt, match_templates=None):
         """Internal stream filter that applies any defined match templates
         to the stream.
         """
@@ -1092,8 +1093,12 @@
 
                     # Consume and store all events until an end event
                     # corresponding to this start event is encountered
-                    content = [(kind, data, pos)]
-                    content += list(self._match(_strip(stream), ctxt)) + tail
+                    content = chain([(kind, data, pos)],
+                                    self._match(_strip(stream), ctxt),
+                                    tail)
+                    for filter_ in self.filters[3:]:
+                        content = filter_(content, ctxt)
+                    content = list(content)
 
                     kind, data, pos = tail[0]
                     for test in [mt[0] for mt in match_templates]:
--- a/genshi/tests/filters.py
+++ b/genshi/tests/filters.py
@@ -12,11 +12,15 @@
 # history and logs, available at http://genshi.edgewall.org/log/.
 
 import doctest
+import os
+import shutil
+import tempfile
 import unittest
 
 from genshi.core import Stream
 from genshi.input import HTML, ParseError
 from genshi.filters import HTMLSanitizer
+from genshi.template import TemplateLoader
 
 
 class HTMLSanitizerTestCase(unittest.TestCase):
@@ -116,9 +120,44 @@
         self.assertEquals(u'<img/>', unicode(html | HTMLSanitizer()))
 
 
+class IncludeFilterTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.dirname = tempfile.mkdtemp(suffix='markup_test')
+
+    def tearDown(self):
+        shutil.rmtree(self.dirname)
+
+    def test_select_inluded_elements(self):
+        file1 = open(os.path.join(self.dirname, 'tmpl1.html'), 'w')
+        try:
+            file1.write("""<li>$item</li>""")
+        finally:
+            file1.close()
+
+        file2 = open(os.path.join(self.dirname, 'tmpl2.html'), 'w')
+        try:
+            file2.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
+                                 xmlns:py="http://genshi.edgewall.org/">
+              <ul py:match="ul">${select('li')}</ul>
+              <ul py:with="items=(1, 2, 3)">
+                <xi:include href="tmpl1.html" py:for="item in items" />
+              </ul>
+            </html>""")
+        finally:
+            file2.close()
+
+        loader = TemplateLoader([self.dirname])
+        tmpl = loader.load('tmpl2.html')
+        self.assertEqual("""<html>
+              <ul><li>1</li><li>2</li><li>3</li></ul>
+            </html>""", tmpl.generate().render())
+
+
 def suite():
     suite = unittest.TestSuite()
     suite.addTest(unittest.makeSuite(HTMLSanitizerTestCase, 'test'))
+    suite.addTest(unittest.makeSuite(IncludeFilterTestCase, 'test'))
     return suite
 
 if __name__ == '__main__':
Copyright (C) 2012-2017 Edgewall Software