phpのバッチでターミナル上で色をつける方法

PHPで書かれたWEBサーバ」d:id:maru_cc:20080215:1203077168
さっそく落としてソースを見てみた。ちょっと古いけど。
nanoweb 2.2.8
http://nanoweb.si.kz/


まず、インストーラからみてみた。
Windows用のバッチファイルとLinux用のシェルバッチがあった。
Linux用のシェルバッチでは、実行中に一時的なphpファイルを作成し、それを実行する構造だ。


その中で気になる箇所があった、インストール完了時に色や太さを変更してメッセージを表示しているようだ。

<?php
echo bold("

Installation

");

boldという関数がそれっぽい(Installationの次の行にあった文字は化けたので消しました)


該当部分だけ取り出してみる。

<?php
echo bold("

Installation

");

function bold($string) {
    return("^[1;34m" . $string . "^[0m");
}

(※ ^の部分は実際には制御文字です)
愛用しているEmEditorで開いてみるとなにやらみなれない記号としてハットの部分が表示されている。
なんらかのバイナリ文字のようだ。
そこで、バイナリエディタで開いてみる。

1Bという文字がそれっぽい。

調べてみると、ESCという制御文字のようだ。
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/codes.html

1B ESC 拡張


ここまで調べてみて、nipotanがSoozyConference4で発表していた内容を思い出した。
「超LT - nipotan, kuboon, mizuno_takaaki」
http://www.nicovideo.jp/watch/sm2159081
perlでターミナルを使ってプレゼンツールを作るという話。
ちょっと調べてみたら、ブログでも紹介されていた。
Perl でプレゼンテーションツール」
d:id:nipotan:20070330:1175220356
ちょっと古い記事だけど。
ソースが載っているし、CodeReposにも登録されているとのことでした。


でも、せっかくだからコードを見ないで自力でもうちょっと調べてみました。


まずは、1Bの制御文字に意味があるだろうとアタリをつけて取り合えずテスト。

<?php
echo 0x1B . "[1;34m" . "hoge" . 0x1B . "[0m\n";

結果

27[1;34mhoge27[0m

だめですねぇ。。


0x1Bといのは方向として間違っていないので、どう制御文字をphpで書くかという話。
以前、バイナリファイルを作成するときにpackという関数を使っていたので、それを試してみました。
http://jp2.php.net/pack

<?php
echo pack('c',0x1B) . "[1;34m" . "hoge" . pack('c',0x1B) . "[0m\n";

色が着きました!
ビンゴ!!


後は、制御文字の後につける数値などに意味があるだろうということで調べてみると、こんな情報を発見。
http://codezine.jp/a/article/aid/67.aspx

シーケンス 内容
ESC[x;yH 座標x,yにカーソルを移動
ESC[2J クリア
ESC[0J その行をカーソルから行末までクリア
ESC[0m 通常の文字
ESC[1m 太字文字
ESC[4m 下線つき文字
ESC[5m 点滅文字
ESC[7m 反転文字
ESC[30m 前景色:黒
ESC[31m 前景色:赤
ESC[32m 前景色:緑
ESC[33m 前景色:黄
ESC[34m 前景色:青
ESC[35m 前景色:紫
ESC[36m 前景色:水色
ESC[37m 前景色:白
ESC[40m 背景色:黒
ESC[41m 背景色:赤
ESC[42m 背景色:緑
ESC[43m 背景色:黄
ESC[44m 背景色:青
ESC[45m 背景色:紫
ESC[46m 背景色:水色
ESC[47m 背景色:白

これを組み合わせれば自由に色が付けられそうだ。


phpのバッチで色つき文字で表示させるというのは、あまり使いどころがないかもしれないけど、シェルバッチとしては、仕事でも各環境へ配布するスクリプトなどで使用していたりする。
rsyncコマンドを叩いているシェルバッチで、削除対象になるファイルなどを色つきで表示したりすれば使い勝手がよくなるかもしれない。