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")

その他

このサイトのサンプルコードも参考になるかも

ページのトップへ戻る