UserTag table-organize Documentation <] [loop ....] [loop-tags] [/loop] [/table-organize] Takes an unorganized set of table cells and organizes them into rows based on the number of columns; it will also break them into separate tables. If the number of cells are not on an even modulus of the number of columns, then "filler" cells are pushed on. Parameters: =over 4 =item cols (or columns) Number of columns. This argument defaults to 2 if not present. =item rows Optional number of rows. Implies "table" parameter. =item table If present, will cause a surrounding
pair with the attributes specified in this option. =item caption Table container text, if any. Can be an array. =item td Attributes for table cells. Can be an array. =item tr Attributes for table rows. Can be an array. =item pretty Adds newline and tab characters to provide some reasonable indenting. =item filler Contents to place in empty cells put on as filler. Defaults to C< >. =item limit Maximum number of cells to use. Truncates extra cells silently. =back The C, C, and C attributes can be specified with indexes; if they are, then they will alternate according to the modulus. The C option array size should probably always equal the number of columns; if it is bigger, then trailing elements are ignored. If it is smaller, no attribute is used. For example, to produce a table that 1) alternates rows with background colors C<#EEEEEE> and C<#FFFFFF>, and 2) aligns the columns RIGHT CENTER LEFT, do: [table-organize cols=3 pretty=1 tr.0='bgcolor="#EEEEEE"' tr.1='bgcolor="#FFFFFF"' td.0='align=right' td.1='align=center' td.2='align=left' ] [loop list="1 2 3 1a 2a 3a 1b"] [loop-code] [/loop] [/table-organize] which will produce: 1 2 3 1a 2a 3a 1b     See the source for more ideas on how to extend this tag. EOD UserTag table-organize Order cols UserTag table-organize attrAlias columns cols UserTag table-organize Interpolate UserTag table-organize addAttr UserTag table-organize hasEndTag UserTag table-organize Routine <)(?!.*)(.*):$1:is; my $postamble = $2; my @cells; push @cells, $1 while $body =~ s:()::is; if(int($opt->{limit}) and $opt->{limit} < scalar(@cells) ) { splice(@cells, $opt->{limit}); } for(qw/ table/) { $opt->{$_} = defined $opt->{$_} ? " $opt->{$_}" : ''; } my @td; if(! $opt->{td}) { @td = '' x $cols; } elsif (ref $opt->{td} ) { @td = @{$opt->{td}}; push @td, '' while scalar(@td) < $cols; } else { @td = " $opt->{td}" x $cols; } my %attr; for(qw/caption tr/) { if( ! $opt->{$_} ) { #do nothing } elsif (ref $opt->{$_}) { $attr{$_} = $opt->{$_}; } else { $attr{$_} = [$opt->{$_}]; } } my $pretty = $opt->{pretty}; $opt->{td} =~ s/^(\S)/ $1/; $opt->{tr} =~ s/^(\S)/ $1/; my @rest; my $rows; my $rmod; my $tmod = 0; my $total_mod; $opt->{filler} = ' ' if ! defined $opt->{filler}; if($rows = int($opt->{rows}) ) { $total_mod = $rows * $cols; @rest = splice(@cells, $total_mod) if $total_mod < @cells; $opt->{table} = ' ' if ! $opt->{table}; } my $joiner = $pretty ? "\n\t\t" : ""; while(@cells) { while (scalar(@cells) % $cols) { push @cells, "$opt->{filler}"; } #$out .= ""; if($opt->{table}) { $out .= "{table}>"; $out .= "\n" if $pretty; if($opt->{caption}) { my $idx = $tmod % scalar(@{$attr{caption}}); #$out .= ""; $out .= "\n" if $pretty; $out .= "" . $attr{caption}[$idx] . ""; $out .= "\n" if $pretty; } } $rmod = 0; while(@cells) { $out .= "\t" if $pretty; $out .= "{tr}) { my $idx = $rmod % scalar(@{$attr{tr}}); $out .= " " . $attr{tr}[$idx]; } $out .= ">"; $out .= "\n\t\t" if $pretty; my @op = splice (@cells, 0, $cols); if($opt->{td}) { for ( my $i = 0; $i < $cols; $i++) { $op[$i] =~ s/({table}) { $out .= ""; $out .= "\n" if $pretty; } if(@rest) { my $num = $total_mod < scalar(@rest) ? $total_mod : scalar(@rest); @cells = splice(@rest, 0, $num); } $tmod++; } return $out . $postamble; } EOR