.. |travis| image:: https://travis-ci.org/i80and/fett.svg?branch=master
            :target: https://travis-ci.org/i80and/fett

=============
Fett |travis|
=============

Overview
--------

Example
-------

.. code-block:: python

   import fett

   fett.Template('''{{ for customer in customers }}
   {{ if i even }}
   Even: {{ customer.name }}
   {{ else }}
   Odd: {{ customer.name }}
   {{ end }}
   {{ else }}
   No customers :(
   {{ end }}''').render({'customers': [
       {'name': 'Bob'},
       {'name': 'Elvis'},
       {'name': 'Judy'}
   ]})

Syntax
------

==========================================   ===========
Tag Format                                   Description
==========================================   ===========
``{{ <expression> }}``                       Substitutions_
``{{ `foo` <expression> }}``                 Substitutions_
``{{ format <name> }}``                      Metaformatting_
``{{ if <expression> }}``                    Conditionals_
``{{ for <name> in <expression> }}``         Loops_
``{{ else }}``
``{{ end }}``                                Block termination
``{{ # <comment> }}``                        Comments_
==========================================   ===========

Spaces between tag opening/closing delimiters are optional.

Expressions
~~~~~~~~~~~

An **expression** is given for Substitutions_, Conditionals_, and Loops_.

Expressions take the following form:

    <name>[.<subfield>...] [<filter> [<filter2>...]]

Instead of specifying a field path, you can start an expression using
a string literal:

    `<literal>` [<filter> [<filter2>...]]

You can use **filters** to modify a single value in simple ways. For example,
the loop iteration counter ``i`` counts from ``0``, but users often wish to
count from ``1``. You can obtain a count-from-1 value with the expression
``i inc``.

The full list of filters:

===========  ======
Filter Name  Effect
===========  ======
car          Returns the first element of a list.
cdr          Returns all but the first element of a list.
dec          Decrements a value representable as an integer by one.
even         Returns true iff its input is representable as an even integer.
escape       Encodes `&`, `<`, `>`, `"`, and `'` characters with HTML entities.
inc          Increments a value representable as an integer by one.
len          Returns the length of a list.
not          Returns the inverse of a boolean.
odd          Returns true iff its input is representable as an odd integer.
negative     Returns true iff its input is representable as an integer < 0.
positive     Returns true iff its input is representable as an integer > 0.
split        Splits a value into a list by whitespace.
strip        Returns the input string with surrounding whitespace removed.
striptags    Remove HTML tags from a value.
timesNegOne  Returns int(input) * -1
zero         Returns true iff the input is zero
===========  ======

===========  ======
Filter Name  Effect
===========  ======
upperCase    Returns a Unicode-aware uppercase version of the input.
lowerCase    Returns a Unicode-aware lowercase version of the input.
===========  ======

=====================  ======
Filter Name            Effect
=====================  ======
add(n)                 Increments a value representable as an integer by `n`.
minus(n)               Decrements a value representable as an integer by `n`.
equal(value)           Returns true iff a value equals the given value.
lessThan(n)            Returns true iff n < the given value.
lessThanOrEqual(n)     Returns true iff n <= the given value.
greaterThan(n)         Returns true iff n > the given value.
greaterThanOrEqual(n)  Returns true iff n >= the given value.
=====================  ======

Substitutions
~~~~~~~~~~~~~

Metaformatting
~~~~~~~~~~~~~~

Conditionals
~~~~~~~~~~~~

Loops
~~~~~

Comments
~~~~~~~~
