Nannou — движок шаблонизации, основанный на концепции сопоставления с образцом. Он позволяет производить шаблонизацию комплексных объектов произвольной степени вложенности, не заботясь об их внутренней иерархии.
Допустим нам нужно генерировать HTML для небольшого блога, с простеньким каскадным меню, и блоками с блог-постами разного вида: картинками, текстами, цитатами. Шаблон (пусть он находится в файле blog.html) в этом случае будет выглядеть примерно так:
<!--/ link title children -->
<li><?a href="<%link%>"><%title%></a>||<span><%title%></span?></li>
<?ul>
<%children%>
</ul?>
<!--/ text meta -->
<div class="post">
<%meta%>
<%text%>
</div>
<!--/ picture meta -->
<div class="image">
<img src="<%picture%>">
<%meta%>
</div>
<!--/ cite meta -->
<div class="cite">
<blockquote>
<%cite%>
</blockquote>
<%meta%>
</div>
<!--/ author published -->
<p class="meta"><%published%> by <%author%></p>
Компилируя шаблон
>>> from nannou import nannou
>>> me = nannou(open('blog.html').read())
получаем функцию me. Теперь мы можем подавать ей на вход объекты, получая на выходе сгенерированный html:
>>> me({'cite':'All we need is love', 'meta':{'author':'John Lennon', 'published': '25 June 1967'}})
<div class="cite">
<blockquote>
All we need is love
</blockquote>
<p class="meta">25 June 1967 by John Lennon</p>
</div>
>>> me([{
... 'picture': 'cat.jpeg',
... 'meta':{
... 'author': 'Me',
... 'published': '2 Jan 2011'
... }
... }, {
... 'text': 'The quick bluetooth mouse jump over lazy box',
... 'meta':{
... 'author': 'Not me',
... 'published': '1 Jan 2011'
... }
... }])
<div class="image">
<img src="cat.jpeg">
<p class="meta">2 Jan 2011 by Me</p>
</div>
<div class="post">
<p class="meta">1 Jan 2011 by Not me</p>
The quick bluetooth mouse jump over lazy box
</div>
Древовидные структуры генерируются также легко:
>>> print me({
... 'link': '',
... 'title': 'Энциклопедии',
... 'children': [
... {
... 'link': 'http://www.britannica.com',
... 'title': 'Британика',
... 'children': []
... },
... {
... 'link': 'http://en.wikipedia.org',
... 'title': 'Английская википедия',
... 'children': []
... }
... ]
... })
<li><span>Энциклопедии</span></li>
<ul>
<li><a href="http://www.britannica.com">Британика</a></li>
<li><a href="http://en.wikipedia.org">Английская википедия</a></li>
</ul>
Этот пример, хорошо или плохо, но иллюстрирует основное приемущество nannou: описывая шаблон простым списком паттернов, мы получаем возможность шаблонизировать объекты произвольной сложности. Единственным требованием является наличие паттерна для описания того или иного фрагмента.
.
.