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