Armin Ronacher | de478f6 | 2007-02-28 22:35:04 +0100 | [diff] [blame] | 1 | # -*- coding: utf-8 -*- |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 2 | """ |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 3 | Jinja2 |
| 4 | ~~~~~~ |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 5 | |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 6 | Jinja2 is a template engine written in pure Python. It provides a |
| 7 | `Django`_ inspired non-XML syntax but supports inline expressions and |
| 8 | an optional `sandboxed`_ environment. |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 9 | |
| 10 | Nutshell |
| 11 | -------- |
| 12 | |
| 13 | Here a small example of a Jinja template:: |
| 14 | |
| 15 | {% extends 'base.html' %} |
| 16 | {% block title %}Memberlist{% endblock %} |
| 17 | {% block content %} |
| 18 | <ul> |
| 19 | {% for user in users %} |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 20 | <li><a href="{{ user.url }}">{{ user.username }}</a></li> |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 21 | {% endfor %} |
| 22 | </ul> |
| 23 | {% endblock %} |
| 24 | |
| 25 | Philosophy |
| 26 | ---------- |
| 27 | |
| 28 | Application logic is for the controller but don't try to make the life |
| 29 | for the template designer too hard by giving him too few functionality. |
| 30 | |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 31 | For more informations visit the new `jinja2 webpage`_ and `documentation`_. |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 32 | |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 33 | The `Jinja2 tip`_ is installable via `easy_install` with ``easy_install |
| 34 | Jinja2==dev``. |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 35 | |
| 36 | .. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security) |
| 37 | .. _Django: http://www.djangoproject.com/ |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 38 | .. _jinja webpage: http://jinja2.pocoo.org/ |
| 39 | .. _documentation: http://jinja2.pocoo.org/documentation/index.html |
| 40 | .. _Jinja tip: http://dev.pocoo.org/hg/jinja2-main/archive/tip.tar.gz#egg=Jinja2-dev |
Armin Ronacher | 5829306 | 2008-02-11 15:36:22 +0100 | [diff] [blame] | 41 | """ |
Armin Ronacher | 0830e25 | 2007-03-22 23:45:30 +0100 | [diff] [blame] | 42 | import os |
Armin Ronacher | d15a4dc | 2007-05-28 18:16:16 +0200 | [diff] [blame] | 43 | import sys |
Armin Ronacher | 0830e25 | 2007-03-22 23:45:30 +0100 | [diff] [blame] | 44 | import ez_setup |
| 45 | ez_setup.use_setuptools() |
Armin Ronacher | ee2c18e | 2007-04-20 22:39:04 +0200 | [diff] [blame] | 46 | |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 47 | from setuptools import setup, Extension, Feature |
| 48 | from distutils.command.build_ext import build_ext |
| 49 | from distutils.errors import CCompilerError, DistutilsPlatformError |
Armin Ronacher | de478f6 | 2007-02-28 22:35:04 +0100 | [diff] [blame] | 50 | |
Armin Ronacher | 0830e25 | 2007-03-22 23:45:30 +0100 | [diff] [blame] | 51 | |
Armin Ronacher | e21ced2 | 2007-03-22 23:57:10 +0100 | [diff] [blame] | 52 | def list_files(path): |
| 53 | for fn in os.listdir(path): |
| 54 | if fn.startswith('.'): |
| 55 | continue |
| 56 | fn = os.path.join(path, fn) |
| 57 | if os.path.isfile(fn): |
| 58 | yield fn |
| 59 | |
| 60 | |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 61 | def get_terminal_width(): |
| 62 | """Return the current terminal dimensions.""" |
| 63 | try: |
| 64 | from struct import pack, unpack |
| 65 | from fcntl import ioctl |
| 66 | from termios import TIOCGWINSZ |
| 67 | s = pack('HHHH', 0, 0, 0, 0) |
| 68 | return unpack('HHHH', ioctl(sys.stdout.fileno(), TIOCGWINSZ, s))[1] |
| 69 | except: |
| 70 | return 80 |
| 71 | |
| 72 | |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 73 | class optional_build_ext(build_ext): |
| 74 | """This class allows C extension building to fail.""" |
| 75 | |
| 76 | def run(self): |
| 77 | try: |
| 78 | build_ext.run(self) |
| 79 | except DistutilsPlatformError: |
| 80 | self._unavailable() |
| 81 | |
| 82 | def build_extension(self, ext): |
| 83 | try: |
| 84 | build_ext.build_extension(self, ext) |
| 85 | except CCompilerError, x: |
| 86 | self._unavailable() |
| 87 | |
| 88 | def _unavailable(self): |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 89 | width = get_terminal_width() |
| 90 | print '*' * width |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 91 | print """WARNING: |
| 92 | An optional C extension could not be compiled, speedups will not be |
| 93 | available.""" |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 94 | print '*' * width |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 95 | |
| 96 | |
Armin Ronacher | de478f6 | 2007-02-28 22:35:04 +0100 | [diff] [blame] | 97 | setup( |
Armin Ronacher | 203bfcb | 2008-04-24 21:54:44 +0200 | [diff] [blame] | 98 | name='Jinja2', |
Armin Ronacher | 4a3038d | 2008-04-07 18:46:27 +0200 | [diff] [blame] | 99 | version='2.0dev', |
Armin Ronacher | 015b0c9 | 2007-11-11 00:10:17 +0100 | [diff] [blame] | 100 | url='http://jinja.pocoo.org/', |
| 101 | license='BSD', |
| 102 | author='Armin Ronacher', |
| 103 | author_email='armin.ronacher@active-4.com', |
| 104 | description='A small but fast and easy to use stand-alone template ' |
| 105 | 'engine written in pure python.', |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 106 | long_description=__doc__, |
Armin Ronacher | e21ced2 | 2007-03-22 23:57:10 +0100 | [diff] [blame] | 107 | # jinja is egg safe. But because we distribute the documentation |
| 108 | # in form of html and txt files it's a better idea to extract the files |
Armin Ronacher | 015b0c9 | 2007-11-11 00:10:17 +0100 | [diff] [blame] | 109 | zip_safe=False, |
| 110 | classifiers=[ |
Armin Ronacher | f59bac2 | 2008-04-20 13:11:43 +0200 | [diff] [blame] | 111 | 'Development Status :: 4 Beta', |
Armin Ronacher | de478f6 | 2007-02-28 22:35:04 +0100 | [diff] [blame] | 112 | 'Environment :: Web Environment', |
| 113 | 'Intended Audience :: Developers', |
| 114 | 'License :: OSI Approved :: BSD License', |
| 115 | 'Operating System :: OS Independent', |
| 116 | 'Programming Language :: Python', |
Armin Ronacher | 8ebf1f9 | 2007-03-03 11:22:18 +0100 | [diff] [blame] | 117 | 'Topic :: Internet :: WWW/HTTP :: Dynamic Content', |
| 118 | 'Topic :: Software Development :: Libraries :: Python Modules', |
| 119 | 'Topic :: Text Processing :: Markup :: HTML' |
| 120 | ], |
Armin Ronacher | 4a3038d | 2008-04-07 18:46:27 +0200 | [diff] [blame] | 121 | packages=['jinja2'], |
Armin Ronacher | 015b0c9 | 2007-11-11 00:10:17 +0100 | [diff] [blame] | 122 | data_files=[ |
Armin Ronacher | 7ceced5 | 2008-05-03 10:15:31 +0200 | [diff] [blame] | 123 | ##('docs', list(list_files('docs/_build/html'))) |
Armin Ronacher | 0830e25 | 2007-03-22 23:45:30 +0100 | [diff] [blame] | 124 | ], |
Armin Ronacher | bd33f11 | 2008-04-18 09:17:32 +0200 | [diff] [blame] | 125 | features={ |
| 126 | 'speedups': Feature("optional C speed-enhancements", |
| 127 | standard=True, |
| 128 | ext_modules=[ |
| 129 | Extension('jinja2._speedups', ['jinja2/_speedups.c']) |
| 130 | ] |
| 131 | ) |
| 132 | }, |
Armin Ronacher | 2b60fe5 | 2008-04-21 08:23:59 +0200 | [diff] [blame] | 133 | extras_require={'i18n': ['Babel>=0.8']}, |
Armin Ronacher | f59bac2 | 2008-04-20 13:11:43 +0200 | [diff] [blame] | 134 | entry_points=""" |
| 135 | [babel.extractors] |
Armin Ronacher | b5124e6 | 2008-04-25 00:36:14 +0200 | [diff] [blame] | 136 | jinja2 = jinja.ext:babel_extract[i18n] |
Armin Ronacher | f59bac2 | 2008-04-20 13:11:43 +0200 | [diff] [blame] | 137 | """ |
Armin Ronacher | de478f6 | 2007-02-28 22:35:04 +0100 | [diff] [blame] | 138 | ) |