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