.. _filtering_toplevel:

=======================
Filtering and Buffering
=======================

Expression Filtering
=====================

As described in the chapter :ref:`syntax_toplevel`, the "``|``" operator can be
applied to a "``${}``" expression to apply escape filters to the
output:

.. sourcecode:: mako

    ${"this is some text" | u}

The above expression applies URL escaping to the expression, and
produces ``this+is+some+text``.

The built-in escape flags are:

* ``u`` : URL escaping, provided by
  ``urllib.quote_plus(string.encode('utf-8'))``
* ``h`` : HTML escaping, provided by
  ``markupsafe.escape(string)`` (new as of 0.3.4 - prior
  versions use ``cgi.escape(string, True)``)
* ``x`` : XML escaping
* ``trim`` : whitespace trimming, provided by ``string.strip()``
* ``entity`` : produces HTML entity references for applicable
  strings, derived from ``htmlentitydefs``
* ``unicode`` (``str`` on Python 3): produces a Python unicode
  string (this function is applied by default).
* ``decode.<some encoding>`` : decode input into a Python
  unicode with the specified encoding
* ``n`` : disable all default filtering; only filters specified
  in the local expression tag will be applied.

To apply more than one filter, separate them by a comma:

.. sourcecode:: mako

    ${" <tag>some value</tag> " | h,trim}

The above produces ``&lt;tag&gt;some value&lt;/tag&gt;``, with
no leading or trailing whitespace. The HTML escaping function is
applied first, the "trim" function second.

Naturally, you can make your own filters too. A filter is just a
Python function that accepts a single string argument, and
returns the filtered result. The expressions after the ``|``
operator draw upon the local namespace of the template in which
they appear, meaning you can define escaping functions locally:
 
.. sourcecode:: mako

    <%!
        def myescape(text):
            return "<TAG>" + text + "</TAG>"
    %>
 
    Heres some tagged text: ${"text" | myescape}
 
Or from any Python module:

.. sourcecode:: mako

    <%!
        import myfilters
    %>
 
    Heres some tagged text: ${"text" | myfilters.tagfilter}
 
A page can apply a default set of filters to all expression tags
using the ``expression_filter`` argument to the ``%page`` tag:

.. sourcecode:: mako

    <%page expression_filter="h"/>
 
    Escaped text:  ${"<html>some html</html>"}
 
Result:

.. sourcecode:: html

    Escaped text: &lt;html&gt;some html&lt;/html&gt;

.. _filtering_default_filters:

The default_filters Argument 
----------------------------

In addition to the ``expression_filter`` argument, the
``default_filters`` argument to both ``Template`` and
``TemplateLookup`` can specify filtering for all expression tags
at the programmatic level. This array-based argument, when given
its default argument of ``None``, will be internally set to
``["unicode"]`` (or ``["str"]`` on Python 3), except when
``disable_unicode=True`` is set in which case it defaults to
``["str"]``:

.. sourcecode:: python

    t = TemplateLookup(directories=['/tmp'], default_filters=['unicode'])

To replace the usual ``unicode``/``str`` function with a
specific encoding, the ``decode`` filter can be substituted:

.. sourcecode:: python

    t = TemplateLookup(directories=['/tmp'], default_filters=['decode.utf8'])

To disable ``default_filters`` entirely, set it to an empty
list:

.. sourcecode:: python

    t = TemplateLookup(directories=['/tmp'], default_filters=[])
 
Any string name can be added to ``default_filters`` where it
will be added to all expressions as a filter. The filters are
applied from left to right, meaning the leftmost filter is
applied first.

.. sourcecode:: python

    t = Template(templatetext, default_filters=['unicode', 'myfilter'])
 
To ease the usage of ``default_filters`` with custom filters,
you can also add imports (or other code) to all templates using
the ``imports`` argument:

.. sourcecode:: python

    t = TemplateLookup(directories=['/tmp'], 
        default_filters=['unicode', 'myfilter'], 
        imports=['from mypackage import myfilter'])
 
The above will generate templates something like this:

.. sourcecode:: python

    # ....
    from mypackage import myfilter

    def render_body(context):
        context.write(myfilter(unicode("some text")))

Turning off Filtering with the "n" filter
------------------------------------------

In all cases the special ``n`` filter, used locally within an
expression, will **disable** all filters declared in the
``<%page>`` tag as well ``default_filters``. Such as:

.. sourcecode:: mako

    ${'myexpression' | n}

Will render ``myexpression`` with no filtering of any kind, and

.. sourcecode:: mako

    ${'myexpression' | n, trim}
 
will render ``myexpression`` using the ``trim`` filter only. 

Filtering Defs and Blocks
==========================

The ``%def`` and ``%block`` tags have an argument called ``filter`` which will apply the
given list of filter functions to the output of the ``%def``:

.. sourcecode:: mako

    <%def name="foo()" filter="h, trim">
        <b>this is bold</b>
    </%def>
 
When the filter attribute is applied to a def as above, the def
is automatically **buffered** as well. This is described next.

Buffering
==========

One of Mako's central design goals is speed. To this end, all of
the textual content within a template and its various callables
is by default piped directly to the single buffer that is stored
within the ``Context`` object. While this normally is easy to
miss, it has certain side effects. The main one is that when you
call a def using the normal expression syntax, i.e.
``${somedef()}``, it may appear that the return value of the
function is the content it produced, which is then delivered to
your template just like any other expression substitution,
except that normally, this is not the case; the return value of
``${somedef()}`` is simply the empty string ``''``. By the time
you receive this empty string, the output of ``somedef()`` has
been sent to the underlying buffer.

You may not want this effect, if for example you are doing
something like this:

.. sourcecode:: mako

    ${" results " + somedef() + " more results "}
 
If the ``somedef()`` function produced the content "``somedef's
results``", the above template would produce this output:

.. sourcecode:: html

    somedef's results results more results
 
This is because ``somedef()`` fully executes before the
expression returns the results of its concatenation; the
concatenation in turn receives just the empty string as its
middle expression.

Mako provides two ways to work around this. One is by applying
buffering to the ``%def`` itself:

.. sourcecode:: mako

    <%def name="somedef()" buffered="True">
        somedef's results
    </%def>
 
The above definition will generate code similar to this:

.. sourcecode:: python

    def somedef():
        context.push_buffer()
        try:
            context.write("somedef's results")
        finally:
            buf = context.pop_buffer()
        return buf.getvalue()
 
So that the content of ``somedef()`` is sent to a second buffer,
which is then popped off the stack and its value returned. The
speed hit inherent in buffering the output of a def is also
apparent.

Note that the ``filter`` argument on %def also causes the def to
be buffered. This is so that the final content of the %def can
be delivered to the escaping function in one batch, which
reduces method calls and also produces more deterministic
behavior for the filtering function itself, which can possibly
be useful for a filtering function that wishes to apply a
transformation to the text as a whole.

The other way to buffer the output of a def or any Mako callable
is by using the built-in ``capture`` function. This function
performs an operation similar to the above buffering operation
except it is specified by the caller.

.. sourcecode:: mako

    ${" results " + capture(somedef) + " more results "}
 
Note that the first argument to the ``capture`` function is
**the function itself**, not the result of calling it. This is
because the ``capture`` function takes over the job of actually
calling the target function, after setting up a buffered
environment. To send arguments to the function, just send them
to ``capture`` instead:

.. sourcecode:: mako

    ${capture(somedef, 17, 'hi', use_paging=True)}
 
The above call is equivalent to the unbuffered call:

.. sourcecode:: mako

    ${somedef(17, 'hi', use_paging=True)}
 
Decorating
===========

This is a feature that's new as of version 0.2.5. Somewhat like
a filter for a %def but more flexible, the ``decorator``
argument to ``%def`` allows the creation of a function that will
work in a similar manner to a Python decorator. The function can
control whether or not the function executes. The original
intent of this function is to allow the creation of custom cache
logic, but there may be other uses as well.

``decorator`` is intended to be used with a regular Python
function, such as one defined in a library module. Here we'll
illustrate the python function defined in the template for
simplicities' sake:

.. sourcecode:: mako

    <%!
        def bar(fn):
            def decorate(context, *args, **kw):
                context.write("BAR")
                fn(*args, **kw)
                context.write("BAR")
                return ''
            return decorate
    %>
 
    <%def name="foo()" decorator="bar">
        this is foo
    </%def>
 
    ${foo()}
 
The above template will return, with more whitespace than this,
``"BAR this is foo BAR"``. The function is the render callable
itself (or possibly a wrapper around it), and by default will
write to the context. To capture its output, use the ``capture``
callable in the ``mako.runtime`` module (available in templates
as just ``runtime``):

.. sourcecode:: mako

    <%!
        def bar(fn):
            def decorate(context, *args, **kw):
                return "BAR" + runtime.capture(context, fn, *args, **kw) + "BAR"
            return decorate
    %>

    <%def name="foo()" decorator="bar">
        this is foo
    </%def>

    ${foo()}

The decorator can be used with top-level defs as well as nested
defs, and blocks too. Note that when calling a top-level def from the
``Template`` api, i.e. ``template.get_def('somedef').render()``,
the decorator has to write the output to the ``context``, i.e.
as in the first example. The return value gets discarded.
