Index: third_party/pystache/src/loader.py |
diff --git a/third_party/pystache/src/loader.py b/third_party/pystache/src/loader.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d4a7e5310ff4022dc27cb3e5bd57c63d817861b8 |
--- /dev/null |
+++ b/third_party/pystache/src/loader.py |
@@ -0,0 +1,170 @@ |
+# coding: utf-8 |
+ |
+""" |
+This module provides a Loader class for locating and reading templates. |
+ |
+""" |
+ |
+import os |
+import sys |
+ |
+from pystache import common |
+from pystache import defaults |
+from pystache.locator import Locator |
+ |
+ |
+# We make a function so that the current defaults take effect. |
+# TODO: revisit whether this is necessary. |
+ |
+def _make_to_unicode(): |
+ def to_unicode(s, encoding=None): |
+ """ |
+ Raises a TypeError exception if the given string is already unicode. |
+ |
+ """ |
+ if encoding is None: |
+ encoding = defaults.STRING_ENCODING |
+ return unicode(s, encoding, defaults.DECODE_ERRORS) |
+ return to_unicode |
+ |
+ |
+class Loader(object): |
+ |
+ """ |
+ Loads the template associated to a name or user-defined object. |
+ |
+ All load_*() methods return the template as a unicode string. |
+ |
+ """ |
+ |
+ def __init__(self, file_encoding=None, extension=None, to_unicode=None, |
+ search_dirs=None): |
+ """ |
+ Construct a template loader instance. |
+ |
+ Arguments: |
+ |
+ extension: the template file extension, without the leading dot. |
+ Pass False for no extension (e.g. to use extensionless template |
+ files). Defaults to the package default. |
+ |
+ file_encoding: the name of the encoding to use when converting file |
+ contents to unicode. Defaults to the package default. |
+ |
+ search_dirs: the list of directories in which to search when loading |
+ a template by name or file name. Defaults to the package default. |
+ |
+ to_unicode: the function to use when converting strings of type |
+ str to unicode. The function should have the signature: |
+ |
+ to_unicode(s, encoding=None) |
+ |
+ It should accept a string of type str and an optional encoding |
+ name and return a string of type unicode. Defaults to calling |
+ Python's built-in function unicode() using the package string |
+ encoding and decode errors defaults. |
+ |
+ """ |
+ if extension is None: |
+ extension = defaults.TEMPLATE_EXTENSION |
+ |
+ if file_encoding is None: |
+ file_encoding = defaults.FILE_ENCODING |
+ |
+ if search_dirs is None: |
+ search_dirs = defaults.SEARCH_DIRS |
+ |
+ if to_unicode is None: |
+ to_unicode = _make_to_unicode() |
+ |
+ self.extension = extension |
+ self.file_encoding = file_encoding |
+ # TODO: unit test setting this attribute. |
+ self.search_dirs = search_dirs |
+ self.to_unicode = to_unicode |
+ |
+ def _make_locator(self): |
+ return Locator(extension=self.extension) |
+ |
+ def unicode(self, s, encoding=None): |
+ """ |
+ Convert a string to unicode using the given encoding, and return it. |
+ |
+ This function uses the underlying to_unicode attribute. |
+ |
+ Arguments: |
+ |
+ s: a basestring instance to convert to unicode. Unlike Python's |
+ built-in unicode() function, it is okay to pass unicode strings |
+ to this function. (Passing a unicode string to Python's unicode() |
+ with the encoding argument throws the error, "TypeError: decoding |
+ Unicode is not supported.") |
+ |
+ encoding: the encoding to pass to the to_unicode attribute. |
+ Defaults to None. |
+ |
+ """ |
+ if isinstance(s, unicode): |
+ return unicode(s) |
+ |
+ return self.to_unicode(s, encoding) |
+ |
+ def read(self, path, encoding=None): |
+ """ |
+ Read the template at the given path, and return it as a unicode string. |
+ |
+ """ |
+ b = common.read(path) |
+ |
+ if encoding is None: |
+ encoding = self.file_encoding |
+ |
+ return self.unicode(b, encoding) |
+ |
+ def load_file(self, file_name): |
+ """ |
+ Find and return the template with the given file name. |
+ |
+ Arguments: |
+ |
+ file_name: the file name of the template. |
+ |
+ """ |
+ locator = self._make_locator() |
+ |
+ path = locator.find_file(file_name, self.search_dirs) |
+ |
+ return self.read(path) |
+ |
+ def load_name(self, name): |
+ """ |
+ Find and return the template with the given template name. |
+ |
+ Arguments: |
+ |
+ name: the name of the template. |
+ |
+ """ |
+ locator = self._make_locator() |
+ |
+ path = locator.find_name(name, self.search_dirs) |
+ |
+ return self.read(path) |
+ |
+ # TODO: unit-test this method. |
+ def load_object(self, obj): |
+ """ |
+ Find and return the template associated to the given object. |
+ |
+ Arguments: |
+ |
+ obj: an instance of a user-defined class. |
+ |
+ search_dirs: the list of directories in which to search. |
+ |
+ """ |
+ locator = self._make_locator() |
+ |
+ path = locator.find_object(obj, self.search_dirs) |
+ |
+ return self.read(path) |