X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FHTML%2FElement%2FLibrary.pm;h=936840ba8a71ab11f4516cdcc1987f82ad96cd97;hb=3caedb5b3a025561935df4403083c02425cb3845;hp=99abc3d39f7c534ce6eff10ac7cbba1cbedcbbeb;hpb=3c14ea1e4127f65aaf48989a5364977785b595cf;p=html-element-library.git diff --git a/lib/HTML/Element/Library.pm b/lib/HTML/Element/Library.pm index 99abc3d..936840b 100644 --- a/lib/HTML/Element/Library.pm +++ b/lib/HTML/Element/Library.pm @@ -12,6 +12,7 @@ use Array::Group qw(:all); use Carp qw(confess); use Data::Dumper; use HTML::Element; +use List::Util qw(first); use List::MoreUtils qw/:all/; use Params::Validate qw(:all); use Scalar::Listify; @@ -36,13 +37,48 @@ sub HTML::Element::siblings { $p->content_list; } +sub HTML::Element::hash_map { + my $container = shift; + + my %p = validate(@_, { + hash => { type => HASHREF }, + to_attr => 1, + excluding => { type => ARRAYREF , default => [] }, + debug => { default => 0 }, + }); + + warn 'The container tag is ', $container->tag if $p{debug} ; + warn 'hash' . Dumper($p{hash}) if $p{debug} ; + warn 'at_under' . Dumper(\@_); + + my @same_as = $container->look_down( $p{to_attr} => qr/.+/ ) ; + + warn 'Found ' . scalar(@same_as) . ' nodes' if $p{debug} ; + + + for my $same_as (@same_as) { + my $attr_val = $same_as->attr($p{to_attr}) ; + if (first { $attr_val eq $_ } @{$p{excluding}}) { + warn "excluding $attr_val" if $p{debug} ; + next; + } + warn "processing $attr_val" if $p{debug} ; + $same_as->replace_content( $p{hash}->{$attr_val} ) ; + } + +} + + sub HTML::Element::passover { my ($tree, $child_id) = @_; - warn "ARGS: my ($tree, $child_id)"; + warn "ARGS: my ($tree, $child_id)" if $DEBUG; + warn $tree->as_HTML(undef, ' ') if $DEBUG; my $exodus = $tree->look_down(id => $child_id); + warn "E: $exodus" if $DEBUG; + my @s = HTML::Element::siblings($exodus); for my $s (@s) { @@ -188,6 +224,7 @@ sub HTML::Element::iter2 { warn "wrapper_data: " . Dumper $p{wrapper_data} if $p{debug} ; my $container = ref_or_ld($tree, $p{wrapper_ld}); + warn "container: " . $container if $p{debug} ; warn "wrapper_(preproc): " . $container->as_HTML if $p{debug} ; $p{wrapper_proc}->($container) if defined $p{wrapper_proc} ; warn "wrapper_(postproc): " . $container->as_HTML if $p{debug} ; @@ -620,23 +657,30 @@ sub HTML::Element::unroll_select { my $select = {}; my $select_node = $s->look_down(id => $select{select_label}); + warn "Select Node: " . $select_node if $select{debug}; - my $option = $select_node->look_down('_tag' => 'option'); + unless ($select{append}) { + for my $option ($select_node->look_down('_tag' => 'option')) { + $option->delete; + } + } -# warn $option; + my $option = HTML::Element->new('option'); + warn "Option Node: " . $option if $select{debug}; $option->detach; while (my $row = $select{data_iter}->($select{data})) { -# warn Dumper($row); - my $o = $option->clone; - $o->attr('value', $select{option_value}->($row)); - $o->attr('SELECTED', 1) if ($select{option_selected}->($row)) ; - - $o->replace_content($select{option_content}->($row)); - $select_node->push_content($o); + warn "Data Row:" . Dumper($row) if $select{debug}; + my $o = $option->clone; + $o->attr('value', $select{option_value}->($row)); + $o->attr('SELECTED', 1) if (exists $select{option_selected} and $select{option_selected}->($row)) ; + + $o->replace_content($select{option_content}->($row)); + $select_node->push_content($o); + warn $o->as_HTML if $select{debug}; } @@ -725,6 +769,31 @@ One of these days, I'll around to writing a nice C section. =head2 Tree Rewriting Methods +=head3 $elem->hash_map(hash => \%h, to_attr => $attr, excluding => \@excluded) + +This method is designed to take a hashref and populate a series of elements. For example: + + + + + + + + +
1(877) 255-3239*********
+ +In the table above, there are several attributes named C<< smap >>. If we have a hashref whose keys are the same: + + my %data = (people_id => 888, phone => '444-4444', password => 'dont-you-dare-render'); + +Then a single API call allows us to populate the HTML while excluding those ones we dont: + + $tree->hash_map(hash => \%data, to_attr => 'sid', excluding => ['password']); + +Of course, the other way to prevent rendering some of the hash mapping is to not give that element the attr +you plan to use for hash mapping. + + =head3 $elem->replace_content(@new_elem) Replaces all of C<$elem>'s content with C<@new_elem>. @@ -962,7 +1031,11 @@ to give you a taste of how C is used: -=head2 Tree-Building Methods: Unrolling an array via a single sample element (