|  | .. _syntax_toplevel: | 
|  |  | 
|  | ====== | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | ${"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 :ref:`filtering_toplevel`. | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | % 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. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | % 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 | 
|  |  | 
|  | The ``%`` sign can also be "escaped", if you actually want to | 
|  | emit a percent sign as the first non whitespace character on a | 
|  | line, by escaping it as in ``%%``: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | %% some text | 
|  |  | 
|  | %% some more text | 
|  |  | 
|  | Comments | 
|  | ======== | 
|  |  | 
|  | Comments come in two varieties. The single line comment uses | 
|  | ``##`` as the first non-space characters on a line: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | ## this is a comment. | 
|  | ...text ... | 
|  |  | 
|  | A multiline version exists using ``<%doc>  ...text... </%doc>``: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%doc> | 
|  | these are comments | 
|  | more comments | 
|  | </%doc> | 
|  |  | 
|  | Newline Filters | 
|  | ================ | 
|  |  | 
|  | The backslash ("``\``") character, placed at the end of any | 
|  | line, will consume the newline character before continuing to | 
|  | the next line: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%! | 
|  | 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 a single contiguous block above all render callables, | 
|  | in the order in which they appear in the source template. | 
|  |  | 
|  | 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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%page args="x, y, z='default'"/> | 
|  |  | 
|  | Or a page tag that defines caching characteristics: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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 :ref:`namespaces_body` as well as :ref:`caching_toplevel`. | 
|  |  | 
|  | <%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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%include file="header.html"/> | 
|  |  | 
|  | hello world | 
|  |  | 
|  | <%include file="footer.html"/> | 
|  |  | 
|  | Include also accepts arguments which are available as ``<%page>`` arguments in the receiving template: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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 :ref:`defs_toplevel`. | 
|  |  | 
|  | <%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. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%namespace file="functions.html" import="*"/> | 
|  |  | 
|  | The underlying object generated by %namespace, an instance of | 
|  | :class:`.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 :ref:`namespaces_toplevel`. | 
|  |  | 
|  | <%inherit> | 
|  | ---------- | 
|  |  | 
|  | Inherit allows templates to arrange themselves in **inheritance | 
|  | chains**. This is a concept familiar in many other template | 
|  | languages. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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 :ref:`inheritance_toplevel`. | 
|  |  | 
|  | <%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. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%mynamespace:somedef param="some value"> | 
|  | this is the body | 
|  | </%mynamespace:somedef> | 
|  |  | 
|  | To create custom tags which accept a body, see | 
|  | :ref:`defs_with_content`. | 
|  |  | 
|  | <%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_with_content`. | 
|  |  | 
|  | <%doc> | 
|  | ------ | 
|  |  | 
|  | The doc tag handles multiline comments: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <%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: | 
|  |  | 
|  | .. sourcecode:: 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. | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | % if not len(records): | 
|  | No records found. | 
|  | <% return %> | 
|  | % endif | 
|  |  | 
|  | Or perhaps: | 
|  |  | 
|  | .. sourcecode:: mako | 
|  |  | 
|  | <% | 
|  | if not len(records): | 
|  | return | 
|  | %> | 
|  |  |