bloat code with even more layers of indirection, split off the filesystem-based stuff into a separate lib.filesystem package (next, move it to sites/www.qmsk.net)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<%def name="render_menu(open_page, page, items, ancestry)">
<ul>
% for pi in items :
<li>
<a href="${site_page_url}/${pi.url}"${' class="selected-page"' if pi == open_page else ''}>${pi.title} ${'»' if pi.children and pi.parent else ''}</a>
% if pi in ancestry and pi.children and pi.parent :
${render_menu(page, pi, pi.children, ancestry)}
% endif
</li>
% endfor
</ul>
</%def>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>qmsk.net ${' :: ' + h.breadcrumb(menu.ancestry, links=False) if menu.ancestry else ''}</title>
<link rel="Stylesheet" type="text/css" href="${site_root_url}/static/style.css" />
</head>
<body>
<div id="header">
<a href="${site_page_url}/">QMSK.NET</a>
</div>
<div id="container">
<div id="nav">
${render_menu(menu.page, menu.page, menu.items, menu.ancestry)}
</div>
<div id="content">
<div id="breadcrumb">
<!-- ${h.breadcrumb(menu.ancestry)} -->
</div>
${page.content}
</div>
</div>
<div id="footer">
<div id="footer-right">
Page Modified ${page.modified} <br/>
Current time ${h.now()}
</div>
<div id="footer-left">
© ${h.copyright_year()} Tero Marttila
</div>
<div id="footer-center">
Validated <a href="http://validator.w3.org/check?uri=www.qmsk.net">XHTML 1.0 Strict</a> & <a href="http://jigsaw.w3.org/css-validator/validator?uri=www.qmsk.net">CSS 2.1</a>
</div>
</div>
</body>
</html>