Gosuke Miyashita about feed

HTML::Widget::Kwalify #0

18 October 2006

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 の処理とか、フォームバリデーション対応とか、やること山積みですが。)