def _compile_from_file(self, path, filename): if path is not None: util.verify_directory(os.path.dirname(path)) filemtime = os.stat(filename)[stat.ST_MTIME] if not os.path.exists(path) or \ os.stat(path)[stat.ST_MTIME] < filemtime: _compile_module_file( self, open(filename, 'rb').read(), filename, path) module = imp.load_source(self.module_id, path, open(path, 'rb')) del sys.modules[self.module_id] if module._magic_number != codegen.MAGIC_NUMBER: _compile_module_file( self, open(filename, 'rb').read(), filename, path) module = imp.load_source(self.module_id, path, open(path, 'rb')) del sys.modules[self.module_id] ModuleInfo(module, path, self, filename, None, None) else: # template filename and no module directory, compile code # in memory code, module = _compile_text( self, open(filename, 'rb').read(), filename) self._source = None self._code = code ModuleInfo(module, None, self, filename, code, None) return module
def _compile_from_file(self, path, filename): if path is not None: util.verify_directory(os.path.dirname(path)) filemtime = os.stat(filename)[stat.ST_MTIME] if (not os.path.exists(path) or os.stat(path)[stat.ST_MTIME] < filemtime): data = util.read_file(filename) _compile_module_file(self, data, filename, path, self.module_writer) module = compat.load_module(self.module_id, path) del sys.modules[self.module_id] if module._magic_number != codegen.MAGIC_NUMBER: data = util.read_file(filename) _compile_module_file(self, data, filename, path, self.module_writer) module = compat.load_module(self.module_id, path) del sys.modules[self.module_id] ModuleInfo(module, path, self, filename, None, None) else: # template filename and no module directory, compile code # in memory data = util.read_file(filename) code, module = _compile_text(self, data, filename) self._source = None self._code = code ModuleInfo(module, None, self, filename, code, None) return module
def __init__(self, text=None, filename=None, uri=None, format_exceptions=False, error_handler=None, lookup=None, output_encoding=None, encoding_errors='strict', module_directory=None, cache_type=None, cache_dir=None, cache_url=None, module_filename=None, input_encoding=None, disable_unicode=False, default_filters=None, buffer_filters=[], imports=None, preprocessor=None, cache_enabled=True): """construct a new Template instance using either literal template text, or a previously loaded template module text - textual template source, or None if a module is to be provided uri - the uri of this template, or some identifying string. defaults to the full filename given, or "memory:(hex id of this Template)" if no filename filename - filename of the source template, if any format_exceptions - catch exceptions and format them into an error display template """ if uri: self.module_id = re.sub(r'\W', "_", uri) self.uri = uri elif filename: self.module_id = re.sub(r'\W', "_", filename) self.uri = filename else: self.module_id = "memory:" + hex(id(self)) self.uri = self.module_id self.input_encoding = input_encoding self.output_encoding = output_encoding self.encoding_errors = encoding_errors self.disable_unicode = disable_unicode if default_filters is None: if self.disable_unicode: self.default_filters = ['str'] else: self.default_filters = ['unicode'] else: self.default_filters = default_filters self.buffer_filters = buffer_filters self.imports = imports self.preprocessor = preprocessor # if plain text, compile code in memory only if text is not None: (code, module) = _compile_text(self, text, filename) self._code = code self._source = text ModuleInfo(module, None, self, filename, code, text) elif filename is not None: # if template filename and a module directory, load # a filesystem-based module file, generating if needed if module_filename is not None: path = module_filename elif module_directory is not None: u = self.uri if u[0] == '/': u = u[1:] path = os.path.abspath(os.path.join(module_directory.replace('/', os.path.sep), u + ".py")) else: path = None if path is not None: util.verify_directory(os.path.dirname(path)) filemtime = os.stat(filename)[stat.ST_MTIME] if not os.path.exists(path) or os.stat(path)[stat.ST_MTIME] < filemtime: _compile_module_file(self, file(filename).read(), filename, path) module = imp.load_source(self.module_id, path, file(path)) del sys.modules[self.module_id] if module._magic_number != codegen.MAGIC_NUMBER: _compile_module_file(self, file(filename).read(), filename, path) module = imp.load_source(self.module_id, path, file(path)) del sys.modules[self.module_id] ModuleInfo(module, path, self, filename, None, None) else: # template filename and no module directory, compile code # in memory (code, module) = _compile_text(self, file(filename).read(), filename) self._source = None self._code = code ModuleInfo(module, None, self, filename, code, None) else: raise exceptions.RuntimeException("Template requires text or filename") self.module = module self.filename = filename self.callable_ = self.module.render_body self.format_exceptions = format_exceptions self.error_handler = error_handler self.lookup = lookup self.cache_type = cache_type self.cache_dir = cache_dir self.cache_url = cache_url self.cache_enabled = cache_enabled