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

sakharuk lon-capa-cvs@mail.lon-capa.org
Tue, 30 Jul 2002 14:10:51 -0000


sakharuk		Tue Jul 30 10:10:51 2002 EDT

  Modified files:              
    /loncom/xml	londefdef.pm 
  Log:
  Added algorithm for adjusting the size of cells. It is very important in the case of duty tables (as in the Ray's case). Now all problems from the Ray's course with even ugly tables can be printed more or less reasonably. I am working on the implementation of the user defined length of cells <td width="...">. It'l' be finished soon.
  
  
Index: loncom/xml/londefdef.pm
diff -u loncom/xml/londefdef.pm:1.78 loncom/xml/londefdef.pm:1.79
--- loncom/xml/londefdef.pm:1.78	Thu Jul 25 11:28:26 2002
+++ loncom/xml/londefdef.pm	Tue Jul 30 10:10:51 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.78 2002/07/25 15:28:26 sakharuk Exp $
+# $Id: londefdef.pm,v 1.79 2002/07/30 14:10:51 sakharuk Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -1283,7 +1283,7 @@
 		my $aa = {};
 		push @Apache::londefdef::table, $aa; 
 		$Apache::londefdef::table[-1]{'row_number'} = -1;
-		$Apache::londefdef::table[-1]{'output'} = '\begin{tabular} ';
+		$Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';
 		my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
 		unless (defined $border) { $border = 0; }
 		if ($border) { 
@@ -1299,34 +1299,103 @@
 	   return $currentstring;
 	}
         sub end_table {
-	    my ($target,$token) = @_;
+	    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';
             if ($target eq 'web') {
               $currentstring = $token->[2];     
 	    } elsif ($target eq 'tex') {
 		my $inmemory = '';
 		my $output = '';
+                #construct header of the table
 		my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};
 		my $in;
 		for ($in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {
 		    $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};
 		}
 		$header_of_table .= '}';
+                #fill the table
 		for ($in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
 		    $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];
 		    chop $output;
 		    $output .= ' \\\\ ';
 		}
-                my @length = split(/,/,$Apache::londefdef::table[-1]{'length'});
-                my $how_many_columns = $#length;
-                my $parboxlength = '(\textwidth';
-                for (my $io=0; $io<=$#length;$io++) {
-		    if ($length[$io] ne '') {
-			$parboxlength .= ' - '.$length[$io].' ';
+                #define the length of the table cells
+		my @lengthforoutput = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]);
+		my $how_many_columns = $#lengthforoutput + 1;
+		my $filled_columns = 0;
+		foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) {
+		    my @length = split(/,/,$tempo_length);
+		    for (my $ico=0;$ico<$how_many_columns;$ico++) {
+			if (not $lengthforoutput[$ico]=~m/\s*0\s*/) {$filled_columns++;}
+		    }
+		}
+		my $temp_file;
+		my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.tbl";
+		if (-e $filename) {
+		    $temp_file = Apache::File->new($filename); 
+		    my @tbl_file_content = <$temp_file>;
+		    my ($one,$two) = split(/,/,$tbl_file_content[0]);
+			$how_many_columns+=$one-1;
+			$filled_columns+=$two;
+		} else {
+		    $temp_file = Apache::File->new('>>'.$filename); 
+		}
+		print $temp_file "$how_many_columns,$filled_columns\n";
+		foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) {
+		    my @length = split(/,/,$tempo_length);
+		    for (my $ico=0;$ico<=$#lengthforoutput;$ico++) {
+			$lengthforoutput[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/;
+			my $old_value = $1;
+			my $old_unit = $2; 
+			if ($old_unit eq 'cm') { 
+			    $old_value = $old_value * 10;
+			} elsif ($old_unit eq 'in') { 
+			    $old_value = $old_value * 25.4;
+			} elsif ($old_unit eq 'pt') {
+			    $old_value = $old_value * 25.4/72.27;
+			} elsif ($old_unit eq 'pc') {
+			    $old_value = $old_value * 25.4/6.022;
+			}
+			$old_unit = 'mm';
+ 			$length[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/;
+			my $new_value = $1;
+			my $new_unit = $2;
+			if ($new_unit eq 'cm') { 
+			    $new_value = $new_value * 10;
+			} elsif ($old_unit eq 'in') { 
+			    $new_value = $new_value * 25.4;
+			} elsif ($old_unit eq 'pt') {
+			    $new_value = $new_value * 25.4/72.27;
+			} elsif ($old_unit eq 'pc') {
+			    $new_value = $new_value * 25.4/6.022;
+			}
+			$new_unit = 'mm';
+			if ($old_value < $new_value) {
+			    $lengthforoutput[$ico] = $new_value.' mm';
+			} else {
+			    $lengthforoutput[$ico] = $old_value.' mm';
+			}		 
 		    }
 		}
-		$parboxlength .= ')/'.$how_many_columns.' - 7 mm';
+                my $parboxlength = '(\textwidth';
+                for (my $io=0; $io<=$#lengthforoutput;$io++) {
+		    $parboxlength .= ' - '.$lengthforoutput[$io].' ';
+		}
+		$parboxlength .= ')/($GLOBALnumberOFcolumns+1) - 1 mm';
+		$output =~ s/\\parbox{}{}/\\parbox{1 mm}{}/g;
+		$output =~ s/\\parbox{}{(\\textbf{\w?\.?})}/\\parbox{5 mm}{$1}/g; #for stupid tables with empty columns
 		$output =~ s/\\parbox{}/\\parbox{$parboxlength}/g;
+                my ($howmanyatall,$howmanyfilled) = (0,0);
+	     
+		my @tagar = @$tagstack;
+		my $signature = 1;
+		for (my $ico=0;$ico<$#tagar;$ico++) {
+		     if ($tagar[$ico] eq 'table') { $signature = 0; }
+		}
+		if ($signature) {
+		    my $totalnumber = $how_many_columns-$filled_columns-1;
+		    $output =~ s/\$GLOBALnumberOFcolumns/$totalnumber/g;
+		}		
 		$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm ';
 		if ($#Apache::londefdef::table > 0) {
 		    $inmemory = $Apache::londefdef::table[-1]{'output'};
@@ -1357,7 +1426,6 @@
 		push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});
 		$Apache::londefdef::table[-1]{'counter_columns'} = -1;
 		$Apache::londefdef::table[-1]{'length'} = ''; 
-
 	    } 
 	   return $currentstring;
 	}        
@@ -1367,7 +1435,9 @@
             if ($target eq 'web') {
 		$currentstring = $token->[2];     
 	    } elsif ($target eq 'tex') {
-#		$currentstring .= ' START ROW '. $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}].' END ROW ';
+#		$currentstring .= ' START ROW '. $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}].' END ROW ';		
+		push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};
+
 	    }
 	   return $currentstring;
 	}
@@ -1398,10 +1468,10 @@
 		my $current_row = $Apache::londefdef::table[-1]{'row_number'};
 		my $data=&Apache::lonxml::endredirection();
 		if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) {                 
-                    $Apache::londefdef::table[-1]{'length'} .= $1.',';             
+                    $Apache::londefdef::table[-1]{'length'} .= $1.',';        
 		} else {
 		    $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; 
-                }                                                                 
+                }                                        
 		@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
 	    }
 	   return $currentstring;