Python-Markdown基本編
初回公開:2018/01/01
最終更新:2018/01/13
Markdownについては
Markdown処理できるラィブラリはいろいろあって
【 目次 】
Python-Markdown
PythonでMarkdownテキストをhtmlに変換するにはPython-Markdownがよく使われているようだ。
公式ページ
ドキュメントは
ドキュメントを当サイトで翻訳(翻訳中にバージョンが変わってしまって,ドキュメントサイトのURLが変更になったり内容も若干変更されてしまっているようだが)
インストールは
pip install markdown
または
easy_install markdown
pipについては「Pythonの開発環境を整える - 愚鈍人」。
だいぶ前にインストールしたので記憶が定かでないが、私のセットアップ環境の場合には以下のようにしたようなメモが残っていた。
インストール例
Python2.7
Python2.7に対しては
私の環境ではpipのインストールデレクトリにpathをとうしていないので、 Python2.7のpipのデレクトリに移動して
cd C:\Python27\Scripts pip2.7 install markdown
C:\Python27\Lib\site-packages\markdown
にインストールされた。
Python3.4
ついでにPython3.4に対しても
cd C:\Python34\Scripts pip3.4 install markdown
C:\Python34\Lib\site-packages\markdown
にインストールされた
Eclipse Pleiades All in One 4.4.1.v20140926
Pleiades All in One 4.4.1.v20140926 - Eclipseの場合には
python2にはデフォルトでpipがインストールされていないので setuptoolsとpipのインストールをしてからPython-Markdownをインストール。
cd C:\Rd\Python\pleiades-e4.4-python-jre_20140926\pleiades\python\2 python C:\Python27\tmp\ez_setup.py easy_install pip pip2.7 install markdown
C:\Rd\Python\pleiades-e4.4-python-jre_20140926\pleiades\python\2\Lib\site-packages\markdown
にインストールされた。
python3の場合はpipがインストール済みなので
cd C:\Rd\Python\pleiades-e4.4-python-jre_20140926\pleiades\python\3\Scripts pip3.4 install markdown
しかし
Fatal error in launcher: Unable to create process using '"D:\dev\tools\python\64bit\3\python.exe" "C:\Rd\Python\pleiades-e4.4-python-jre_20140926\pleiades\python\3\Scripts\pip.exe" install markdown'
と表示されてエラーとなってしまった。
何故かD:\dev\tools\python\64bit\3\python.exe
を探している。
多分、pipをインストールし直せばいいのだろうが、面倒くさいので
pipを使わずにMarkdown 2.5.2 : Python Package Indexより、Markdown-2.5.2.zipをダウンロード
解凍して直接インストール
また、別にpython3がインストールしてあるのでそっちを使ってもよいのだが。
cd <Markdown-2.5.2.zip解凍デレクトリ>\Markdown-2.5.2 C:\Rd\Python\pleiades-e4.4-python-jre_20140926\pleiades\python\3\python.exe setup.py install
動作確認
convert関数を使って動作確認。
Python-Markdownのconvert関数を使って動作確認
#coding: UTF-8 import markdown makedown_text = u''' ドキュメントタイトル =================== Markdownについては - [MarkdownでHTMLを簡単に - 愚鈍人](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=markdown_memo) - [MarkdownでHTMLを簡単に - Sublime Tex 編 - 愚鈍人](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=sublime_markdown) ''' print markdown.Markdown().convert(makedown_text)
python3の場合はprint文に()が必要。
コマンドラインからの実行
コマンドラインからの実行も可能
markdownファイル(md_test.md)として以下の内容を文字コードutf-8形式で保存して
ドキュメントタイトル =================== Markdownについては - [MarkdownでHTMLを簡単に - 愚鈍人](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=markdown_memo) - [MarkdownでHTMLを簡単に - Sublime Tex 編 - 愚鈍人](http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=sublime_markdown)
以下のコマンドを実行。
python -m markdown md_test.md
指定できるオプション等コマンドの形式の説明は
python -m markdown --help
また、[pythonインストールデレクトリ]\Scriptsフォルダにmarkdown_py.batができているのでこれを実行しても良い。
C:\Python27\Scripts\markdown_py.bat md_test.md
しかし、日本語のドキュメントの場合はコマンドプロンプトに出力するとunicodeで表示されるため文字化けで表示されてしまうようだ。
だが、リダイレクトでファイルに出力してファイルの内容を確認してみると
python -m markdown md_test.md > md_test.html
utf-8の文字コードで出力されているのが確認できる。
markdownのAPI
公開関数
Python-Markdownパッケージには2つの公開の関数が用意されている。
markdown関数
markdown文字列をhtmlテキストに変換するにはmarkdown関数を使って
import markdown html_text = markdown.markdown(makedown_text) print "html1" print html_text
ファイルからファイルへmakedownテキストをhtmlテキスト変換するには、「MarkdownをPythonライブラリとして使用する」のコードを参考に
(各ファイルの文字コードがutf-8であるとすると)
import markdown import codecs input_file = codecs.open("md_test.md", mode="r", encoding="utf-8") makedown_text = input_file.read() output_file = codecs.open("md_test.html", "w", encoding="utf-8", errors="xmlcharrefreplace" ) template_file = codecs.open("template.html", mode="r", encoding="utf-8") html_template = template_file.read() html_text = html_template.format(markdown.markdown(makedown_text)) output_file.write(html_text)
errors="xmlcharrefreplace
の意味は、
外枠のhtmlテンプレートファイルtemplate.htmlを用意して
template.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>markdownテスト</title> </head> <body> {0} </body> </html>
出力ファイルmd_test.htmlの内容
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>markdownテスト</title> </head> <body> <h1>ドキュメントタイトル</h1> <p>Markdownについては</p> <ul> <li><a href="http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=markdown_memo">MarkdownでHTMLを簡単に - 愚鈍人</a></li> <li><a href="http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=sublime_markdown">MarkdownでHTMLを簡単に - Sublime Tex 編 - 愚鈍人</a></li> </ul> </body> </html>
markdownFromFile関数
ファイルからファイルへmakedownテキストをhtmlテキスト変換するには、markdownFromFile関数を用いることでもっと簡単なコードで実現できる。
import markdown markdown.markdownFromFile(input="md_test.md", output="md_test2.html", encoding="utf8")
出力ファイルmd_test2.html
<h1>ドキュメントタイトル</h1> <p>Markdownについては</p> <ul> <li><a href="http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=markdown_memo">MarkdownでHTMLを簡単に - 愚鈍人</a></li> <li><a href="http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=sublime_markdown">MarkdownでHTMLを簡単に - Sublime Tex 編 - 愚鈍人</a></li> </ul>
引数outputの指定を省略すると標準出力に出力される。
Markdownクラス
前述のmarkdownモジュールの公開関数markdownおよびmarkdownFromFileはMarkdownクラスのインスタンスメソッドのラッパー関数になっているようで、
私のPython2.7環境ではC:\Python27\Lib\site-packages\markdown\__init__.py
の中で定義されている。
その主要な部分を抜粋してみると以下のようになっている。
def markdown(text, *args, **kwargs): md = Markdown(*args, **kwargs) return md.convert(text) def markdownFromFile(*args, **kwargs): md = Markdown(**kwargs) md.convertFile(kwargs.get('input', None), kwargs.get('output', None), kwargs.get('encoding', None))
関数の内部でMarkdownクラスのオブジェクトを生成してそのインスタンスメソッドを呼び出している事になる。
複数のドキュメントを変換する場合は、公開関数markdownおよびmarkdownFromFileを使って、いちいちMarkdownクラスのインスタンスを毎回生成していたのではパフォーマンスが低下してしまう。
そのため、直接 Markdownクラスのインスタンスを生成して、そのオブジェクトを使いまわした方が効率がよい事になる。
md = Markdown(*args, **kwargs)
では、Markdownクラスのコンストラクタやメソッドの引数にはどのようなものが指定できるのだろうか。
Markdownクラスは公開関数markdownおよびmarkdownFromFileと同様にC:\Python27\Lib\site-packages\markdown\__init__.py
で定義されていて、
そのソースに書かれているコメントを参照する事で、どのような引数が指定できるのかがだいたいの想像ができる。
Markdownクラスのソースより抜粋
class Markdown(object): ... 途中略 def __init__(self, *args, **kwargs): """ Creates a new Markdown instance. Keyword arguments: * extensions: A list of extensions. If they are of type string, the module mdx_name.py will be loaded. If they are a subclass of markdown.Extension, they will be used as-is. * extension_configs: Configuration settingis for extensions. * output_format: Format of output. Supported formats are: * "xhtml1": Outputs XHTML 1.x. Default. * "xhtml5": Outputs XHTML style tags of HTML 5 * "xhtml": Outputs latest supported version of XHTML (currently XHTML 1.1). * "html4": Outputs HTML 4 * "html5": Outputs HTML style tags of HTML 5 * "html": Outputs latest supported version of HTML (currently HTML 4). Note that it is suggested that the more specific formats ("xhtml1" and "html4") be used as "xhtml" or "html" may change in the future if it makes sense at that time. * safe_mode: Deprecated! Disallow raw html. One of "remove", "replace" or "escape". * html_replacement_text: Deprecated! Text used when safe_mode is set to "replace". * tab_length: Length of tabs in the source. Default: 4 * enable_attributes: Enable the conversion of attributes. Default: True * smart_emphasis: Treat `_connected_words_` intelligently Default: True * lazy_ol: Ignore number of first item of ordered lists. Default: True """
それぞれの引数が何を意味するかについては「MarkdownをPythonライブラリとして使用する - 愚鈍人」を参照。
convertメソッド
引数で指定されたmarkdown文字列をhtml文字列に変換する。
markdown_object = markdown.Markdown() html_text=markdown_object.convert(makedown_text) print(html_text)
resetメソッド
reset処理の分だけパフォーマンスは落ちるようだが、markdown_objectをつかいまわして再利用する場合に以前のmarkdown_objectの内部状態を初期化するためメソッドのようだ。
resetメソッドはメソッドチェーンができるので
other_html_text=markdown_object.reset().convert(other_makedown_text)
のように簡潔にコードを記述できる。
convertFileメソッド
markdownFromFile関数のかわりに使用されるメソッドのようで、markdownFromFile関数はconvertFileメソッドのラッパ関数となっている。
markdown_object.convertFile(input="md_test.md", output="md_test2.html", encoding="utf8")
その他
このサイトのサンプルコードも参考になるかも