Kajiki 0.8.2
Fast XML-based template engine with Genshi syntax and Jinja blocks
License: MIT
Keywords: templating engine template genshi jinja jinja2 mako chameleon xml html xhtml

Kajiki provides fast well-formed XML templates
==============================================

Because Kajiki's input is XML, it can ensure that your HTML/XML output is
well-formed. The Genshi-like syntax, based on XML attributes or tags, is simply
beautiful and easily understood (or ignored) by web designers.
But instead of the slow performance of Genshi_, Kajiki compiles
templates to Python code that renders with blazing-fast speed, so Kajiki can
compete with the speed of Jinja_, Mako_, Chameleon_ and others.
Also, one of Genshi's misfeatures -- py:match -- is replaced with blocks which
work like Jinja's blocks.

By combining the best ideas out there -- XML input,
Genshi's syntax and features, Jinja's template inheritance and final
compilation to Python --, Kajiki is ready to become
the most widely used templating engine for web development in Python.
And more features are coming soon; stay tuned!

Example
=======

.. code:: python

    >>> import kajiki
    >>> Template = kajiki.XMLTemplate('''<html>
    ...     <head><title>$title</title></head>
    ...     <body>
    ...         <h1>$title</h1>
    ...         <ul>
    ...             <li py:for="x in range(repetitions)">$title</li>
    ...         </ul>
    ...     </body>
    ... </html>''')
    >>> print(Template(dict(title='Kajiki is teh awesome!', repetitions=3)).render())
    <html>
        <head><title>Kajiki is teh awesome!</title></head>
        <body>
            <h1>Kajiki is teh awesome!</h1>
            <ul>
                <li>Kajiki is teh awesome!</li><li>Kajiki is teh awesome!</li><li>Kajiki is teh awesome!</li>
            </ul>
        </body>
    </html>


Links
=====

Documentation_

Kajiki is licensed under an MIT-style license_.

The git repository and `issue tracker`_ are at GitHub_. Previously the project
used SourceForge_ for the hg repository, issue tracker and forums.

We use Travis_ for continuous integration.


.. _Documentation: http://kajiki.readthedocs.org/
.. _license: https://github.com/nandoflorestan/kajiki/blob/master/LICENSE.rst
.. _`issue tracker`: https://github.com/nandoflorestan/kajiki/issues
.. _GitHub: https://github.com/nandoflorestan/kajiki
.. _SourceForge: http://sourceforge.net/p/kajiki/
.. _Travis: https://travis-ci.org/nandoflorestan/kajiki
.. _Genshi: https://pypi.python.org/pypi/Genshi
.. _Jinja: https://pypi.python.org/pypi/Jinja2
.. _Mako: https://pypi.python.org/pypi/Mako
.. _Chameleon: https://pypi.python.org/pypi/Chameleon

CHANGES
=======

0.8.2 (2019-11-26)
------------------

* Fixed some HTML entities not being properly recognised

0.8.1 (2019-10-20)
------------------

* Fixed unexpected <DOCTYPE> when including templates

0.8.0 (2019-06-03)
------------------

* Fixed support for Python 3.8
* Dropped support for Python 2.6 and 3.3

0.7.2 (2018-04-16)
------------------

* Improve parsing of ``${}`` expressions and fix syntax errors reporting in braced expressions.
* Improve parsing of documents with comments before the root element

0.7.1 (2017-09-11)
------------------

* Allow to replace ``gettext`` function by providing it in the template context or through ``base_globals`` in Loader

0.7.0 (2017-06-27)
------------------

* Text for i18n is now extracted ignoring the empty spaces surrounding the text itself. Empty text will always be treated as non translatable nodes for performance reasons.
* ``extract_python`` option will now report syntax errors when extracting text for translation.

0.6.3 (2017-05-25)
------------------

* Added ``extract_python`` option to babel message extractor, this allows extracting gettext calls in ``${}`` expressions

0.6.1 (2016-11-28)
------------------

* Actually report 0.6 in kajiki/version.py
* Expose ``strip_text`` option in loader

0.6.0 (2016-11-27)
------------------

* Fixed ``py:switch`` error message wrongly mentioning ``py:with``
* Support for multiline ``${}`` expressions
* Subsequent text nodes are now squashed into a single text node. This allows translating whole paragraphs instead of single sentences.
* Allow code and function calls inside tag attributes
* Added ``strip_text`` option to XMLTemplate and i18n collector to ensure leading and trailing spaces are stipped by text nodes (also leads to minified HTML)
* Some HTML nodes that do not require being closed but is commonly considered best practice to close them are now emitted with ending tag (IE: <p>)
* Generally improved code documentation to lower entry barrier for contributors


0.5.5 (2016-06-08)
------------------

* ``py:attrs`` will now emit the attribute name itself or will omit the attribute at all in case of
  ``bool`` values for 'checked', 'disabled', 'readonly', 'multiple', 'selected', 'nohref',
  'ismap', 'declare' and 'defer',

0.5.4 (2016-06-04)
------------------

* ``py:switch`` now correctly supports multiple ``py:case`` statements.
* text inside ``<script>`` and ``<style>`` tags is no longer collected translation.
* Syntax errors now report the line and the surrounding code when there is a markup or python syntax error.
* As ``py:swtich`` discards all its content apart from ``py:case`` and ``py:else`` statements it will now correctly report an error when the statements has other content.
* ``py:else`` will now correctly detect spurious content between itself and ``py:if`` as the two must be consequential.
* Improved code documentation on core classes.

0.5.3 (2016-01-25)
------------------

* ``py:with`` statement now keeps order of variables, so that variables can depend from each other.
* Babel is no longer a dependency unless you want to use the message extractor.

0.5.2 (2015-10-13)
------------------

* TranslatableTextNodes are now only generated for non-empty strings
* ``py:with`` statement now accepts multiple variables separated by semicolon
* Babel message extractor fixed on Python2

0.5.1 (2015-07-26)
------------------

* Fix crash on PyPy

0.5.0 (2015-07-25)
------------------

* CDATA sections created by the user are now properly preserved
* ``cdata_scripts=False`` option in ``XMLTemplate`` allows disabling automatic CDATA for script and style tags.
* Autoblocks experimental feature automatically creates blocks from specified tag names.

0.4.4 (2013-09-07)
------------------

* Also accept "$." without erroring out. In fact, accept anything.
* Add integration plugin for TurboGears 1

0.4.3 (2013-08-12)
------------------

* Accept "$(" without erroring out. Easier to write jQuery stuff.

0.4.2 (2013-08-01)
------------------

* There was a showstopper regression in FileLoader. Fixes #1

0.4.0 (2013-07-29)
------------------

* Support Python versions 2.6, 2.7, 3.2, 3.3 in a single codebase
  using the *nine* library.
* Support HTML entities as well as XML entities in input templates.
* py:include fixed, can see global variables.
* Genshi compatibility: support built-in functions:
  defined(), value_of() and Markup().
* ``py:def``: Do not crash if a function has no content.
* ``py:strip=''`` is the same as ``py:strip='True'``.
* Correctness: escape HTML attribute values.
* Correctness: Always close script tags, even in XML mode.
* Add integration module for the Pyramid web framework.
* Give the FileLoader a *path*, not just a base *directory*.
* Documentation improvements, including the need to write CDATA sections.
* Move from Sourceforge to Github.
* Use Travis for continuous integration.
* The whole codebase is formatted according to PEP8.

0.3.5 (2012-05-07)
------------------

* Several bugfixes
* Output HTML attributes in alphabetical order (for testability)

0.3.4 (2011-06-01)
------------------

* Make Kajiki work on Python 2.4

0.3.2 (2010-11-26)
------------------

* Fix Python 2.5 syntax error

0.3.1 (2010-11-24)
------------------

* Add support for py:with
* Remove unused babel import that was breaking pip/easy_install
* Python 2.5 fixes
* Correctly strip None attributes and expressions
* Turn off autoescaping in text templates

0.3 (2010-10-10)
----------------

* Adds i18n support
* Fixes several bugs: [#7], [#9], [#10]