おぎろぐはてブロ

なんだかんだエンジニアになって10年以上

jsminとCSSTidyのExtension作成

JavaScriptのファイルサイズ縮小化ツールjsminと、CSS圧縮ツールCSSTidyを、C++で実装してExtensionにしてみているところです。どちらもPHPスクリプト版が提供されてはいるのだけれど、Cのが早い!ということで。^^;
とりあえず、jsminの方は実装完了。

こんなかんじで使う

ob_start()のコールバックに使えるようにして、

<script type="text/javascript">
<?php ob_start("jsmin") ?>
// ここにスクリプト書いたり、include "hoge.js" してみたり
<?php ob_end_flush() ?>
</script>

てな感じで書けば、挟まれた部分にjsminやCSSTidyがかけられます。
動的にコードが変化したり、修正の都度いちいち圧縮するのめんどくせ、という場合にはよいかも。

出力バッファリングのコールバック関数

前述の通り、jsminもCSSTidyもPHPコードが提供されているので、そのままでは使えないものの、修正すれば、コールバック関数を書くことができます。

string callback_function(string input [, int flag])

というインターフェースで、inputで元の文字列を受け取り、結果を戻り値として返却するだけです。(flagは、chunkを指定して複数回コールバック関数が呼ばれるときに、先頭ブロックで呼び出されたのか、最後のブロックで呼び出されたのか、それとも途中なのかという定数を返却します。ヘッダ・フッタに特別の処理をする必要がある場合とかかな。詳しくは、PHPマニュアルを参照ください)

jsmin

ソースコードは、 C, C#, Java, JavaScript, Perl, PHP, Python, Rubyと多岐にわたって提供されています。CのPHPモジュールとして組み込むわけなので、Cのコードを使おうと思ったのだけれど、コマンドラインツールとしての利用を想定しているため、putcで標準出力に吐いてたりして、ちょっと直すのが厳しい。ということで、C#のコードをC++にリライトしたクラスを作り、それを呼び出すようにして実装しました。

CSSTidy

jsminは改行や無駄なスペースを削っていくだけなのだが、CSSTidyはもっと複雑なことをして最適化をしてくれる。リアルタイムの圧縮に高機能なこれを使うのって、どうかと思うけどね。。こちらは、C++でライブラリとして使えるようなコードで提供されているので、すぐに実装できると思います。
実はまだ使ってない。。コンパイルだけは通したけど。。

おもうこと

PEARに比べて使うための敷居も高いので、ニーズはあんまりないと思うのだけど、こういうのソースを提供したほうがいいのかなぁ。
とはいえ、自分の環境でだけコンパイル通ればいいやってスタンスで書いてるので、なかなか難しいかも。