Шаблонизатор Nannou

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: описывая шаблон простым списком паттернов, мы получаем возможность шаблонизировать объекты произвольной сложности. Единственным требованием является наличие паттерна для описания того или иного фрагмента.

Использование

.

Тонкие моменты

.

Интерфейс

nannou.compile(template, rtl={}, debug=False)
Конструктор шаблонизатора

Указатели