[LON-CAPA-cvs] cvs: loncom /xml londefdef.pm

foxr lon-capa-cvs@mail.lon-capa.org
Sun, 27 Nov 2005 23:54:00 -0000


This is a MIME encoded message

--foxr1133135640
Content-Type: text/plain

foxr		Sun Nov 27 18:54:00 2005 EDT

  Modified files:              
    /loncom/xml	londefdef.pm 
  Log:
  Defect 3058  ... I believe this fixes the simplest case of this
  by removing some extraneous \vspace directives.   I have noticed that
  nested tables are totally wrong.   I have some progress on that front as
  well, but that needs more work as well.  Will see if I need to make a new
  bugreport for that issue.
  
  
--foxr1133135640
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20051127185400.txt"

Index: loncom/xml/londefdef.pm
diff -u loncom/xml/londefdef.pm:1.293 loncom/xml/londefdef.pm:1.294
--- loncom/xml/londefdef.pm:1.293	Mon Nov  7 21:04:23 2005
+++ loncom/xml/londefdef.pm	Sun Nov 27 18:54:00 2005
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.293 2005/11/08 02:04:23 albertel Exp $
+# $Id: londefdef.pm,v 1.294 2005/11/27 23:54:00 foxr Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -48,6 +48,7 @@
 use Apache::lonmeta();
 use Apache::Constants qw(:common);
 use File::Basename;
+use Data::Dumper;
 
 BEGIN {
 
@@ -55,6 +56,21 @@
 
 }
 
+#
+#   Dumps all elements of the table structure.
+#   Need this 'cause evidently when given an array, Data::Dumper only seems
+#   to dump element 0.
+#
+sub debug_dump_table {
+    my $lastrow = $#Apache::londefdef::table;
+    &Apache::lonnet::logthis("Dumping table:  Last row index: $lastrow");
+    my $row;
+    for ($row =0; $row <= $lastrow; $row++ ) {
+	my $text = Dumper($Apache::londefdef::table[$row]);
+	&Apache::lonnet::logthis("table [ $row ]".$text);
+
+    }
+}
 
 sub initialize_londefdef {
     $Apache::londefdef::TD_redirection=0;
@@ -1925,24 +1941,25 @@
 		}
 	    }
 	}
+
+	# width either comes forced from the TeXwidth or the width parameters.
+	# in either case it can be a percentage or absolute width.
+
 	my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
 	if (not defined $TeXwidth) {
-	    my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
-	    if ($htmlwidth=~/%/) {
-                $Apache::londefdef::table[-1]{'percent'}=1;
-		$htmlwidth=~/(\d+)/;
-		$Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;;
-	    } else {
-		$Apache::londefdef::table[-1]{'width'}=$textwidth;
-	    }
-	} elsif ($TeXwidth=~/%/) {
+	    $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
+
+	} else {
+	    $Apache::londefdef::table[-1]{'forcedtablewidth'} = 1;
+	}
+	if ($TeXwidth=~/%/) {
 	    $Apache::londefdef::table[-1]{'percent'}=1;
 	    $TeXwidth=~/(\d+)/;
             $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
 	} else {
-	    $Apache::londefdef::table[-1]{'forcetablewidth'}=1;
 	    $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
 	}        
+
         #table's border
 	my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); 
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
@@ -1970,7 +1987,11 @@
         $Apache::londefdef::table[-1]{'content'}=[];
         $Apache::londefdef::table[-1]{'align'}=[];
         $currentstring.='\keephidden{NEW TABLE ENTRY}';
-   }
+	&Apache::lonnet::logthis("------ start-table------");
+	&debug_dump_table;
+	&Apache::lonnet::logthis("-------start-table------");
+
+    }
     return $currentstring;
 }
  
@@ -1984,6 +2005,9 @@
 	my $output = '';
 	my $WARNING='';
         #width of columns from TeXwidth attributes
+	&Apache::lonnet::logthis("----------------end_table-----------------");
+	&debug_dump_table;
+
 	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
 	    for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
 		if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) {
@@ -2168,13 +2192,15 @@
 	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
 	    for (my $jn=0;$jn<=$#fwidth;$jn++) {
 		if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-		    $output.='\vspace*{-6 mm}\begin{center}';
+		    # $output.='\vspace*{-6 mm}\begin{center}';
+		    $output.='\begin{center}';
 		} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
 		    $output.=' \hfill \llap{'
 		}
 		$output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn];
 		if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-		    $output.='\end{center}\vspace*{-6 mm}';
+		    # $output.='\end{center}\vspace*{-6 mm}';
+		    $output.='\end{center}';
 		} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
 		    $output.='} ';
 		}
@@ -2187,6 +2213,36 @@
 	$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut ';
 	if ($#Apache::londefdef::table > 0) {	    
 	    my $inmemory = $Apache::londefdef::table[-1]{'output'};
+	    &Apache::lonnet::logthis("--- popping nested table --");
+	    # Figure out max/and min width  by summing us and then
+	    # apply that to the current column of the table we nest in
+	    # if it's larger than the current width or the current width
+	    # is undefined.
+	    #
+	    my $min_nested_width = 0;
+	    my $max_nested_width = 0;
+	    for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {
+		
+		$min_nested_width +=  $min_len[$col];
+		$max_nested_width +=  $max_len[$col];
+	    }
+	    # Fudge in an extra 5 mm for borders etc:
+	    
+	    $min_nested_width += 5;
+	    $max_nested_width += 5;
+
+	    &Apache::lonnet::logthis("Nested min: $min_nested_width");
+	    &Apache::lonnet::logthis("Nested max: $max_nested_width");
+	    my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};
+	    my $outer_row    = $Apache::londefdef::table[-2]{'row_number'};
+	    &Apache::lonnet::logthis("Outer row/column: $outer_row : $outer_column");
+	    if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) {
+		$Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width;
+	    }
+	    if ($max_nested_width > $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column]) {
+		$Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column] = $max_nested_width;
+	    }
+
 	    pop @Apache::londefdef::table;
 	    push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory;
 	} else {
@@ -2194,6 +2250,9 @@
 	    pop @Apache::londefdef::table;
 	    undef @Apache::londefdef::table;
 	}
+	&debug_dump_table;
+	&Apache::lonnet::logthis("---------end table------");
+
     }
     return $currentstring;
 }
@@ -2205,6 +2264,7 @@
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
+	&Apache::lonnet::logthis("--------------start-tr----------");
 	$Apache::londefdef::table[-1]{'row_number'}++;
 	my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
 	if ($alignchar ne '') {
@@ -2219,6 +2279,8 @@
 	push @ {$Apache::londefdef::table[-1]{'minlen'}}, [];
 	push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
 	push @ {$Apache::londefdef::table[-1]{'content'}}, [];
+	&debug_dump_table;
+	&Apache::lonnet::logthis("------------start-tr-----------");
     } 
     return $currentstring;
 }
@@ -2229,9 +2291,13 @@
     if ($target eq 'web') {
 	$currentstring .= $token->[2];     
     } elsif ($target eq 'tex') {
+	&Apache::lonnet::logthis("-------end-tr-----");
 	if ($Apache::londefdef::TD_redirection) {
 	    &end_td_tex($parstack,$parser,$safeeval);    
 	}
+	&debug_dump_table;
+	&Apache::lonnet::logthis("------end-tr------");
+	
     }
     return $currentstring;
 }
@@ -2243,8 +2309,11 @@
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
+	&Apache::lonnet::logthis("------start-td----");
 	$Apache::londefdef::TD_redirection = 1;
 	&tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
+	&debug_dump_table;
+	&Apache::lonnet::logthis("-----start-td-----");
     } 
     return $currentstring;
 }   
@@ -2365,7 +2434,7 @@
 	}        
     }
 	for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {         
-	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
+	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in] \&/;
 	}
     push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
     return'';
@@ -2377,8 +2446,11 @@
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
+	&Apache::lonnet::logthis("--------end_td-----");
         $Apache::londefdef::TD_redirection =0;
 	&end_td_tex($parstack,$parser,$safeeval);
+	&debug_dump_table;
+	&Apache::lonnet::logthis("--------end-td----");
     }
     return $currentstring;
 }
@@ -4056,7 +4128,11 @@
     } 
     return $file,$path;
 }
-
+#  Converts a measurement in to mm from any of 
+#  the other valid LaTeX units of measure.
+#  If the units of measure are missing from the 
+#  parameter, it is assumed to be in and returned
+#  with mm units of measure
 sub recalc {
     my $argument = shift;
     if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}

--foxr1133135640--