You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.8 KiB
71 lines
1.8 KiB
# ext/autohandler.py
|
|
# Copyright 2006-2022 the Mako authors and contributors <see AUTHORS file>
|
|
#
|
|
# This module is part of Mako and is released under
|
|
# the MIT License: http://www.opensource.org/licenses/mit-license.php
|
|
|
|
"""adds autohandler functionality to Mako templates.
|
|
|
|
requires that the TemplateLookup class is used with templates.
|
|
|
|
usage::
|
|
|
|
<%!
|
|
from mako.ext.autohandler import autohandler
|
|
%>
|
|
<%inherit file="${autohandler(template, context)}"/>
|
|
|
|
|
|
or with custom autohandler filename::
|
|
|
|
<%!
|
|
from mako.ext.autohandler import autohandler
|
|
%>
|
|
<%inherit file="${autohandler(template, context, name='somefilename')}"/>
|
|
|
|
"""
|
|
|
|
import os
|
|
import posixpath
|
|
import re
|
|
|
|
|
|
def autohandler(template, context, name="autohandler"):
|
|
lookup = context.lookup
|
|
_template_uri = template.module._template_uri
|
|
if not lookup.filesystem_checks:
|
|
try:
|
|
return lookup._uri_cache[(autohandler, _template_uri, name)]
|
|
except KeyError:
|
|
pass
|
|
|
|
tokens = re.findall(r"([^/]+)", posixpath.dirname(_template_uri)) + [name]
|
|
while len(tokens):
|
|
path = "/" + "/".join(tokens)
|
|
if path != _template_uri and _file_exists(lookup, path):
|
|
if not lookup.filesystem_checks:
|
|
return lookup._uri_cache.setdefault(
|
|
(autohandler, _template_uri, name), path
|
|
)
|
|
else:
|
|
return path
|
|
if len(tokens) == 1:
|
|
break
|
|
tokens[-2:] = [name]
|
|
|
|
if not lookup.filesystem_checks:
|
|
return lookup._uri_cache.setdefault(
|
|
(autohandler, _template_uri, name), None
|
|
)
|
|
else:
|
|
return None
|
|
|
|
|
|
def _file_exists(lookup, path):
|
|
psub = re.sub(r"^/", "", path)
|
|
for d in lookup.directories:
|
|
if os.path.exists(d + "/" + psub):
|
|
return True
|
|
else:
|
|
return False
|