Skip to main content
This is a pre-production deployment of Warehouse. Changes made here affect the production instance of PyPI (
Help us improve Python packaging - Donate today!

A Jinja extension (compatible with Flask and other frameworks) to compile and/or compress your assets.

Project Description
[![Build Status](](


A Jinja2 extension to compile and/or compress your assets.

# Installing
pip install jac
For LESS and CSS support, install [less](<br />
`npm install -g less`

For COFFEE support, install [coffee-script](<br />
`npm install -g coffee-script`

For Sass and SCSS support, install [sass](<br />
`gem install sass`

JavaScript minification is built-in using the Python [rJsmin]( package.

When installing on Mac OS X set this shell variable, because jac dependencies contain C code:<br />
`export CFLAGS=-Qunused-arguments`

# Usage
To use it, you just have to put your css or js inside a compress tag.
{% compress 'css' %}
<style type="text/sass">
sass stuff
<link rel="stylesheet" type="text/sass" href="file.sass">
{% endcompress %}

{% compress 'js' %}
<script type="text/coffeescript">
coffee stuff
<script type="text/coffeescript" src=""></script>
{% endcompress %}

## Configuring Jinja
You just have to create an environment with jac on it and configure output dir, static prefix and say where it can find your sources.

import jinja2

from jac import CompressorExtension

env = jinja2.Environment(extensions=[CompressorExtension])
env.compressor_output_dir = './static/dist'
env.compressor_static_prefix = '/static'
env.compressor_source_dirs = './static_files'
After that just use `template = env.from_string(html); template.render()` to get it done.

## Configuring Flask
Where you configure your app, just do this:

from jac.contrib.flask import JAC

app = Flask(__name__)
app.config['COMPRESSOR_DEBUG'] = app.config.get('DEBUG')
app.config['COMPRESSOR_OUTPUT_DIR'] = './static/dist'
app.config['COMPRESSOR_STATIC_PREFIX'] = '/static'
jac = JAC(app)
And you are done.

## Offline Compression
JAC supports compressing static assets offline, then deploying to a production
server. Here is a script to compress your static assets if using Flask:

#!/usr/bin/env python

import os
import shutil
import sys

from jac.contrib.flask import get_template_dirs

from my_flask_module import app

def main():

env = app.jinja_env

if os.path.exists(env.compressor_output_dir):
print('Deleting previously compressed files in {output_dir}'
print('No previous compressed files found in {output_dir}'

template_dirs = [os.path.join(app.root_path, x)
for x in get_template_dirs(app)]

print('Compressing static assets into {output_dir}'
compressor = env.extensions['jac.extension.CompressorExtension'].compressor
compressor.offline_compress(env, template_dirs)

print('Finished offline-compressing static assets.')
return 0

if __name__ == '__main__':

Replace `my_flask_module` with the correct import path to find your Flask app.

## Custom Compressors

The `compressor_classes` template env variable tells jac which compressor to
use for each mimetype. The default value for `compressor_classes` is:
'text/css': LessCompressor,
'text/coffeescript': CoffeeScriptCompressor,
'text/less': LessCompressor,
'text/javascript': JavaScriptCompressor,
'text/sass': SassCompressor,
'text/scss': SassCompressor,

To use an alternate compressor class, provide a class with a `compile` class
method accepting arg `text` and kwargs `mimetype`, `cwd`, `uri_cwd`, and
`debug`. For example, to use [libsass-python](
for SASS files instead of the built-in SassCompressor, create your custom
compressor class:

import sass

class CustomSassCompressor(object):
"""Custom compressor for text/sass mimetype.

Uses libsass-python for compression.

def compile(cls, text, cwd=None, **kwargs):

include_paths = []
if cwd:
include_paths += [cwd]

return sass.compile(string=text, include_paths=include_paths)

Then tell jac to use your custom compressor for `text/sass` mimetypes:

env.compressor_classes['text/sass'] = CustomSassCompressor

The equivalent for Flask is:

jac.set_compressor('text/sass', CustomSassCompressor)

To only customize the path of a compressor which forks a subprocess for the
compile step (LessCompressor, CoffeeScriptCompressor, and SassCompressor), just
extend the compressor class and overwrite the `binary` class attribute:

from jac.compressors import SassCompressor

class CustomSassCompressor(SassCompressor):
"""Custom SASS compressor using Compass binary instead of libsass for text/sass mimetype.

Uses the faster libsass wrapper sassc for SASS compression.

binary = '/usr/bin/sassc'

# Tell Flask to use our custom SASS compressor
jac.set_compressor('text/sass', CustomSassCompressor)

# Running Tests
virtualenv venv
. venv/bin/activate
pip install -r requirements_tests.txt
make test
Release History

Release History

This version
History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


Download Files

Download Files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

File Name & Checksum SHA256 Checksum Help Version File Type Upload Date
jac-0.16.3-py2.py3-none-any.whl (16.8 kB) Copy SHA256 Checksum SHA256 3.6 Wheel Oct 21, 2017
jac-0.16.3-py3-none-any.whl (16.8 kB) Copy SHA256 Checksum SHA256 3.6 Wheel Oct 21, 2017
jac-0.16.3.tar.gz (10.6 kB) Copy SHA256 Checksum SHA256 Source Oct 21, 2017

Supported By

WebFaction WebFaction Technical Writing Elastic Elastic Search Pingdom Pingdom Monitoring Dyn Dyn DNS Sentry Sentry Error Logging CloudAMQP CloudAMQP RabbitMQ Heroku Heroku PaaS Kabu Creative Kabu Creative UX & Design Fastly Fastly CDN DigiCert DigiCert EV Certificate Rackspace Rackspace Cloud Servers DreamHost DreamHost Log Hosting