tokenize
モジュールは入力形式を認識します。行には有効な Python 識別子が含まれており、ステートメントのインデント レベルは重要です。ElementTree
モジュールを使用すると、メモリ内のツリー構造を操作できるため、ツリーの作成を html としてのレンダリングから分離する方がより柔軟になる可能性があります。
from tokenize import NAME, INDENT, DEDENT, ENDMARKER, NEWLINE, generate_tokens
from xml.etree import ElementTree as etree
def parse(file, TreeBuilder=etree.TreeBuilder):
tb = TreeBuilder()
tb.start('ul', {})
for type_, text, start, end, line in generate_tokens(file.readline):
if type_ == NAME: # convert name to <li> item
tb.start('li', {})
tb.data(text)
tb.end('li')
elif type_ == NEWLINE:
continue
elif type_ == INDENT: # start <ul>
tb.start('ul', {})
elif type_ == DEDENT: # end </ul>
tb.end('ul')
elif type_ == ENDMARKER: # done
tb.end('ul') # end parent list
break
else: # unexpected token
assert 0, (type_, text, start, end, line)
return tb.close() # return root element
.start()
, .end()
, .data()
,.close()
メソッドを提供する任意のクラスを使用できます。TreeBuilder
たとえば、ツリーを構築する代わりに、オンザフライで html を記述できます。
stdin を解析し、html を stdout に書き込むには、次を使用できますElementTree.write()
。
import sys
etree.ElementTree(parse(sys.stdin)).write(sys.stdout, method='html')
出力:
<ul><li>A</li><ul><li>B</li><li>C</li><ul><li>D</li><li>E</li></ul></ul></ul>
だけでなく、任意のファイルを使用できますsys.stdin/sys.stdout
。
注: Python 3 で stdout に書き込むには、sys.stdout.buffer
またはencoding="unicode"
バイト/Unicode の区別によります。