# HG changeset patch # User cmlenz # Date 1149424457 0 # Node ID f77f7a91aa468b8707de0fdd677e491371543f46 # Parent 5dc4bfe67c20a9642183609ae3f983c5c84eabd3 Moved the template-specific stream event kinds into the template module. diff --git a/markup/core.py b/markup/core.py --- 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 diff --git a/markup/filters.py b/markup/filters.py --- 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: diff --git a/markup/template.py b/markup/template.py --- 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): diff --git a/markup/tests/template.py b/markup/tests/template.py --- 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])