Template Helpers¶
The Stencil
template engine can access any functions inside its context to apply when generating content.
This recipe will show how to add an “excerpt” filter to let you show a short introduction to blog posts in your list pages.
Steps¶
1. Write helper function¶
First, we write a function in our plugins.py
to preform the needed work:
from lxml import html
from stencil import SafeStr
def excerpt(content, length):
'''
HTML-Safe trimming of content to a fixed number of blocks.
Ensures all tags are properly closed.
'''
fragments = html.fromstring(content)
return SafeStr(''.join(html.tostring(x, encoding='unicode') for x in fragments[:length]))
2. Register it on site load¶
Next, we need to register an event callback to add our function to the context when a render creates a template context:
from gilbert import Site
@Site.register_context_provider
def global_context(ctx):
ctx['excerpt'] = excerpt
return ctx
3. Use it in a template!¶
Finally, we can call the function in our templates:
<article>
<header>
<h1><a href="{{ post.url }}">{{ post.title }}</a></h1>
</header>
<p>{{ excerpt(post.content, 3) }}</p>
</article>