Skip to main content

PugJS syntax template adapter for Django, Jinja2, Mako and Tornado templates

Project description

PyPugJS PyPiPackage BuildStatus Coverage

PyPugJS is a fork of PyJade with the name Jade changed to PugJS.

Additional disclaimer: Since the original pypugjs died i took the liberty to keep it alive, because since starting to work with the jade compiler for node I hate writing HTML and want to continue using it in my Django projects. I will keep the existing non Django stuff inside the project, but I cannot support anything other since I’m not actively using it not will be in the foreseable future. Tornado, Mako etc. support will be welcome tho!

PyPugJS is a high performance port of PugJS for python, that converts any .pug source into different Template-languages (Django, Jinja2, Mako or Tornado).


To simply output the conversion to your console:

pypugjs [-c django|jinja|mako|tornado] input.pug [output.html]


To install pypugjs:

pip install pypugjs

Now simply name your templates with a `.pug` extension and this PugJS compiler will do the rest. Any templates with other extensions will not be compiled with the pypugjs compiler.

Framework specific installation instructions


Generally the same as the PugJS Node module (except of cases and several other features, which are not implemented)


This code

!!! 5
    title= pageTitle
      if (foo) {
    h1.title PugJS - node template engine
      if youAreUsingPugJS
        p You are amazing
        p Get on it!

Converts to

<!DOCTYPE html>
<html lang="en">
    <script type='text/javascript'>
      if (foo) {
    <h1 class="title">PugJS - node template engine</h1>
    <div id="container">
      {%if youAreUsingPugJS%}
        <p>You are amazing</p>
        <p>Get on it!</p>

Convert existing templates online with the HTML2Jade converter.

Register filters

If you want to register a function as a filter, you only have to decorate the function with pypugjs.register_filter("filter_name")

import pypugjs

def capitalize(text, ast):
  return text.capitalize()

Notable Features

Adding conditional classes:

a(class={'active-class': True, 'another': False})

Define mixins like this mixins/foo.pug:

mixin foo(data)
  .foo {{ data }}

And use them in your templates like this:

include mixins/foo.pug



To start the testsuite, start the following commands:

make init
make test






  • added Makefile for testing, installing, releasing, linting …
  • added coverage reports
  • package is mainly base on the cookiecutter package
  • additional release helpers
  • packages passes flake8 test


  • conditional classes feature (thx to paradoxxxzero)
  • mixin support for jinja (matin)
  • mixin support for django
  • refactored the django tests to actually use the file loader
  • some pep8 fixes


  • PyPugs was originally created as PyJade by Syrus Akbary in November 2011.
  • It was then renamed maintained by Matan Noam Shavit
  • Since I need it for my projects and hate coding plain HTML, I continued maintaining this package.

Project details

Download files

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

Filename, size & hash SHA256 hash help File type Python version Upload date
pypugjs-5.7.2-py2.py3-none-any.whl (38.5 kB) Copy SHA256 hash SHA256 Wheel py2.py3 Sep 12, 2018

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page