Mercurial > genshi > mirror
changeset 374:b146277eb54a trunk
`MarkupTemplate`s can now be instantiated from markup streams, in addition to strings and file-like objects. Thanks to David Fraser for the patch. Closes #69.
author | cmlenz |
---|---|
date | Thu, 23 Nov 2006 10:52:14 +0000 |
parents | 37e45862f814 |
children | f3a8686b80d7 |
files | ChangeLog genshi/template/core.py genshi/template/markup.py genshi/template/tests/markup.py genshi/template/text.py |
diffstat | 5 files changed, 28 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -27,6 +27,8 @@ are callable. * Instances of the `genshi.core.Attrs` class are now immutable (they are subclasses of `tuple` instead of `list`). + * `MarkupTemplate`s can now be instantiated from markup streams, in addition + to strings and file-like objects (ticket #69). Version 0.3.5
--- a/genshi/template/core.py +++ b/genshi/template/core.py @@ -170,10 +170,6 @@ def __init__(self, source, basedir=None, filename=None, loader=None, encoding=None): """Initialize a template from either a string or a file-like object.""" - if isinstance(source, basestring): - self.source = StringIO(source) - else: - self.source = source self.basedir = basedir self.filename = filename if basedir and filename: @@ -182,13 +178,17 @@ self.filepath = filename self.loader = loader + if isinstance(source, basestring): + source = StringIO(source) + else: + source = source + self.stream = list(self._prepare(self._parse(source, encoding))) self.filters = [self._flatten, self._eval] - self.stream = list(self._prepare(self._parse(encoding))) def __repr__(self): return '<%s "%s">' % (self.__class__.__name__, self.filename) - def _parse(self, encoding): + def _parse(self, source, encoding): """Parse the template. The parsing stage parses the template and constructs a list of
--- a/genshi/template/markup.py +++ b/genshi/template/markup.py @@ -63,7 +63,7 @@ if loader: self.filters.append(self._include) - def _parse(self, encoding): + def _parse(self, source, encoding): """Parse the template from an XML document.""" stream = [] # list of events of the "compiled" template dirmap = {} # temporary mapping of directives to elements @@ -73,8 +73,11 @@ fallback_stream = None include_href = None - for kind, data, pos in XMLParser(self.source, filename=self.filename, - encoding=encoding): + if not isinstance(source, Stream): + source = XMLParser(source, filename=self.filename, + encoding=encoding) + + for kind, data, pos in source: if kind is START_NS: # Strip out the namespace declaration for template directives
--- a/genshi/template/tests/markup.py +++ b/genshi/template/tests/markup.py @@ -14,11 +14,13 @@ import doctest import os import shutil +from StringIO import StringIO import sys import tempfile import unittest from genshi.core import Markup +from genshi.input import XML from genshi.template.core import BadDirectiveError, TemplateSyntaxError from genshi.template.loader import TemplateLoader from genshi.template.markup import MarkupTemplate @@ -27,6 +29,16 @@ class MarkupTemplateTestCase(unittest.TestCase): """Tests for markup template processing.""" + def test_parse_fileobj(self): + fileobj = StringIO('<root> ${var} $var</root>') + tmpl = MarkupTemplate(fileobj) + self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) + + def test_parse_stream(self): + stream = XML('<root> ${var} $var</root>') + tmpl = MarkupTemplate(stream) + self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42))) + def test_interpolate_mixed3(self): tmpl = MarkupTemplate('<root> ${var} $var</root>') self.assertEqual('<root> 42 42</root>', str(tmpl.generate(var=42)))
--- a/genshi/template/text.py +++ b/genshi/template/text.py @@ -54,7 +54,7 @@ r'(?:^[ \t]*(?<!\\)#((?:\w+|#).*)\n?)', re.MULTILINE) - def _parse(self, encoding): + def _parse(self, source, encoding): """Parse the template from text input.""" stream = [] # list of events of the "compiled" template dirmap = {} # temporary mapping of directives to elements @@ -62,7 +62,7 @@ if not encoding: encoding = 'utf-8' - source = self.source.read().decode(encoding, 'replace') + source = source.read().decode(encoding, 'replace') offset = 0 lineno = 1