diff --git a/Dockerfile b/Dockerfile index 39598278..075b3e47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,7 +9,7 @@ RUN pip install git+https://github.com/ikreymer/pywb.git@develop#egg=pywb-0.32.2 RUN pip install git+https://github.com/t0m/pyamf.git@python3 -RUN pip install boto +RUN pip install boto webassets ADD . /webrecore/ WORKDIR /webrecore/ diff --git a/urlrewrite/templateview.py b/urlrewrite/templateview.py index c33f854e..e6b8cdd3 100644 --- a/urlrewrite/templateview.py +++ b/urlrewrite/templateview.py @@ -5,6 +5,12 @@ from six.moves.urllib.parse import urlsplit from jinja2 import Environment from jinja2 import FileSystemLoader, PackageLoader, ChoiceLoader +from webassets.ext.jinja2 import AssetsExtension +from webassets.loaders import YAMLLoader +from webassets.env import Resolver + +from pkg_resources import resource_filename + import json import os @@ -27,6 +33,7 @@ class RelEnvironment(Environment): class JinjaEnv(object): def __init__(self, paths=['templates', '.', '/'], packages=['pywb'], + assets_path=None, globals=None, overlay=None, extensions=None): @@ -35,7 +42,10 @@ class JinjaEnv(object): loader = ChoiceLoader(self._make_loaders(paths, packages)) - extensions = extensions or {} + extensions = extensions or [] + + if assets_path: + extensions.append(AssetsExtension) if overlay: jinja_env = overlay.jinja_env.overlay(loader=loader, @@ -47,10 +57,19 @@ class JinjaEnv(object): extensions=extensions) jinja_env.filters.update(self.filters) + if globals: jinja_env.globals.update(globals) + self.jinja_env = jinja_env + # init assets + if assets_path: + assets_loader = YAMLLoader(assets_path) + assets_env = assets_loader.load_environment() + assets_env.resolver = PkgResResolver() + jinja_env.assets_environment = assets_env + def _make_loaders(self, paths, packages): loaders = [] # add loaders for paths @@ -182,3 +201,25 @@ class TopFrameView(BaseInsertView): return self.render_to_string(env, **params) +# ============================================================================ +class PkgResResolver(Resolver): + def get_pkg_path(self, item): + if not isinstance(item, str): + return None + + parts = urlsplit(item) + if parts.scheme == 'pkg' and parts.netloc: + return (parts.netloc, parts.path) + + return None + + def resolve_source(self, ctx, item): + pkg = self.get_pkg_path(item) + if pkg: + filename = resource_filename(pkg[0], pkg[1]) + if filename: + return filename + + return super(PkgResResolver, self).resolve_source(ctx, item) + +