- 2014
- move CHANGES to changelog.rst
diff --git a/.gitignore b/.gitignore
index e2799a5..267bfc2 100755
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,5 @@
-build/
-doc/build/output
+/build
+/doc/build/output
 *.pyc
 *.orig
 *.egg-info
diff --git a/CHANGES b/CHANGES
index 6538fe6..f942ad9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,946 +1,15 @@
-0.9.2
-- [bug] A rework of the mako-render script allows the script to run
-  correctly when given a file pathname that is outside of the current
-  directory, e.g. ``mako-render ../some_template.mako``.  In this case,
-  the "template root" defaults to the directory in which the template
-  is located, instead of ".".  The script also accepts a new argument
-  ``--template-dir`` which can be specified multiple times to establish
-  template lookup directories.  Standard input for templates also works
-  now too.  Pull request #2 courtesy Derek Harland.
+=====
+MOVED
+=====
 
-0.9.1
-- [bug] Fixed bug in Babel plugin where translator comments
-  would be lost if intervening text nodes were encountered.
-  Fix courtesy Ned Batchelder.  [ticket:225]
+Please see:
 
-- [bug] Fixed TGPlugin.render method to support unicode template
-  names in Py2K - courtesy Vladimir Magamedov.
+    /docs/changelog.html
 
-- [bug] Fixed an AST issue that was preventing correct operation
-  under alpha versions of Python 3.4.  Pullreq courtesy Zer0-.
+    /docs/build/changelog.rst
 
-- [bug] Changed the format of the "source encoding" header output
-  by the code generator to use the format ``# -*- coding:%s -*-``
-  instead of ``# -*- encoding:%s -*-``; the former is more common
-  and compatible with emacs.  Courtesy Martin Geisler.
+or
 
-- [bug] Fixed issue where an old lexer rule prevented a template line
-  which looked like "#*" from being correctly parsed.  [ticket:224]
+    https://docs.makotemplates.org/en/latest/changelog.html
 
-0.9.0
-- [bug] The Context.locals_() method becomes a private underscored
-  method, as this method has a specific internal use. The purpose
-  of Context.kwargs has been clarified, in that it only delivers
-  top level keyword arguments originally passed to template.render().
-  [ticket:219]
-
-- [bug] Fixed the babel plugin to properly interpret ${} sections
-  inside of a "call" tag, i.e. <%self:some_tag attr="${_('foo')}"/>.
-  Code that's subject to babel escapes in here needs to be
-  specified as a Python expression, not a literal.  This change
-  is backwards incompatible vs. code that is relying upon a _('')
-  translation to be working within a call tag.
-
-- [bug] The Babel plugin has been repaired to work on Python 3.
-  [ticket:187]
-
-- [bug] Using <%namespace import="*" module="somemodule"/> now
-  skips over module elements that are not explcitly callable,
-  avoiding TypeError when trying to produce partials.
-  [ticket:207]
-
-- [bug] Fixed Py3K bug where a "lambda" expression was not
-  interpreted correctly within a template tag; also
-  fixed in Py2.4.  [ticket:190]
-
-0.8.1
-- [bug] Changed setup.py to skip installing markupsafe
-  if Python version is < 2.6 or is between 3.0 and
-  less than 3.3, as Markupsafe now only supports 2.6->2.X,
-  3.3->3.X. [ticket:216]
-
-- [bug] Fixed regression where "entity" filter wasn't
-  converted for py3k properly (added tests.)
-  [ticket:214]
-
-- [bug] Fixed bug where mako-render script wasn't
-  compatible with Py3k.  [ticket:212]
-
-- [bug] Cleaned up all the various deprecation/
-  file warnings when running the tests under
-  various Pythons with warnings turned on.
-  [ticket:213]
-
-0.8.0
-- [feature] Performance improvement to the
-  "legacy" HTML escape feature, used for XML
-  escaping and when markupsafe isn't present,
-  courtesy George Xie.
-
-- [bug] Fixed bug whereby an exception in Python 3
-  against a module compiled to the filesystem would
-  fail trying to produce a RichTraceback due to the
-  content being in bytes. [ticket:209]
-
-- [bug] Change default for compile()->reserved_names
-  from tuple to frozenset, as this is expected to be
-  a set by default.  [ticket:208]
-
-- [feature] Code has been reworked to support Python 2.4->
-  Python 3.xx in place.  2to3 no longer needed.
-
-- [feature] Added lexer_cls argument to Template,
-  TemplateLookup, allows alternate Lexer classes
-  to be used.
-
-- [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.
+for the current CHANGES.
diff --git a/LICENSE b/LICENSE
index 38a3124..4a62c62 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 This is the MIT license: http://www.opensource.org/licenses/mit-license.php
 
-Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>.
+Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>.
 Mako is a trademark of Michael Bayer.
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of this
diff --git a/doc/build/changelog.rst b/doc/build/changelog.rst
new file mode 100644
index 0000000..5c890cf
--- /dev/null
+++ b/doc/build/changelog.rst
@@ -0,0 +1,1911 @@
+=========
+Changelog
+=========
+
+.. changelog::
+    :version: 0.9.2
+    :released:
+
+    .. change::
+        :tags: bug
+        :tickets: 2
+
+      A rework of the mako-render script allows the script to run
+      correctly when given a file pathname that is outside of the current
+      directory, e.g. ``mako-render ../some_template.mako``.  In this case,
+      the "template root" defaults to the directory in which the template
+      is located, instead of ".".  The script also accepts a new argument
+      ``--template-dir`` which can be specified multiple times to establish
+      template lookup directories.  Standard input for templates also works
+      now too.  Pull request courtesy Derek Harland.
+
+.. changelog::
+    :version: 0.9.1
+    :released: Thu Dec 26 2013
+
+    .. change::
+        :tags: bug
+        :tickets: 225
+
+      Fixed bug in Babel plugin where translator comments
+      would be lost if intervening text nodes were encountered.
+      Fix courtesy Ned Batchelder.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Fixed TGPlugin.render method to support unicode template
+      names in Py2K - courtesy Vladimir Magamedov.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Fixed an AST issue that was preventing correct operation
+      under alpha versions of Python 3.4.  Pullreq courtesy Zer0-.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Changed the format of the "source encoding" header output
+      by the code generator to use the format ``# -*- coding:%s -*-``
+      instead of ``# -*- encoding:%s -*-``; the former is more common
+      and compatible with emacs.  Courtesy Martin Geisler.
+
+    .. change::
+        :tags: bug
+        :tickets: 224
+
+      Fixed issue where an old lexer rule prevented a template line
+      which looked like "#*" from being correctly parsed.
+
+.. changelog::
+    :version: 0.9.0
+    :released:
+
+    .. change::
+        :tags: bug
+        :tickets: 219
+
+      The Context.locals_() method becomes a private underscored
+      method, as this method has a specific internal use. The purpose
+      of Context.kwargs has been clarified, in that it only delivers
+      top level keyword arguments originally passed to template.render().
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Fixed the babel plugin to properly interpret ${} sections
+      inside of a "call" tag, i.e. <%self:some_tag attr="${_('foo')}"/>.
+      Code that's subject to babel escapes in here needs to be
+      specified as a Python expression, not a literal.  This change
+      is backwards incompatible vs. code that is relying upon a _('')
+      translation to be working within a call tag.
+
+    .. change::
+        :tags: bug
+        :tickets: 187
+
+      The Babel plugin has been repaired to work on Python 3.
+
+    .. change::
+        :tags: bug
+        :tickets: 207
+
+      Using <%namespace import="*" module="somemodule"/> now
+      skips over module elements that are not explcitly callable,
+      avoiding TypeError when trying to produce partials.
+
+    .. change::
+        :tags: bug
+        :tickets: 190
+
+      Fixed Py3K bug where a "lambda" expression was not
+      interpreted correctly within a template tag; also
+      fixed in Py2.4.
+
+
+.. changelog::
+    :version: 0.8.1
+    :released: Fri May 24 2013
+
+    .. change::
+        :tags: bug
+        :tickets: 216
+
+      Changed setup.py to skip installing markupsafe
+      if Python version is < 2.6 or is between 3.0 and
+      less than 3.3, as Markupsafe now only supports 2.6->2.X,
+      3.3->3.X.
+
+    .. change::
+        :tags: bug
+        :tickets: 214
+
+      Fixed regression where "entity" filter wasn't
+      converted for py3k properly (added tests.)
+
+    .. change::
+        :tags: bug
+        :tickets: 212
+
+      Fixed bug where mako-render script wasn't
+      compatible with Py3k.
+
+    .. change::
+        :tags: bug
+        :tickets: 213
+
+      Cleaned up all the various deprecation/
+      file warnings when running the tests under
+      various Pythons with warnings turned on.
+
+.. changelog::
+    :version: 0.8.0
+    :released: Wed Apr 10 2013
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      Performance improvement to the
+      "legacy" HTML escape feature, used for XML
+      escaping and when markupsafe isn't present,
+      courtesy George Xie.
+
+    .. change::
+        :tags: bug
+        :tickets: 209
+
+      Fixed bug whereby an exception in Python 3
+      against a module compiled to the filesystem would
+      fail trying to produce a RichTraceback due to the
+      content being in bytes.
+
+    .. change::
+        :tags: bug
+        :tickets: 208
+
+      Change default for compile()->reserved_names
+      from tuple to frozenset, as this is expected to be
+      a set by default.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      Code has been reworked to support Python 2.4->
+      Python 3.xx in place.  2to3 no longer needed.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      Added lexer_cls argument to Template,
+      TemplateLookup, allows alternate Lexer classes
+      to be used.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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.
+
+
+.. changelog::
+    :version: 0.7.3
+    :released: Wed Nov 7 2012
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags: bug
+        :tickets: 201
+
+      AST supporting now supports tuple-packed
+      function arguments inside pure-python def
+      or lambda expressions.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Fixed Py3K bug in the Babel extension.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      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>.
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      Fixed bug in plugin loader to correctly
+      raise exception when non-existent plugin
+      is specified.
+
+.. changelog::
+    :version: 0.7.2
+    :released: Fri Jul 20 2012
+
+    .. change::
+        :tags: bug
+        :tickets: 193
+
+      Fixed regression in 0.7.1 where AST
+      parsing for Py2.4 was broken.
+
+.. changelog::
+    :version: 0.7.1
+    :released: Sun Jul 8 2012
+
+    .. change::
+        :tags: feature
+        :tickets: 146
+
+      Control lines with no bodies will
+      now succeed, as "pass" is added for these
+      when no statements are otherwise present.
+      Courtesy Ben Trofatter
+
+    .. change::
+        :tags: bug
+        :tickets: 192
+
+      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.
+
+    .. change::
+        :tags: bug
+        :tickets: 191
+
+      Can now use strict_undefined at the
+      same time args passed to def() are used
+      by other elements of the <%def> tag.
+
+.. changelog::
+    :version: 0.7.0
+    :released: Fri Mar 30 2012
+
+    .. change::
+        :tags: feature
+        :tickets: 125
+
+      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
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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".
+
+    .. change::
+        :tags: feature
+        :tickets: 95
+
+      The html_error_template() will now
+      apply Pygments highlighting to the source
+      code displayed in the traceback, if Pygments
+      if available.  Courtesy Ben Trofatter
+
+    .. change::
+        :tags: feature
+        :tickets: 147
+
+      Added support for context managers,
+      i.e. "% with x as e:/ % endwith" support.
+      Courtesy Ben Trofatter
+
+    .. change::
+        :tags: feature
+        :tickets: 185
+
+      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.
+
+    .. change::
+        :tags: bug
+        :tickets: 182
+
+      Fixed some Py3K resource warnings due
+      to filehandles being implicitly closed.
+
+    .. change::
+        :tags: bug
+        :tickets: 186
+
+      Fixed endless recursion bug when
+      nesting multiple def-calls with content.
+      Thanks to Jeff Dairiki.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      Added Jinja2 to the example
+      benchmark suite, courtesy Vincent Férotin
+
+
+.. changelog::
+    :version: 0.6.2
+    :released: Thu Feb 2 2012
+
+    .. change::
+        :tags: bug
+        :tickets: 86, 20
+
+      The ${{"foo":"bar"}} parsing issue is fixed!!
+      The legendary Eevee has slain the dragon!.  Also fixes quoting issue
+      at.
+
+.. changelog::
+    :version: 0.6.1
+    :released:
+
+    .. change::
+        :tags: bug
+        :tickets:
+
+      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.
+
+.. changelog::
+    :version: 0.6.0
+    :released: Sat Jan 21 2012
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      The 'put' method on Cache is now
+      'set'.  'put' is there for backwards compatibility.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags: feature
+        :tickets:
+
+      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'}
+
+    .. change::
+        :tags: feature/bug
+        :tickets: 180
+
+      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)
+
+    .. change::
+        :tags: feature
+        :tickets: 178
+
+      Added "--var name=value" option to the mako-render
+      script, allows passing of kw to the template from
+      the command line.
+
+    .. change::
+        :tags: feature
+        :tickets: 181
+
+      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.
+
+    .. change::
+        :tags: bug
+        :tickets: 142
+
+      The exception message in the html_error_template
+      is now escaped with the HTML filter.
+
+    .. change::
+        :tags: bug
+        :tickets: 173
+
+      Added "white-space:pre" style to html_error_template()
+      for code blocks so that indentation is preserved
+
+    .. change::
+        :tags: bug
+        :tickets: 175
+
+      The "benchmark" example is now Python 3 compatible
+      (even though several of those old template libs aren't
+      available on Py3K, so YMMV)
+
+
+.. changelog::
+    :version: 0.5.0
+    :released: Wed Sep 28 2011
+
+    .. change::
+        :tags:
+        :tickets: 174
+
+      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.
+
+
+.. changelog::
+    :version: 0.4.2
+    :released: Fri Aug 5 2011
+
+    .. change::
+        :tags:
+        :tickets: 170
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 169
+
+      Fixed the babel plugin to accommodate <%block>
+
+.. changelog::
+    :version: 0.4.1
+    :released: Wed Apr 6 2011
+
+    .. change::
+        :tags:
+        :tickets: 164
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 165
+
+      a slight adjustment to the "highlight" logic
+      for generating template bound stacktraces.
+      Will stick to known template source lines
+      without any extra guessing.
+
+.. changelog::
+    :version: 0.4.0
+    :released: Sun Mar 6 2011
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      disable_unicode mode requires that
+      output_encoding be set to None - it also
+      forces the bytestring_passthrough flag
+      to True.
+
+    .. change::
+        :tags:
+        :tickets: 156
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 159
+
+      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.
+
+
+.. changelog::
+    :version: 0.3.6
+    :released: Sat Nov 13 2010
+
+    .. change::
+        :tags:
+        :tickets: 126
+
+      Documentation is on Sphinx.
+
+    .. change::
+        :tags:
+        :tickets: 154
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 153
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 155
+
+      Patch to lexer to not generate an empty
+      '' write in the case of backslash-ended
+      lines.
+
+    .. change::
+        :tags:
+        :tickets: 148
+
+      Fixed missing **extra collection in
+      setup.py which prevented setup.py
+      from running 2to3 on install.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+.. changelog::
+    :version: 0.3.5
+    :released: Sun Oct 24 2010
+
+    .. change::
+        :tags:
+        :tickets: 141
+
+      The <%namespace> tag allows expressions
+      for the `file` argument, i.e. with ${}.
+      The `context` variable, if needed,
+      must be referenced explicitly.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      ${} expressions embedded in tags,
+      such as <%foo:bar x="${...}">, now
+      allow multiline Python expressions.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 151
+
+      Added a try/except around "import markupsafe".
+      This to support GAE which can't run markupsafe. No idea whatsoever if the
+      install_requires in setup.py also breaks GAE,
+      couldn't get an answer on this.
+
+.. changelog::
+    :version: 0.3.4
+    :released: Tue Jun 22 2010
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 137
+
+      Fixed call to "unicode.strip" in
+      exceptions.text_error_template which
+      is not Py3k compatible.
+
+.. changelog::
+    :version: 0.3.3
+    :released: Mon May 31 2010
+
+    .. change::
+        :tags:
+        :tickets: 135
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 131
+
+      Fixed sometimes incorrect usage of
+      exc.__class__.__name__
+      in html/text error templates when using
+      Python 2.4
+
+    .. change::
+        :tags:
+        :tickets:
+
+      Fixed broken @property decorator on
+      template.last_modified
+
+    .. change::
+        :tags:
+        :tickets: 132
+
+      Fixed error formatting when a stacktrace
+      line contains no line number, as in when
+      inside an eval/exec-generated function.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+.. changelog::
+    :version: 0.3.2
+    :released: Thu Mar 11 2010
+
+    .. change::
+        :tags:
+        :tickets: 116
+
+      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
+
+.. changelog::
+    :version: 0.3.1
+    :released: Sun Mar 7 2010
+
+    .. change::
+        :tags:
+        :tickets: 129
+
+      Fixed incorrect dir name in setup.py
+
+.. changelog::
+    :version: 0.3.0
+    :released: Fri Mar 5 2010
+
+    .. change::
+        :tags:
+        :tickets: 123
+
+      Python 2.3 support is dropped.
+
+    .. change::
+        :tags:
+        :tickets: 119
+
+      Python 3 support is added ! See README.py3k
+      for installation and testing notes.
+
+    .. change::
+        :tags:
+        :tickets: 127
+
+      Unit tests now run with nose.
+
+    .. change::
+        :tags:
+        :tickets: 99
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 122
+
+      RichTraceback(), html_error_template().render(),
+      text_error_template().render() now accept "error"
+      and "traceback" as optional arguments, and
+      these are now actually used.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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().
+
+    .. change::
+        :tags:
+        :tickets: 112
+
+      A percent sign can be emitted as the first
+      non-whitespace character on a line by escaping
+      it as in "%%".
+
+    .. change::
+        :tags:
+        :tickets: 94
+
+      Template accepts empty control structure, i.e.
+      % if: %endif, etc.
+
+    .. change::
+        :tags:
+        :tickets: 116
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 109
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 128
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 73
+
+      TemplateLookup raises TopLevelLookupException for
+      a given path that is a directory, not a filename,
+      instead of passing through to the template to
+      generate IOError.
+
+
+.. changelog::
+    :version: 0.2.6
+    :released:
+
+    .. change::
+        :tags:
+        :tickets:
+
+      Fix mako function decorators to preserve the
+      original function's name in all cases. Patch
+      from Scott Torborg.
+
+    .. change::
+        :tags:
+        :tickets: 118
+
+      Support the <%namespacename:defname> syntax in
+      the babel extractor.
+
+    .. change::
+        :tags:
+        :tickets: 88
+
+      Further fixes to unicode handling of .py files with the
+      html_error_template.
+
+.. changelog::
+    :version: 0.2.5
+    :released: Mon Sep  7 2009
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 101
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 104
+
+      Fixed namespace.__getattr__() to raise
+      AttributeError on attribute not found
+      instead of RuntimeError.
+
+    .. change::
+        :tags:
+        :tickets: 97
+
+      Added last_modified accessor to Template,
+      returns the time.time() when the module
+      was created.
+
+    .. change::
+        :tags:
+        :tickets: 102
+
+      Fixed lexing support for whitespace
+      around '=' sign in defs.
+
+    .. change::
+        :tags:
+        :tickets: 108
+
+      Removed errant "lower()" in the lexer which
+      was causing tags to compile with
+      case-insensitive names, thus messing up
+      custom <%call> names.
+
+    .. change::
+        :tags:
+        :tickets: 110
+
+      added "mako.__version__" attribute to
+      the base module.
+
+.. changelog::
+    :version: 0.2.4
+    :released: Tue Dec 23 2008
+
+    .. change::
+        :tags:
+        :tickets:
+
+      Fixed compatibility with Jython 2.5b1.
+
+.. changelog::
+    :version: 0.2.3
+    :released: Sun Nov 23 2008
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added support for Jython 2.5.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added "cache" accessor to Template, Namespace.
+      e.g.  ${local.cache.get('somekey')} or
+      template.cache.invalidate_body()
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 92
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 93
+
+      fixed bug whereby an <%included> template with
+      <%page> args named the same as a __builtin__ would not
+      honor the default value specified in <%page>
+
+    .. change::
+        :tags:
+        :tickets: 88
+
+      fixed the html_error_template not handling tracebacks from
+      normal .py files with a magic encoding comment
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 90
+
+      fixed Python 2.3 compat. in mako.pyparser
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix Babel 0.9.3 compatibility; stripping comment tags is now
+      optional (and enabled by default).
+
+.. changelog::
+    :version: 0.2.2
+    :released: Mon Jun 23 2008
+
+    .. change::
+        :tags:
+        :tickets: 87
+
+      cached blocks now use the current context when rendering
+      an expired section, instead of the original context
+      passed in
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+.. changelog::
+    :version: 0.2.1
+    :released: Mon Jun 16 2008
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fixed bug where 'output_encoding' parameter would prevent
+      render_unicode() from returning a unicode object.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      bumped magic number, which forces template recompile for
+      this version (fixes incompatible compile symbols from 0.1
+      series).
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added a few docs for cache options, specifically those that
+      help with memcached.
+
+.. changelog::
+    :version: 0.2.0
+    :released: Tue Jun  3 2008
+
+    .. change::
+        :tags:
+        :tickets:
+
+      Speed improvements (as though we needed them, but people
+      contributed and there you go):
+
+    .. change::
+        :tags:
+        :tickets: 77
+
+      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%. (courtesy
+      anonymous guest)
+
+    .. change::
+        :tags:
+        :tickets: 76
+
+      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)
+
+    .. change::
+        :tags:
+        :tickets:
+
+      New Features, API changes:
+
+    .. change::
+        :tags:
+        :tickets: 62
+
+      added "attr" accessor to namespaces. Returns
+      attributes configured as module level attributes, i.e.
+      within <%! %> sections.  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.
+
+    .. change::
+        :tags:
+        :tickets: 78
+
+      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}"/>
+
+    .. change::
+        :tags:
+        :tickets:
+
+      some functions on Context are now private:
+      _push_buffer(), _pop_buffer(),
+      caller_stack._push_frame(), caller_stack._pop_frame().
+
+    .. change::
+        :tags:
+        :tickets: 56, 81
+
+      added a runner script "mako-render" which renders
+      standard input as a template to stdout
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 83, 84
+
+      can now use most names from __builtins__ as variable
+      names without explicit declaration (i.e. 'id',
+      'exception', 'range', etc.)
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 84
+
+      can also use builtin names as local variable names
+      (i.e. dict, locals) (came from fix for)
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 68
+
+      fixed bug in python generation when variable names are
+      used with identifiers like "else", "finally", etc.
+      inside them
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 69
+
+      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
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 71
+
+      fixed issue with inline format_exceptions that was
+      producing blank exception pages when an inheriting
+      template is present
+
+    .. change::
+        :tags: bugfixes
+        :tickets:
+
+      format_exceptions will apply the encoding options of
+      html_error_template() to the buffered output
+
+    .. change::
+        :tags: bugfixes
+        :tickets: 75
+
+      rewrote the "whitespace adjuster" function to work
+      with more elaborate combinations of quotes and
+      comments
+
+
+.. changelog::
+    :version: 0.1.10
+    :released:
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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)
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fixed bug where local.get_namespace() could put an
+      incorrect "self" in the current context
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fixed another namespace bug where the namespace functions
+      did not have access to the correct context containing
+      their 'self' and 'parent'
+
+.. changelog::
+    :version: 0.1.9
+    :released:
+
+    .. change::
+        :tags:
+        :tickets: 47
+
+      filters.Decode filter can also accept a non-basestring
+      object and will call str() + unicode() on it
+
+    .. change::
+        :tags:
+        :tickets: 53
+
+      comments can be placed at the end of control lines,
+      i.e. if foo: # a comment,, thanks to
+      Paul Colomiets
+
+    .. change::
+        :tags:
+        :tickets: 16
+
+      fixed expressions and page tag arguments and with embedded
+      newlines in CRLF templates, follow up to, thanks
+      Eric Woroshow
+
+    .. change::
+        :tags:
+        :tickets: 51
+
+      added an IOError catch for source file not found in RichTraceback
+      exception reporter
+
+.. changelog::
+    :version: 0.1.8
+    :released: Tue Jun 26 2007
+
+    .. change::
+        :tags:
+        :tickets:
+
+      variable names declared in render methods by internal
+      codegen prefixed by "__M_" to prevent name collisions
+      with user code
+
+    .. change::
+        :tags:
+        :tickets: 45
+
+      added a Babel (http://babel.edgewall.org/) extractor entry
+      point, allowing extraction of gettext messages directly from
+      mako templates via Babel
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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').
+
+    .. change::
+        :tags:
+        :tickets: 35
+
+      more tg fix:  fixed, allowing string-based
+      templates with tgplugin even if non-compatible args were sent
+
+.. changelog::
+    :version: 0.1.7
+    :released: Wed Jun 13 2007
+
+    .. change::
+        :tags:
+        :tickets:
+
+      one small fix to the unit tests to support python 2.3
+
+    .. change::
+        :tags:
+        :tickets:
+
+      a slight hack to how cache.py detects Beaker's memcached,
+      works around unexplained import behavior observed on some
+      python 2.3 installations
+
+.. changelog::
+    :version: 0.1.6
+    :released: Fri May 18 2007
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 34
+
+      fix to module_directory path generation when the path is "./"
+
+    .. change::
+        :tags:
+        :tickets: 35
+
+      TGPlugin passes options to string-based templates
+
+    .. change::
+        :tags:
+        :tickets: 28
+
+      added an explicit stack frame step to template runtime, which
+      allows much simpler and hopefully bug-free tracking of 'caller',
+      fixes
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 37
+
+      fix to RichTraceback and exception reporting to get template
+      source code as a unicode object
+
+    .. change::
+        :tags:
+        :tickets: 39
+
+      html_error_template includes options "full=True", "css=True"
+      which control generation of HTML tags, CSS
+
+    .. change::
+        :tags:
+        :tickets: 40
+
+      added the 'encoding_errors' parameter to Template/TemplateLookup
+      for specifying the error handler associated with encoding to
+      'output_encoding'
+
+    .. change::
+        :tags:
+        :tickets: 37
+
+      the Template returned by html_error_template now defaults to
+      output_encoding=sys.getdefaultencoding(),
+      encoding_errors='htmlentityreplace'
+
+    .. change::
+        :tags:
+        :tickets:
+
+      control lines, i.e. % lines, support backslashes to continue long
+      lines (#32)
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fixed codegen bug when defining <%def> within <%call> within <%call>
+
+    .. change::
+        :tags:
+        :tickets:
+
+      leading utf-8 BOM in template files is honored according to pep-0263
+
+.. changelog::
+    :version: 0.1.5
+    :released: Sat Mar 31 2007
+
+    .. change::
+        :tags:
+        :tickets: 26
+
+      AST expression generation - added in just about everything
+      expression-wise from the AST module
+
+    .. change::
+        :tags:
+        :tickets: 27
+
+      AST parsing, properly detects imports of the form "import foo.bar"
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix to lexing of <%docs> tag nested in other tags
+
+    .. change::
+        :tags:
+        :tickets: 29
+
+      fix to context-arguments inside of <%include> tag which broke
+      during 0.1.4
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added "n" filter, disables *all* filters normally applied to an expression
+      via <%page> or default_filters (but not those within the filter)
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+.. changelog::
+    :version: 0.1.4
+    :released: Sat Mar 10 2007
+
+    .. change::
+        :tags:
+        :tickets:
+
+      got defs-within-defs to be cacheable
+
+    .. change::
+        :tags:
+        :tickets: 23
+
+      fixes to code parsing/whitespace adjusting where plain python comments
+      may contain quote characters
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix to variable scoping for identifiers only referenced within
+      functions
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added a path normalization step to lookup so URIs like
+      "/foo/bar/../etc/../foo" pre-process the ".." tokens before checking
+      the filesystem
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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
+
+    .. change::
+        :tags:
+        :tickets:
+
+      <%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.)
+
+    .. change::
+        :tags:
+        :tickets:
+
+      <%include> plus arguments is also programmatically available via
+      self.include_file(<filename>, **kwargs)
+
+    .. change::
+        :tags:
+        :tickets: 24
+
+      further escaping added for multibyte expressions in %def, %call
+      attributes
+
+.. changelog::
+    :version: 0.1.3
+    :released: Wed Feb 21 2007
+
+    .. change::
+        :tags:
+        :tickets:
+
+      ***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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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>.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      new multiline comment form: "<%doc> a comment </%doc>"
+
+    .. change::
+        :tags:
+        :tickets:
+
+      UNDEFINED evaluates to False
+
+    .. change::
+        :tags:
+        :tickets:
+
+      improvement to scoping of "caller" variable when using <%call> tag
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added lexer error for unclosed control-line (%) line
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added mako.ext.preprocessors package, contains one preprocessor so far:
+      'convert_comments', which will convert single # comments to the new ##
+      format
+
+.. changelog::
+    :version: 0.1.2
+    :released: Thu Feb  1 2007
+
+    .. change::
+        :tags:
+        :tickets: 11
+
+      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
+
+    .. change::
+        :tags:
+        :tickets:
+
+      all template lexing converts the template to unicode first, to
+      immediately catch any encoding issues and ensure internal unicode
+      representation.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added module_filename argument to Template to allow specification of a
+      specific module file
+
+    .. change::
+        :tags:
+        :tickets: 14
+
+      added modulename_callable to TemplateLookup to allow a function to
+      determine module filenames (takes filename, uri arguments). used for
+
+    .. change::
+        :tags:
+        :tickets:
+
+      added optional input_encoding flag to Template, to allow sending a
+      unicode() object with no magic encoding comment
+
+    .. change::
+        :tags:
+        :tickets:
+
+      "expression_filter" argument in <%page> applies only to expressions
+
+    .. change::
+        :tags: "unicode"
+        :tickets:
+
+      added "default_filters" argument to Template, TemplateLookup. applies only
+      to expressions, gets prepended to "expression_filter" arg from <%page>.
+      defaults to, so that all expressions get stringified into u''
+      by default (this is what Mako already does). By setting to [], expressions
+      are passed through raw.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      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.
+
+    .. change::
+        :tags:
+        :tickets: 16
+
+      support for CRLF templates...whoops ! welcome to all the windows users.
+
+    .. change::
+        :tags:
+        :tickets:
+
+      small fix to local variable propigation for locals that are conditionally
+      declared
+
+    .. change::
+        :tags:
+        :tickets:
+
+      got "top level" def calls to work, i.e. template.get_def("somedef").render()
+
+.. changelog::
+    :version: 0.1.1
+    :released: Sun Jan 14 2007
+
+    .. change::
+        :tags:
+        :tickets: 8
+
+      buffet plugin supports string-based templates, allows ToscaWidgets to work
+
+    .. change::
+        :tags:
+        :tickets:
+
+      AST parsing fixes: fixed TryExcept identifier parsing
+
+    .. change::
+        :tags:
+        :tickets:
+
+      removed textmate tmbundle from contrib and into separate SVN location;
+      windows users cant handle those files, setuptools not very good at
+      "pruning" certain directories
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix so that "cache_timeout" parameter is propigated
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix to expression filters so that string conversion (actually unicode)
+      properly occurs before filtering
+
+    .. change::
+        :tags:
+        :tickets:
+
+      better error message when a lookup is attempted with a template that has no
+      lookup
+
+    .. change::
+        :tags:
+        :tickets:
+
+      implemented "module" attribute for namespace
+
+    .. change::
+        :tags:
+        :tickets:
+
+      fix to code generation to correctly track multiple defs with the same name
+
+    .. change::
+        :tags:
+        :tickets: 9
+
+      "directories" can be passed to TemplateLookup as a scalar in which case it
+      gets converted to a list
diff --git a/doc/build/conf.py b/doc/build/conf.py
index 5bfd996..aabdf18 100644
--- a/doc/build/conf.py
+++ b/doc/build/conf.py
@@ -31,7 +31,8 @@
 #                'sphinx.ext.doctest', 'builder.builders']
 
 extensions = ['sphinx.ext.autodoc','sphinx.ext.intersphinx',
-                'sphinx.ext.doctest', 'builder.builders']
+                'changelog', 'sphinx_paramlinks',
+                'builder.builders']
 
 # Add any paths that contain templates here, relative to this directory.
 templates_path = ['templates']
diff --git a/doc/build/index.rst b/doc/build/index.rst
index a81d5ba..3104ca9 100644
--- a/doc/build/index.rst
+++ b/doc/build/index.rst
@@ -13,6 +13,7 @@
     filtering
     unicode
     caching
+    changelog
 
 Indices and Tables
 ------------------
diff --git a/doc/build/requirements.txt b/doc/build/requirements.txt
new file mode 100644
index 0000000..35f3f21
--- /dev/null
+++ b/doc/build/requirements.txt
@@ -0,0 +1,2 @@
+changelog
+sphinx-paramlinks>=0.2.0
diff --git a/mako/__init__.py b/mako/__init__.py
index 76c1045..aa99505 100644
--- a/mako/__init__.py
+++ b/mako/__init__.py
@@ -1,5 +1,5 @@
 # mako/__init__.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/_ast_util.py b/mako/_ast_util.py
index 3b0bd21..788b86a 100644
--- a/mako/_ast_util.py
+++ b/mako/_ast_util.py
@@ -1,5 +1,5 @@
 # mako/_ast_util.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ast.py b/mako/ast.py
index f9ae3e1..24ef1b4 100644
--- a/mako/ast.py
+++ b/mako/ast.py
@@ -1,5 +1,5 @@
 # mako/ast.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/cache.py b/mako/cache.py
index 4433040..b7de6b5 100644
--- a/mako/cache.py
+++ b/mako/cache.py
@@ -1,5 +1,5 @@
 # mako/cache.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/codegen.py b/mako/codegen.py
index 2779a6d..769e0c6 100644
--- a/mako/codegen.py
+++ b/mako/codegen.py
@@ -1,5 +1,5 @@
 # mako/codegen.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/exceptions.py b/mako/exceptions.py
index dcf81a6..b8f97ee 100644
--- a/mako/exceptions.py
+++ b/mako/exceptions.py
@@ -1,5 +1,5 @@
 # mako/exceptions.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/autohandler.py b/mako/ext/autohandler.py
index d56cbc1..99f651a 100644
--- a/mako/ext/autohandler.py
+++ b/mako/ext/autohandler.py
@@ -1,5 +1,5 @@
 # ext/autohandler.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/babelplugin.py b/mako/ext/babelplugin.py
index 538c048..2ff0781 100644
--- a/mako/ext/babelplugin.py
+++ b/mako/ext/babelplugin.py
@@ -1,5 +1,5 @@
 # ext/babelplugin.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/preprocessors.py b/mako/ext/preprocessors.py
index 5a15ff3..94569c5 100644
--- a/mako/ext/preprocessors.py
+++ b/mako/ext/preprocessors.py
@@ -1,5 +1,5 @@
 # ext/preprocessors.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/pygmentplugin.py b/mako/ext/pygmentplugin.py
index 040a25c..7e3cb42 100644
--- a/mako/ext/pygmentplugin.py
+++ b/mako/ext/pygmentplugin.py
@@ -1,5 +1,5 @@
 # ext/pygmentplugin.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/ext/turbogears.py b/mako/ext/turbogears.py
index a4179d0..ebbee50 100644
--- a/mako/ext/turbogears.py
+++ b/mako/ext/turbogears.py
@@ -1,5 +1,5 @@
 # ext/turbogears.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/filters.py b/mako/filters.py
index 77aaf75..369cbc3 100644
--- a/mako/filters.py
+++ b/mako/filters.py
@@ -1,5 +1,5 @@
 # mako/filters.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/lexer.py b/mako/lexer.py
index 42b9ecd..dca88e1 100644
--- a/mako/lexer.py
+++ b/mako/lexer.py
@@ -1,5 +1,5 @@
 # mako/lexer.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/lookup.py b/mako/lookup.py
index 3edd101..3ac21f4 100644
--- a/mako/lookup.py
+++ b/mako/lookup.py
@@ -1,5 +1,5 @@
 # mako/lookup.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/parsetree.py b/mako/parsetree.py
index 1c04c26..ab83c5c 100644
--- a/mako/parsetree.py
+++ b/mako/parsetree.py
@@ -1,5 +1,5 @@
 # mako/parsetree.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/pygen.py b/mako/pygen.py
index ed7ccc7..cba9464 100644
--- a/mako/pygen.py
+++ b/mako/pygen.py
@@ -1,5 +1,5 @@
 # mako/pygen.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/pyparser.py b/mako/pyparser.py
index 75301cc..fc4db9d 100644
--- a/mako/pyparser.py
+++ b/mako/pyparser.py
@@ -1,5 +1,5 @@
 # mako/pyparser.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/runtime.py b/mako/runtime.py
index f94c109..5a3489b 100644
--- a/mako/runtime.py
+++ b/mako/runtime.py
@@ -1,5 +1,5 @@
 # mako/runtime.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/template.py b/mako/template.py
index 3a7b7f0..00783b7 100644
--- a/mako/template.py
+++ b/mako/template.py
@@ -1,5 +1,5 @@
 # mako/template.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php
diff --git a/mako/util.py b/mako/util.py
index 0a9e14e..0108109 100644
--- a/mako/util.py
+++ b/mako/util.py
@@ -1,5 +1,5 @@
 # mako/util.py
-# Copyright (C) 2006-2013 the Mako authors and contributors <see AUTHORS file>
+# Copyright (C) 2006-2014 the Mako authors and contributors <see AUTHORS file>
 #
 # This module is part of Mako and is released under
 # the MIT License: http://www.opensource.org/licenses/mit-license.php