[LON-CAPA-cvs] cvs: loncom /xml lontable.pm
foxr
foxr@source.lon-capa.org
Tue, 19 Apr 2011 22:30:42 -0000
foxr Tue Apr 19 22:30:42 2011 EDT
Modified files:
/loncom/xml lontable.pm
Log:
BZ6317 - Get rules to work for <cgroup /> case. This should complete the work
on this bug.
Index: loncom/xml/lontable.pm
diff -u loncom/xml/lontable.pm:1.18 loncom/xml/lontable.pm:1.19
--- loncom/xml/lontable.pm:1.18 Wed Apr 13 10:44:26 2011
+++ loncom/xml/lontable.pm Tue Apr 19 22:30:42 2011
@@ -1,16 +1,13 @@
+
# The LearningOnline Network with CAPA
# Generating TeX tables.
#
-# $Id: lontable.pm,v 1.18 2011/04/13 10:44:26 foxr Exp $
+# $Id: lontable.pm,v 1.19 2011/04/19 22:30:42 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
-#
-# LON-CAPA is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
@@ -57,7 +54,7 @@
use strict;
use Apache::lonlatextable;
use Apache::lonnet; # for trace logging.
-
+use Data::Dumper;
my $tracing = 0; # Set to 1 to enable log tracing. 2 for local sub tracing.
@@ -272,7 +269,8 @@
'foot' => []
},
col_widths => {},
- part => 'body' # one of 'body', 'head', 'foot'.
+ part => 'body', # one of 'body', 'head', 'foot'.
+ colgroups => [] # Stores information about column groups.
};
@@ -931,7 +929,9 @@
sub define_colgroup {
my ($this, $attributes) = @_;
if ($tracing) { &Apache::lonnet::logthis("col_group"); }
-
+ my $colgroups = $this->{'colgroups'};
+ push(@$colgroups, $attributes); # Colgroups always add at end.
+
}
@@ -967,7 +967,8 @@
my $cell_lr_border = (($inner_border == 1) || ($inner_border == 3)) ? 1 : 0;
my $part_border = ($inner_border == 4);
- # Add the caption if supplied.
+
+ # Add the caption if supplied.
if ($this->{'caption'} ne "") {
$table->set_caption($this->caption);
@@ -1029,22 +1030,42 @@
}
}
-
- if ($tracing) { &Apache::lonnet::logthis("rendering head"); }
- $this->render_part('head', $table, $useP, $default_width);
- if ($tracing) { &Apache::lonnet::logthis("rendering body"); }
- $this->render_part('body', $table, $useP, $default_width);
- if ($tracing) { &Apache::lonnet::logthis("rendering footer"); }
- $this->render_part('foot', $table, $useP, $default_width);
+ # If rule is groups. we need to have a
+ # list of the column numbers at which a column ends...
+ # and the coldef needs to start with a |
+ #
+ my @colgroup_ends;
+ my $colgroup_col = 0;
+ my $group = 0;
+ my $coldef = "";
+ if ($outer_border || $cell_lr_border) {
+ $coldef .= '|';
+ }
+ if ($part_border) {
+ $coldef .= '|';
+ my $colgroup_col = 0;
+ my $colgroups = $this->{'colgroups'};
+ foreach my $group (@$colgroups) {
+ if (defined $group->{'span'}) {
+ $colgroup_col += $group->{'span'};
+ } else {
+ $colgroup_col++;
+ }
+ push(@colgroup_ends, $colgroup_col);
+ }
+
+ }
+ $this->render_part('head', $table, $useP, $default_width,
+ \@colgroup_ends);
+ $this->render_part('body', $table, $useP, $default_width,
+ \@colgroup_ends);
+ $this->render_part('foot', $table, $useP, $default_width,
+ \@colgroup_ends);
- my $coldef = "";
- if ($outer_border || $cell_lr_border) {
- $coldef .= '|';
- }
for (my $i =0; $i < $column_count; $i++) {
if ($useP) {
$coldef .= "p{$default_width $colunits}";
@@ -1055,6 +1076,10 @@
($outer_border && ($i == $column_count-1))) {
$coldef .= '|';
}
+ if ($part_border && ($i == ($colgroup_ends[$group]-1))) {
+ $coldef .= '|';
+ $group++;
+ }
}
$table->{'coldef'} = $coldef;
@@ -1090,6 +1115,32 @@
}
return $size; # Default is cm.
+}
+
+
+
+#---------------------------------------------------------------------------
+#
+# Private methods:
+#
+
+#
+# Convert size with units -> size in cm.
+# The resulting size is floating point with no units so that it can be used in
+# computation. Note that an illegal or missing unit is treated silently as
+# cm for now.
+#
+sub size_to_cm {
+ my ($this, $size_spec) = @_;
+ my ($size, $units) = split(/ /, $size_spec);
+ if (lc($units) eq 'mm') {
+ return $size / 10.0;
+ }
+ if (lc($units) eq 'in') {
+ return $size * 2.54;
+ }
+
+ return $size; # Default is cm.
}
#
@@ -1099,7 +1150,8 @@
# respectively.
#
sub render_part {
- my ($this, $part, $table, $useP, $default_width) = @_;
+ my ($this, $part, $table, $useP,
+ $default_width, $colgroup_ends) = @_;
if ($tracing) { &Apache::lonnet::logthis("render_part: $part") };
@@ -1110,12 +1162,12 @@
return;
}
-
+ my @cgends = @$colgroup_ends;
# Build up the data:
my @data;
my $colwidths = $this->{'col_widths'};
- my $rows = $this->{'rows'}->{$part}; # TODO: Render header, body footer as groups.
+ my $rows = $this->{'rows'}->{$part};
my $row_count = scalar(@$rows);
my $inner_border = $this->{'inner_border'};
my $outer_border = $this->{'outer_border'};
@@ -1143,11 +1195,13 @@
my $startcol = 1;
my @underlines; # Array of \cline cells if cellborder on.
-
+ my $colgroup_count = @cgends; # Number of column groups.
+ my $cgroup = 0; # Group we are on.
+ my $cgstart = 0; # Where the next cgroup starts.
for (my $cell = 0; $cell < $cell_count; $cell++) {
my $contents = $cells->[$cell]->{'contents'};
-
+
#
# Cell alignment is the default alignment unless
# explicitly specified in the cell.
@@ -1196,11 +1250,29 @@
if ($cell_lr_border || ($outer_border && ($cell == ($cell_count -1)))) {
$col_align = $col_align.'|';
}
+ if ($part_border) {
+ if ($cell == $cgstart) {
+ $col_align = '|' . $col_align;
+ if ($cgroup < $colgroup_count) {
+ $cgstart = $cgends[$cgroup];
+ $cgroup++;
+ } else {
+ $cgstart = 1000000; # TODO: Get this logic right
+ }
+ if ($cell == ($cell_count - 1) &&
+ ($cell == ($cgstart-1))) {
+ $col_align = $col_align . '|'; # last col ends colgrp.
+ }
+ }
+ }
#factor in spans:
my $cspan = $cells->[$cell]->{'colspan'};
my $nextcol = $startcol + $cspan;
+
+ # At this point this col is the start of the span.
+ # nextcol is the end of the span.
# If we can avoid the \multicolumn directive that's best as
# that makes some things like \parpic invalid in LaTeX which
@@ -1222,6 +1294,7 @@
push(@underlines, "\\cline{$startcol-$lastcol}");
}
$startcol = $nextcol;
+
# Rowspans should take care of themselves.
push(@row, $contents);