--- loncom/xml/londefdef.pm 2006/01/09 22:54:47 1.302.2.2 +++ loncom/xml/londefdef.pm 2005/12/23 00:12:32 1.305 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.302.2.2 2006/01/09 22:54:47 albertel Exp $ +# $Id: londefdef.pm,v 1.305 2005/12/23 00:12:32 foxr Exp $ # # # Copyright Michigan State University Board of Trustees @@ -68,7 +68,6 @@ BEGIN { # for ($row =0; $row <= $lastrow; $row++ ) { # my $text = Dumper($Apache::londefdef::table[$row]); # &Apache::lonnet::logthis("table [ $row ]".$text); -# # } #} sub initialize_londefdef { @@ -594,34 +593,25 @@ sub end_body { return $currentstring; } -# \begin{center} causes a new paragprah spacing that looks odd inside -# of a table cell -sub center_correction { return '\vspace*{-6 mm}'; } #--
tag (end tag required) sub start_center { - my ($target,$token,$tagstack) = @_; + my ($target,$token) = @_; my $currentstring = &end_p(); # Close off any prior para. if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - if (&is_inside_of($tagstack, "table")) { - $currentstring .= ¢er_correction(); - } $currentstring .= '\begin{center}'; } return $currentstring; } sub end_center { - my ($target,$token,$tagstack) = @_; + my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{center}'; - if (&is_inside_of($tagstack, "table")) { - $currentstring .= ¢er_correction(); - } } return $currentstring; } @@ -1192,10 +1182,6 @@ sub start_p { if ($align eq 'center') { $currentstring .='\begin{center}\par'; $closing_string = '\end{center}'; - if (&is_inside_of($tagstack, "table")) { - $currentstring = ¢er_correction().$currentstring; - $closing_string .= ¢er_correction(); - } } elsif ($align eq 'right') { $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{'; $closing_string= '}}'; @@ -1537,10 +1523,6 @@ sub start_div { if ($align eq 'center') { $currentstring .= '\begin{center}'; $endstring = '\end{center}'; - if (&is_inside_of($tagstack, "table")) { - $currentstring = ¢er_correction().$currentstring; - $endstring .= ¢er_correction(); - } } elsif ($align eq 'right') { $currentstring .= '\begin{flushright}'; @@ -1961,16 +1943,11 @@ sub start_table { # width either comes forced from the TeXwidth or the width parameters. # in either case it can be a percentage or absolute width. - # in the width case we ignore absolute width + my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); - if (!defined($TeXwidth)) { - my $htmlwidth = &Apache::lonxml::get_param('width',$parstack, - $safeeval,undef,1); - if ($htmlwidth =~ /%/) { - $TeXwidth = $htmlwidth; - } else { - $TeXwidth = $textwidth; - } + if (not defined $TeXwidth) { + $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); + } else { $Apache::londefdef::table[-1]{'forcedtablewidth'} = 1; } @@ -2024,6 +2001,7 @@ sub end_table { my $inmemory = ''; my $output = ''; my $WARNING=''; + # &debug_dump_table($Apache::londefdef::table[-1]); #width of columns from TeXwidth attributes for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { @@ -2209,17 +2187,34 @@ sub end_table { #fill the table for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$#fwidth;$jn++) { + # + # Do the appropriate magic if this has a colspan + # + my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn]; + if ($colspan > 1) { + $output .= '\multicolumn{'. + $colspan + .'}{|l|}{'; + } if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { - $output.=¢er_correction().'\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}'.¢er_correction(); + # $output.='\end{center}\vspace*{-6 mm}'; + $output.='\end{center}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.='} '; } + # Close off the colspan... + # + if ($colspan > 1) { + $output .= '}'; + $jn += $colspan-1; # Adjust for number of rows really left. + } if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};} } $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; @@ -2366,8 +2361,38 @@ sub start_td_tex { sub end_td_tex { my ($parstack,$parser,$safeeval) = @_; - my $current_row = $Apache::londefdef::table[-1]{'row_number'}; - my $data=&Apache::lonxml::endredirection(); + my $current_row = $Apache::londefdef::table[-1]{'row_number'}; + my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; + my $data = &Apache::lonxml::endredirection(); + + # The rowspan array of the table indicates which cells are part of a span. + # n indicates the start of a span set of n rows. + # ^ indicates a cell that continues a span set. + # If this and subsequent cells are part of a rowspan, we must + # push along the row until we find one that is not. + + while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column]) + && $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] eq '^') { + # Part of a span. + push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, ''; + $current_column++; + } + $Apache::londefdef::table[-1]{'counter_columns'} = $current_column; + + + + my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0); + if (!$rowspan) { + $rowspan = 1; + } + + + + $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] = $rowspan; + for (my $i = 1; $i < $rowspan; $i++) { + $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column] = '^'; + } + 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'; @@ -2456,7 +2481,34 @@ sub end_td_tex { } # Should be be killing off the 'include' elements as they're used up? + push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; + + # Get the column and row spans. + # Colspan can be done via \multicolumn if I can figure out the data structs. + + my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); + if (!$colspan) { + $colspan = 1; + } + + + # the colspan array will indicate how many columns will be spanned by this + # cell..this requires that counter_columns also be adjusted accordingly + # so that the next bunch of text goes in the right cell. Note that since + # counter_columns is incremented in the start_td_tex, we adjust by colspan-1. + # + + $Apache::londefdef::table[-1]{'colspan'}[$current_row][$current_column] = $colspan; + $Apache::londefdef::table[-1]{'counter_columns'} += $colspan -1; + + # Put empty text in spanned cols. + + for (my $i = 0; $i < ($colspan -1); $i++) { + push @ {$Apache::londefdef::table[-1]{'content'}[-1] },''; + } + + return ''; } @@ -2653,8 +2705,7 @@ sub start_img { $safeeval, undef,1)); if(!$align) { - # disabled for now see BUG#4535 - if (0 && &is_inside_of($tagstack, "table")) { + if (&is_inside_of($tagstack, "table")) { $align = "right"; # Force wraptext use. } else { $align = "bottom"; # This is html's default so it's ours too.