HTML::Widget::Kwalify #0

HTML::Widget::Kwalify というものをつくってます。まだプロトタイプにもなってない感じだけど。

これで Kwalify スキーマから HTML::Widget オブジェクトを自動生成して、Plagger のウェブインターフェースを簡単につくっちゃおう、という目論見です。

use HTML::Widget::Kwalify;

my $w = HTML::Widget::Kwalify->create_from( file => 'schema.yaml' );
print $w->process;

みたいな感じで、schema.yaml から HTML フォームを一発で生成できます。

CGI::Application ベースでサンプルをつくると、こんな感じになります。

まずはディスパッチする index.cgi 。

#!/usr/local/bin/perl

use strict;
use warnings;
use lib './lib';

use WidgetKwalify;

my $w = WidgetKwalify->new;
$w->run;

本体の lib/WidgetKwalify.pm 。

package WidgetKwalify;

use strict;
use warnings;
use base qw( CGI::Application );
use HTML::Widget::Kwalify;
use CGI::Application::Plugin::TT;

our $TEMPLATE_OPTIONS = {
    INCLUDE_PATH => '/path/to/template',
};

sub setup {
    my $self = shift;

    $self->start_mode('top');
    $self->run_modes(
        top => 'top',
    );

    $self->tt_config( TEMPLATE_OPTIONS => $TEMPLATE_OPTIONS );
}

sub top {
    my $self = shift;

    my $q = $self->query;
    my $w = HTML::Widget::Kwalify->create_from( file => 'schema.yaml' );
    return $self->tt_process(
        'index.html',
        { widget => $q ? $w->process($q) : $w->process }
    );
}

1;

HTML テンプレート template/index.html 。

<table>
[% FOREACH element = widget.elements %]
  <tr>
    <td>[% element.label.content.0 %]:</td>
    <td>[% element.element.as_XML %]</td>
  </tr>
[% END %]
</table>

Plagger の example にある schema.yaml の global セクションを使ってこのサンプルを動かすと、こんな感じになります。まだ type:seq の処理をちゃんとしてないので、plugin_path が変ですが、他は良い感じ。log-level もちゃんと select になってるし。

これで、Plagger ホスティングウェブアプリつくれば、bloglines2gmail とか youtube2podcast とか、目的別にスキーマファイルつくるだけで、設定用フォームが自動で生成できるし、プラグイン毎にスキーマファイル用意しておいて、利用したいプラグインを選択すると、そのプラグイン用の設定フォームが自動で生成できる、といったことが可能になりますね。

あと、

$widget->process($query)->save_to( file => 'config.yaml' );

な感じで POST したフォームの内容を YAML にしてファイルに保存、とかできるようにする予定です。(他にも type: seq の処理とか、フォームバリデーション対応とか、やること山積みですが。)