【Catalyst】HTML::Tidyを使って出力を整形する


いろんなテンプレートをインクルードしまくったせいか生成されるHTMLが非常に汚かったので、HTML::Tidyを使って整形してみた。

HTML::Tidyのインストール

これは前の記事を参照。

【MovableType】Tidy を使って HTML を整形するプラグイン | blog.remora.cx
http://blog.remora.cx/2010/03/tiding-movabletype.html

簡単に手順だけ書いておく1

$ sudo yum install tidy libtidy libtidy-devel
$ sudo cpan -i P/PE/PETDANCE/HTML-Tidy-1.08.tar.gz

HTML::Tidyを扱うModelを追加する

以前TheSchwartzをModel化したときと同じく、Catalyst::Model::Adaptorを使う。

$ cd MyApp/script
$ ./myapp_create.pl Model Tidy Adaptor HTML::Tidy

これでMyApp/lib/MyApp/Model/Tidy.pmが作成される。

設定ファイルを書く

アプリケーションの設定ファイルにどのような整形を行うか記述する。

$ vim MyApp/myapp.yml
# 途中省略
Model::Tidy:
    class: "HTML::Tidy"
    constructor: "new"
    args:
        indent: yes
        indent_attributes: yes
        wrap: 80
        break_before_br: yes
        replace_color: yes

ハイライトした部分がTidyのオプションだ。他にどんなオプションがあるのかは以下参照。

HTML Tidy Configuration Options Quick Reference
http://tidy.sourceforge.net./docs/quickref.html

endアクションに細工する

後はCatalyst側で出力時にHTMLを整形するよう書き換える。通常ではRoot.pmの中身は以下のようになっていると思うが、

sub end : ActionClass('RenderView') {}

これを以下のように書き換える。

sub render : ActionClass( "RenderView" ) { }
sub end : Private { my ( $self, $c ) = @_;
    $c->forward( "render" );
    if ( $c->res->content_type =~ /html/ ) {
        my $body = $c->res->body;
        $c->res->body( $c->model( "Tidy" )->clean( $body ) );
    }
}

完了

これで完了。アプリケーションを再起動すれば整形されたHTMLが出力されているはずだ。当たり前ではあるが、整形しないときに比べればサーバへの負荷は増している。本番環境ではコードを取り去ってしまおう。


  1. これはCentOS 5.4で試したときの場合。最新版のHTML::Tidy 1.50はインストールできなかったので、バージョン1.08をインストールしている。 

コメントを残す