.. _defs_toplevel:

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

``<%def>`` and ``<%block>`` are two tags that both demarcate any block of text
and/or code.   They both exist within generated Python as a callable function, 
i.e., a Python ``def``.   They differ in their scope and calling semantics.
Whereas ``<%def>`` provides a construct that is very much like a named Python
``def``, the ``<%block>`` is more layout oriented.

Using Defs
==========

The ``<%def>`` tag requires a ``name`` attribute, where the ``name`` references
a Python function signature:

.. sourcecode:: mako

    <%def name="hello()">
        hello world
    </%def>

To invoke the ``<%def>``, it is normally called as an expression:

.. sourcecode:: mako

    the def:  ${hello()}

If the ``<%def>`` is not nested inside of another ``<%def>``,
its known as a **top level def** and can be accessed anywhere in
the template, including above where it was defined.

All defs, top level or not, have access to the current
contextual namespace in exactly the same way their containing
template does. Suppose the template below is executed with the
variables ``username`` and ``accountdata`` inside the context:

.. sourcecode:: mako

    Hello there ${username}, how are ya.  Lets see what your account says:
 
    ${account()}

    <%def name="account()">
        Account for ${username}:<br/>
 
        % for row in accountdata:
            Value: ${row}<br/>
        % endfor
    </%def>

The ``username`` and ``accountdata`` variables are present
within the main template body as well as the body of the
``account()`` def.

Since defs are just Python functions, you can define and pass
arguments to them as well:

.. sourcecode:: mako

    ${account(accountname='john')}
 
    <%def name="account(accountname, type='regular')">
        account name: ${accountname}, type ${type}
    </%def>

When you declare an argument signature for your def, they are
required to follow normal Python conventions (i.e., all
arguments are required except keyword arguments with a default
value). This is in contrast to using context-level variables,
which evaluate to ``UNDEFINED`` if you reference a name that
does not exist.

Calling defs from Other Files 
-----------------------------

Top level ``<%defs>`` are **exported** by your template's
module, and can be called from the outside; including from other
templates, as well as normal Python code. Calling a ``<%def>``
from another template is something like using an ``<%include>``
- except you are calling a specific function within the
template, not the whole template.

The remote ``<%def>`` call is also a little bit like calling
functions from other modules in Python. There is an "import"
step to pull the names from another template into your own
template; then the function or functions are available.

To import another template, use the ``<%namespace>`` tag:

.. sourcecode:: mako

    <%namespace name="mystuff" file="mystuff.html"/>

The above tag adds a local variable "mystuff" to the current
scope.

Then, just call the defs off of ``mystuff``:

.. sourcecode:: mako

    ${mystuff.somedef(x=5,y=7)}

The ``<%namespace>`` tag also supports some of the other
semantics of Python's ``import`` statement, including pulling
names into the local variable space, or using ``*`` to represent
all names, using the ``import`` attribute:

.. sourcecode:: mako

    <%namespace file="mystuff.html" import="foo, bar"/>

This is just a quick intro to the concept of a **namespace**,
which is a central Mako concept that has its own chapter in
these docs. For more detail and examples, see
:ref:`namespaces_toplevel`.

Calling defs programmatically
-----------------------------

You can call def's programmatically from any :class:`.Template` object
using the :meth:`~.Template.get_def()` method, which returns a :class:`.DefTemplate`
object. This is a :class:`.Template` subclass which the parent
:class:`.Template` creates, and is usable like any other template:

.. sourcecode:: python

    from mako.template import Template
 
    template = Template("""
        <%def name="hi(name)">
            hi ${name}!
        </%def>
 
        <%def name="bye(name)">
            bye ${name}!
        </%def>
    """)
 
    print template.get_def("hi").render(name="ed")
    print template.get_def("bye").render(name="ed")
 

Defs within Defs
----------------

The def model follows regular Python rules for closures.
Declaring ``<%def>`` inside another ``<%def>`` declares it
within the parent's **enclosing scope**:

.. sourcecode:: mako

    <%def name="mydef()">
        <%def name="subdef()">
            a sub def
        </%def>
 
        im the def, and the subcomponent is ${subdef()}
    </%def>

Just like Python, names that exist outside the inner ``<%def>``
exist inside it as well:

.. sourcecode:: mako

    <%
        x = 12
    %>
    <%def name="outer()">
        <%
            y = 15
        %>
        <%def name="inner()">
            inner, x is ${x}, y is ${y}
        </%def>

        outer, x is ${x}, y is ${y}
    </%def>

Assigning to a name inside of a def declares that name as local
to the scope of that def (again, like Python itself). This means
the following code will raise an error:

.. sourcecode:: mako

    <%
        x = 10
    %>
    <%def name="somedef()">
        ## error !
        somedef, x is ${x} 
        <%
            x = 27 
        %>
    </%def>

...because the assignment to ``x`` declares x as local to the
scope of ``somedef``, rendering the "outer" version unreachable
in the expression that tries to render it.

.. _defs_with_content:

Calling a def with embedded content and/or other defs
-----------------------------------------------------

A flip-side to def within def is a def call with content. This
is where you call a def, and at the same time declare a block of
content (or multiple blocks) that can be used by the def being
called. The main point of such a call is to create custom,
nestable tags, just like any other template language's
custom-tag creation system - where the external tag controls the
execution of the nested tags and can communicate state to them.
Only with Mako, you don't have to use any external Python
modules, you can define arbitrarily nestable tags right in your
templates.

To achieve this, the target def is invoked using the form
``<%namepacename:defname>`` instead of the normal ``${}``
syntax. This syntax, introduced in Mako 0.2.3, is functionally
equivalent another tag known as ``call``, which takes the form
``<%call expr='namespacename.defname(args)'>``. While ``%call``
is available in all versions of Mako, the newer style is
probably more familiar looking. The ``namespace`` portion of the
call is the name of the **namespace** in which the def is
defined - in the most simple cases, this can be ``local`` or
``self`` to reference the current template's namespace (the
difference between ``local`` and ``self`` is one of inheritance
- see :ref:`namespaces_builtin` for details).

When the target def is invoked, a variable ``caller`` is placed
in its context which contains another namespace containing the
body and other defs defined by the caller. The body itself is
referenced by the method ``body()``. Below, we build a ``%def``
that operates upon ``caller.body()`` to invoke the body of the
custom tag:

.. sourcecode:: mako

    <%def name="buildtable()">
        <table>
            <tr><td>
                ${caller.body()}
            </td></tr>
        </table>
    </%def>
 
    <%self:buildtable>
        I am the table body.
    </%self:buildtable>
 
This produces the output (whitespace formatted):

.. sourcecode:: html

    <table>
        <tr><td>
            I am the table body.
        </td></tr>
    </table>

Using the older ``%call`` syntax looks like:

.. sourcecode:: mako

    <%def name="buildtable()">
        <table>
            <tr><td>
                ${caller.body()}
            </td></tr>
        </table>
    </%def>

    <%call expr="buildtable()">
        I am the table body.
    </%call>

The ``body()`` can be executed multiple times or not at all.
This means you can use def-call-with-content to build iterators,
conditionals, etc:

.. sourcecode:: mako

    <%def name="lister(count)">
        % for x in range(count):
            ${caller.body()}
        % endfor
    </%def>
 
    <%self:lister count="${3}">
        hi
    </%self:lister>
 
Produces:
 
.. sourcecode:: html

    hi
    hi
    hi

Notice above we pass ``3`` as a Python expression, so that it
remains as an integer.

A custom "conditional" tag:
 
.. sourcecode:: mako

    <%def name="conditional(expression)">
        % if expression:
            ${caller.body()}
        % endif
    </%def>

    <%self:conditional expression="${4==4}">
        im the result
    </%self:conditional>

Produces:

.. sourcecode:: html

    im the result

But that's not all. The ``body()`` function also can handle
arguments, which will augment the local namespace of the body
callable. The caller must define the arguments which it expects
to receive from its target def using the ``args`` attribute,
which is a comma-separated list of argument names. Below, our
``<%def>`` calls the ``body()`` of its caller, passing in an
element of data from its argument:

.. sourcecode:: mako

    <%def name="layoutdata(somedata)">
        <table>
        % for item in somedata:
            <tr>
            % for col in item:
                <td>${caller.body(col=col)}</td>
            % endfor
            </tr>
        % endfor
        </table>
    </%def>

    <%self:layoutdata somedata="${[[1,2,3],[4,5,6],[7,8,9]]}" args="col">\
    Body data: ${col}\
    </%self:layoutdata>
 
Produces:

.. sourcecode:: html

    <table>
       <tr>
           <td>Body data: 1</td>
           <td>Body data: 2</td>
           <td>Body data: 3</td>
       </tr>
       <tr>
           <td>Body data: 4</td>
           <td>Body data: 5</td>
           <td>Body data: 6</td>
       </tr>
       <tr>
           <td>Body data: 7</td>
           <td>Body data: 8</td>
           <td>Body data: 9</td>
       </tr>
    </table>
 
You don't have to stick to calling just the ``body()`` function.
The caller can define any number of callables, allowing the
``<%call>`` tag to produce whole layouts:

.. sourcecode:: mako

    <%def name="layout()">
        ## a layout def
        <div class="mainlayout">
            <div class="header">
                ${caller.header()}
            </div>
            <div class="sidebar">
                ${caller.sidebar()}
            </div>
            <div class="content">
                ${caller.body()}
            </div>
        </div>
    </%def>

    ## calls the layout def
    <%self:layout>
        <%def name="header()">
            I am the header
        </%def>
        <%def name="sidebar()">
            <ul>
                <li>sidebar 1</li>
                <li>sidebar 2</li>
            </ul>
        </%def>
 
            this is the body
    </%self:layout>
 
The above layout would produce:

.. sourcecode:: html

    <div class="mainlayout">
       <div class="header">
       I am the header
       </div>

       <div class="sidebar">
       <ul>
           <li>sidebar 1</li>
           <li>sidebar 2</li>
       </ul>
       </div>

       <div class="content">
       this is the body
       </div>
    </div>

The number of things you can do with ``<%call>`` and/or the
``<%namespacename:defname>`` calling syntax is enormous. You can
create form widget libraries, such as an enclosing ``<FORM>``
tag and nested HTML input elements, or portable wrapping schemes
using ``<div>`` or other elements. You can create tags that
interpret rows of data, such as from a database, providing the
individual columns of each row to a ``body()`` callable which
lays out the row any way it wants. Basically anything you'd do
with a "custom tag" or tag library in some other system, Mako
provides via ``<%def>`` tags and plain Python callables which are
invoked via ``<%namespacename:defname>`` or ``<%call>``.

.. _blocks:

Using Blocks
============

The ``<%block>`` tag is new as of Mako 0.4.1, and introduces some new twists on the
``<%def>`` tag which make it more closely tailored towards layout.

An example of a block:

.. sourcecode:: mako

    <html>
        <body>
            <%block>
                this is a block.
            </%block>
        </body>
    </html>

In the above example, we define a simple block.  The block renders its content in the place
that it's defined.  Since the block is called for us, it doesn't need a name and the above
is referred to as an **anonymous block**.  So the output of the above template will be:

.. sourcecode:: html

    <html>
        <body>
                this is a block.
        </body>
    </html>

So in fact the above block has absolutely no effect.   Its usefulness comes when we start
using modifiers.  Such as, we can apply a filter to our block:

.. sourcecode:: mako

    <html>
        <body>
            <%block filter="h">
                <html>this is some escaped html.</html>
            </%block>
        </body>
    </html>

or perhaps a caching directive:

.. sourcecode:: mako

    <html>
        <body>
            <%block cached="True" cache_timeout="60">
                This content will be cached for 60 seconds.
            </%block>
        </body>
    </html>

Blocks also work in iterations, conditionals, just like defs:

.. sourcecode:: mako

    % if some_condition:
        <%block>condition is met</%block>
    % endif

While the block renders at the point it is defined in the template,
the underlying function is present in the generated Python code only
once, so there's no issue with placing a block inside of a loop or
similar. Anonymous blocks are defined as closures in the local
rendering body, so have access to local variable scope:

.. sourcecode:: mako

    % for i in range(1, 4):
        <%block>i is ${i}</%block>
    % endfor


Using Named Blocks
------------------

Possibly the more important area where blocks are useful is when we
do actually give them names. Named blocks are tailored to behave
somewhat closely to Jinja2's block tag, in that they define an area
of a layout which can be overridden by an inheriting template. In
sharp contrast to the ``<%def>`` tag, the name given to a block is
global for the entire template regardless of how deeply it's nested:

.. sourcecode:: mako

    <html>
    <%block name="header">
        <head>
            <title>
                <%block name="title">Title</%block>
            </title>
        </head>
    </%block>
    <body>
        ${next.body()}
    </body>
    </html>

The above example has two named blocks "``header``" and "``title``", both of which can be referred to 
by an inheriting template.  A detailed walkthrough of this usage can be found at :ref:`inheritance_toplevel`.

Note above that named blocks don't have any argument declaration the way defs do.   They still implement themselves
as Python functions, however, so they can be invoked additional times beyond their initial definition:

.. sourcecode:: mako

    <div name="page">
        <%block name="pagecontrol">
            <a href="">previous page</a> |
            <a href="">next page</a>
        </%block>

        <table>
            ## some content
        </table>

        ${pagecontrol()}
    </div>

The content referenced by ``pagecontrol`` above will be rendered both above and below the ``<table>`` tags.

To keep things sane, named blocks have restrictions that defs do not:

* The ``<%block>`` declaration cannot have any argument signature.
* The name of a ``<%block>`` can only be defined once in a template - an error is raised if two blocks of the same
  name occur anywhere in a single template, regardless of nesting.  A similar error is raised if a top level def 
  shares the same name as that of a block.
* A named ``<%block>`` cannot be defined within a ``<%def>``, or inside the body of a "call", i.e.
  ``<%call>`` or ``<%namespacename:defname>`` tag.   Anonymous blocks can, however.

Using page arguments in named blocks
-------------------------------------

A named block is very much like a top level def. It has a similar
restriction to these types of defs in that arguments passed to the
template via the ``<%page>`` tag aren't automatically available.
Using arguments with the ``<%page>`` tag is described in the section
:ref:`namespaces_body`, and refers to scenarios such as when the
``body()`` method of a template is called from an inherited template passing
arguments, or the template is invoked from an ``<%include>`` tag
with arguments. To allow a named block to share the same arguments
passed to the page, the ``args`` attribute can be used:

.. sourcecode:: mako

    <%page args="post"/>

    <a name="${post.title}" />

    <span class="post_prose">
        <%block name="post_prose" args="post">
            ${post.content}
        </%block>
    </span>

Where above, if the template is called via a directive like
``<%include file="post.mako" args="post=post" />``, the ``post``
variable is available both in the main body as well as the
``post_prose`` block.

Similarly, the ``**pageargs`` variable is present, in named blocks only, 
for those arguments not explicit in the ``<%page>`` tag:

.. sourcecode:: mako

    <%block name="post_prose">
        ${pageargs['post'].content}
    </%block>

The ``args`` attribute is only allowed with named blocks. With
anonymous blocks, the Python function is always rendered in the same
scope as the call itself, so anything available directly outside the
anonymous block is available inside as well.
