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>