[wellwell-devel] [wellwell/zoom] Let [zoom] handle alternate class names in lists.
Stefan Hornburg
wellwell-devel at rt.icdevgroup.org
Mon Sep 6 12:18:18 UTC 2010
commit eec158758ebac003b1f8e966a5e24afc66e86eed
Author: Stefan Hornburg (Racke) <racke at linuxia.de>
Date: Mon Sep 6 13:15:37 2010 +0200
Let [zoom] handle alternate class names in lists.
lib/WellWell/Zoom.pm | 70 ++++++++++++++++++++++++++++++++++---------------
1 files changed, 48 insertions(+), 22 deletions(-)
---
diff --git a/lib/WellWell/Zoom.pm b/lib/WellWell/Zoom.pm
index fa7ae08..f48f6ae 100644
--- a/lib/WellWell/Zoom.pm
+++ b/lib/WellWell/Zoom.pm
@@ -83,9 +83,11 @@ sub zoom {
else {
%paste_pos = (before => $lel->next_sibling());
}
-
+
$lel->cut();
-
+
+ my $row_pos = 0;
+
while ($row = $sth->fetchrow_hashref) {
# now fill in params
while (($key, $value) = each %{$sref->{params}->{$name}->{hash}}) {
@@ -141,10 +143,19 @@ sub zoom {
}
}
}
-
+
+ $row_pos++;
+
# now add to the template
my $subtree = $lel->copy();
-
+
+ # alternate classes?
+ if ($sref->{lists}->{$name}->[2]->{alternate}) {
+ my $idx = $row_pos % $sref->{lists}->{$name}->[2]->{alternate};
+
+ $subtree->set_att('class', $sref->{lists}->{$name}->[1]->[$idx]);
+ }
+
$subtree->paste(%paste_pos);
# call increment functions
@@ -176,7 +187,7 @@ sub zoom {
sub parse_template {
my ($template, $specs) = @_;
- my ($twig, $xml, $object);
+ my ($twig, $xml, $object, $list);
$object = {specs => $specs, lists => {}, params => {}};
@@ -187,6 +198,15 @@ sub parse_template {
die "Invalid HTML template: $template\n";
}
+ # examine list on alternates
+ for my $name (keys %{$object->{lists}}) {
+ $list = $object->{lists}->{$name};
+
+ if (@{$list->[1]} > 1) {
+ $list->[2]->{alternate} = @{$list->[1]};
+ }
+ }
+
$object->{xml} = $xml;
return $object;
}
@@ -195,12 +215,21 @@ sub parse_template {
sub parse_handler {
my ($elt, $sref) = @_;
- my ($gi, $class, $name, $sob, $elt_text);
+ my ($gi, @classes, @static_classes, $class, $name, $sob, $elt_text);
$gi = $elt->gi();
- $class = $elt->att('class');
- if (defined $class && exists $sref->{specs}->{class}->{$class}) {
+ # weed out "static" classes
+ for my $class (split(/\s+/, $elt->att('class'))) {
+ if (exists $sref->{specs}->{class}->{$class}) {
+ push @classes, $class;
+ }
+ else {
+ push @static_classes, $class;
+ }
+ }
+
+ for my $class (@classes) {
$sob = $sref->{specs}->{class}->{$class};
$name = $sob->{name} || $class;
@@ -214,6 +243,9 @@ sub parse_handler {
if ($sob->{type} eq 'list') {
if (exists $sref->{lists}->{$name}) {
+ # record static classes
+ push (@{$sref->{lists}->{$name}->[1]}, join(' ', @static_classes));
+
# discard repeated lists
$elt->cut();
return;
@@ -221,7 +253,7 @@ sub parse_handler {
$sob->{elts} = [$elt];
- $sref->{lists}->{$name} = [$sob];
+ $sref->{lists}->{$name} = [$sob, [join(' ', @static_classes)]];
return $sref;
}
@@ -235,11 +267,9 @@ sub parse_handler {
if ($gi eq 'input') {
# replace value attribute instead of text
$elt->{zoom_rep_att} = 'value';
- }
- elsif ($gi eq 'select') {
+ } elsif ($gi eq 'select') {
$elt->{zoom_rep_sub} = \&set_selected;
- }
- elsif (! $elt->contains_only_text()) {
+ } elsif (! $elt->contains_only_text()) {
# contains real elements, so we have to be careful with
# set text and apply it only to the first PCDATA element
if ($elt_text = $elt->first_child('#PCDATA')) {
@@ -253,16 +283,14 @@ sub parse_handler {
if (exists $sob->{scope} && $sob->{scope} eq 'element') {
$elt->{zoom_rep_sub} = $subref;
- }
- else {
+ } else {
$sob->{subref} = $subref;
}
}
$sref->{params}->{$sob->{list}}->{hash}->{$name} = $sob;
push(@{$sref->{params}->{$sob->{list}}->{array}}, $sob);
- }
- elsif ($sob->{type} eq 'increment') {
+ } elsif ($sob->{type} eq 'increment') {
# increments
push (@{$sob->{elts}}, $elt);
@@ -272,16 +300,14 @@ sub parse_handler {
# record it for increment values
$sref->{params}->{$sob->{list}}->{hash}->{$name} = $sob;
- }
- elsif ($sob->{type} eq 'value') {
+ } elsif ($sob->{type} eq 'value') {
push (@{$sob->{elts}}, $elt);
$sref->{values}->{$name} = $sob;
- }
- else {
+ } else {
return $sref;
}
}
-
+
return $sref;
}
More information about the wellwell-devel
mailing list