--- loncom/xml/londefdef.pm 2003/04/11 18:25:03 1.125 +++ loncom/xml/londefdef.pm 2003/04/16 17:59:01 1.126 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.125 2003/04/11 18:25:03 sakharuk Exp $ +# $Id: londefdef.pm,v 1.126 2003/04/16 17:59:01 sakharuk Exp $ # # # Copyright Michigan State University Board of Trustees @@ -1182,20 +1182,30 @@ sub end_small { #-- tag sub start_basefont { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $basesize) { + $currentstring = '{\\'.$basesize.' '; + } + } return $currentstring; } sub end_basefont { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $basesize) { + $currentstring = '}'; + } + } return $currentstring; } @@ -1207,7 +1217,12 @@ sub start_font { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode++;} $currentstring = $token->[4]; - } + } elsif ($target eq 'tex') { + my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $fontsize) { + $currentstring = '{\\'.$fontsize.' '; + } + } return $currentstring; } @@ -1218,7 +1233,12 @@ sub end_font { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;} $currentstring = $token->[2]; - } + } elsif ($target eq 'tex') { + my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); + if (defined $fontsize) { + $currentstring = '}'; + } + } return $currentstring; } @@ -1676,6 +1696,9 @@ sub end_dd { #-- tag sub start_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; + my $textwidth=&recalc($ENV{'form.textwidth'}); + $textwidth=~/(\d+)/; + $textwidth=$1; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; @@ -1683,7 +1706,25 @@ sub start_table { my $aa = {}; push @Apache::londefdef::table, $aa; $Apache::londefdef::table[-1]{'row_number'} = -1; - $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; + #table's 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=~/%/) { + $htmlwidth=~/(\d+)/; + my $value=$1*$textwidth/100; + $Apache::londefdef::table[-1]{'width'}=$value; + } else { + $Apache::londefdef::table[-1]{'width'}=$textwidth; + } + } elsif ($TeXwidth=~/%/) { + $TeXwidth=~/(\d+)/; + my $value=$1*$textwidth/100; + $Apache::londefdef::table[-1]{'width'}=$value; + } else { + $Apache::londefdef::table[-1]{'width'}=$textwidth; + } + #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); unless (defined $border) { $border = 0; } if ($border) { @@ -1695,13 +1736,7 @@ sub start_table { $Apache::londefdef::table[-1]{'vinc'} = '&'; $Apache::londefdef::table[-1]{'vvinc'} = ''; } - my $width; - foreach my $key (keys(%{$token->[2]})) { - if ($key =~ /^width$/i) { - $width = &Apache::lonxml::get_param($key,$parstack,$safeeval,undef,1); - } - } - if (defined($width)) { $Apache::londefdef::table[-1]{'width'}=$width; } + $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; } return $currentstring; } @@ -1716,108 +1751,71 @@ sub end_table { 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++) { + for (my $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 .= ' \\\\ '; - } + + #define the length of the table cells - my @lengthforoutput = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); - my $how_many_columns = $#lengthforoutput + 1; #total number of columns in the table - my $filled_columns = 0; #number of columns with information about width - my $available_space = ' '; - 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'; + #always starts with TeXwidth (if defined everything else is ignored) + my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]); + for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]); + for (my $jn=0;$jn<=$#length_row;$jn++) { + if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];} + } + } + #continues trying estimate the width of raw data + my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); + for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]); + for (my $jn=0;$jn<=$#length_row;$jn++) { + if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];} + } + } + #comparing of TeXwidth and raw data width + my $available_length=$Apache::londefdef::table[-1]{'width'}; + my $needed=0; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]!=0) { + $available_length=$available_length-$length_row_final[$jn]; + $needed++; + } + } + $needed=$#length_row_final-$needed+1; + $currentstring.=' SSSSS '.$needed.' EEEEE \\\\'; + $currentstring.=' SSSSS '.$available_length.' EEEEE \\\\'; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]==0) { + if ($length_raw_row[$jn]<$available_length/3) { + $length_row_final[$jn]=$length_raw_row[$jn]; + $available_length=$available_length-$length_raw_row[$jn]; + $needed--; } } } - for (my $ico=0;$ico<=$#lengthforoutput;$ico++) { - if (not $lengthforoutput[$ico]=~m/^\s*0\s*\w*\s*$/) { - $filled_columns++; - $available_space = $available_space.' - '.$lengthforoutput[$ico]; + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + if ($length_row_final[$jn]==0) { + $length_row_final[$jn]=0.9*$available_length/$needed; } } - 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,$three) = split(/,/,$tbl_file_content[0]); - $how_many_columns+=$one-1; - $filled_columns+=$two; - if($three=~/\S/) {$available_space = $available_space.' - '.$three;} - } else { - $temp_file = Apache::File->new('>>'.$filename); - } - print $temp_file "$how_many_columns,$filled_columns,$available_space\n"; - $output =~ s/\\parbox{TOBECHANGEDONNUMBER}{}/\\parbox{1 mm}{}/g; - $output =~ s/\\parbox{TOBECHANGEDONNUMBER}/\\parbox{\$SpacePerColumn}/g; - my @tagar = @$tagstack; - my $signature = 1; - for (my $ico=0;$ico<$#tagar;$ico++) { - if ($tagar[$ico] eq 'table') { $signature = 0; } - } - if ($signature) { - my $NumberEmptyLength = $how_many_columns - $filled_columns; - my $SpacePerColumn = '(\textwidth '.$available_space.')/'.$NumberEmptyLength; - my $shorthand = ($filled_columns+1)*4; - $output =~ s/\$SpacePerColumn/$SpacePerColumn - $shorthand mm/g; - } - if ($how_many_columns==1) { - #start of block with width correction for one column table - $output=~s/^\s*\\parbox\{([^\}]*)\}/\\parbox\{\\textwidth - 1 cm\}/; - #end of block with width correction for one column table + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + $currentstring.=' SSSSS '.$length_row_final[$jn].' EEEEE \\\\'; + $currentstring.=' JJJJJJJ '.$length_raw_row[$jn].' HHHHHHH \\\\'; } - $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'}; - pop @Apache::londefdef::table; - $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}] .= $inmemory - } else { - $currentstring = $Apache::londefdef::table[-1]{'output'}; - $currentstring =~ s/\\\\\s+\\\\/\\\\/g; - pop @Apache::londefdef::table; - if (-e $filename) { - unlink $filename; + #fill the table + for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + for (my $jn=0;$jn<=$#length_row_final;$jn++) { + my $substituted=$length_row_final[$jn]; + $Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/; } + $output .= $Apache::londefdef::table[-1]{'rowdata'}[$in]; + chop $output; + $output .= ' \\\\ '; } + $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm '; + $currentstring .= $Apache::londefdef::table[-1]{'output'}; } return $currentstring; } @@ -1838,7 +1836,8 @@ sub start_tr { } push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'}); $Apache::londefdef::table[-1]{'counter_columns'} = -1; - $Apache::londefdef::table[-1]{'length'} = ''; + $Apache::londefdef::table[-1]{'TeXlength'} = ''; + $Apache::londefdef::table[-1]{'length'} = ''; } return $currentstring; } @@ -1849,8 +1848,8 @@ sub end_tr { if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { + push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'}; push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'}; - } return $currentstring; } @@ -1874,27 +1873,37 @@ sub start_td { } sub end_td { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; - my $tempolen = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { 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|in|pc|pt))/) { - $Apache::londefdef::table[-1]{'length'} .= $1.','; - $tempolen = $1; + my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); + if (defined $TeXwidth) { + my $current_length=&recalc($TeXwidth); + $current_length=~/(\d+)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; } else { - if (length($data)<5) { - $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; - $tempolen = '6 mm'; - } else { - $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; - $tempolen = 'TOBECHANGEDONNUMBER'; - } - } - @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$tempolen.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; + if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) { + my $current_length=&recalc($1); + $current_length=~/(\d+)/; + $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; + $Apache::londefdef::table[-1]{'length'} .= '0,'; + } else { + $data=~/^\s*(\S.*)/; + $data=$1; + $data=~/(.*\S)\s*$/; + $data=$1; + my $current_length=2*length($data); + $Apache::londefdef::table[-1]{'length'} .= $current_length.','; + $Apache::londefdef::table[-1]{'TeXlength'} .= '0,'; + } + } + @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '. + $Apache::londefdef::table[-1]{'vinc'}; } return $currentstring; } @@ -2205,12 +2214,14 @@ sub end_frameset { #--
 sub start_pre {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= '\begin{verbatim}';
+	my $width = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
+	if (not defined $width) {$width ='\textwidth';}
+	$currentstring .= '\parbox['.$width.']{\begin{verbatim}';
     } 
     return $currentstring;
 }
@@ -2221,7 +2232,7 @@ sub end_pre {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= '\end{verbatim}';
+	$currentstring .= '\end{verbatim}}';
     }
     return $currentstring;
 }
@@ -3083,5 +3094,23 @@ sub image_replication {
     return '';
 }
 
+sub recalc {
+    my $argument = shift;
+    if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}
+    $argument=~/\s*(\d+)\s*(mm|cm|in|pc|pt)/;
+    my $value=$1;
+    my $units=$2;
+    if ($units eq 'cm') {
+	$value*=10;
+    } elsif ($units eq 'in') {
+	$value*=25.4;
+    } elsif ($units eq 'pc') {
+	$value*=(25.4*12/72.27);
+    } elsif ($units eq 'pt') {
+	$value*=(25.4/72.27);
+    }
+    return $value.' mm';
+}
+
 1;
 __END__