Source code for flask_webpackext.manifest
# -*- coding: utf-8 -*-
#
# This file is part of Flask-WebpackExt
# Copyright (C) 2017 CERN.
#
# Flask-WebpackExt is free software; you can redistribute it and/or modify
# it under the terms of the Revised BSD License; see LICENSE file for
# more details.
"""Proxy to current extension."""
from __future__ import absolute_import, print_function
from flask import current_app
from markupsafe import Markup
from pywebpack import Manifest, ManifestEntry, ManifestLoader
from .errors import ManifestKeyNotFoundError
[docs]class JinjaManifest(Manifest):
"""Manifest entry which marks rendered strings as safe for Jinja."""
def __getitem__(self, key):
"""Get a manifest entry."""
try:
return super(JinjaManifest, self).__getitem__(key)
except KeyError:
raise ManifestKeyNotFoundError('Key {} not found in manifest.json'
.format(key))
def __getattr__(self, name):
"""Get a manifest entry."""
try:
return super(JinjaManifest, self).__getattr__(name)
except AttributeError as e:
raise ManifestKeyNotFoundError('Key {} not found in manifest.json'
.format(name))
[docs]class JinjaManifestEntry(ManifestEntry):
"""Manifest entry which marks rendered strings as safe for Jinja."""
def __html__(self):
"""Ensures that string is not escaped when included in Jinja."""
return Markup(self.render())
[docs]class JinjaManifestLoader(ManifestLoader):
"""Factory which uses the Jinja manifest entry."""
cache = {}
def __init__(self, manifest_cls=JinjaManifest,
entry_cls=JinjaManifestEntry):
"""Initialize manifest loader."""
super(JinjaManifestLoader, self).__init__(
manifest_cls=manifest_cls,
entry_cls=entry_cls
)
[docs] def load(self, filepath):
"""Load a manifest from a file."""
if current_app.debug or filepath not in JinjaManifestLoader.cache:
JinjaManifestLoader.cache[filepath] = \
super(JinjaManifestLoader, self).load(filepath)
return JinjaManifestLoader.cache[filepath]