A template language grammar inspired by the Python code aesthetic
Project description
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/*
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file plywood-2.1.0.tar.gz
.
File metadata
- Download URL: plywood-2.1.0.tar.gz
- Upload date:
- Size: 42.1 kB
- Tags: Source
- Uploaded using 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
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 188ce1eb564a2348440a215aba64e0c7c3971a92fe4ba047ad8e5b1d37744fad |
|
MD5 | 9d81a93028459d43dbafb13b5798ae24 |
|
BLAKE2b-256 | ce8aebc5df114099a9f935e7475d0cda52a1b1cb5340df995bbd0d9d05e178a7 |