PHP Markdownをコマンドラインで使う

はじめに

このサイトの一部ページはMarkdownを使って作成している.書き方が簡単で,割切って使うには便利である.

しかし,テーブルや定義リスト(dl,dt,dd)が使えない.そこで,テーブルや定義リストに対応したPHP Markdownを使うことにした.

動作環境は以下の通りである.

  • Windows XP SP2+パッチたくさん
  • cygwin 1.5.24
  • PHP 5.2.5
  • PHP Markdown Extra 1.1.7

PHPのインストール

その名の通り,PHP Markdownを使うにはPHPが必要である.まずはPHPからインストールしよう.PHP DownloadsからWindows Binariesをダウンロードする.zipとインストーラのどちらでも良いが,今回はzipファイルをダウンロードした.

zipを展開して適当なディレクトリに配置する.今回はc:\Program Files\php\に配置した.

コマンドラインからの起動に便利なように,aliasを設定する..bashrcに以下の文字列を追加する.

alias php='/cygdrive/c/progra~1/php/php.exe'

コマンドラインからphpのバージョンを表示してみよう.以下のような表示が出ればOK.

$ php -v
PHP 5.2.5 (cli) (built: Nov  8 2007 23:18:51)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

PHP Markdownのインストール

続いてPHP Markdownをインストールする.PHP MarkdownにはPHP Markdown 1.0.1kとPHP Markdown Extra 1.1.7がある.テーブルや定義リストに対応した機能追加版のPHP Markdown Extra 1.1.7をダウンロードする.

zipファイルなので,適当なディレクトリに展開する.展開したディレクトリはc:\Program Files\phpmarkdown\としよう.

コマンドラインで動かす

PHP Markdownはファイルからの読込みができない.なので,そのままではコマンドラインから動かしても意味がない.ファイルを読込んでPHP Markdownに渡すプログラムを作成する.とりあえずmd_wrapper.phpという名前にして,適当なディレクトリ(c:\Documents and Settings\foo\My Documents\)に保管する.プログラムの内容は以下の通り.

md_wrapper.php:

#! /cygdrive/c/progra~1/php/php.exe

<?php
set_include_path(get_include_path().PATH_SEPARATOR."C:\Program Files\phpmarkdown");
include_once "markdown.php";

$input=($argc==1)? 'php://stdin': $argv[1];
$markdown=file_get_contents($input);
$html=Markdown($markdown);
file_put_contents('php://stdout',$html);
?>

引数に指定したファイルの中身をPHP Markdownに渡し,引数がなければ標準入力からの入力を待つプログラムである.

動かしてみよう.まず,入力用のファイル(sam.md)をmd_wrapper.phpと同じディレクトリに作る.

sam.md:

# header 1
## header 2
term
: definition

md_wrapper.phpの引数に作成したsam.mdを指定して実行するとhtmlができる.

$ md_wrapper.php sam.md

<h1>header 1</h1>

<h2>header 2</h2>

<dl>
<dt>term</dt>
<dd>definition</dd>
</dl>

ファイルを指定しないと標準入力からの入力待ちになる.

$ md_wrapper.php     ←ファイルを指定していないので標準入力からの入力待ち
# header 1               ←入力
## header 2
term
: definition
                         ←Ctrl+C入力
<h1>header 1</h1>        ←出力

<h2>header 2</h2>

<dl>
<dt>term</dt>
<dd>definition</dd>
</dl>

コマンドラインからの入力に便利なように,md_wrapper.phpにaliasを設定しよう..bashrcに以下を追加する.

alias markdown="c:/Documents\ and\ Settings/foo/My\ Documents/md_wrapper.php"

Windows版PHPを使っているためか,Windows形式のパスc:/Documents・・・でないと動かない.cygwin形式のパス/cygdrive/c/Documents・・・だと以下のようなエラーになる.

Could not open input file: /cygdrive/c/Documents and Settings/foo/My Documents/md_wrapper.php

短い形式のパスにしても同じエラーになる.

Could not open input file: /cygdrive/c/Docume~1/foo/MyDocu~1/md_wrapper.php

antで動かす

antを使ってMarkdown書式からxhtmlへ変換している.MarkdownからPHP Markdownに書換える.以下の2点を変更する.ちなみに,変数${in}にファイル名を格納し,markdownのファイル(${in}.md)からhtmlファイル(${in}.md.tmp)を作成している.

  • 実行するプログラムをperlからPHP
  • 引数で与えているスクリプトをMarkdown.plからmd_wrapper.php

Markdown(perl版)実行用:

<project name="markdown" default="markdown">
  <property environment="env"/>
  <property name="perl" value="${env.PROGRAMFILES}/perl/perl.exe"/>
  <property name="markdown" value="${env.HOME}/Markdown.pl"/>

  <target name="markdown">
    <apply executable="${perl}" dest="." output="${in}.html">
      <arg line="${markdown}"/>
      <fileset file="${in}.md"/>
      <mapper type="glob" from="*.md" to="*.html"/>
    </apply>
  </target>
</project>

PHP Markdown実行用:

<project name="markdown" default="markdown">
  <property environment="env"/>
  <property name="php" value="${env.PROGRAMFILES}/php/php.exe"/>
  <property name="markdown" value="${env.HOME}/md_wrapper.php"/>

  <target name="markdown">
    <apply executable="${php}" dest="." output="${in}.html">
      <arg line="${markdown}"/>
      <fileset file="${in}.md"/>
      <mapper type="glob" from="*.md" to="*.html"/>
    </apply>
  </target>
</project>