Syntax {@name=syntax}
==============================

A Mako template is parsed from a text stream containing any kind of content, XML, HTML, email text, etc.  The template can further contain Mako-specific directives which represent variable and/or expression substitutions, control structures (i.e. conditionals and loops), server-side comments, full blocks of Python code, as well as various tags that offer additional functionality.  All of these constructs compile into real Python code.  This means that you can leverage the full power of Python in almost every aspect of a Mako template.

### Expression Substitution

The simplest expression is just a variable substitution.  The syntax for this is the `${}` construct, which is inspired by Perl, Genshi, JSP EL, and others:

    this is x: ${x}

Above, the string representation of `x` is applied to the template's output stream.  If you're wondering where `x` comes from, its usually from the `Context` supplied to the template's rendering function.  If `x` was not supplied to the template and was not otherwise assigned locally, it evaluates to a special value `UNDEFINED`.  More on that later.
    
The contents within the `${}` tag are evaluated by Python directly, so full expressions are OK:

    pythagorean theorem:  ${pow(x,2) + pow(y,2)}
    
The results of the expression are evaluated into a string result in all cases before being rendered to the output stream, such as the above example where the expression produces a numeric result.

#### Expression Escaping

Mako includes a number of built-in escaping mechanisms, including HTML, URI and XML escaping, as well as a "trim" function.  These escapes can be added to an expression substituion using the `|` operator:

    ${"this is some text" | u}

The above expression applies URL escaping to the expression, and produces `this+is+some+text`.  The `u` name indicates URL escaping, whereas `h` represents HTML escaping, `x` represents XML escaping, and `trim` applies a trim function.

Read more about built in filtering functions, including how to make your own filter functions, in [filtering](rel:filtering).

### Control Structures

A control structure refers to all those things that control the flow of a program - conditionals (i.e. if/else), loops (like while and for), as well as things like `try/except`.  In Mako, control structures are written using the `%` marker followed by a regular Python control expression, and are "closed" by using another `%` marker with the tag "`end<name>`", where "`<name>`" is the keyword of the expression:

    % if x==5:
        this is some output
    % endif
    
The `%` can appear anywhere on the line as long as no text precedes it; indentation is not signficant.  The full range of Python "colon" expressions are allowed here, including `if/elif/else`, `while`, `for`, and even `def`, although Mako has a built-in tag for defs which is more full-featured.

    % for a in ['one', 'two', 'three', 'four', 'five']:
        % if a[0] == 't':
         its two or three
        % elif a[0] == 'f':
        four/five
        % else:
        one
        %endif
    % endfor
    
### Comments

Comments come in two varieties.  The single line comment uses `##` as the first non-space characters on a line:

    ## this is a comment.
    ...text ...

A multiline version exists using `<%doc>  ...text... </%doc>`:

    <%doc>
        these are comments
        more comments
    </%doc>

Note that this is **new behavior as of Mako 0.1.3**.  The syntax prior to this version was the single pound sign (`#`), which was agreed by the Mako userbase that it conflicted with CSS elements too often and also did not address multiline comments easily.

### Newline Filters

The backslash ("`\`") character, placed at the end of any line, will consume the newline character before continuing to the next line:

    here is a line that goes onto \
    another line.
    
The above text evaluates to:

    here is a line that goes onto another line.
    
### Python Blocks

Any arbitrary block of python can be dropped in using the `<% %>` tags:

    this is a template
    <%
        x = db.get_resource('foo')
        y = [z.element for z in x if x.frobnizzle==5]
    %>
    % for elem in y:
        element: ${elem}
    % endfor
    
Within `<% %>`, you're writing a regular block of Python code.  While the code can appear with an arbitrary level of preceding whitespace,  it has to be consistently formatted with itself.  Mako's compiler will adjust the block of Python to be consistent with the surrounding generated Python code.

#### Module-level Blocks

A variant on `<% %>` is the module-level code block, denoted by `<%! %>`.  Code within these tags is executed at the module level of the template, and not within the rendering function of the template.  Therefore, this code does not have access to the template's context and is only executed when the template is loaded into memory (which can be only once per application, or more, depending on the runtime environment).  Use the `<%! %>` tags to declare your template's imports, as well as any pure-Python functions you might want to declare:

    <%!
        import mylib
        import re
        
        def filter(text):
            return re.sub(r'^@', '', text)
    %>
    
Any number of `<%! %>` blocks can be declared anywhere in a template; they will be rendered in the resulting module in the order that they appear.

### Tags

The rest of what Mako offers takes place in the form of tags.  All tags use the same syntax, which is similar to an XML tag except that the first character of the tag name is a `%` character.  The tag is closed either by a contained slash character, or an explicit closing tag:

    <%include file="foo.txt"/>
    
    <%def name="foo" buffered="True">
        this is a def
    </%def>
    
All tags have a set of attributes which are defined for each tag.  Some of these attributes are required.  Also, many attributes support **evaluation**, meaning you can embed an expression (using `${}`) inside the attribute text:

    <%include file="/foo/bar/${myfile}.txt"/>
    
Whether or not an attribute accepts runtime evaluation depends on the type of tag and how that tag is compiled into the template.  The best way to find out if you can stick an expression in is to try it !  The lexer will tell you if its not valid.

Heres a quick summary of all the tags:

#### <%page>

This tag defines general characteristics of the template, including caching arguments, and optional lists of arguments which the template expects when invoked.

    <%page args="x, y, z='default'"/>
    
Or a page tag that defines caching characteristics:
    
    <%page cached="True" cache_type="memory"/>

Currently, only one `<%page>` tag gets used per template, the rest get ignored.  While this will be improved in a future release, for now make sure you have only one `<%page>` tag defined in your template, else you may not get the results you want.  The details of what `<%page>` is used for are described further in [namespaces_body](rel:namespaces_body) as well as [caching](rel:caching).
    
#### <%include>

A tag that is familiar from other template languages, %include is a regular joe that just accepts a file argument and calls in the rendered result of that file:

    <%include file="header.html"/>
    
        hello world
        
    <%include file="footer.html"/>

Include also accepts arguments which are available as `<%page>` arguments in the receiving template:

    <%include file="toolbar.html" args="current_section='members', username='ed'"/>

#### <%def>

The `%def` tag defines a Python function which contains a set of content, that can be called at some other point in the template.  The basic idea is simple:

    <%def name="myfunc(x)">
        this is myfunc, x is ${x}
    </%def>
    
    ${myfunc(7)}
    
The %def tag is a lot more powerful than a plain Python def, as the Mako compiler provides many extra services with %def that you wouldn't normally have, such as the ability to export defs as template "methods", automatic propagation of the current `Context`, buffering/filtering/caching flags, and def calls with content, which enable packages of defs to be sent as arguments to other def calls (not as hard as it sounds).  Get the full deal on what %def can do in [defs](rel:defs).

#### <%namespace>

%namespace is Mako's equivalent of Python's `import` statement.  It allows access to all the rendering functions and metadata of other template files, plain Python modules, as well as locally defined "packages" of functions.

    <%namespace file="functions.html" import="*"/>

The underlying object generated by %namespace, an instance of `mako.runtime.Namespace`, is a central construct used in templates to reference template-specific information such as the current URI, inheritance structures, and other things that are not as hard as they sound right here.  Namespaces are described in [namespaces](rel:namespaces).

#### <%inherit>

Inherit allows templates to arrange themselves in **inheritance chains**.  This is a concept familiar in many other template languages.

    <%inherit file="base.html"/>

When using the %inherit tag, control is passed to the topmost inherited template first, which then decides how to handle calling areas of content from its inheriting templates.  Mako offers a lot of flexbility in this area, including dynamic inheritance, content wrapping, and polymorphic method calls.  Check it out in [inheritance](rel:inheritance).

#### <%namespacename:defname>

As of Mako 0.2.3, any user-defined "tag" can be created against a namespace by using a tag with a name of the form *namespacename*:*defname*.  The closed and open formats of such a tag are equivalent to an inline expression and the `<%call>` tag, respectively.

    <%mynamespace:somedef param="some value">
        this is the body
    </%mynamespace:somedef>

To create custom tags which accept a body, see [defs_defswithcontent](rel:defs_defswithcontent).

#### <%call>

The call tag is the "classic" form of a user-defined tag, and is roughly equiavlent to the `<%namespacename:defname>` syntax described above.  This tag is also described in [defs_defswithcontent](rel:defs_defswithcontent).

#### <%doc>

The doc tag handles multiline comments:

    <%doc>
        these are comments
        more comments
    </%doc>

Also the `##` symbol as the first non-space characters on a line can be used for single line comments.

#### <%text>

This tag suspends the Mako lexer's normal parsing of Mako template directives, and returns its entire body contents as plain text.  It is used pretty much to write documentation about Mako:

    <%text filter="h">
        heres some fake mako ${syntax}
        <%def name="x()">${x}</%def>
    %CLOSETEXT

### Returning early from a template

Sometimes you want to stop processing a template or `<%def>` method in the middle and just use the text you've accumulated so far.  You can use a ``return`` statement inside a Python block to do that.

    % if not len(records):
        No records found.
        <% return %>
    % endif

Or perhaps:

    <%
        if not len(records):
            return
    %>
