Skip to main content

Pug template support in Python

Project description

https://img.shields.io/pypi/v/ninjadog.svg https://img.shields.io/travis/knowsuchagency/ninjadog.svg Updates

Pug template (formerly jade) support in Python

Installation

ninjadog requires Python 3, node-js, npm, and the pug-cli library

brew install npm
npm install -g pug-cli
pip install ninjadog

For use with Pyramid, just add it to the configuration

config.include('ninjadog')

Usage

ninjadog leverages the pug-cli library, written in nodejs, to render pug templates in Python.

It allows you to take something like this

html
    head
        title my pug template
    body
        #content
            h1 Hello #{name}
            .block
                input#bar.foo1.foo2
                input(type="text", placeholder="your name")
                if name == "Bob"
                    h2 Hello Bob
                ul
                    for book in books
                        li= book
                    else
                        li sorry, no books

and sprinkle some Python over it

from ninjadog import render

context = {
    'name': 'Bob',
    'books': ['coloring book', 'audio book', "O'Reilly book"],
    'type': 'text',
}

print(render(file=filepath, context=context, pretty=True))

to render this

<!DOCTYPE html>
<html>
  <head>
    <title>my pug template</title>
  </head>
  <body>
    <div id="content">
      <h1>Hello Bob</h1>
      <div class="block">
        <input class="foo1 foo2" id="bar">
        <input type="text" placeholder="your name">
        <h2>Hello Bob</h2>
        <ul>
          <li>coloring book</li>
          <li>audio book</li>
          <li>O'Reilly book</li>
        </ul>
      </div>
    </div>
  </body>
</html>

You can even combine jinja2 syntax for unparalleled template-rendering power.

from ninjadog import render


def stop_believing():
    return False


context = {
    'stop_believing': stop_believing,
    'happy': {
        'birthday': 'today',
    }
}

template_string = """
h1 hello, world
if happy.birthday == 'today'
    p it's time to celebrate!
    p {{ "Don't" if not stop_believing() }} stop believing
"""

print(render(template_string,
             context=context,
             pretty=True,
             with_jinja=True))
<h1>hello, world</h1>
<p>it's time to celebrate!</p>
<p>Don't stop believing</p>

Why?

Pug templates are a super elegant and expressive way to write html, IMO.

There exists a project, pyjade and a less-popular fork, pypugjs, that are pure-python implementations of the pug template engine, but they have some minor bugs and the maintenance is a bit lacking.

I figured it would be good to have an alternative method to render pug templates that used the native javascript rendering engine.

ninjadog does this by spawning the pug cli as a subprocess. This means that it can’t be as fast as a native template engine like pyjade, but it will likely be more reliable over time as it’s leveraging the popular and well-maintained nodejs implementation.

Gotchas

Currently, rendering a template with jinja2 syntax goes through the following process:

  1. Render elements on the initial template through jinja2

  2. Pass the output to the pug-cli, gathering extensions and inclusions in the process

  3. Render the output through jinja2 again, since the original template may have extended or included other templates that countained jinja2 syntax themselves.

What this means is that if you want to escape jinja2 syntax, you need to do it twice.

For example, to have a literal {{ escaping inception }} rendered, you’ll need to have {{ "{{ '{{ escaping inception }}' }}" }} in your template.

对不起

Project details


Download files

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

Source Distribution

ninjadog-0.5.2.tar.gz (290.4 kB view details)

Uploaded Source

Built Distribution

ninjadog-0.5.2-py2.py3-none-any.whl (15.1 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file ninjadog-0.5.2.tar.gz.

File metadata

  • Download URL: ninjadog-0.5.2.tar.gz
  • Upload date:
  • Size: 290.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for ninjadog-0.5.2.tar.gz
Algorithm Hash digest
SHA256 b7b28ef3a6bbb051c834577b3d78ea5efa3cd707d6150ca1ce04f096b3428bbf
MD5 21160983605b0677f3dfde359ec268ed
BLAKE2b-256 d3833cda47f54d28a53d4add4e7da631f0096ea41ff4d3ff8b26640114284f74

See more details on using hashes here.

File details

Details for the file ninjadog-0.5.2-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for ninjadog-0.5.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 c2013d2c956884da5eaaf9c8b1632bed268e18cf3b1ee57d8468a622a7076faf
MD5 5eb54098e757d746eedce6c106407674
BLAKE2b-256 fd9f9f98e241790d7d0d90fc4a96fb06f15366bb2f582d236ad0eab70de30c00

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page