ANN: pyTenjin 1.0.0 - a high-speed and full-featured template engine
Dhaivat Pandya
dhaivatpandya at gmail.com
Tue Feb 22 09:31:35 EST 2011
On Feb 21, 8:15 pm, Makoto Kuwata <k... at kuwata-lab.com> wrote:
> Hi all,
>
> I released pyTenjin 1.0.0.http://pypi.python.org/pypi/Tenjin/http://www.kuwata-lab.com/tenjin/
>
> This release contains a lot of enhancements and changes.
>
> Overview
> --------
>
> * Very fast: about 10 times faster than Django template engine
> * Easy to learn: no need to learn template-original language
> * Full-featured: nestable layout template, partial template, preprocessing, etc.
> * Lightweight: only 2000 lines of code and very fast to import.
> * Google App Engine supported
>
> Documents
> ---------
>
> * User's Guide
> http://www.kuwata-lab.com/tenjin/pytenjin-users-guide.html
> * Examples
> http://www.kuwata-lab.com/tenjin/pytenjin-examples.html
> * CHANGES
> http://www.kuwata-lab.com/tenjin/pytenjin-CHANGES.txt
>
> Install
> -------
>
> $ sudo easy_install Tenjin
>
> Or:
>
> $ wgethttp://pypi.python.org/packages/source/T/Tenjin/Tenjin-1.0.0.tar.gz
> $ tar xzf Tenjin-1.0.0.tar.gz
> $ cd Tenjin-1.0.0/
> $ sudo python setup.py install
>
> Example
> -------
>
> ## views/example.pyhtml
> <?py #@ARGS title, items ?>
> <h2>${title}</h2>
> <table>
> <?py cycle = new_cycle('odd', 'even') ?>
> <?py for item in items: ?>
> <tr class="${cycle()}">
> <td>${item}</td>
> </tr>
> <?py #endfor ?>
> </table>
>
> ## main.py
> import tenjin
> #tenjin.set_template_encoding('utf-8') # optional (default 'utf-8')
> from tenjin.helpers import *
> from tenjin.html import *
> engine = tenjin.Engine(path=['views'])
> context = {'title': 'Example', 'items': ['Haruhi', 'Mikuru', 'Yuki'] }
> output = engine.render('example.pyhtml', context)
> print(output)
>
> ## output
> $ python main.py
> <h2>Example</h2>
> <table>
> <tr class="odd">
> <td>Haruhi</td>
> </tr>
> <tr class="even">
> <td>Mikuru</td>
> </tr>
> <tr class="odd">
> <td>Yuki</td>
> </tr>
> </table>
>
> Enhancements
> ------------
>
> * (IMPORTANT!!) Performance is improved (about 5 percent).
> To improve performance, compiled Python code is changed.
> This means that YOU MUST TOUCH ALL TEMPLATE FILES AND UPDATE TIME STAMPS
> OF THEM in order to clear cache data before using this release.
>
> ## touch all template files to clear cache data
> $ find . -name '*.pyhtml' | xargs touch
> ## show compiled python code
> $ cat ex.pyhtml
> <ul>
> <?py for item in items: ?>
> <li>${item}</li>
> <?py #endfor ?>
> <?ul>
> $ pytenjin -sb ex.pyhtml
> _extend=_buf.extend;_to_str=to_str;_escape=escape;
> _extend(('''<ul>\n''', ));
> for item in items:
> _extend((''' <li>''', _escape(_to_str(item)), '''</li>\n''', ));
> #endfor
> _extend(('''<?ul>\n''', ));
>
> * (IMPORTANT!!) Free-indent style supported. Now there is no limitation
> about indent.
>
> ## In the previous version, there is strong restriction about indent.
> <html>
> <body>
> <table>
> <?py for item in items: ?>
> <tr>
> <td>${item}</td>
> </tr>
> <?py #endfor ?>
> </table>
> </body>
> </html>
>
> ## In this release, you can place statements freely.
> <html>
> <body>
> <table>
> <?py for item in items: ?>
> <tr>
> <td>${item}</td>
> </tr>
> <?py #endfor ?>
> </table>
> </body>
> </html>
>
> * (IMPORTANT!!) SafeTemplate and SafeEngine classes are now provided.
> These classes support autoescaping similar to Django or Jinja2.
> See
> http://www.kuwata-lab.com/tenjin/pytenjin-users-guide.html#auto-escaping
> for details.
>
> * (IMPORTANT!!) New function 'tenjin.set_template_encoding()' is provided.
> If you prefer templates to be unicode-base like Django or Jinja2,
> call it before importing helpers.
>
> ## change Tenjin to be unicode-based
> import tenjin
> tenjin.set_template_encoding('utf-8') # call before importing helpers
> from tenjin.helpers import *
> ## The above is same as:
> #import tenjin
> #Template.encoding = 'utf-8'
> #tenjin.helpers.to_str = tenjin.helpers.generate_tostrfunc(decode='utf-8')
> #from tenjin.helpers import *
>
> Notice that you should NOT write '<?py # coding: utf-8 ?>' into template
> files if you call tenjin.set_template_encoding(). If you wrote it,
> SyntaxError exception would be raised.
>
> * (IMPORTANT!!) New helper function 'cache_as()' is available for
> fragment cache.
> This replaces 'not_cached()' and 'echo_cached()'.
>
> ## previous (obsolete)
> <?py if not_cached('cachekey1', 60): ?>
> ...
> <?py #endif ?>
> <?py echo_cached() ?>
>
> ## using new helper
> <?py for _ in cache_as('cachekey1', 60): ?>
> ...
> <?py #endfor ?>
>
> 'not_cached()' and 'echo_cached()' are still available but not recommended.
>
> * (IMPORTANT!!) New helper 'capture_as()' is available for capturing template.
> This replaces 'start_capture()' and 'stop_capture()'.
>
> ## preivous (obsolete)
> <?py start_capture('name') ?>
> ....
> <?py stop_capture() ?>
>
> ## using new helper
> <?py with capture_as('name'): ?>
> ....
> <?py #endfor ?>
>
> 'start_capture()' and 'stop_capture()' are still available but not
> recommended.
>
> New helper 'capture_as()' allows you to nest capturing which is
> impossible with 'start_capture()' and 'stop_capture()'.
>
> * If 'trace=True' is passed to Template class (or Engine class), output
> string will contain template file name. For example:
>
> <!-- ***** begin: hello.pyhtml ***** -->
> <div class="content">
> <p>Hello World!</p>
> </div>
> <!-- ***** end: hello.pyhtml ***** -->
>
> * tenjin.Engine now helps M17N of templates. If you pass 'lang' option to
> Engine, it will generates cache files for each langs from a file.
> This feature is intened to use with preprocessing in order to reduce
> catalog expantion cost (such as '${_("Hello")}')
>
> ## for lang='en'
> engine_en = tenjin.Engine(lang='en', preprocess=True)
> engine_en.render('index.pyhtml') # generates 'index.pyhtml.en.cache'
> ## for lang='fr'
> engine_fr = tenjin.Engine(lang='fr', preprocess=True)
> engine_fr.render('index.pyhtml') # generates 'index.pyhtml.fr.cache'
>
> * (Experimental) New html helper 'js_link()'.
>
> >>> from tenjin.html import *
> >>> js_link('click', 'alert("OK")', klass='link')
> '<a href="javascript:undefined"
> onclick="alert("OK");return false" class="link">click</a>'
>
> Changes
> -------
>
> * (IMPORTANT!!) You must close statement block of 'if', 'for', 'with', ...
> with corresponding '#endif', '#endfor', '#endwith', and so on.
> Notice that '#end' is available as almighty closer.
>
> * (IMPORTANT!!) tenjin.GaeMemcacheCacheStorage is removed (this is already
> announced in the previous release).
> Please use tenjin.gae.GaeMemcacheStorage instead.
>
> * 'tenjin.helpers.html' module is renamed to 'tenjin.html', but old module
> name is still available for backward compatibility.
>
> * escape_html() (and escape()) now escapes "'" into "'".
>
> * new_cycle() is moved from tenjin.helpers.html module to tenjin.helpers
> module because it is not only for HTML.
>
> * In GAE environment, Tenjin uses '1.1' as dummy value of CURRENT_VERSION_ID
> when it is not provided. This prevents error when using GAE and tenjin
> on test environment.
>
> * Python 2.3 is now unsupported. (Python 2.4 is still supported because
> CentOS uses Python 2.4).
>
> * (internal) Tenjin.escape_expr_and_escapeflag() is changed to
> Tenjin.escape_expr_and_flags().
>
> * (internal) Tenjin.add_expr() is changed to take 'flags' argument.
>
> * (internal) 'tenjin.__release__' is renamed to 'tenjin.__version__'.
>
> Bugfixes
> --------
>
> * Cache file saving was failed on Windows because existing file should be
> removed before renaming file. (patched by elishowk, thank you!)
>
> Thank you.
> --
> regards,
> makoto kuwata
I love that you have included python inside the templating. I hate
those templates which have a seperate template language.
More information about the Python-list
mailing list