Better solution for access to .md files when running from source
The SelectedFileSystemLoader doesn't collect everything and the kitchen sink from disk...
This commit is contained in:
parent
21b7339187
commit
ce28b637ab
2 changed files with 34 additions and 24 deletions
|
|
@ -738,32 +738,10 @@ class Server(object):
|
|||
|
||||
loaders = [app.jinja_loader, filesystem_loader]
|
||||
if octoprint.util.is_running_from_source():
|
||||
from octoprint.util.jinja import SelectedFileSystemLoader
|
||||
root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
||||
allowed = ["AUTHORS.md", "CHANGELOG.md", "SUPPORTERS.md", "THIRDPARTYLICENSES.md"]
|
||||
|
||||
class SourceRootFilesystemLoader(jinja2.FileSystemLoader):
|
||||
def __init__(self, template_filter, prefix, *args, **kwargs):
|
||||
jinja2.FileSystemLoader.__init__(self, *args, **kwargs)
|
||||
self._filter = template_filter
|
||||
if not prefix.endswith("/"):
|
||||
prefix += "/"
|
||||
self._prefix = prefix
|
||||
|
||||
def get_source(self, environment, template):
|
||||
if not template.startswith(self._prefix):
|
||||
raise jinja2.TemplateNotFound(template)
|
||||
|
||||
template = template[len(self._prefix):]
|
||||
if not self._filter(template):
|
||||
raise jinja2.TemplateNotFound(template)
|
||||
|
||||
return jinja2.FileSystemLoader.get_source(self, environment, template)
|
||||
|
||||
def list_templates(self):
|
||||
templates = jinja2.FileSystemLoader.list_templates(self)
|
||||
return map(lambda t: self._prefix + t, filter(self._filter, templates))
|
||||
|
||||
loaders.append(SourceRootFilesystemLoader(lambda t: t in allowed, "_data/", root))
|
||||
loaders.append(SelectedFileSystemLoader(root, allowed, prefix="_data/"))
|
||||
|
||||
jinja_loader = jinja2.ChoiceLoader(loaders)
|
||||
app.jinja_loader = jinja_loader
|
||||
|
|
|
|||
|
|
@ -54,6 +54,32 @@ class FilteredFileSystemLoader(FileSystemLoader):
|
|||
return all(filter_results)
|
||||
|
||||
|
||||
class SelectedFileSystemLoader(FileSystemLoader):
|
||||
def __init__(self, searchpath, files, prefix=None, **kwargs):
|
||||
FileSystemLoader.__init__(self, searchpath, **kwargs)
|
||||
self.files = files
|
||||
|
||||
if prefix is not None and not prefix.endswith("/"):
|
||||
prefix += "/"
|
||||
self.prefix = prefix
|
||||
|
||||
def get_source(self, environment, template):
|
||||
if not template.startswith(self.prefix):
|
||||
raise TemplateNotFound(template)
|
||||
|
||||
template = template[len(self.prefix):]
|
||||
if not template in self.files:
|
||||
raise TemplateNotFound(template)
|
||||
|
||||
return FileSystemLoader.get_source(self, environment, template)
|
||||
|
||||
def list_templates(self):
|
||||
return [self._prefixed(f) for f in self.files if any(map(lambda folder: os.path.exists(os.path.join(folder, f)), self.searchpath))]
|
||||
|
||||
def _prefixed(self, name):
|
||||
return self.prefix + name if self.prefix else name
|
||||
|
||||
|
||||
def get_all_template_paths(loader):
|
||||
def walk_folder(folder):
|
||||
files = []
|
||||
|
|
@ -71,6 +97,12 @@ def get_all_template_paths(loader):
|
|||
result += walk_folder(folder)
|
||||
return filter(loader.path_filter, result)
|
||||
|
||||
elif isinstance(loader, SelectedFileSystemLoader):
|
||||
result = []
|
||||
for folder in loader.searchpath:
|
||||
result += filter(lambda x: os.path.exists(f), [os.path.join(folder, f) for f in loader.files])
|
||||
return result
|
||||
|
||||
elif isinstance(loader, FileSystemLoader):
|
||||
result = []
|
||||
for folder in loader.searchpath:
|
||||
|
|
|
|||
Loading…
Reference in a new issue