2020年6月14日日曜日

Python Markdownで独自のタグを使う

目的

Bloggerの投稿をmarkdownでやりたい


やり方

方法は色々あると思うが、markdownをhtml形式に変換するのが手っ取り早かった

Qiita:Pythonでmarkdownをhtmlにコンバートする

こちらにmarkdownの使い方はまとまっていたので上記記事を参照した

ただし、私のbloggerではcodeタグではなく、<pre class="prettyprint"></p>で行っている

デフォルトのままでは```はcodeに変換されてしまう。。

その為、このタグを上書きして独自のタグを使うためのextensionを作成した


コード

import markdown
from markdown.inlinepatterns import Pattern
from markdown.extensions import Extension
import xml.etree.ElementTree as etree

BACKTICK_RE = r'([```]{3})(.*?)\2'

class CodePattern(Pattern):
    def handleMatch(self, m):
        if m.group(2) == '```':
            tag = 'pre'
            el = etree.Element(tag)
            el.text = m.group(3)
            el.set('class', "prettyprint")
            return el
        pass

class CodeExtension(Extension):
    def extendMarkdown(self, md):
        # Delete the old patterns
        md.inlinePatterns.deregister('backtick')

        # Add our new MultiPattern
        multi = CodePattern(BACKTICK_RE)
        md.inlinePatterns.register(multi, 'backtick', 100)


sample_text = '''
※今回の箇所はここ※
```
まさかコードも入れられるんですか?
if (!lie) {
    return true;
}
```
'''

md = markdown.Markdown(extensions=['tables', CodeExtension()])
print(md.convert(sample_text))

これを行うと、
<p>※今回の箇所はここ※
<pre class="prettyprint">
まさかコードも入れられるんですか?
if (!lie) {
    return true;
}
</pre>
</p>

と出力されるので、これをbloggerに貼り付ければHTMLを書くのがかなり楽になる。

参考

Tutorial: Writing-Extensions-for-Python-Markdown