Update runtime documentation to include LoopContext and reserved names.
diff --git a/doc/build/runtime.rst b/doc/build/runtime.rst
index 25cdd59..fd5a7ce 100644
--- a/doc/build/runtime.rst
+++ b/doc/build/runtime.rst
@@ -15,8 +15,8 @@
The :class:`.Context` is the central object that is created when
a template is first executed, and is responsible for handling
all communication with the outside world. Within the template
-environment, it is available via the name ``context``. The :class:`.Context`
-includes two
+environment, it is available via the :ref:`reserved name <reserved-names>`
+``context``. The :class:`.Context` includes two
major components, one of which is the output buffer, which is a
file-like object such as Python's ``StringIO`` or similar, and
the other a dictionary of variables that can be freely
@@ -159,7 +159,7 @@
Context Methods and Accessors
------------------------------
-Significant members off of :class:`.Context` include:
+Significant members of :class:`.Context` include:
* ``context[key]`` / ``context.get(key, default=None)`` -
dictionary-like accessors for the context. Normally, any
@@ -188,6 +188,149 @@
:class:`.TemplateLookup` of the originally-called :class:`.Template` gets
used in a particular execution).
+.. loop-context
+
+Loop Context
+============
+
+Within ``% for`` blocks, the :ref:`reserved name<reserved-names>` ``loop``
+is available. A new feature of Mako 0.7.0, ``loop`` tracks the progress of
+the ``for`` loop and makes it easy to use the iteration state to control
+template behavior.
+
+Iterations
+----------
+
+Regardless of the type of iterable you're looping over, ``loop`` always tracks
+the 0-indexed iteration count (available at ``loop.index``), its parity
+(through the ``loop.even`` and ``loop.odd`` bools), and ``loop.first``, a bool
+indicating whether the loop is on its first iteration. If your iterable
+provides a ``__len__`` method, ``loop`` also provides access to
+a count of iterations remaining at ``loop.reverse_index`` and ``loop.last``,
+a bool indicating whether the loop is on its last iteration; accessing these
+without ``__len__`` will raise a ``TypeError``.
+
+Cycling
+-------
+
+Cycling is available regardless of whether the iterable you're using provides
+a ``__len__`` method. Prior to Mako 0.7.0, you might have generated a simple
+zebra striped list with either::
+
+.. sourcecode:: mako
+
+ <ul>
+ % for i, item in enumerate(('spam', 'ham', 'eggs')):
+ <li class="${'odd' if i%2 else 'even'}">${item}</li>
+ % endfor
+ </ul>
+
+or::
+
+.. sourcecode:: mako
+
+ <%! from itertools import cycle %>
+ <% parity = cycle(('even', 'odd')) %>
+ <ul>
+ % for item in ('spam', 'ham', 'eggs'):
+ <li class="${next(parity)}">${item}</li>
+ % endfor
+ </ul>
+
+both of which give you::
+
+.. sourcecode:: html
+
+ <ul>
+ <li class="even">spam</li>
+ <li class="odd">ham</li>
+ <li class="even">eggs</li>
+ </ul>
+
+With ``loop``, you get the same results with cleaner code and less prep work.::
+
+.. sourcecode:: mako
+
+ <ul>
+ % for item in ('spam', 'ham', 'eggs'):
+ <li class="${loop.cycle('even', 'odd')}">${item}</li>
+ % endfor
+ </ul>
+
+Parent loops
+------------
+
+Loop contexts can also be transparently nested, and the Mako runtime will do
+the right thing and manage the scope for you. You can access the parent loop
+context through ``loop.parent``.
+
+This
+also allows you to easily reach all the way back up through the loop stack by
+chaining ``parent`` attribute accesses, i.e. ``loop.parent.parent....`` as
+long as the stack depth isn't exceeded. For example, you can use the parent
+loop to make a checkered table::
+
+.. sourcecode:: mako
+
+ <table>
+ % for consonant in 'pbj':
+ <tr>
+ % for vowel in 'iou':
+ <td class="${'black' if (loop.parent.even == loop.even) else 'red'}">
+ ${consonant + vowel}t
+ </td>
+ % endfor
+ </tr>
+ % endfor
+ </table>
+
+.. sourcecode:: html
+
+ <table>
+ <tr>
+ <td class="black">
+ pit
+ </td>
+ <td class="red">
+ pot
+ </td>
+ <td class="black">
+ put
+ </td>
+ </tr>
+ <tr>
+ <td class="red">
+ bit
+ </td>
+ <td class="black">
+ bot
+ </td>
+ <td class="red">
+ but
+ </td>
+ </tr>
+ <tr>
+ <td class="black">
+ jit
+ </td>
+ <td class="red">
+ jot
+ </td>
+ <td class="black">
+ jut
+ </td>
+ </tr>
+ </table>
+
+.. reserved-names
+
+Reserved names
+==============
+
+As of Mako 0.7.0, there are two reserved identifiers within the Mako runtime:
+* :ref:`context <context>`
+* :ref:`loop <loop-context>`
+
All the built-in names
======================
@@ -213,6 +356,8 @@
* ``caller`` - a "mini" namespace created when using the
``<%call>`` tag to define a "def call with content"; described
in :ref:`defs_with_content`.
+* ``loop`` - this provides access to :class:`.LoopContext`\ s when
+ they are requested within ``% for`` loops, introduced at :ref:`loop`.
* ``capture`` - a function that calls a given def and captures
its resulting content into a string, which is returned. Usage
is described in :ref:`filtering_toplevel`.
@@ -238,6 +383,10 @@
:show-inheritance:
:members:
+.. autoclass:: mako.runtime.LoopContext
+ :show-inheritance:
+ :members:
+
.. autoclass:: mako.runtime.Undefined
:show-inheritance: