--- 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.