------
``Tue Mar 12, 2013``
- support inline tags along with text. Eg,
``<div> hello world <span> how are you``
- Tags can also be nested in a text line. Eg,
``First name : <inptext :firstname>``
- Added `tagspan` and `textspan` grammar to support nested tags in the same
line.
- Added return statement, where template functions can return objects
other than template code. A corresponding popobject() instruction is added.
- Template plugins can define configuration settings using ConfigDict and
default_settings method. Although settings value must always be
string. ``ISettings`` methods added for BaseTTL and other plugins
implemented in tayra.
- Package info (package() entry point) returns list of template plugins
available in tayra package.
- Lexer preserves the token and its line no in ttl text while passing them to
the parser.
- Line no information from lexer are coded in the intermediate python file
in debug mode to accurately map exceptions to the correct line in the
ttl-file.
- Revamped filter block handling in ast and pycode.
- Codegen used __traceback_decorator__ to map exceptions to ttl file location.
- Improved vim-plugin for TTL filetype.
- Expression substitution is made pluggable. Any text within the ``${ ... }``
syntax is now handled by a runtime plugin implementing `ITayraExpression`
interface.
- TTLCompiler['expression.default'] configuration parameter specifies
the default `ITayraExpression` plugin to handle the expression.
- To invoke a specific plugin, ``${-<name> ... }``,
where <name> is the plugin name to handle expression substitution.
- Renamed TTLCompiler['use_tag_plugins'] to TTLCompiler['tag.plugins'].
- ITayraEscFilter specification is merged with ITayraExpression interface
specification.
- TayraExpression plugin `py` added. This plugin is configured as the default
handler for expression substitution.
- TayraExpression plugin `evalpy` added.
- Added test cases for pluggable expression substitution feature.
Instead of blindly importing all utility functions from pluggdapps.utils,
these functions are first imported, individually, into tayra.utils and
then populated into a container object. This container object is finally made
available in template context as ``h``. Eg, ::
<head>
<body>
${ h.parsecsv( 'one, two, three' ) }
${ h.parsecsvlines( 'one, \\n two,
three' ) }
${ dir(h) }