katagami:一个简单的xml/html模板库
katagami的Python项目详细描述
这个库是许多Python templating libraries库之一。
功能
- Based on XML’s Processing instructions (<?…?>)
- Simple features and simple implementation
- Python script inside XML/HTML with any level indentation
- Inline Python expression
- Embed Python script
- Block structure
- Supports both of Python 2 and Python 3
- As fast as mako
- Iteratable output
示例
用inline Python expression和python的为(Block structure)生成一个html字符串:
>>> from katagami import render_string, myprint >>> myprint(render_string('''<html> ... <body> ... <? for name in names: {?> ... <p>hello, <?=name?></p> ... <?}?> ... </body> ... </html>''', {'names': ['world', 'python']})) <html> <body> <BLANKLINE> <p>hello, world</p> <BLANKLINE> <p>hello, python</p> <BLANKLINE> </body> </html>
内联python表达式
此功能评估内联表达式并输出结果:
>>> myprint(render_string('''<html><body> ... <?='hello, world'?> ... </body></html>''')) <html><body> hello, world </body></html>
默认情况下,此示例引发异常,计算表达式必须是 str(unicode在python 2中):
>>> myprint(render_string('''<html><body> ... <?=1?> ... </body></html>''')) #doctest: +IGNORE_EXCEPTION_DETAIL Traceback (most recent call last): ... TypeError: Can't convert 'int' object to str implicitly
设置“cast”字符串功能:
>>> myprint(render_string('''<?py ... from katagami import cast_string ... ?><html><body> ... <?=1?> ... </body></html>''')) <html><body> 1 </body></html>
还可以设置除挂钩之外的功能:
>>> myprint(render_string('''<?py ... from katagami import except_hook ... ?><html><body> ... <?=1?> ... </body></html>''')) <html><body> Can't convert 'int' object to str implicitly </body></html>
嵌入python脚本
所有缩进将自动排列:
>>> myprint(render_string('''<html> ... <?py ... # It is a top level here. This works fine. ... if 1: ... msg = 'message from indented script' ... ?> ... <body> ... <p><?=msg?></p> ... <?py msg = 'message from single line script' # This works fine too. ?> ... <p><?=msg?></p> ... <? if 1: {?> ... <?py ... # Is is nested here. This also works fine. ... msg = 'message from nested indented script' ... ?> ... <p><?=msg?></p> ... <?}?> ... </body> ... </html>''')) <html> <BLANKLINE> <body> <p>message from indented script</p> <BLANKLINE> <p>message from single line script</p> <BLANKLINE> <BLANKLINE> <p>message from nested indented script</p> <BLANKLINE> </body> </html>
块结构
C型块结构缩进:
>>> myprint(render_string('''<html> ... <body> ... <p>hello, ... <? try: {?> ... <?=name?> ... <?} except NameError: {?> ... NameError ... <?} else: {?> ... never output here ... <?}?> ... </p> ... </body> ... </html>''')) <html> <body> <p>hello, <BLANKLINE> <BLANKLINE> NameError <BLANKLINE> </p> </body> </html>
注
- ‘<? }’ and ‘{ ?>’ are wrong. Don’t insert space. ‘<?}’ and ‘{?>’ are correct.
- Ending colon (‘:’) is required.
- Block closing ‘<?}?>’ is required.
编码检测
将自动检测编码:
>>> myprint(render_string(b'''<html> ... <head><meta charset="shift-jis"></head> ... <body>\x93\xfa\x96{\x8c\xea</body> ... </html>''')) <html> <head><meta charset="shift-jis"></head> <body>\u65e5\u672c\u8a9e</body> </html>
支持的格式:
- <?xml encoding=”ENCODING”?>
- <meta charset=”ENCODING”>
- <meta http-equiv=”Content-Type” content=”MIMETYPE; ENCODING”>
历史记录
- 2.0.1 improve backward compatibility of the test
- 2.0.0 change a lot and add some features
- 1.1.0 change api, add except_handler, add shorthand of gettext (<?_message?>),
- some fixes
- 1.0.3 fix ignoring encoding argument, fix indent bug, add renderString
- 1.0.2 improve doctest compatibility, some fixes
- 1.0.1 fix bugs, docs, speed
- 1.0.0 remove backward compatibility