From 98e4f43ff7e5441a113127c6427dbaa75530c54c Mon Sep 17 00:00:00 2001 From: Chris Jerdonek Date: Tue, 27 Dec 2011 18:46:14 -0800 Subject: The View class now does all its loading through a Renderer instance. This will help with future refactoring and code maintenance by not having the same logic duplicated in more than one part of the code. It also takes more responsibility away from the View class, which is what we want. --- pystache/renderer.py | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) (limited to 'pystache/renderer.py') diff --git a/pystache/renderer.py b/pystache/renderer.py index 0323800..72aed73 100644 --- a/pystache/renderer.py +++ b/pystache/renderer.py @@ -6,9 +6,11 @@ This module provides a Renderer class to render templates. """ import cgi +import os import sys from .context import Context +from .loader import DEFAULT_EXTENSION from .loader import Loader from .reader import Reader from .renderengine import RenderEngine @@ -34,7 +36,8 @@ class Renderer(object): """ def __init__(self, loader=None, file_encoding=None, default_encoding=None, - decode_errors='strict', escape=None): + decode_errors='strict', search_dirs=None, file_extension=None, + escape=None): """ Construct an instance. @@ -80,28 +83,54 @@ class Renderer(object): strings of type str encountered during the rendering process. Defaults to "strict". + search_dirs: the list of directories in which to search for + templates when loading a template by name. Defaults to the + current working directory. If given a string, the string is + interpreted as a single directory. + + file_extension: the template file extension. Defaults to "mustache". + Pass False for no extension (i.e. for extensionless files). + """ if default_encoding is None: default_encoding = sys.getdefaultencoding() - if file_encoding is None: - file_encoding = default_encoding - if escape is None: # The quote=True argument causes double quotes to be escaped, # but not single quotes: # http://docs.python.org/library/cgi.html#cgi.escape escape = lambda s: cgi.escape(s, quote=True) + # This needs to be after we set the default default_encoding. + if file_encoding is None: + file_encoding = default_encoding + + if file_extension is None: + file_extension = DEFAULT_EXTENSION + + if search_dirs is None: + search_dirs = os.curdir # i.e. "." + + if isinstance(search_dirs, basestring): + search_dirs = [search_dirs] + + # This needs to be after we set some of the defaults above. if loader is None: reader = Reader(encoding=file_encoding, decode_errors=decode_errors) - loader = Loader(reader=reader) + loader = Loader(reader=reader, search_dirs=search_dirs, extension=file_extension) self.decode_errors = decode_errors self.default_encoding = default_encoding self.escape = escape self.file_encoding = file_encoding + self.file_extension = file_extension + # TODO: we should not store a loader attribute because the loader + # would no longer reflect the current attributes if, say, someone + # changed the search_dirs attribute after instantiation. Instead, + # we should construct the Loader instance each time on the fly, + # as we do with the Reader in the read() method. self.loader = loader + self.search_dirs = search_dirs def _to_unicode_soft(self, s): """ -- cgit v1.2.1