sub formdata {
my ($html,$formname) = @_;
my $tp = HTML::TokeParser->new(\$html) or die "Bad HTML form";
while (my $form = $tp->get_tag('form')) {
last if !$formname || ($form->[1]{name} eq $formname);
$tp->get_text('/form');
}
my @form;
while (my $field = $tp->get_tag('input','select','textarea')) {
my ($tag,$attr) = @$field;
if ($tag eq 'textarea') {
my $text = $tp->get_text('/textarea');
push @form,$attr->{name},$text;
next;
}
if ($tag eq 'select') {
my $selected;
while (my $tok = $tp->get_token) {
last if $tok->[-1] =~ m(/select)i;
my ($typ,$tag,$att) = @$tok;
next unless $typ eq 'S' && $tag eq 'option';
$selected = $att->{value} if exists $att->{selected};
}
push @form,$attr->{name},$selected if defined $selected;
next;
}
if ($attr->{type} =~ /hidden|password|text/) {
push @form,$attr->{name},$attr->{value};
}
if ($attr->{type} =~ /radio|checkbox/ &&
exists $attr->{checked}) {
push @form,$attr->{name},$attr->{value};
}
}
@form;
}