Home » Projekte » Webber » Plugins » template_mako.py

Mako templates

This plugin uses the Mako template library to render the actual pages during the "pagetemplate" hook.

Configuration 

template 

Name of the template file. Must be specified in "webber.conf", but can be overridden, see "Configuration inheritance" and "Page format".

template: "default"

Note that you don't need to add the ".tmpl" file suffix.

style_dir 

Directory where templates (and often CSS files) reside. Defaults to "in/style".

input_encoding and output_encoding 

Name of the encoding for the input files (page files, templates etc) and the output files (rendered HTML pages). Must be specified in "webber.conf".

input_encoding: "iso-8859-1"
output_encoding: "iso-8859-1"

Template files 

The "*.tmpl" files in the specified style directory can now utilize the fill power of Mako. Here's an example of a rather minimal template:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>${file.title | entity}</title>
<meta http-equiv="Content-Type" content="text/html; charset=${file.output_encoding}"/>
% if len(keywords):
        <meta name="keywords" content="${keywords | entity}" />
% endif
% if len(description):
        <meta name="description" content="${description | entity}" />
% endif
</head>
<body>
<h1>${file.title | entity}</h1>
${body}
</body>
</html>

Example of template inheritance 

However, be replacing "${body}" with a named make container, we can use inheritance to modify the page body on a per-file basis. Add this at the top of the file:

<�f name="contents()">\
${body}
</�f>\
#######################################################################

and replace "${body}" with:

${self.contents()}

Now you can create a new template file, e.g. "history.tmpl" that inherits from "default.tmpl" and adds a list of recently changed files:

<%inherit file="default.tmpl"/>
#######################################################################
<�f name="contents()">\
${body}
<%
  recently = get_recently()
%>
% if len(recently)>1:
<h2>What's new?</h2>
%   for page, link in recently:
%     if page.mtime > page.ctime:
        Modified ${format_date(page.mtime)}\
%     else:
        Created ${format_date(page.ctime)}\
%     endif
: <a href="${link}">${page.title | entity}</a><br />
%   endfor
% endif
</�f>\

Page attributes 

As you migt have seen in the above example, you have access to various objects and their members ("${page.title}"), variables ("${body}") and functions ("$format_date()").

${file} 

This is the file object. TODO

${body} 

This is the page body, as rendered by the hooks "htmlize" and "linkify".

${rootpath} 

This is the path from the current file to the top-level directory. You can use this for relative links inside your document.

Example: conside that the current rendered page is test/foo/bar.html. Then "${rootpath}" is "../../". So you can access your main index.html file by "${rootpath}index.html".

${description} 

That's the "description:" text from your page. You can use this in meta tags in your HTML header.

${keywords} 

That's the "keywords:" text from your page. You can use this in meta tags in your HTML header.

Functions marked with @set_function() 

Any function marked with "@set_function("name")" can be used in the template. Whatever text the function returns is put into the final page.

All functions are documented on the "Functions" page.