Pandocを利用して複数のMarkdownファイルをhtml形式に変換するPythonスクリプト(2018.5.5, 2020.4.7改変, 2020.4.13追記)

Summary

先日作成した.mdファイルを.htmlに変換するスクリプトを改善。 既に.htmlファイルが存在する場合は、対応する.mdファイルと最終更新時刻を比較して、.mdの更新時刻の方が新しい場合にだけ.html変換を行うようにアップデートした。インラインhtmlコードをそのまま残すように変更。(2020.4.7)
raw_htmlで記述する<img>などではdata-external=“1”のようにアトリビュートを付記すれば–self-containedオプション選択時にもhtmlファイル内部に組み込まれず外部lリンクのままにできる。(2020.4.13)
MacDownとPandocのインストールはMarcdown関連のツールあれこれ(2018.5.3)を参照。

使い方

PandocとMacDownがインストールされている必要がある。 スクリプト(md2html.py)を任意の場所に置いて実行できるようにchmodしておく。

カレントディレクトリの.mdファイルを指定して.htmlに変換するには、コマンドラインから下記のように指定して実行する。

実行方法

$ md2html.py ./*.md

第一引数のファイル名の拡張子が’.css’の場合には、そのファイルをスタイルファイルとして使用する。.cssファイルが第一引数に指定されていない場合、さらにMacDownがインストールされていて~/Library/Application Support/Macdown/Styles/GitHub2.cssが存在すればそれを使い、なければスタイルファイルは用いない。スタイルファイル./github-pandoc.cssを指定する場合は以下のようにして実行。

$ md2html.py ./github-pandoc.css ./*.md

MacDownが使用しているスタイルファイルは ~/Library/Application Support/Macdown/Styles/ にあり、GitHub.cssGitHub2.cssなどが選択可能。 それらを指定して使えるほか、GithubにもGiuhub風のスタイルファイル(GitHub-like CSS for pandoc standalone HTML files)にgithub-pandoc.cssなどがある。

全ての.mdファイルに対応する.htmlファイルを更新するには、.mdファイルの最終更新時刻を.htmlファイルより新しくすれば良いので、touchコマンドを使えば良い。

$ touch ./*.md
$ md2html.py ./*.md

ソースコード(md2html.py)

Pythonスクリプトからの外部コマンドの実行や、ファイル名の操作についてはPythonでのファイル名操作やコマンド実行などOS操作関連(2018.5.4)を参照。

2020.4.7の修正点

2020.4.13の修正点


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# md2html.py
# changes
# 2018.05.03: the first version
# 2018.05.05: added new features
# 2020.04.07: modify pandoc options
# 2020.04.13: utilize data-external="1" with --self-contained extention

import sys
import os

if len(sys.argv) < 2:
    print("Usage: %s [cssfile.css] file1.md [file2.md ...]" % sys.argv[0])
    print(" Converts *.md to *.html (requires pandoc installed)")
    print(" GitHub2.css provided with MacDown is used when no .css specified")
    print(" This script does nothing when newer .html file already exists")
    print(" To update all .html files, try 'touch *.md' before running this script")
    sys.exit(-1)

# To use the style file provided with MacDown
CSS_name = '~/Library/Application Support/MacDown/Styles/GitHub2.css'
#CSS_name = './github-pandoc.css'

# Check if the first arg specifies a .css file
name,ext = os.path.splitext( os.path.basename(sys.argv[1]))
if ext.lower() == '.css':
    CSS_name = sys.argv[1]

CSS_name = os.path.expanduser(CSS_name)

file_names = sys.argv[1:]
for ifile in file_names:
    dir = os.path.dirname(ifile)
    name,ext = os.path.splitext( os.path.basename(ifile))
    #print(ext)
    if ext.lower() == '.md':
        #print('Source: '+ifile)
        ofile = os.path.join(dir, name+'.html')
        # Do nothing when newer .html file already exists for the corresponding target .md file
        if os.path.exists(ofile) == False or os.path.getmtime(ofile) <= os.path.getmtime(ifile):
            print('pandoc -f markdown+raw_html -s --self-contained -t html5 -c "'
                  +CSS_name+'" -o "'+ofile+'" "'+ifile+'"')
            os.system('pandoc -f markdown+raw_html -s --self-contained -t html5 -c "'
                  +CSS_name+'" -o "'+ofile+'" "'+ifile+'"')
    else:
        print('Skip: '+ifile)

参考

Back to Index