back

epy.py - implementation of ePython

Introduction

epy.pyはPerlにあるePerl(embedded Perl)、RubyにあるeRuby(embedded Ruby)のような、ePython(embedded Python)のPython実装です。eRuby実装の中で最速のErubis、またPythonのテンプレートシステムの中で最速を誇るpyTenjinの作者の方の30 Lines Implementation of eRubyを下敷きにPythonで実装しました。

Feature

Download

http://wids.net/archive/epy/

Syntax

<% (python code) %>
Pythonコードとして実行。
<%= (python code) %>
Pythonコードとして実行され、返り値を表示。
<%# (python code) %>
コメント(出力結果には表示されませんが、Pythonコードとしてはコメントで残ります)。
<%=r (python code) %>
raw mode(エスケープコードがあった場合でも、エスケープせずに表示)。
<% %>
残りの1%。他のテンプレートシステムでendforendendifにあたるものです。Pythonコードのインデントレベルを1段階下げます。このアイデアはPython Server Pagesから拝借しました。

Example

Basic

Python 2.5 (release25-maint, Jul 20 2008, 20:47:25)
[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import epy
>>> epython = epy.ePython('Hello, <%= progname.replace("p", "P") %>')
>>> env = dict(progname='epython')
>>> print epython.render(env)
Hello, ePython
>>> print epython.pysrc
_buf = []
_buf.append(u'Hello, ')
_buf.append(_esc(unicode(progname.replace("p", "P"))))

__result = ''.join(_buf)

for loop

epython.src

<% for language in languages: %>
 <p>embedded <%= language %> is e<%= language.title() %>.</p>
 <% %>

epython.render(dict(languages=['perl', 'ruby', 'python'])

 <p>embedded perl is ePerl.</p>
 <p>embedded ruby is eRuby.</p>
 <p>embedded python is ePython.</p>

epytnon.pysrc

_buf = []
for language in languages:
 _buf.append(u' embedded ')
 _buf.append(_esc(unicode(language)))
 _buf.append(u' is e')
 _buf.append(_esc(unicode(language.title())))
 _buf.append(u'.\n')

__result = ''.join(_buf)

if .. elif .. else

epython.src

<p>Acronym dictionary - <%= ac %>:<br />
<% if ac == 'DoCoMo': %>
 Do Communication over the Mobile
<% elif ac == 'IBM': %>
 International Business Machines
<% else: %>
 A Clever Representation Of Names You Manufacture
 <% %></p>

epython.render(dict(ac='PCMCIA'))

<p>Acronym dictionary - PCMCIA:<br />
 A Clever Representation Of Names You Manufacture
</p>

epython.pysrc

_buf = []
_buf.append(u'<p>Acronym dictionary - ')
_buf.append(_esc(unicode(ac)))
_buf.append(u':<br />\n')
if ac == 'DoCoMo':
 _buf.append(u' Do Communication over the Mobile\n')
elif ac == 'IBM':
 _buf.append(u' International Business Machines\n')
else:
 _buf.append(u' A Clever Representation Of Names You Manufacture\n')
_buf.append(u'</p>\n')

__result = ''.join(_buf)

FAQ

「見た目」99%互換?

実際には、ここで実装されているePythonはインデントを考慮していません。

<% for language in languages: %>
 <p>embedded <%= language %> is e<%= language.title() %>.</p>
 <% %>

このコードは、

<% for language in languages: %>
<p>embedded <%= language %> is e<%= language.title() %>.</p>
<% %>

でも全く問題なく実行されます。ですから、「見た目」だけ互換です。

HTMLで出力したいんだけど、勝手にエスケープしてよ

epy.ePythonHTMLを使って下さい。勝手にエスケープします。勝手にエスケープされたくないところはraw modeにして下さい。

Requirements

Changelog

License

MIT License.