--- loncom/xml/londefdef.pm 2005/12/06 22:37:00 1.301 +++ loncom/xml/londefdef.pm 2005/12/20 23:12:03 1.304 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.301 2005/12/06 22:37:00 foxr Exp $ +# $Id: londefdef.pm,v 1.304 2005/12/20 23:12:03 foxr Exp $ # # # Copyright Michigan State University Board of Trustees @@ -48,7 +48,7 @@ use Apache::lonmenu(); use Apache::lonmeta(); use Apache::Constants qw(:common); use File::Basename; -use Data::Dumper; +# use Data::Dumper; BEGIN { @@ -61,16 +61,16 @@ BEGIN { # 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 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; @Apache::londefdef::table = (); @@ -2187,6 +2187,15 @@ 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.='\vspace*{-6 mm}\begin{center}'; $output.='\begin{center}'; @@ -2200,6 +2209,12 @@ sub end_table { } 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'}.' '; @@ -2346,8 +2361,13 @@ 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(); + + + + 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'; @@ -2424,7 +2444,11 @@ sub end_td_tex { push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length; } } - for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) { + # Substitute all of the tables nested in this cell in their appropriate places. + + + my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant... + for (my $in=0; $in<=$nested_count; $in++) { my $nested = shift @{$Apache::londefdef::table[-1]{'include'}}; $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/; # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/; @@ -2433,6 +2457,33 @@ 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. + # Rowspan, can be done using the multirow package which adds similar stuff to rowspanning. + + my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); + if (!$colspan) { + $colspan = 1; + } + my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0); + + + # 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 ''; }