plywood
A python-inspired templating language.
DEMO
import app.url
import request
from plywood.plugin import compress
doctype(5) # or doctype('strict') doctype('xhtml'), etc.
html: # this'll start looking a lot like jade, but with quotes and colons
# even though 'html' is a function call, the parentheses are optional.
head:
meta(charset="utf-8")
title:
if self.title: # context variables are available on 'self'
# docstrings are stripped of preceding whitespace and the first and
# last newline is removed.
"""
{{self.title}} |
""" # string interpolation uses plywood in 'inline' mode. Each line
# will be joined with a space.
'Welcome' # string literals require quotes
compress('css'):
# passing values to tag attributes are escaped (html-entitized) automatically
# if you want to escape using xml, pass {'format': 'xml'} in your options.
link(rel='stylesheet', type='text/css', href=url.static('css/reset.css'))
link(rel='stylesheet', type='text/css', href=url.static('css/welcome.css'))
script(src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", type="text/javascript")
compress('js'):
script(src=url.static("js/underscore.js"), type="text/javascript")
script(src=url.static("js/backbone.js"), type="text/javascript")
ieif 'lt IE 9':
script(src="//html5shiv.googlecode.com/svn/trunk/html5.js", type="text/javascript")
link(rel='stylesheet', type='text/css', href=url.static('css/ie.css'))
# blocks? block inheritance? of course!
block('extra_head')
body:
div(class="wrapper", id="main-header"):
# for xml usage, the token parsing will accept some gnarly-looking elements in
# argument lists, and this uses the html-plugin constructor, so that
# you don't have to create a bunch of plugins for your XML documents.
# (you still need commas between arguments)
<book xmlns='urn:loc.gov:books',
xmlns:isbn='urn:ISBN:0-395-36341-6'>:
<isbn:number>: 1568491379
header:
block('header'):
# inlining is easy
p(class="logo"): 'logo'
# more complicated inlining
p: a(href=url.reverse("login")): 'Login'
block('header_title'):
if self.user:
'Welcome, '{self.user.name}'
else:
'Welcome'
if not self.user:
p(class="login"):
a(href=url.reverse("login")): 'Log In'
a(href=url.reverse("logout")): 'Log Out'
nav:
ul:
block('nav'):
section(class="breadcrumb"):
block('breadcrumb')
section(class="main"):
block('messages'):
if messages:
ul(class="messages"):
for message in self.messages:
li(class=message.tags): message
script:
# code literals, so that savvy editors can color the source code
'''javascript
$(document).ready(function(){
$("ul.messages").addClass("animate");
var fade_out = _(function() {
this.addClass("fade-out")
}).bind($("ul.messages"))
setTimeout(fade_out, 5000);
$("ul.messages").bind("click", fade_out);
});
'''
block('content')
footer:
p:
'©{now(%Y)} colinta'
INSTALLATION
$ pip install plywood $ ply < in.ply > out.html # local development $ pip install -e .
RUNTIME
When you run a plywood template, a lot of the work is done using plugins, which are loaded into the global context - the PlywoodEnv object. This only needs to happen once per application - the PlywoodEnv can be reused by any number of templates (though it is not thread safe - that will be remedied soon).
When you actually run a compiled Plywood object, you can pass in a dict of values that you want
WHY!?!?
The main reason: I envisioned an HTML templating language that had python-like syntax, and the options that are out there now (Haml, Coffekup, Jade) don’t hit the mark.
Plain-Jane HTML? Sure, if you want. That is, I think, the best alternative to plywood! For that, use Jinja2.
The template languages that take an HTML-agnostic view (jinja2, django) is HTML made nastier by inserting additional markup. I looked at Jade and Haml as “yeah, you’re getting there”, but they didn’t nail it. Plus, have you tried writing extensions for those systems? Ooof. Nasty stuff. Writing a plugin for plywood is much easier, and since you can take some part in the parsing and runtime process, you can write some pretty hefty plugins!
I’m unapologettically a DIY-er. I think that sometimes wheels just need re-inventing!
LICENSE
- Author:
Colin T.A. Gray
- Copyright:
2012 Colin T.A. Gray <http://colinta.com/>
Copyright (c) 2012, Colin T.A. Gray All rights reserved.
See LICENSE for more details (it’s a simplified BSD license).
RELEASE
python setup.py sdist twine upload dist/*
Metadata
Release files for plywood 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| plywood-2.1.0.tar.gz | 42.1 kB | Without provenance | Details for plywood-2.1.0.tar.gz |
Release files / plywood-2.1.0.tar.gz
| Download URL | plywood-2.1.0.tar.gz |
|---|---|
| Size | 42.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
188ce1eb564a2348440a215aba64e0c7c3971a92fe4ba047ad8e5b1d37744fad
|
|
BLAKE2b-256 checksum How to use checksums |
ce8aebc5df114099a9f935e7475d0cda52a1b1cb5340df995bbd0d9d05e178a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.7.4
|
Security for plywood 2.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.