mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-15 00:03:28 +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:
parent
003d84c371
commit
3d507c5d68
@ -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/
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user