-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathassets.py
More file actions
90 lines (68 loc) · 3.06 KB
/
assets.py
File metadata and controls
90 lines (68 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from __future__ import unicode_literals
import logging
import os
import posixpath
from os.path import join
import jinja2
import webassets
from jinja2 import ext
from pelican import signals
from rcssmin import cssmin
from webassets import Environment
from webassets.ext.jinja2 import AssetsExtension
from webassets.filter import Filter, register_filter
from webassets.filter.rjsmin.rjsmin import jsmin
logger = logging.getLogger(__name__)
@jinja2.contextfunction
def asset(ctx, name):
env = ctx.environment.assets_environment
bundle = env[name]
bundle.build()
return jinja2.Markup(open(os.path.join(env.directory, bundle.output)).read())
class Extension(ext.Extension):
def __init__(self, environment):
environment.globals.update(
asset=asset,
)
environment.filters['cssmin'] = cssmin
environment.filters['jsmin'] = jsmin
def add_jinja2_ext(pelican):
"""Add Webassets to Jinja2 extensions in Pelican settings."""
if 'JINJA_ENVIRONMENT' in pelican.settings: # pelican 3.7+
pelican.settings['JINJA_ENVIRONMENT']['extensions'].append(Extension)
pelican.settings['JINJA_ENVIRONMENT']['extensions'].append(AssetsExtension)
else:
pelican.settings['JINJA_EXTENSIONS'].append(Extension)
pelican.settings['JINJA_EXTENSIONS'].append(AssetsExtension)
def create_assets_env(generator):
"""Define the assets environment and pass it to the generator."""
theme_static_dir = generator.settings['THEME_STATIC_DIR']
static_url = posixpath.join(generator.settings['SITEURL'], theme_static_dir)
assets_destination = os.path.join(generator.output_path, theme_static_dir)
generator.env.assets_environment = Environment(assets_destination, static_url)
if 'ASSET_CONFIG' in generator.settings:
for item in generator.settings['ASSET_CONFIG']:
generator.env.assets_environment.config[item[0]] = item[1]
if 'ASSET_BUNDLES' in generator.settings:
for name, args, kwargs in generator.settings['ASSET_BUNDLES']:
generator.env.assets_environment.register(name, *args, **kwargs)
if 'ASSET_DEBUG' in generator.settings:
generator.env.assets_environment.debug = generator.settings['ASSET_DEBUG']
elif logging.getLevelName(logger.getEffectiveLevel()) == "DEBUG":
generator.env.assets_environment.debug = True
for path in (generator.settings['THEME_STATIC_PATHS'] + generator.settings.get('ASSET_SOURCE_PATHS', [])):
full_path = os.path.join(generator.theme, path)
generator.env.assets_environment.append_path(full_path, static_url)
def register():
"""Plugin registration."""
if webassets:
signals.initialized.connect(add_jinja2_ext)
signals.generator_init.connect(create_assets_env)
@register_filter
class RCssMinFilter(Filter):
name = 'rcssmin'
def output(self, _in, out, **kwargs):
out.write(cssmin(_in.read()))
else:
logger.warning('`assets` failed to load dependency `webassets`.'
'`assets` plugin not loaded.')