epy.pyはPerlにあるePerl(embedded Perl)、RubyにあるeRuby(embedded Ruby)のような、ePython(embedded Python)のPython実装です。eRuby実装の中で最速のErubis、またPythonのテンプレートシステムの中で最速を誇るpyTenjinの作者の方の30 Lines Implementation of eRubyを下敷きにPythonで実装しました。
<% (python code) %>
<%= (python code) %>
<%# (python code) %>
<%=r (python code) %>
<% %>
endfor
やend
、endif
にあたるものです。Pythonコードのインデントレベルを1段階下げます。このアイデアはPython Server Pagesから拝借しました。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 language in languages: %>
<p>embedded <%= language %> is e<%= language.title() %>.</p>
<% %>
<p>embedded perl is ePerl.</p>
<p>embedded ruby is eRuby.</p>
<p>embedded python is ePython.</p>
_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)
<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>
<p>Acronym dictionary - PCMCIA:<br />
A Clever Representation Of Names You Manufacture
</p>
_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)
実際には、ここで実装されている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>
<% %>
でも全く問題なく実行されます。ですから、「見た目」だけ互換です。
epy.ePythonHTMLを使って下さい。勝手にエスケープします。勝手にエスケープされたくないところはraw modeにして下さい。