changeset 10:f77f7a91aa46 trunk

Moved the template-specific stream event kinds into the template module.
author cmlenz
date Sun, 04 Jun 2006 12:34:17 +0000
parents 5dc4bfe67c20
children 10c80c490c6e
files markup/core.py markup/filters.py markup/template.py markup/tests/template.py
diffstat 4 files changed, 24 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/markup/core.py
+++ b/markup/core.py
@@ -55,8 +55,6 @@
     START = StreamEventKind('start') # a start tag
     END = StreamEventKind('end') # an end tag
     TEXT = StreamEventKind('text') # literal text
-    EXPR = StreamEventKind('expr') # an expression
-    SUB = StreamEventKind('sub') # a "subprogram"
     PROLOG = StreamEventKind('prolog') # XML prolog
     DOCTYPE = StreamEventKind('doctype') # doctype declaration
     START_NS = StreamEventKind('start-ns') # start namespace mapping
--- a/markup/filters.py
+++ b/markup/filters.py
@@ -30,6 +30,8 @@
     """Responsible for evaluating expressions in a template."""
 
     def __call__(self, stream, ctxt=None):
+        from markup.template import Template
+
         for kind, data, pos in stream:
 
             if kind is Stream.START:
@@ -43,7 +45,7 @@
                     else:
                         values = []
                         for subkind, subdata, subpos in substream:
-                            if subkind is Stream.EXPR:
+                            if subkind is Template.EXPR:
                                 values.append(subdata.evaluate(ctxt))
                             else:
                                 values.append(subdata)
@@ -53,7 +55,7 @@
                     new_attrib.append((name, ''.join(value)))
                 yield kind, (tag, Attributes(new_attrib)), pos
 
-            elif kind is Stream.EXPR:
+            elif kind is Template.EXPR:
                 result = data.evaluate(ctxt)
                 if result is None:
                     continue
@@ -68,7 +70,7 @@
                     # iterable, in which case we yield the
                     # individual items
                     try:
-                        yield Stream.SUB, ([], iter(result)), pos
+                        yield Template.SUB, ([], iter(result)), pos
                     except TypeError:
                         # Neither a string nor an iterable, so just
                         # pass it through
@@ -177,6 +179,8 @@
         self.handler = handler
 
     def __call__(self, stream, ctxt=None):
+        from markup.template import Template
+
         test = self.path.test()
         for kind, data, pos in stream:
             result = test(kind, data, pos)
@@ -192,7 +196,7 @@
                     content.append(ev)
                     test(*ev)
 
-                yield (Stream.SUB,
+                yield (Template.SUB,
                        ([lambda stream, ctxt: self.handler(content, ctxt)], []),
                        pos)
             else:
--- a/markup/template.py
+++ b/markup/template.py
@@ -47,7 +47,7 @@
 import re
 from StringIO import StringIO
 
-from markup.core import Attributes, Stream
+from markup.core import Attributes, Stream, StreamEventKind
 from markup.eval import Expression
 from markup.filters import EvalFilter, IncludeFilter, MatchFilter, \
                            WhitespaceFilter
@@ -241,13 +241,12 @@
         kind, data, pos = stream.next()
         if kind is Stream.START:
             yield kind, data, pos # emit start tag
-        yield Stream.EXPR, self.expr, pos
+        yield Template.EXPR, self.expr, pos
         previous = stream.next()
         for event in stream:
             previous = event
-        else:
-            if previous is not None:
-                yield previous
+        if previous is not None:
+            yield previous
 
 
 class DefDirective(Directive):
@@ -450,7 +449,7 @@
     """
     def __call__(self, stream, ctxt):
         kind, data, pos = stream.next()
-        yield Stream.EXPR, self.expr, pos
+        yield Template.EXPR, self.expr, pos
 
 
 class StripDirective(Directive):
@@ -513,8 +512,6 @@
             strip = True
         if strip:
             stream.next() # skip start tag
-            # can ignore StopIteration since it will just break from this
-            # generator
             previous = stream.next()
             for event in stream:
                 yield previous
@@ -530,6 +527,9 @@
     """
     NAMESPACE = 'http://purl.org/kid/ns#'
 
+    EXPR = StreamEventKind('expr') # an expression
+    SUB = StreamEventKind('sub') # a "subprogram"
+
     directives = [('def', DefDirective),
                   ('match', MatchDirective),
                   ('for', ForDirective),
@@ -620,7 +620,7 @@
                 if (depth, data) in dirmap:
                     directives, start_offset = dirmap.pop((depth, data))
                     substream = stream[start_offset:]
-                    stream[start_offset:] = [(Stream.SUB,
+                    stream[start_offset:] = [(Template.SUB,
                                               (directives, substream), pos)]
 
             elif kind is Stream.TEXT:
@@ -643,7 +643,7 @@
             try:
                 for kind, data, pos in stream:
 
-                    if kind is Stream.SUB:
+                    if kind is Template.SUB:
                         # This event is a list of directives and a list of
                         # nested events to which those directives should be
                         # applied
@@ -686,7 +686,7 @@
         def _interpolate(text):
             for idx, group in enumerate(patterns.pop(0).split(text)):
                 if idx % 2:
-                    yield Stream.EXPR, Expression(group), (lineno, offset)
+                    yield Template.EXPR, Expression(group), (lineno, offset)
                 elif group:
                     if patterns:
                         for result in _interpolate(group):
--- a/markup/tests/template.py
+++ b/markup/tests/template.py
@@ -31,7 +31,7 @@
     def test_interpolate_simple(self):
         parts = list(Template._interpolate('${bla}'))
         self.assertEqual(1, len(parts))
-        self.assertEqual(Stream.EXPR, parts[0][0])
+        self.assertEqual(Template.EXPR, parts[0][0])
         self.assertEqual('bla', parts[0][1].source)
 
     def test_interpolate_escaped(self):
@@ -43,17 +43,17 @@
     def test_interpolate_short(self):
         parts = list(Template._interpolate('$bla'))
         self.assertEqual(1, len(parts))
-        self.assertEqual(Stream.EXPR, parts[0][0])
+        self.assertEqual(Template.EXPR, parts[0][0])
         self.assertEqual('bla', parts[0][1].source)
 
     def test_interpolate_mixed1(self):
         parts = list(Template._interpolate('$foo bar $baz'))
         self.assertEqual(3, len(parts))
-        self.assertEqual(Stream.EXPR, parts[0][0])
+        self.assertEqual(Template.EXPR, parts[0][0])
         self.assertEqual('foo', parts[0][1].source)
         self.assertEqual(Stream.TEXT, parts[1][0])
         self.assertEqual(' bar ', parts[1][1])
-        self.assertEqual(Stream.EXPR, parts[2][0])
+        self.assertEqual(Template.EXPR, parts[2][0])
         self.assertEqual('baz', parts[2][1].source)
 
     def test_interpolate_mixed2(self):
@@ -61,7 +61,7 @@
         self.assertEqual(3, len(parts))
         self.assertEqual(Stream.TEXT, parts[0][0])
         self.assertEqual('foo ', parts[0][1])
-        self.assertEqual(Stream.EXPR, parts[1][0])
+        self.assertEqual(Template.EXPR, parts[1][0])
         self.assertEqual('bar', parts[1][1].source)
         self.assertEqual(Stream.TEXT, parts[2][0])
         self.assertEqual(' baz', parts[2][1])
Copyright (C) 2012-2017 Edgewall Software