Introduction
This tutorial shows how to create a simple links page that'll look something like this:
1. Define the HTML template
The following HTML template contains three elements (<title>
, <li>
, <a>
) containing compiler directives (node="con:title"
, node="rep:item"
, node="con:link"
):
<html> <head> <title node="con:title">TITLE</title> </head> <body> <ul> <li node="rep:item"> <a href="" node="con:link">LINK</a> </li> </ul> </body> </html>
Note that another attribute name, e.g. id
, may be used instead of node
if preferred.
HTMLTemplate will compile this template to the following object model:
Template | |----title | |----item | | | |----link
2. Write the template controller
Both the Template
and Repeater
(rep:item
) nodes require callback functions to control their rendering.
The main render_template
callback function inserts text into the <title>
element and generates a list of <li>
items:
def render_template(tem, pagetitle, linksinfo):
tem.title.content = pagetitle
tem.item.repeat(render_item, linksinfo)
This function takes a copy of the Template
object as its first argument, followed by two user-supplied arguments containing the data to be inserted into the template:
pagetitle : string -- the page title
linksinfo : list of tuple -- a list of form [(URI, name),...]
The repeat()
method call in the render_template
function takes a second callback function, render_item
to control the rendering of each <li>
list item and its <a>
element:
def render_item(item, linkinfo):
URI, name = linkinfo
item.link.atts['href'] = URI
item.link.content = name
3. Compile the HTML Template
Compiling the template is simple. Just create a new Template
instance, passing it the render_template
function, HTML template string and, optionally, the name of the attribute used to define compiler directives, e.g. attribute='id'
:
template = HTMLTemplate.Template(render_template, html)
4. Render a page
To render a page, call the Template
object's render()
method, passing it any data to be forwarded to the render_template
function:
title = "Site Map"
links = [
('index.html', 'Home'),
('products/index.html', 'Products'),
('about.html', 'About')]
print template.render(title, links)
Here's the result:
<html> <head> <title>Site Map</title> </head> <body> <ul> <li> <a href="index.html">Home</a> </li> <li> <a href="products/index.html">Products</a> </li> <li> <a href="about.html">About</a> </li> </ul> </body> </html>