yu00’s blog

プログラミングに関する備忘録です

Pandoc+Python環境構築まとめ

はじめに

PandocはMarkdownからHTML変換など、マークアップ言語を
別の形式に変換するツールです。
また、Pandoc filterという仕組みを使用することで、
変換書式を自作することができます。
ここでは、PandocとPython Pandoc filterを
使用するための環境構築方法を説明します。
環境はWindows+Python Anaconda(Miniconda)で説明します。

インストールと設定

Miniconda

MinicondaはPythonの実行環境+パッケージ管理ツールです。
同様のツールAnacondaと比べ必要最小限のパッケージのみ
含まれるため、容量が少ない&軽いという利点があります。

公式ホームページ
から自身のOSにあったバージョンをダウンロードしてインストールします。

Minicondaの起動方法
  • Windowsのタスクバーからanacondaを検索して「Anaconda Prompt」を実行

Pandoc & Panflute

Pandocと、PythonのPandoc filterであるpanfluteをインストールします。
Pandocとpanfluteにはバージョンに依存関係があるため、同時にインストールします。

  • Anaconda Promptを起動
  • 以下コマンドを実行
    • conda install -c conda-forge pandoc panflute
文字コード設定

Pandocでは文字コードUTF-8で扱うため、Python文字コードUTF-8にします。

  • Anaconda Promptを起動
  • 以下コマンドを実行
    • conda env config vars set PYTHONUTF8=1

Selenium(オプション)

SeleniumはWebページ実行のためのツールです。
Pandoc filterでは基本必要になりませんが、
JavaScriptを実行する時に必要になることがあります。
ここではChromeブラウザでのインストール方法を説明します。

  • 「Chrom>設定>Chromeについて」からバージョンを確認(ここではX.X.Xとする)
  • Anaconda Promptを起動
  • 以下コマンドを実行
    • conda install -c conda-forge selenium python-chromedriver-binary=X.X.X

(Chromeバージョンの上3桁まで同じなら問題ないかとは思いますが、もし問題あればconda search -c conda-forge python-chromedriver-binaryで検索して近いバージョンをインストールしてください)

サンプル

ソース

ソースとして以下のようなマークダウンを用意します

# ヘッダ1
テスト

## ヘッダ2
テスト

### ヘッダ3
テスト

Pandoc filterとして、すべてのヘッダの先頭に「😀」を追加するコードを作成してみます。

import panflute as pf

def action(elem, doc):
    if isinstance(elem, pf.Header):
        elem.content.insert(0, pf.Str('😀'))

pf.run_filter(action)

変換方法

マークダウンをHTMLに変換します。

選択肢1 : Anaconda Prompt
  • Anaconda Promptを起動
  • cdコマンドでsrc.mdがあるフォルダに移動
  • 以下コマンドを実行
    • pandoc -s src.md -o dst.html --filter filter.py
選択肢2 : バッチファイル
  • Anaconda Promptを起動
  • where condaでconda.batのパスを調べる(ここではX\X\Xとする)
  • 以下のようなバッチファイルを作成
call X\X\X\conda.bat activate
pandoc -s src.md -o dst.html --filter filter.py
  • run_pandoc.batをダブルクリックして実行

生成されたHTMLファイル

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
  (略)
</head>
<body>
<h1 id="ヘッダ1">😀ヘッダ1</h1>
<p>テスト</p>
<h2 id="ヘッダ2">😀ヘッダ2</h2>
<p>テスト</p>
<h2 id="ヘッダ3">😀ヘッダ3</h2>
<p>テスト</p>
</body>
</html>

リファレンスリンク