Dan Kubb <[EMAIL PROTECTED]> writes: > Anyway, the patch is attached. I'd appreciate comments,
[...] > diff -ru old/lib/HTML/Form.pm new/lib/HTML/Form.pm > --- old/lib/HTML/Form.pm Tue Nov 30 03:25:00 2004 > +++ new/lib/HTML/Form.pm Fri Dec 3 00:44:02 2004 > @@ -96,7 +96,7 @@ > my $p = HTML::TokeParser->new(ref($html) ? $html->decoded_content(ref => > 1) : \$html); > eval { > # optimization > - $p->report_tags(qw(form input textarea select optgroup option keygen)); > + $p->report_tags(qw(form input textarea select optgroup option keygen > label)); > }; > > unless (defined $base_uri) { > @@ -122,12 +122,34 @@ > $attr->{'enctype'}); > $f->{attr} = $attr; > push(@forms, $f); > + my(%labels, $current_label); > while (my $t = $p->get_tag) { > my($tag, $attr) = @$t; > last if $tag eq "/form"; > - if ($tag eq "input") { > + if ($tag eq "label") { > + $current_label = $p->get_phrase; > + $labels{ $attr->{for} } = $current_label > + if exists $attr->{for}; > + } > + elsif ($tag eq "/label") { > + $current_label = undef; > + } > + elsif ($tag eq "input") { Are there other form elements than <input> that might take labels? > my $type = delete $attr->{type} || "text"; > - $attr->{value_name} = $p->get_phrase; > + > + if(exists $attr->{id} && exists $labels{$attr->{id}}) { > + $attr->{value_name} = $labels{$attr->{id}}; Indentation is not consistent with the rest of the code. > + } > + else { > + $attr->{value_name} = defined $current_label > + ? $current_label . " " . $p->get_phrase > + : $p->get_phrase; > + > + $attr->{value_name} =~ s/\A\s+//; > + 1 while $attr->{value_name} =~ s/\s\z//; why not '$attr->{value_name} =~ s/\s+\z//;' > + $attr->{value_name} =~ s/\s+/ /; There can't really be multispace anywhere since get_phrase will trim the text. This would always be a noop. > + } > + > $f->push_input($type, $attr); > } > elsif ($tag eq "textarea") { > diff -ru old/t/html/form.t new/t/html/form.t > --- old/t/html/form.t Mon Nov 15 06:45:42 2004 > +++ new/t/html/form.t Fri Dec 3 01:07:09 2004 > @@ -3,7 +3,7 @@ > use strict; > use Test qw(plan ok); > > -plan tests => 98; > +plan tests => 102; > > use HTML::Form; > > @@ -447,3 +447,27 @@ > ok(@f, 2); > ok($f[0]->find_input("s")); > ok($f[1]->find_input("t")); > + > +$f = HTML::Form->parse(<<EOT, "http://www.example.com"); > +<form ACTION="http://example.com/"> > + <fieldset> > + <label> > + <input type=radio name=l0 value=0 />zero > + </label> > + <label>one > + <input type=radio name=l1 value=1> > + </label> > + <label for="l2">two</label> > + <input type=radio name=l2 id=l2 value=2> > + <label> > + <span>nested</span> > + <input type=radio name=l3 value=3> > + </label> > + </fieldset> > +</form> > +EOT > + > +ok(join(":", $f->find_input("l0")->value_names), "zero"); > +ok(join(":", $f->find_input("l1")->value_names), "one"); > +ok(join(":", $f->find_input("l2")->value_names), "two"); > +ok(join(":", $f->find_input("l3")->value_names), "nested"); >