1
0
mirror of https://github.com/webrecorder/pywb.git synced 2025-03-24 06:59:52 +01:00

urlrewrite: webassets: add webassets support to JinjaEnv, if 'assets_path' is set, the specified webassets yaml file is added to the env

This commit is contained in:
Ilya Kreymer 2016-10-22 00:13:41 -07:00
parent 003d84c371
commit 3d507c5d68
2 changed files with 43 additions and 2 deletions

View File

@ -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 git+https://github.com/t0m/pyamf.git@python3
RUN pip install boto RUN pip install boto webassets
ADD . /webrecore/ ADD . /webrecore/
WORKDIR /webrecore/ WORKDIR /webrecore/

View File

@ -5,6 +5,12 @@ from six.moves.urllib.parse import urlsplit
from jinja2 import Environment from jinja2 import Environment
from jinja2 import FileSystemLoader, PackageLoader, ChoiceLoader 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 json
import os import os
@ -27,6 +33,7 @@ class RelEnvironment(Environment):
class JinjaEnv(object): class JinjaEnv(object):
def __init__(self, paths=['templates', '.', '/'], def __init__(self, paths=['templates', '.', '/'],
packages=['pywb'], packages=['pywb'],
assets_path=None,
globals=None, globals=None,
overlay=None, overlay=None,
extensions=None): extensions=None):
@ -35,7 +42,10 @@ class JinjaEnv(object):
loader = ChoiceLoader(self._make_loaders(paths, packages)) loader = ChoiceLoader(self._make_loaders(paths, packages))
extensions = extensions or {} extensions = extensions or []
if assets_path:
extensions.append(AssetsExtension)
if overlay: if overlay:
jinja_env = overlay.jinja_env.overlay(loader=loader, jinja_env = overlay.jinja_env.overlay(loader=loader,
@ -47,10 +57,19 @@ class JinjaEnv(object):
extensions=extensions) extensions=extensions)
jinja_env.filters.update(self.filters) jinja_env.filters.update(self.filters)
if globals: if globals:
jinja_env.globals.update(globals) jinja_env.globals.update(globals)
self.jinja_env = jinja_env 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): def _make_loaders(self, paths, packages):
loaders = [] loaders = []
# add loaders for paths # add loaders for paths
@ -182,3 +201,25 @@ class TopFrameView(BaseInsertView):
return self.render_to_string(env, **params) 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)