Skip to content

PugJS syntax adapter for Django, Jinja2 and Mako templates

License

Notifications You must be signed in to change notification settings

ZeroGachis/pypugjs

 
 

Repository files navigation

PyPugJS BuildStatus

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

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 canot supportanything other since I'm not actively using it not will be in the foreseeable 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).

UTILITIES

To simply output the conversion to your console:

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

INSTALLATION

To install pypugjs:

pip install pypugjs

Or:

python setup.py install

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.

Django

In settings.py, add a loader to TEMPLATES like so:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            os.path.join(BASE_DIR, 'templates')
        ],
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'loaders': [
                # PyPugJS part:   ##############################
                ('pypugjs.ext.django.Loader', (
                    'django.template.loaders.filesystem.Loader',
                    'django.template.loaders.app_directories.Loader',
                ))
            ],
            'builtins': [
                'pypugjs.ext.django.templatetags',
            ],
        },
    },
]

In case you want to use Djangos translation feature, be sure to put this import statement at the top of your settings.py.

import pypugjs.ext.django # noqa

Jinja2

Just add pypugjs.ext.jinja.PyPugJSExtension as extension

jinja_env = Environment(extensions=['pypugjs.ext.jinja.PyPugJSExtension'])

Mako

Just add pypugjs.ext.mako.preprocessor as preprocessor

from pypugjs.ext.mako import preprocessor as mako_preprocessor
mako.template.Template(haml_source,
    preprocessor=mako_preprocessor
)

Flask

Just add pypugjs.ext.jinja.PyPugJSExtension as extension to the environment of the app

app.jinja_env.add_extension('pypugjs.ext.jinja.PyPugJSExtension')

Pyramid

Adjust your "your_project/__init__.py" and add the following line somewhere to in the main() function

config.include('pypugjs.ext.pyramid')

Tornado Templates

Append this after importing tornado.template

from tornado import template
from pypugjs.ext.tornado import patch_tornado
patch_tornado()

(...)

Syntax

Generally the same as the PugJS Node.js module (except of cases and several other features, which are not implemented) https://github.com/pugjs/pug/blob/master/README.md

Example

This code

!!! 5
html(lang="en")
  head
    title= pageTitle
    script(type='text/javascript')
      if (foo) {
         bar()
      }
  body
    h1.title PugJS - node template engine
    #container
      if youAreUsingPugJS
        p You are amazing
      else
        p Get on it!

Converts to

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

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

@pypugjs.register_filter('capitalize')
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

'...'
+foo(data)

TESTING

You must have nose package installed. You can do the tests with:

./test.sh

TODOs and BUGS

See: https://github.com/kakulukia/pypugjs/issues

ChangeLog

  • conditional classes feature (thx to paradoxxxzero)

About

PugJS syntax adapter for Django, Jinja2 and Mako templates

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 91.4%
  • HTML 4.5%
  • Pug 4.0%
  • Shell 0.1%