Index: third_party/pystache/src/specloader.py |
diff --git a/third_party/pystache/src/specloader.py b/third_party/pystache/src/specloader.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3a77d4c5288c8a87e99041fc98c60d15a451235c |
--- /dev/null |
+++ b/third_party/pystache/src/specloader.py |
@@ -0,0 +1,90 @@ |
+# coding: utf-8 |
+ |
+""" |
+This module supports customized (aka special or specified) template loading. |
+ |
+""" |
+ |
+import os.path |
+ |
+from pystache.loader import Loader |
+ |
+ |
+# TODO: add test cases for this class. |
+class SpecLoader(object): |
+ |
+ """ |
+ Supports loading custom-specified templates (from TemplateSpec instances). |
+ |
+ """ |
+ |
+ def __init__(self, loader=None): |
+ if loader is None: |
+ loader = Loader() |
+ |
+ self.loader = loader |
+ |
+ def _find_relative(self, spec): |
+ """ |
+ Return the path to the template as a relative (dir, file_name) pair. |
+ |
+ The directory returned is relative to the directory containing the |
+ class definition of the given object. The method returns None for |
+ this directory if the directory is unknown without first searching |
+ the search directories. |
+ |
+ """ |
+ if spec.template_rel_path is not None: |
+ return os.path.split(spec.template_rel_path) |
+ # Otherwise, determine the file name separately. |
+ |
+ locator = self.loader._make_locator() |
+ |
+ # We do not use the ternary operator for Python 2.4 support. |
+ if spec.template_name is not None: |
+ template_name = spec.template_name |
+ else: |
+ template_name = locator.make_template_name(spec) |
+ |
+ file_name = locator.make_file_name(template_name, spec.template_extension) |
+ |
+ return (spec.template_rel_directory, file_name) |
+ |
+ def _find(self, spec): |
+ """ |
+ Find and return the path to the template associated to the instance. |
+ |
+ """ |
+ if spec.template_path is not None: |
+ return spec.template_path |
+ |
+ dir_path, file_name = self._find_relative(spec) |
+ |
+ locator = self.loader._make_locator() |
+ |
+ if dir_path is None: |
+ # Then we need to search for the path. |
+ path = locator.find_object(spec, self.loader.search_dirs, file_name=file_name) |
+ else: |
+ obj_dir = locator.get_object_directory(spec) |
+ path = os.path.join(obj_dir, dir_path, file_name) |
+ |
+ return path |
+ |
+ def load(self, spec): |
+ """ |
+ Find and return the template associated to a TemplateSpec instance. |
+ |
+ Returns the template as a unicode string. |
+ |
+ Arguments: |
+ |
+ spec: a TemplateSpec instance. |
+ |
+ """ |
+ if spec.template is not None: |
+ return self.loader.unicode(spec.template, spec.template_encoding) |
+ |
+ path = self._find(spec) |
+ |
+ return self.loader.read(path, spec.template_encoding) |