[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.