$p->replace_with(@item);
}
+sub HTML::Element::itercb {
+ my ($self, $data, $code) = @_;
+ my $orig = $self;
+ my $prev = $orig;
+ for my $el (@$data) {
+ my $current = $orig->clone;
+ $code->($el, $current);
+ $prev->postinsert($current);
+ $prev = $current;
+ }
+ $orig->detach;
+}
+
sub HTML::Element::iter2 { ## no critic (RequireArgUnpacking)
my $tree = shift;
HTML::TreeBuilder->parse($string);
}
+sub HTML::Element::fid { shift->look_down(id => $_[0]) }
+sub HTML::Element::fclass { shift->look_down(class => qr/\b$_[0]\b/s) }
+
1;
__END__
=head1 METHODS
+=head2 Aliases
+
+These are short aliases for common operations:
+
+=over
+
+=item I<$el>->B<fid>(I<$id>)
+
+Finds an element given its id. Equivalent to C<< $el->look_down(id => $id) >>.
+
+=item I<$el>->B<fclass>(I<$class>)
+
+Finds one or more elements given one of their classes. Equivalent to C<< $el->look_down(class => qr/\b$class\b/s) >>
+
+=back
+
=head2 Positional Querying Methods
=head3 $elem->siblings
and there is no good answer. The latter would be more concise and it
is what I should have done.
+=head3 Unrolling an array via a single sample element and a callback (<ul> container)
+
+This is a more advanced version of the previous method. Instead of
+cloning the sample element several times and calling
+C<replace_content> on the clone with the array element, a custom
+callback is called with the clone and array element.
+
+Here is the example from before.
+
+ <strong>Here are the things I need from the store:</strong>
+ <ul>
+ <li class="store_items">Sample item</li>
+ </ul>
+
+Code:
+
+ sub cb {
+ my ($data, $li) = @_;
+ $li->replace_content($data);
+ }
+
+ my $li = $tree->look_down(class => 'store_items');
+ my @items = qw(bread butter vodka);
+ $li->itercb(\@items, \&cb);
+
+Output is as before:
+
+ <html>
+ <head></head>
+ <body>Here are the things I need from the store:
+ <ul>
+ <li class="store_items">bread</li>
+ <li class="store_items">butter</li>
+ <li class="store_items">vodka</li>
+ </ul>
+ </body>
+ </html>
+
+Here is a more complex example (unrolling a table). HTML:
+
+ <table><thead><th>First Name<th>Last Name<th>Option</thead>
+ <tbody>
+ <tr><td class="first">First<td class="last">Last<td class="option">1
+ </tbody></table>
+
+Code:
+
+ sub tr_cb {
+ my ($data, $tr) = @_;
+ $tr->look_down(class => 'first')->replace_content($data->{first});
+ $tr->look_down(class => 'last')->replace_content($data->{last});
+ $tr->look_down(class => 'option')->replace_content($data->{option});
+ }
+
+ my @data = (
+ {first => 'Foo', last => 'Bar', option => 2},
+ {first => 'Bar', last => 'Bar', option => 3},
+ {first => 'Baz', last => 'Bar', option => 4},
+ );
+
+ my $tr = $tree->find('table')->find('tbody')->find('tr');
+ $tr->itercb(\@data, \&tr_cb);
+
+Produces:
+
+ <table><thead><th>First Name<th>Last Name<th>Option</thead>
+ <tbody>
+ <tr><td class="first">Foo<td class="last">Bar<td class="option">2
+ <tr><td class="first">Bar<td class="last">Bar<td class="option">3
+ <tr><td class="first">Baz<td class="last">Bar<td class="option">4
+ </tbody></table>
+
=head3 Unrolling an array via n sample elements (<dl> container)
C<iter()> was fine for awhile, but some things (e.g. definition lists)
#!/usr/bin/perl -T
use lib '.';
-use t::lib tests => 26;
+use t::lib tests => 27;
##################################################
# Short tests based on mklol
###
+sub cb {
+ my ($data, $tr) = @_;
+ $tr->look_down(class => 'first')->replace_content($data->{first});
+ $tr->look_down(class => 'last')->replace_content($data->{last});
+ $tr->look_down(class => 'option')->replace_content($data->{option});
+}
+
+my @cbdata = (
+ {first => 'Foo', last => 'Bar', option => 2},
+ {first => 'Bar', last => 'Bar', option => 3},
+ {first => 'Baz', last => 'Bar', option => 4},
+);
+
+$tree = mktree 't/html/itercb.html';
+$tree->find('table')->find('tbody')->find('tr')->itercb(\@cbdata, \&cb);
+isxml $tree, 't/html/itercb-exp.html', 'itercb';
+
+###
+
for my $age (qw/5 15 50/) {
$tree = mktree 't/html/highlander.html';
$tree->highlander(