changeset 78:46fed54f23cd trunk

Minor improvements to how directives are applied in template processing.
author cmlenz
date Thu, 13 Jul 2006 15:41:34 +0000
parents f5ec6d4a61e4
children 8d6bee631a58
files markup/template.py
diffstat 1 files changed, 32 insertions(+), 34 deletions(-) [+]
line wrap: on
line diff
--- a/markup/template.py
+++ b/markup/template.py
@@ -34,7 +34,6 @@
  * Support for list comprehensions and generator expressions in expressions
 
 Random thoughts:
- * Is there any need to support py:extends and/or py:layout?
  * Could we generate byte code from expressions?
 """
 
@@ -186,10 +185,11 @@
             expr = ' "%s"' % self.expr.source
         return '<%s%s>' % (self.__class__.__name__, expr)
 
-    def _apply_directives(self, stream, ctxt, directives):
-        if directives:
-            stream = directives[0](iter(stream), ctxt, directives[1:])
-        return stream
+
+def _apply_directives(stream, ctxt, directives):
+    if directives:
+        stream = directives[0](iter(stream), ctxt, directives[1:])
+    return stream
 
 
 class AttrsDirective(Directive):
@@ -240,7 +240,7 @@
             for event in stream:
                 yield event
 
-        return self._apply_directives(_generate(), ctxt, directives)
+        return _apply_directives(_generate(), ctxt, directives)
 
 
 class ContentDirective(Directive):
@@ -271,7 +271,7 @@
                 previous = event
             if previous is not None:
                 yield previous
-        return self._apply_directives(_generate(), ctxt, directives)
+        return _apply_directives(_generate(), ctxt, directives)
 
 
 class DefDirective(Directive):
@@ -350,7 +350,7 @@
             else:
                 scope[name] = kwargs.pop(name, self.defaults.get(name))
         ctxt.push(**scope)
-        for event in self._apply_directives(self.stream, ctxt, self.directives):
+        for event in _apply_directives(self.stream, ctxt, self.directives):
             yield event
         ctxt.pop()
 
@@ -388,7 +388,7 @@
                 for idx, name in enumerate(self.targets):
                     scope[name] = item[idx]
                 ctxt.push(**scope)
-                for event in self._apply_directives(stream, ctxt, directives):
+                for event in _apply_directives(stream, ctxt, directives):
                     yield event
                 ctxt.pop()
 
@@ -416,7 +416,7 @@
 
     def __call__(self, stream, ctxt, directives):
         if self.expr.evaluate(ctxt):
-            return self._apply_directives(stream, ctxt, directives)
+            return _apply_directives(stream, ctxt, directives)
         return []
 
 
@@ -522,20 +522,22 @@
     __slots__ = []
 
     def __call__(self, stream, ctxt, directives):
-        if self.expr:
-            strip = self.expr.evaluate(ctxt)
-        else:
-            strip = True
-        stream = self._apply_directives(stream, ctxt, directives)
-        if strip:
-            stream.next() # skip start tag
-            previous = stream.next()
-            for event in stream:
-                yield previous
-                previous = event
-        else:
-            for event in stream:
-                yield event
+        def _generate():
+            if self.expr:
+                strip = self.expr.evaluate(ctxt)
+            else:
+                strip = True
+            if strip:
+                stream.next() # skip start tag
+                previous = stream.next()
+                for event in stream:
+                    yield previous
+                    previous = event
+            else:
+                for event in stream:
+                    yield event
+
+        return _apply_directives(_generate(), ctxt, directives)
 
 
 class ChooseDirective(Directive):
@@ -585,7 +587,7 @@
             self.value = self.expr.evaluate(ctxt)
         self.matched = False
         ctxt.push(_choose=self)
-        for event in self._apply_directives(stream, ctxt, directives):
+        for event in _apply_directives(stream, ctxt, directives):
             yield event
         ctxt.pop()
 
@@ -607,11 +609,11 @@
         try:
             if value == choose.value:
                 choose.matched = True
-                return self._apply_directives(stream, ctxt, directives)
+                return _apply_directives(stream, ctxt, directives)
         except AttributeError:
             if value:
                 choose.matched = True
-                return self._apply_directives(stream, ctxt, directives)
+                return _apply_directives(stream, ctxt, directives)
         return []
 
 
@@ -626,7 +628,7 @@
         if choose.matched:
             return []
         choose.matched = True
-        return self._apply_directives(stream, ctxt, directives)
+        return _apply_directives(stream, ctxt, directives)
 
 
 class Template(object):
@@ -876,9 +878,7 @@
                     # This event is a list of directives and a list of nested
                     # events to which those directives should be applied
                     directives, substream = data
-                    if directives:
-                        substream = directives[0](iter(substream), ctxt,
-                                                  directives[1:])
+                    substream = _apply_directives(substream, ctxt, directives)
                     for filter_ in (self._eval, self._match, self._flatten):
                         substream = filter_(substream, ctxt)
                     for event in substream:
@@ -926,9 +926,7 @@
                     content = list(self._flatten(content, ctxt))
                     ctxt.push(select=lambda path: Stream(content).select(path))
 
-                    if directives:
-                        template = directives[0](iter(template), ctxt,
-                                                 directives[1:])
+                    template = _apply_directives(template, ctxt, directives)
                     for event in self._match(self._eval(template, ctxt),
                                              ctxt, match_templates[:idx] +
                                              match_templates[idx + 1:]):
Copyright (C) 2012-2017 Edgewall Software