Markdown変換とビューアー

タグ: Laravel3   Markdown   PHP  

MarkdownからHTMLへのコンバーターを作成しましょう。既に一部のLinuxディストリビューションでは、リポジトリに用意されているものもあるようです。

しかし、例えばMarkdownには変換ソフトにより、多少の拡張記述方法の違いがあります。基本的なMarkdownだけで記述すれば良いのですが、やはり拡張記法は便利です。ですから、プレビュー時にも対象となる変換パッケージを使用したいことがあります。

今回はPHPでのコンバートによく使用されるPHP MarkdownのExtraを使用します。これは、Laravelにも含まれていますので、Laravelでシステムを構築する場合は、わざわざインストールする手間はかかりません。

変換コマンド作成

まず、Laravelなどのフレームワークを使用せず、PHPダイレクトでコマンドを作成しましょう。簡単です。

#! /usr/bin/php
<?php

include('MarkdownExtraへのパス/markdown.php');

if($argc < 2) {
    echo 'Please specify input file'.PHP_EOL;
    exit(1);
}

if(is_file($argv[1])) {
    $markdown = file_get_contents($argv[1]);
    if($markdown) {
        echo Markdown($markdown);
        exit(0);
    }
} else {
    echo 'File not found : '.$argv[1].PHP_EOL;
    exit(2);
}

適当な名前でファイルを作成してください。PHP Markdown Extraへのパスを指定してください。

続いて、実行パーミッションを付けてください。mod a+x ファイル名ですね。

使用法は入力ファイルを指定するだけです。標準出力に吐き出す、フィルターです。

オーバーヘッドがかかるため、あまり意味はありませんが、Laravelをインストールしている方は、勉強も兼ねLaravelのタスクとして作成しても良いでしょう。

application/tasks/markdown.phpを以下の内容で作成してください。

<?php

class Markdown_Task extends Task
{

    public function run($param)
    {
        if ( count($param) < 2 ) {
            echo 'Please specify input file and output file.'.PHP_EOL.
            'Specified '.count($param).' parameter(s).'.PHP_EOL;
            exit(1);
        }

        $inputfile = $param[0];
        $outputfile = $param[1];

        if ( !File::exists($inputfile) ) {
            echo 'No file found.'.PHP_EOL;
            exit(2);
        }

        $content = File::get($inputfile, '');

        require_once path('bundle').'/docs/libraries/markdown.php';

        $output =
            '<html>'.
            '<title></title>'.
            '<body>'.Markdown($content).'</body>';

        if ( File::put($outputfile, $output) === false ) {
            echo "Failed output content to $outputfile.".PHP_EOL;
            exit(3);
        }

        exit(0);
    }

}

コードはそう変わりありません。出力ファイルを指定するように作成したため、チェックが多くなっています。Markdown Extraのライブラリーはdocsバンドルが使用しているものを流用するようにしています。

必要に応じ、<style type="text/css"></style>でCSSを指定し、見栄えを良くすることもできます。ご自由に変更してください。

これはArtisanのコマンドとして使用します。

php artisan markdown 入力ファイル 出力ファイル

Markdownビューアー

せっかくコンバーターを作成しましたので、これを利用しビューアーを作成しましょう。変換結果を一時ファイルに保存し、ブラウザーで確認できるようにbashスクリプトを作成します。

お好きな名前で以下の内容をテキストファイルとして作成してください。コマンドとしてしよ良うするため、markviewとか覚えやすいものにしましょう。本格的に使用する場合は、実行パスが通っているディレクトリーに作成しましょう。

最初に作成した、Laravelを使用せず、直接PHPで記述したバージョンを使用する場合です。フィルター名をmarkdownとしています。

#! /usr/bin/sh

rm -f /tmp/markdown.tmp

inputfile=`pwd`/$1

php /FULL-PATH/markdown $inputfile > /tmp/markdown.tmp

if [ $? -eq 0 ]
then
    firefox /tmp/markdown.tmp &
    # google-chrome /tmp/markdown.tmp &
fi

フィルータへのパスを書き換えてください。テンポラリファイルのパスもお好きなものに変更しましょう。ブラウザもお好きなものを使用してください。

続いてArtisanのタスクバージョンを使用する場合です。

#! /usr/bin/sh

rm -f /tmp/markdown.tmp

inputfile=`pwd`/$1

php /FULL-PATH/artisan markdown $inputfile /tmp/markdown.tmp

if [ $? -eq 0 ]
then
    firefox /tmp/markdown.tmp &
    # google-chrome /tmp/markdown.tmp &
fi

フィルターの部分以外は、前バージョンと同じです。

使用方法はプレビューしたいファイルを指定するだけです。このスクリプトをmarkviewで作成した場合は以下の通りです。

markview 表示ファイル