0.7.4
- [feature] Code has been reworked to support Python 2.4->
  Python 3.xx in place.  2to3 no longer needed.

- [feature] Added future_imports parameter to Template
  and TemplateLookup, renders the __future__ header
  with desired capabilities at the top of the generated
  template module.  Courtesy Ben Trofatter.

0.7.3
- [bug] legacy_html_escape function, used when
  Markupsafe isn't installed, was using an inline-compiled
  regexp which causes major slowdowns on Python 3.3;
  is now precompiled.

- [bug] AST supporting now supports tuple-packed
  function arguments inside pure-python def
  or lambda expressions.  [ticket:201]

- [bug] Fixed Py3K bug in the Babel extension.

- [bug] Fixed the "filter" attribute of the
  <%text> tag so that it pulls locally specified
  identifiers from the context the same
  way as that of <%block> and <%filter>.

- [bug] Fixed bug in plugin loader to correctly
  raise exception when non-existent plugin
  is specified.

0.7.2
- [bug] Fixed regression in 0.7.1 where AST
  parsing for Py2.4 was broken.
  [ticket:193]

0.7.1
- [feature] Control lines with no bodies will
  now succeed, as "pass" is added for these
  when no statements are otherwise present.
  Courtesy Ben Trofatter [ticket:146]

- [bug] Fixed some long-broken scoping behavior
  involving variables declared in defs and such,
  which only became apparent when
  the strict_undefined flag was turned on.
  [ticket:192]

- [bug] Can now use strict_undefined at the
  same time args passed to def() are used
  by other elements of the <%def> tag.
  [ticket:191]

0.7.0
- [feature] Added new "loop" variable to templates,
  is provided within a % for block to provide
  info about the loop such as index, first/last,
  odd/even, etc.  A migration path is also provided
  for legacy templates via the "enable_loop" argument
  available on Template, TemplateLookup, and <%page>.
  Thanks to Ben Trofatter for all
  the work on this [ticket:125]

- [feature] Added a real check for "reserved"
  names, that is names which are never pulled
  from the context and cannot be passed to
  the template.render() method.  Current names
  are "context", "loop", "UNDEFINED".

- [feature] The html_error_template() will now
  apply Pygments highlighting to the source
  code displayed in the traceback, if Pygments
  if available.  Courtesy Ben Trofatter
  [ticket:95]

- [feature] Added support for context managers,
  i.e. "% with x as e:/ % endwith" support.
  Courtesy Ben Trofatter [ticket:147]

- [feature] Added class-level flag to CacheImpl
  "pass_context"; when True, the keyword argument
  'context' will be passed to get_or_create()
  containing the Mako Context object.
  [ticket:185]

- [bug] Fixed some Py3K resource warnings due
  to filehandles being implicitly closed.
  [ticket:182]

- [bug] Fixed endless recursion bug when
  nesting multiple def-calls with content.
  Thanks to Jeff Dairiki. [ticket:186]

- [feature] Added Jinja2 to the example
  benchmark suite, courtesy Vincent Férotin

0.6.2
- [bug] The ${{"foo":"bar"}} parsing issue is fixed!!
  The legendary Eevee has slain the dragon!
  [ticket:20].  Also fixes quoting issue
  at [ticket:86].

0.6.1
- [bug] Added special compatibility for the 0.5.0
  Cache() constructor, which was preventing file
  version checks and not allowing Mako 0.6 to
  recompile the module files.

0.6.0

- [feature] Template caching has been converted into a plugin
  system, whereby the usage of Beaker is just the
  default plugin.   Template and TemplateLookup
  now accept a string "cache_impl" parameter which
  refers to the name of a cache plugin, defaulting
  to the name 'beaker'.  New plugins can be
  registered as pkg_resources entrypoints under
  the group "mako.cache", or registered directly
  using mako.cache.register_plugin().  The
  core plugin is the mako.cache.CacheImpl
  class.

- [feature] Added support for Beaker cache regions
  in templates.   Usage of regions should be considered
  as superseding the very obsolete idea of passing in
  backend options, timeouts, etc. within templates.

- [feature] The 'put' method on Cache is now
  'set'.  'put' is there for backwards compatibility.

- [feature] The <%def>, <%block> and <%page> tags now accept
  any argument named "cache_*", and the key
  minus the "cache_" prefix will be passed as keyword
  arguments to the CacheImpl methods.

- [feature] Template and TemplateLookup now accept an argument
  cache_args, which refers to a dictionary containing
  cache parameters.  The cache_dir, cache_url, cache_type,
  cache_timeout arguments are deprecated (will probably
  never be removed, however) and can be passed
  now as cache_args={'url':<some url>, 'type':'memcached',
  'timeout':50, 'dir':'/path/to/some/directory'}

- [feature/bug] Can now refer to context variables
  within extra arguments to <%block>, <%def>, i.e.
  <%block name="foo" cache_key="${somekey}">.
  Filters can also be used in this way, i.e.
  <%def name="foo()" filter="myfilter">
  then template.render(myfilter=some_callable)
  [ticket:180]

- [feature] Added "--var name=value" option to the mako-render
  script, allows passing of kw to the template from
  the command line. [ticket:178]

- [feature] Added module_writer argument to Template,
  TemplateLookup, allows a callable to be passed which
  takes over the writing of the template's module source
  file, so that special environment-specific steps
  can be taken.  [ticket:181]

- [bug] The exception message in the html_error_template
  is now escaped with the HTML filter. [ticket:142]

- [bug] Added "white-space:pre" style to html_error_template()
  for code blocks so that indentation is preserved
  [ticket:173]

- [bug] The "benchmark" example is now Python 3 compatible
  (even though several of those old template libs aren't
  available on Py3K, so YMMV) [ticket:175]

0.5
- A Template is explicitly disallowed
  from having a url that normalizes to relative outside
  of the root.   That is, if the Lookup is based
  at /home/mytemplates, an include that would place
  the ultimate template at
  /home/mytemplates/../some_other_directory,
  i.e. outside of /home/mytemplates,
  is disallowed.   This usage was never intended
  despite the lack of an explicit check.
  The main issue this causes
  is that module files can be written outside
  of the module root (or raise an error, if file perms aren't
  set up), and can also lead to the same template being
  cached in the lookup under multiple, relative roots.
  TemplateLookup instead has always supported multiple
  file roots for this purpose.
  [ticket:174]

0.4.2
- Fixed bug regarding <%call>/def calls w/ content
  whereby the identity of the "caller" callable
  inside the <%def> would be corrupted by the
  presence of another <%call> in the same block.
  [ticket:170]

- Fixed the babel plugin to accommodate <%block>
  [ticket:169]

0.4.1
- New tag: <%block>.  A variant on <%def> that
  evaluates its contents in-place.
  Can be named or anonymous,
  the named version is intended for inheritance
  layouts where any given section can be
  surrounded by the <%block> tag in order for
  it to become overrideable by inheriting
  templates, without the need to specify a
  top-level <%def> plus explicit call.
  Modified scoping and argument rules as well as a
  more strictly enforced usage scheme make it ideal
  for this purpose without at all replacing most
  other things that defs are still good for.
  Lots of new docs. [ticket:164]

- a slight adjustment to the "highlight" logic
  for generating template bound stacktraces.
  Will stick to known template source lines
  without any extra guessing. [ticket:165]

0.4.0
- A 20% speedup for a basic two-page
  inheritance setup rendering
  a table of escaped data
  (see http://techspot.zzzeek.org/2010/11/19/quick-mako-vs.-jinja-speed-test/).
  A few configurational changes which
  affect those in the I-don't-do-unicode
  camp should be noted below.

- The FastEncodingBuffer is now used
  by default instead of cStringIO or StringIO,
  regardless of whether output_encoding
  is set to None or not.  FEB is faster than
  both.  Only StringIO allows bytestrings
  of unknown encoding to pass right
  through, however - while it is of course
  not recommended to send bytestrings of unknown
  encoding to the output stream, this
  mode of usage can be re-enabled by
  setting the flag bytestring_passthrough
  to True.

- disable_unicode mode requires that
  output_encoding be set to None - it also
  forces the bytestring_passthrough flag
  to True.

- the <%namespace> tag raises an error
  if the 'template' and 'module' attributes
  are specified at the same time in
  one tag.  A different class is used
  for each case which allows a reduction in
  runtime conditional logic and function
  call overhead. [ticket:156]

- the keys() in the Context, as well as
  it's internal _data dictionary, now
  include just what was specified to
  render() as well as Mako builtins
  'caller', 'capture'.  The contents
  of __builtin__ are no longer copied.
  Thanks to Daniel Lopez for pointing
  this out. [ticket:159]

0.3.6
- Documentation is on Sphinx.
  [ticket:126]

- Beaker is now part of "extras" in
  setup.py instead of "install_requires".
  This to produce a lighter weight install
  for those who don't use the caching
  as well as to conform to Pyramid
  deployment practices.  [ticket:154]

- The Beaker import (or attempt thereof)
  is delayed until actually needed;
  this to remove the performance penalty
  from startup, particularly for
  "single execution" environments
  such as shell scripts. [ticket:153]

- Patch to lexer to not generate an empty
  '' write in the case of backslash-ended
  lines.  [ticket:155]

- Fixed missing **extra collection in
  setup.py which prevented setup.py
  from running 2to3 on install.
  [ticket:148]

- New flag on Template, TemplateLookup -
  strict_undefined=True, will cause
  variables not found in the context to
  raise a NameError immediately, instead of
  defaulting to the UNDEFINED value.

- The range of Python identifiers that
  are considered "undefined", meaning they
  are pulled from the context, has been
  trimmed back to not include variables
  declared inside of expressions (i.e. from
  list comprehensions), as well as
  in the argument list of lambdas.  This
  to better support the strict_undefined
  feature.  The change should be
  fully backwards-compatible but involved
  a little bit of tinkering in the AST code,
  which hadn't really been touched for
  a couple of years, just FYI.

0.3.5
- The <%namespace> tag allows expressions
  for the `file` argument, i.e. with ${}.
  The `context` variable, if needed,
  must be referenced explicitly.
  [ticket:141]

- ${} expressions embedded in tags,
  such as <%foo:bar x="${...}">, now
  allow multiline Python expressions.

- Fixed previously non-covered regular
  expression, such that using a ${} expression
  inside of a tag element that doesn't allow
  them raises a CompileException instead of
  silently failing.

- Added a try/except around "import markupsafe".
  This to support GAE which can't run markupsafe.
  [ticket:151] No idea whatsoever if the
  install_requires in setup.py also breaks GAE,
  couldn't get an answer on this.

0.3.4
- Now using MarkupSafe for HTML escaping,
  i.e. in place of cgi.escape().  Faster
  C-based implementation and also escapes
  single quotes for additional security.
  Supports the __html__ attribute for
  the given expression as well.

  When using "disable_unicode" mode,
  a pure Python HTML escaper function
  is used which also quotes single quotes.

  Note that Pylons by default doesn't
  use Mako's filter - check your
  environment.py file.

- Fixed call to "unicode.strip" in
  exceptions.text_error_template which
  is not Py3k compatible.  [ticket:137]

0.3.3
- Added conditional to RichTraceback
  such that if no traceback is passed
  and sys.exc_info() has been reset,
  the formatter just returns blank
  for the "traceback" portion.
  [ticket:135]

- Fixed sometimes incorrect usage of
  exc.__class__.__name__
  in html/text error templates when using
  Python 2.4 [ticket:131]

- Fixed broken @property decorator on
  template.last_modified

- Fixed error formatting when a stacktrace
  line contains no line number, as in when
  inside an eval/exec-generated function.
  [ticket:132]

- When a .py is being created, the tempfile
  where the source is stored temporarily is
  now made in the same directory as that of
  the .py file.  This ensures that the two
  files share the same filesystem, thus
  avoiding cross-filesystem synchronization
  issues.  Thanks to Charles Cazabon.

0.3.2
- Calling a def from the top, via
  template.get_def(...).render() now checks the
  argument signature the same way as it did in
  0.2.5, so that TypeError is not raised.
  reopen of [ticket:116]


0.3.1
- Fixed incorrect dir name in setup.py
  [ticket:129]

0.3
- Python 2.3 support is dropped. [ticket:123]

- Python 3 support is added ! See README.py3k
  for installation and testing notes.
  [ticket:119]

- Unit tests now run with nose.  [ticket:127]

- Source code escaping has been simplified.
  In particular, module source files are now
  generated with the Python "magic encoding
  comment", and source code is passed through
  mostly unescaped, except for that code which
  is regenerated from parsed Python source.
  This fixes usage of unicode in
  <%namespace:defname> tags.  [ticket:99]

- RichTraceback(), html_error_template().render(),
  text_error_template().render() now accept "error"
  and "traceback" as optional arguments, and
  these are now actually used.  [ticket:122]

- The exception output generated when
  format_exceptions=True will now be as a Python
  unicode if it occurred during render_unicode(),
  or an encoded string if during render().

- A percent sign can be emitted as the first
  non-whitespace character on a line by escaping
  it as in "%%". [ticket:112]

- Template accepts empty control structure, i.e.
  % if: %endif, etc. [ticket:94]

- The <%page args> tag can now be used in a base
  inheriting template - the full set of render()
  arguments are passed down through the inherits
  chain.  Undeclared arguments go into **pageargs
  as usual.  [ticket:116]

- defs declared within a <%namespace> section, an
  uncommon feature, have been improved.  The defs
  no longer get doubly-rendered in the body() scope,
  and now allow local variable assignment without
  breakage.  [ticket:109]

- Windows paths are handled correctly if a Template
  is passed only an absolute filename (i.e. with c:
  drive etc.)  and no URI - the URI is converted
  to a forward-slash path and module_directory
  is treated as a windows path.  [ticket:128]

- TemplateLookup raises TopLevelLookupException for
  a given path that is a directory, not a filename,
  instead of passing through to the template to
  generate IOError.  [ticket:73]

0.2.6

- Fix mako function decorators to preserve the
  original function's name in all cases. Patch
  from Scott Torborg.

- Support the <%namespacename:defname> syntax in
  the babel extractor. [ticket:118]

- Further fixes to unicode handling of .py files with the
  html_error_template. [ticket:88]

0.2.5
- Added a "decorator" kw argument to <%def>,
  allows custom decoration functions to wrap
  rendering callables.  Mainly intended for
  custom caching algorithms, not sure what
  other uses there may be (but there may be).
  Examples are in the "filtering" docs.

- When Mako creates subdirectories in which
  to store templates, it uses the more
  permissive mode of 0775 instead of 0750,
  helping out with certain multi-process
  scenarios. Note that the mode is always
  subject to the restrictions of the existing
  umask. [ticket:101]

- Fixed namespace.__getattr__() to raise
  AttributeError on attribute not found
  instead of RuntimeError.  [ticket:104]

- Added last_modified accessor to Template,
  returns the time.time() when the module
  was created. [ticket:97]

- Fixed lexing support for whitespace
  around '=' sign in defs. [ticket:102]

- Removed errant "lower()" in the lexer which
  was causing tags to compile with
  case-insensitive names, thus messing up
  custom <%call> names. [ticket:108]

- added "mako.__version__" attribute to
  the base module.  [ticket:110]

0.2.4
- Fixed compatibility with Jython 2.5b1.

0.2.3
- the <%namespacename:defname> syntax described at
  http://techspot.zzzeek.org/?p=28 has now
  been added as a built in syntax, and is recommended
  as a more modern syntax versus <%call expr="expression">.
  The %call tag itself will always remain,
  with <%namespacename:defname> presenting a more HTML-like
  alternative to calling defs, both plain and
  nested.  Many examples of the new syntax are in the
  "Calling a def with embedded content" section
  of the docs.

- added support for Jython 2.5.

- cache module now uses Beaker's CacheManager
  object directly, so that all cache types are included.
  memcached is available as both "ext:memcached" and
  "memcached", the latter for backwards compatibility.

- added "cache" accessor to Template, Namespace.
  e.g.  ${local.cache.get('somekey')} or
  template.cache.invalidate_body()

- added "cache_enabled=True" flag to Template,
  TemplateLookup.  Setting this to False causes cache
  operations to "pass through" and execute every time;
  this flag should be integrated in Pylons with its own
  cache_enabled configuration setting.

- the Cache object now supports invalidate_def(name),
  invalidate_body(), invalidate_closure(name),
  invalidate(key), which will remove the given key
  from the cache, if it exists.  The cache arguments
  (i.e. storage type) are derived from whatever has
  been already persisted for that template.
  [ticket:92]

- For cache changes to work fully, Beaker 1.1 is required.
  1.0.1 and up will work as well with the exception of
  cache expiry.  Note that Beaker 1.1 is **required**
  for applications which use dynamically generated keys,
  since previous versions will permanently store state in memory
  for each individual key, thus consuming all available
  memory for an arbitrarily large number of distinct
  keys.

- fixed bug whereby an <%included> template with
  <%page> args named the same as a __builtin__ would not
  honor the default value specified in <%page> [ticket:93]

- fixed the html_error_template not handling tracebacks from
  normal .py files with a magic encoding comment [ticket:88]

- RichTraceback() now accepts an optional traceback object
  to be used in place of sys.exc_info()[2].  html_error_template()
  and text_error_template() accept an optional
  render()-time argument "traceback" which is passed to the
  RichTraceback object.

- added ModuleTemplate class, which allows the construction
  of a Template given a Python module generated by a previous
  Template.   This allows Python modules alone to be used
  as templates with no compilation step.   Source code
  and template source are optional but allow error reporting
  to work correctly.

- fixed Python 2.3 compat. in mako.pyparser [ticket:90]

- fix Babel 0.9.3 compatibility; stripping comment tags is now
  optional (and enabled by default).


0.2.2
- cached blocks now use the current context when rendering
an expired section, instead of the original context
passed in [ticket:87]
- fixed a critical issue regarding caching, whereby
a cached block would raise an error when called within a
cache-refresh operation that was initiated after the
initiating template had completed rendering.

0.2.1
- fixed bug where 'output_encoding' parameter would prevent
render_unicode() from returning a unicode object.
- bumped magic number, which forces template recompile for
this version (fixes incompatible compile symbols from 0.1
series).
- added a few docs for cache options, specifically those that
help with memcached.

0.2.0
- Speed improvements (as though we needed them, but people
  contributed and there you go):

  - added "bytestring passthru" mode, via
    `disable_unicode=True` argument passed to Template or
    TemplateLookup. All unicode-awareness and filtering is
    turned off, and template modules are generated with
    the appropriate magic encoding comment. In this mode,
    template expressions can only receive raw bytestrings
    or Unicode objects which represent straight ASCII, and
    render_unicode() may not be used if multibyte
    characters are present. When enabled, speed
    improvement around 10-20%. [ticket:77] (courtesy
    anonymous guest)

  - inlined the "write" function of Context into a local
    template variable. This affords a 12-30% speedup in
    template render time. (idea courtesy same anonymous
    guest) [ticket:76]

- New Features, API changes:

  - added "attr" accessor to namespaces. Returns
    attributes configured as module level attributes, i.e.
    within <%! %> sections.  [ticket:62] i.e.:

    # somefile.html
    <%!
        foo = 27
    %>

    # some other template
    <%namespace name="myns" file="somefile.html"/>
    ${myns.attr.foo}

    The slight backwards incompatibility here is, you
    can't have namespace defs named "attr" since the
    "attr" descriptor will occlude it.

  - cache_key argument can now render arguments passed
    directly to the %page or %def, i.e. <%def
    name="foo(x)" cached="True" cache_key="${x}"/>
    [ticket:78]

  - some functions on Context are now private:
    _push_buffer(), _pop_buffer(),
    caller_stack._push_frame(), caller_stack._pop_frame().

  - added a runner script "mako-render" which renders
    standard input as a template to stdout [ticket:81]
    [ticket:56]

- Bugfixes:
  - can now use most names from __builtins__ as variable
    names without explicit declaration (i.e. 'id',
    'exception', 'range', etc.) [ticket:83] [ticket:84]

  - can also use builtin names as local variable names
    (i.e. dict, locals) (came from fix for [ticket:84])

  - fixed bug in python generation when variable names are
    used with identifiers like "else", "finally", etc.
    inside them [ticket:68]

  - fixed codegen bug which occured when using <%page>
    level caching, combined with an expression-based
    cache_key, combined with the usage of <%namespace
    import="*"/> - fixed lexer exceptions not cleaning up
    temporary files, which could lead to a maximum number
    of file descriptors used in the process [ticket:69]

  - fixed issue with inline format_exceptions that was
    producing blank exception pages when an inheriting
    template is present [ticket:71]

  - format_exceptions will apply the encoding options of
    html_error_template() to the buffered output

  - rewrote the "whitespace adjuster" function to work
    with more elaborate combinations of quotes and
    comments [ticket:75]

0.1.10
- fixed propagation of 'caller' such that nested %def calls
  within a <%call> tag's argument list propigates 'caller'
  to the %call function itself (propigates to the inner
  calls too, this is a slight side effect which previously
  existed anyway)
- fixed bug where local.get_namespace() could put an
  incorrect "self" in the current context
- fixed another namespace bug where the namespace functions
  did not have access to the correct context containing
  their 'self' and 'parent'

0.1.9
- filters.Decode filter can also accept a non-basestring
object and will call str() + unicode() on it [ticket:47]
- comments can be placed at the end of control lines,
i.e. if foo: # a comment, [ticket:53], thanks to
Paul Colomiets
- fixed expressions and page tag arguments and with embedded
newlines in CRLF templates, follow up to [ticket:16], thanks
Eric Woroshow
- added an IOError catch for source file not found in RichTraceback
exception reporter [ticket:51]

0.1.8
- variable names declared in render methods by internal
codegen prefixed by "__M_" to prevent name collisions
with user code
- added a Babel (http://babel.edgewall.org/) extractor entry
point, allowing extraction of gettext messages directly from
mako templates via Babel [ticket:45]
- fix to turbogears plugin to work with dot-separated names
(i.e. load_template('foo.bar')).  also takes file extension
as a keyword argument (default is 'mak').
- more tg fix:  fixed [ticket:35], allowing string-based
templates with tgplugin even if non-compatible args were sent

0.1.7
- one small fix to the unit tests to support python 2.3
- a slight hack to how cache.py detects Beaker's memcached,
works around unexplained import behavior observed on some
python 2.3 installations

0.1.6
- caching is now supplied directly by Beaker, which has
  all of MyghtyUtils merged into it now.  The latest Beaker
  (0.7.1) also fixes a bug related to how Mako was using the
  cache API.
- fix to module_directory path generation when the path is "./"
  [ticket:34]
- TGPlugin passes options to string-based templates [ticket:35]
- added an explicit stack frame step to template runtime, which
  allows much simpler and hopefully bug-free tracking of 'caller',
  fixes #28
- if plain Python defs are used with <%call>, a decorator
  @runtime.supports_callable exists to ensure that the "caller"
  stack is properly handled for the def.
- fix to RichTraceback and exception reporting to get template
  source code as a unicode object #37
- html_error_template includes options "full=True", "css=True"
  which control generation of HTML tags, CSS [ticket:39]
- added the 'encoding_errors' parameter to Template/TemplateLookup
  for specifying the error handler associated with encoding to
  'output_encoding' [ticket:40]
- the Template returned by html_error_template now defaults to
  output_encoding=sys.getdefaultencoding(),
  encoding_errors='htmlentityreplace' [ticket:37]
- control lines, i.e. % lines, support backslashes to continue long
  lines (#32)
- fixed codegen bug when defining <%def> within <%call> within <%call>
- leading utf-8 BOM in template files is honored according to pep-0263

0.1.5
- AST expression generation - added in just about everything
  expression-wise from the AST module  [ticket:26]
- AST parsing, properly detects imports of the form "import foo.bar"
  [ticket:27]
- fix to lexing of <%docs> tag nested in other tags
- fix to context-arguments inside of <%include> tag which broke
during 0.1.4 [ticket:29]
- added "n" filter, disables *all* filters normally applied to an expression
via <%page> or default_filters (but not those within the filter)
- added buffer_filters argument, defines filters applied to the return value
of buffered/cached/filtered %defs, after all filters defined with the %def
itself have been applied.  allows the creation of default expression filters
that let the output of return-valued %defs "opt out" of that filtering
via passing special attributes or objects.

0.1.4
- got defs-within-defs to be cacheable
- fixes to code parsing/whitespace adjusting where plain python comments
  may contain quote characters [ticket:23]
- fix to variable scoping for identifiers only referenced within
  functions
- added a path normalization step to lookup so URIs like
  "/foo/bar/../etc/../foo" pre-process the ".." tokens before checking
  the filesystem
- fixed/improved "caller" semantics so that undefined caller is
  "UNDEFINED", propigates __nonzero__ method so it evaulates to False if
  not present, True otherwise. this way you can say % if caller:\n
  ${caller.body()}\n% endif
- <%include> has an "args" attribute that can pass arguments to the
  called template (keyword arguments only, must be declared in that
  page's <%page> tag.)
- <%include> plus arguments is also programmatically available via
  self.include_file(<filename>, **kwargs)
- further escaping added for multibyte expressions in %def, %call
  attributes [ticket:24]


0.1.3
- ***Small Syntax Change*** - the single line comment character is now
*two* hash signs, i.e. "## this is a comment".  This avoids a common
collection with CSS selectors.
- the magic "coding" comment (i.e. # coding:utf-8) will still work with
either one "#" sign or two for now; two is preferred going forward, i.e.
## coding:<someencoding>.
- new multiline comment form: "<%doc> a comment </%doc>"
- UNDEFINED evaluates to False
- improvement to scoping of "caller" variable when using <%call> tag
- added lexer error for unclosed control-line (%) line
- added "preprocessor" argument to Template, TemplateLookup - is a single
  callable or list of callables which will be applied to the template text
  before lexing.  given the text as an argument, returns the new text.
- added mako.ext.preprocessors package, contains one preprocessor so far:
  'convert_comments', which will convert single # comments to the new ##
  format

0.1.2
- fix to parsing of code/expression blocks to insure that non-ascii
  characters, combined with a template that indicates a non-standard
  encoding, are expanded into backslash-escaped glyphs before being AST
  parsed [ticket:11]
- all template lexing converts the template to unicode first, to
  immediately catch any encoding issues and ensure internal unicode
  representation.
- added module_filename argument to Template to allow specification of a
  specific module file
- added modulename_callable to TemplateLookup to allow a function to
  determine module filenames (takes filename, uri arguments). used for
  [ticket:14]
- added optional input_encoding flag to Template, to allow sending a
  unicode() object with no magic encoding comment
- "expression_filter" argument in <%page> applies only to expressions
- added "default_filters" argument to Template, TemplateLookup. applies only
  to expressions, gets prepended to "expression_filter" arg from <%page>.
  defaults to ["unicode"], so that all expressions get stringified into u''
  by default (this is what Mako already does). By setting to [], expressions
  are passed through raw.
- added "imports" argument to Template, TemplateLookup. so you can predefine
  a list of import statements at the top of the template. can be used in
  conjunction with default_filters.
- support for CRLF templates...whoops ! welcome to all the windows users.
  [ticket:16]
- small fix to local variable propigation for locals that are conditionally
  declared
- got "top level" def calls to work, i.e. template.get_def("somedef").render()

0.1.1
- buffet plugin supports string-based templates, allows ToscaWidgets to work
  [ticket:8]
- AST parsing fixes: fixed TryExcept identifier parsing
- removed textmate tmbundle from contrib and into separate SVN location;
  windows users cant handle those files, setuptools not very good at
  "pruning" certain directories
- fix so that "cache_timeout" parameter is propigated
- fix to expression filters so that string conversion (actually unicode)
  properly occurs before filtering
- better error message when a lookup is attempted with a template that has no
  lookup
- implemented "module" attribute for namespace
- fix to code generation to correctly track multiple defs with the same name
- "directories" can be passed to TemplateLookup as a scalar in which case it
  gets converted to a list [ticket:9]

0.1.0

Initial release.
