[LON-CAPA-cvs] cvs: loncom /xml londefdef.pm
foxr
lon-capa-cvs@mail.lon-capa.org
Fri, 09 Mar 2007 17:10:35 -0000
foxr Fri Mar 9 12:10:35 2007 EDT
Modified files:
/loncom/xml londefdef.pm
Log:
BZ 4967 - Fix the case given by Felicia in comment #2.
Spans don't act very well in the case of column widths that are zero
so if a column min/max comes out to be zero, force the min/max
to the average min/max for all columns.. appears to work reasonably
well.
Index: loncom/xml/londefdef.pm
diff -u loncom/xml/londefdef.pm:1.356 loncom/xml/londefdef.pm:1.357
--- loncom/xml/londefdef.pm:1.356 Thu Mar 8 19:08:02 2007
+++ loncom/xml/londefdef.pm Fri Mar 9 12:10:33 2007
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.356 2007/03/09 00:08:02 foxr Exp $
+# $Id: londefdef.pm,v 1.357 2007/03/09 17:10:33 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -2031,7 +2031,10 @@
#boundaries for contents columns
my @min_len=();#columns can not be narrower
my @max_len=();#maximum length of column
- for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+ my $avg_max;
+ my $avg_min;
+ my $counter_cols = $Apache::londefdef::table[-1]{'counter_columns'};
+ for (my $jn=0;$jn<=$counter_cols; $jn++) {
my ($localmin,$localmax)=(0,0);
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) {
@@ -2043,8 +2046,28 @@
}
push @min_len, $localmin;
push @max_len, $localmax;
+ $avg_max = $localmax + $avg_max;
+ $avg_min = $localmin + $avg_min;
}
- for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+ # Does not really matter what the average max/min are if there are no cols.
+ # and this prevents div 0 in that case.
+
+ if ($counter_cols != 0) {
+ $avg_max = $avg_max/$counter_cols;
+ $avg_min = $avg_min/$counter_cols;
+ }
+
+
+ # I don't think the below is needed.. but just in case:
+
+ if ($avg_min > $avg_max) {
+ my $temp = $avg_min;
+ $avg_min = $avg_max;
+ $avg_max = $temp;
+ }
+
+
+ for (my $jn=0;$jn<=$counter_cols;$jn++) {
my $localmin=0,;
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {
@@ -2063,6 +2086,16 @@
$min_len[$jn]=0;
$max_len[$jn]=0;
}
+ # Spans seem to be really bothered by max/min = 0. So if we have one
+ # make it an average joe max/min.
+
+ if ($max_len[$jn] == 0) {
+ $max_len[$jn] = $avg_max;
+ }
+ if ($min_len[$jn] == 0) {
+ $min_len[$jn] = $avg_min;
+ }
+
}
#final adjustment of column width
my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array
@@ -2131,6 +2164,7 @@
$fwidth[$jn]=$max_len[$jn];
$acsessive=$acsessive+$adjust[$jn]-$max_len[$jn];
$adjust[$jn]=0;
+
}
}
if ($acsessive>0) {
@@ -2191,6 +2225,7 @@
$header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'};
}
$header_of_table .= '}';
+
#fill the table
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
my $have_rowspan = 0;
@@ -2518,9 +2553,11 @@
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
if (defined $TeXwidth) {
- push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ for (my $c = 0; $c < $colspan; $c++) {
+ push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ }
} else {
if (($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) or ($data=~m/\[(\d+\.?\d*)\s*mm\]/)) {
my $garbage_data=$data;
@@ -2536,10 +2573,12 @@
if ($fwidth<$current_length) {$fwidth=$current_length;}
$garbage_data=~s/\[(\d+\.?\d*)\s*mm\]//;
}
- push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
- push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ for (my $c = 0; $c < $colspan; $c++) {
+ push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
+ push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ }
} elsif ($data=~/\\parbox\{\s*\d+\.?\d*\s*(mm|cm|in|pc|pt)*\s*\}/ or $data=~/\\epsfxsize\s*=\s*\d+\.?\d*\s*(mm|cm|in|pc|pt)*/) {
my $garbage_data=$data;
my $fwidth=0;
@@ -2555,10 +2594,12 @@
if ($fwidth<$1) {$fwidth=$1;}
$garbage_data=~s/\\epsfxsize\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)//;
}
- push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
- push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ for (my $c = 0; $c < $colspan; $c++) {
+ push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
+ push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ }
$data=~s/\\\\\s*$//;
} else {
$data=~s/^\s+(\S.*)/$1/;
@@ -2586,10 +2627,12 @@
if ($min_length<$lengthword) {$min_length=$lengthword;}
}
}
- push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
- push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
- push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
+ for (my $c = 0; $c < $colspan; $c++) {
+ push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+ push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
+ push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
+ }
}
}
# Substitute all of the tables nested in this cell in their appropriate places.