Markdownは最高
僕はMarkdownは最も最高なマークアップ言語の一つだと思います。なぜならGitHubが全般的に採用しているからです。この文章も全てMarkdownで記述されています。こうやってブログを書いていられるのもMarkdownが使えるからだと思っています。
普通にマークダウン
python-markdownを使います。pip install markdown
してfrom markdown import markdown
してhtml = markdown(raw)
でポコンとHTMLが生まれます。
GFMを扱う
そして世の中にはGitHub式Markdownというものがあります。GitHub Flavored Markdownです。GFMと略されます。「Markdownがここまで普及したのはGitHubのおかげ」というのは過言ではないと聞きます。
お客さまの声
Markdownが便利すぎて生きるのが辛い http://b.hatena.ne.jp/fakechan/20130613#bookmark-132564918
今回はPythonでGFMをレンダリングします。
py-gfmを使います。
「なぜDartの人達がPythonでMarkdown変換器を作っているのか」という疑問が頭をかすめたような気がするとか、そういうのは置いといてとりあえずインストールします。
pip install git+https://github.com/dart-lang/py-gfm
使います
html = md(raw, extensions=['gfm'])
幸せ。
危険なタグの排除
こんなことにならないようにしたいところではありますね。
実はlxmlにはハッピーな機能があってこれを使うと下が下下になります。
>>> html = '''\ ... <html> ... <head> ... <script type="text/javascript" src="evil-site"></script> ... <link rel="alternate" type="text/rss" src="evil-rss"> ... <style> ... body {background-image: url(javascript:do_evil)}; ... div {color: expression(evil)}; ... </style> ... </head> ... <body onload="evil_function()"> ... <!-- I am interpreted for EVIL! --> ... <a href="javascript:evil_function()">a link</a> ... <a href="#" onclick="evil_function()">another link</a> ... <p onclick="evil_function()">a paragraph</p> ... <div style="display: none">secret EVIL!</div> ... <object> of EVIL! </object> ... <iframe src="evil-site"></iframe> ... <form action="evil-site"> ... Password: <input type="password" name="password"> ... </form> ... <blink>annoying EVIL!</blink> ... <a href="evil-site">spam spam SPAM!</a> ... <image src="evil!"> ... </body> ... </html>'''
>>> from lxml.html.clean import clean_html >>> print clean_html(html) <div><style>/* deleted */</style><body> <a href="">a link</a> <a href="#">another link</a> <p>a paragraph</p> <div>secret EVIL!</div> of EVIL! Password: annoying EVIL!<a href="evil-site">spam spam SPAM!</a> <img src="evil!"></body></div>
こいつfrom lxml.html.clean import clean_html
ですね。このclean_htmlを使えば"最低限のいい感じ"になるんです。
pip install lxml
して早速html = clean_html(html)
しましょう。タグをremove_tags
として指定したりもできます。内容もまるごと消し去りたい場合は'kill_tags'。コードみるとかなり自由度高いですね。
最終的に
元気な赤ちゃんが生まれました。
ちなみにpip install pygments
してCSSを読み込むだけでhtmlのコードらへんがカラフルになりますヽ(´ー`)ノ
以上です。