🎄
Python で Markdown を Html に変換する(応用編+α)
これまでの記事:
ブロック要素の Renderer を(部分的に)カスタムする
前回の記事の通り、ブロック要素をイチから定義するのは大変そうです。
が、既存の処理+α程度であれば自作の Renderer のなかで HTMLRenderer
内のメソッドをオーバーライドしてやれば良いことがわかりました。
class Underline(SpanToken):
pattern = re.compile(r"\[_(.+?)_\]")
class CheckBox(SpanToken):
parse_group = 0
pattern = re.compile(r"\[ \]|\[x\]")
def __init__(self, mo:re.Match):
filled = mo.group(0) == "[x]"
if filled:
self.stat = "checked"
else:
self.stat = ""
class CustomRenderer(HTMLRenderer):
def __init__(self):
super().__init__(CheckBox, Underline)
def render_underline(self, token):
template = "<u>{}</u>"
return template.format(self.render_inner(token))
def render_check_box(self, token):
template = '<input type="checkbox" disabled {stat}>'
return template.format(stat=token.stat)
# メソッドをオーバーライドする
def render_list_item(self, token):
if len(token.children) == 0:
return '<li></li>'
inner = '\n'.join([self.render(child) for child in token.children])
inner_template = '\n{}\n'
if self._suppress_ptag_stack[-1]:
if token.children[0].__class__.__name__ == 'Paragraph':
inner_template = inner_template[1:]
if token.children[-1].__class__.__name__ == 'Paragraph':
inner_template = inner_template[:-1]
return '<li><div class="wrapper-li">{}</div></li>'.format(inner_template.format(inner))
ここでは <li></li>
を <li><div class="wrapper-li"></div></li>
のようにして変換するように render_list_item()
メソッドを上書きしました。
(html_renderer.py の中身をコピペして修正)
次こそは発展編(DOM操作)ですっ…!
→ 発展編
Discussion