🎄

Python で Markdown を Html に変換する(応用編+α)

2022/01/10に公開

これまでの記事:


ブロック要素の 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