{% blocktrans %} no longer uses identifiers

Previously {% blocktrans %} blocks required an identifier which would be
passed as an atom to the blocktrans_fun function passed in at
compile-time. This behavior was inconsistent with Django. Now identifiers
are no longer used, and the blocktrans_fun function simply receives the
block to be translated as a string.

For convenience, compiled modules now have a translated_blocks/0
function which returns a list of blocks that were translated at
compile-time. A new helper module called blocktrans_extractor is
provided for extracting blocktrans blocks prior to compilation.

The implementation may result in some oddities; the translatable blocks
are actually derived from the abstract syntax tree, so there may
be whitespace or small syntactic differences between the blocks in
the source code and the blocks used at translation-time. However,
the blocktrans_extractor module will return blocks that are exactly
compatible with the translatable blocks. One side-benefit of this
appproach is that non-semantic whitespace will always be ignored;
if two {% blocktrans %} blocks have slight syntactic differences
but are semantically the same, you only need to provide a single
translation to cover the two of them.
Support for {% ifchanged %} tag

The implementation is a bit messy as it uses the process dictionary to
check for previous values in a loop. But I could not think of a clean
functional way to support this tag without rewriting the entire
compiler.
Support for {% regroup %} tag.
New compile-time option: custom_filters_modules
Support {% ifchanged Expression(s) %} like Django does

Django ifchanged can accept parameters, so it is possible to check for a value
which does not appear in output. Django documentation says to support one or
more parameters, this implementation supports up to 4 paramters (only limited
by the parser expression, this can be improved to support even more
parameters when needed).

{% for date in list %}
  {% ifchanged date.month %}
     {{ date.month }}:{{ date.day }}
  {% else %}
     {{ date.day }}
  {% endifchanged %}
{% endfor %}

See erlydtl_unittests for some other examples.

The other (Django) syntax to use {% ifchanged %} without parameter works like before.
Merge pull request #24 from thge/master

Extended {%ifchanged %} syntax to accept parameters
Use lists module for erlydtl_runtime:find_value
Merge pull request #26 from fauxsoup/master

Use lists module for erlydtl_runtime:find_value
Support arbitrary number of arguments to ifchanged
Fixed date formatting for 'h', added tests.

Removed extra integer_to_list conversion from tag_to_value/3 for $h.
Added tests for "h", "H", "i", and "Y" to each test case.
Merge pull request #30 from bluegraybox/master

date 'h' format fix
More flexible "_" function
Extend the regroup syntax to support nested keys

This commit allows the user to use nested regroup keys. ie.

    {% regroup builds by host.name as hostname_list %}
Make dictsort use deep find
Add testcases for nested regroup and dictsort
Merge pull request #27 from garazdawi/regroup_extend

Allow nested keys in regroup and dictsort
Add unit tests for {% elif Expr %} syntax
Add support for {% elif Expr %} syntax
Merge pull request #35 from psyeugenic/egil/support-elif

Support {% elif %} clause in if template tag syntax
Added postgresql timestamp output format test.