Package: katagami
This library is one of manyPython templating libraries.FeaturesBased on XML’s Processing instructions (<?…?>)Simple features and simple implementationPython script inside XML/HTML with any level indentationInline Python expressionEmbed Python scriptBlock structureSupports both of Python 2 and Python 3As fast asmakoIteratable outputExampleMake a HTML string withinline Python expressionand Python’sfor(Block
structure):>>> 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>Inline Python expressionThis feature evaluates your inline expression and output to result:>>> myprint(render_string('''<html><body>
...     <?='hello, world'?>
... </body></html>'''))
<html><body>
    hello, world
</body></html>By the default, this example raises an exception, evaluated expression must bestr(unicodein 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 implicitlySet thecast_stringfeature:>>> myprint(render_string('''<?py
...         from katagami import cast_string
...     ?><html><body>
...     <?=1?>
... </body></html>'''))
<html><body>
    1
</body></html>Also set theexcept_hookfeature:>>> 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>Embed Python scriptAll indentation will be arranged automatically:>>> 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>Block structureIndentation with C-style block structure:>>> myprint(render_string('''<html>
... <body>
...     <p>hello,&nbsp;
...     <? try: {?>
...         <?=name?>
...     <?} except NameError: {?>
...         NameError
...     <?} else: {?>
...         never output here
...     <?}?>
...     </p>
... </body>
... </html>'''))
<html>
<body>
    <p>hello,&nbsp;
<BLANKLINE>
<BLANKLINE>
        NameError
<BLANKLINE>
    </p>
</body>
</html>Note‘<? }’ and ‘{ ?>’ are wrong. Don’t insert space. ‘<?}’ and ‘{?>’ are correct.Ending colon (‘:’) is required.Block closing ‘<?}?>’ is required.Encoding detectionEncoding will be detected automatically:>>> 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>Supported formats:<?xml encoding=”ENCODING”?><meta charset=”ENCODING”><meta http-equiv=”Content-Type” content=”MIMETYPE; ENCODING”>History2.0.1 improve backward compatibility of the test2.0.0 change a lot and add some features1.1.0 change api, add except_handler, add shorthand of gettext (<?_message?>),some fixes1.0.3 fix ignoringencodingargument, fix indent bug, addrenderString1.0.2 improve doctest compatibility, some fixes1.0.1 fix bugs, docs, speed1.0.0 remove backward compatibility