PythonでMarkdownをHTMLに変換する方法-応用編

IT・プログラミング

今回は、以前紹介したPythonでMarkdownをHTMLに変換するライブラリであるmarkdownのより細かい拡張機能を紹介していきます。
この拡張機能を使うことで、markdownのデフォルト状態では変換できないようなマークダウンも変換できるようになるので、かなり便利です。

様々な拡張機能

略語 (abbr)

略語を定義して使用することができる拡張機能です。Markdownテキスト内で略語を定義し、それを本文内で使用することができます。

Markdownテキスト:

*[HTML]: Hyper Text Markup Language
HTMLは*[HTML]の略です。

Pythonコードと変換結果の表示:

# Markdownテキスト
text6 = "*[HTML]: Hyper Text Markup Language\nHTMLは*[HTML]の略です。"
import markdown
from IPython.display import HTML, display


# MarkdownをHTMLに変換して表示する関数
def convert_to_html_and_display(text, extensions=None):
    if extensions is None:
        extensions = []  # デフォルトではエクステンションを使わない
    html = markdown.markdown(text, extensions=extensions)
    print("Markdown:")
    print(text)
    print("\nHTML:")
    display(HTML(html))
    print("\n\n")
    return html

# 変換結果を表示

html = convert_to_html_and_display(text6, extensions=['abbr'])

このセクションでは、略語を定義し、それを本文内で使用する方法について説明しています。*[略語]: 完全な表現という形式で略語を定義し、本文内では*[略語]を使用します。

CSSの追加 (attr_list)

この拡張機能を使用すると、要素に対してIDやクラスなどの属性を追加できます。特にHTMLへの変換時に、追加の属性が要素に追加されます。

Markdownテキスト:

pタグにidと属性を追加
{: #id名 .クラス名}
これはボックス内のメッセージです。

Pythonコードと変換結果の表示:

# Markdownテキスト
text7 = "{: .box #message}\nこれはボックス内のメッセージです。"

# 変換結果を表示
html = convert_to_html_and_display(text7, extensions=['attr_list'])

このセクションでは、Markdown記法を使用して要素にIDやクラス属性を追加する方法について説明しています。{: #id名 .クラス名}という形式で属性を指定します。

定義リスト (def_list)

定義リストは、項目とその定義を対にして表現するための拡張機能です。項目と定義の間にコロンを使用します。

Markdownテキスト:

アイスクリーム
: 冷たくておいしいデザート
チョコレート
: 甘いお菓子

Pythonコードと変換結果の表示:

# Markdownテキスト
text8 = "アイスクリーム\n: 冷たくておいしいデザート\nチョコレート\n: 甘いお菓子"

# 変換結果を表示
html = convert_to_html_and_display(text8, extensions=['def_list'])

このセクションでは、定義リストを作成する方法について説明しています。項目とその定義を対にして表現することができます。

脚注拡張版 (footnotes)

脚注を作成する拡張機能です。脚注の本文を記述し、その脚注を本文内で参照することができます。

Markdownテキスト:

これは脚注の例です。[^1]
[^1]: これは脚注の本文です。

Pythonコードと変換結果の表示:

# Markdownテキスト
text10 = "これは脚注の例です。[^1]\n[^1]: これは脚注の本文です。"

# 変換結果を表示
html = convert_to_html_and_display(text10, extensions=['footnotes'])

このセクションでは、脚注を作成し、本文内で脚注を参照する方法について説明しています。

Warning (admonition)

Admonition拡張機能を使用すると、警告やヒントなどの情報を強調して表示することができます。

Markdownテキスト:

!!! warning "注意"
これは注意の例です。

Pythonコードと変換結果の表示:

# Markdownテキスト
text11 = '!!! warning "注意"\nこれは注意の例です。'

# 変換結果を表示
convert_to_html_and_display(text11, extensions=['admonition'])

このセクションでは、警告やヒントなどの情報を強調して表示する方法について説明しています。

で改行 (nl2br)

この拡張機能を使用すると、改行をHTMLの<br>要素に変換します。

Markdownテキスト:

これは
brタグで改行する
改行の例です。

Pythonコードと変換結果の表示:

# Markdownテキスト
text15 = 'これは\nブレークする\n改行の例です。'

# 変換結果を表示
convert_to_html_and_display(text15, extensions=['nl2br'])

もちろんです。以下が続きです。


目次 (toc)

この拡張機能を使用すると、自動的に目次を生成できます。[TOC]というタグを使用するだけで、目次が生成されます。

Markdownテキスト:

# コンテンツ
[TOC]

## セクション1
これはセクション1です。

## セクション2
これはセクション2です。

## セクション3
これはセクション3です。

Pythonコードと変換結果の表示:

# Markdownテキスト
text17 = "# コンテンツ\n[TOC]\n\n## セクション1\nこれはセクション1です。\n\n## セクション2\nこれはセクション2です。\n\n## セクション3\nこれはセクション3です。"

# 変換結果を表示
convert_to_html_and_display(text17, extensions=['toc'])

このセクションでは、自動的に目次を生成する方法について説明しています。[TOC]というタグを使用することで、Markdownドキュメント内に目次を表示できます。


連続するリストを正しく表示する (sane_lists)

この拡張機能を使用すると、複数の異なるリストが連続して表示される場合に、正しい番号が付けられたリストが生成されます。

Markdownテキスト:

3. 項目3
4. 項目4

- 列挙1
- 列挙2

Pythonコードと変換結果の表示:

# Markdownテキスト
text_new = """
3. 項目3
4. 項目4

- 列挙1
- 列挙2
"""

# 変換結果を表示
convert_to_html_and_display(text_new, extensions=['sane_lists'])

このセクションでは、連続するリストを正しく表示する方法について説明しています。複数の異なるリストが連続して存在する場合に使用します。

いろいろと便利な拡張機能があるので、ぜひ試してみてください。

完成版コード

これらを組み合わせてすべての拡張に対応する関数がこちらです。

# MarkdownをHTMLに変換して表示する関数
def convert_to_html_and_display(text, extensions=None,configs={}):

    if extensions is None:
        extensions = ['fenced_code', 'codehilite','tables',
        'abbr','attr_list','def_list','footnotes',
        'admonition','nl2br','sane_lists', 'toc'
        ]
    if configs=={} and 'codehilite' in extensions:
        configs = {
            'codehilite':{
                'noclasses': True
            }
        }
    html = markdown.markdown(text, extensions=extensions, extension_configs=configs)

    print("Markdown:")
    print(text)
    print("\nHTML:")
    display(HTML(html))
    print("\n\n")
    return html

タイトルとURLをコピーしました