--- loncom/xml/londefdef.pm 2005/11/08 02:04:23 1.293 +++ loncom/xml/londefdef.pm 2005/11/27 23:54:00 1.294 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.293 2005/11/08 02:04:23 albertel Exp $ +# $Id: londefdef.pm,v 1.294 2005/11/27 23:54:00 foxr Exp $ # # # Copyright Michigan State University Board of Trustees @@ -48,6 +48,7 @@ use Apache::lonmenu(); use Apache::lonmeta(); use Apache::Constants qw(:common); use File::Basename; +use Data::Dumper; BEGIN { @@ -55,6 +56,21 @@ BEGIN { } +# +# Dumps all elements of the table structure. +# 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 initialize_londefdef { $Apache::londefdef::TD_redirection=0; @@ -1925,24 +1941,25 @@ 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. + 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=~/%/) { - $Apache::londefdef::table[-1]{'percent'}=1; - $htmlwidth=~/(\d+)/; - $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;; - } else { - $Apache::londefdef::table[-1]{'width'}=$textwidth; - } - } elsif ($TeXwidth=~/%/) { + $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); + + } else { + $Apache::londefdef::table[-1]{'forcedtablewidth'} = 1; + } + if ($TeXwidth=~/%/) { $Apache::londefdef::table[-1]{'percent'}=1; $TeXwidth=~/(\d+)/; $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100; } else { - $Apache::londefdef::table[-1]{'forcetablewidth'}=1; $Apache::londefdef::table[-1]{'width'}=$TeXwidth; } + #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0); @@ -1970,7 +1987,11 @@ sub start_table { $Apache::londefdef::table[-1]{'content'}=[]; $Apache::londefdef::table[-1]{'align'}=[]; $currentstring.='\keephidden{NEW TABLE ENTRY}'; - } + &Apache::lonnet::logthis("------ start-table------"); + &debug_dump_table; + &Apache::lonnet::logthis("-------start-table------"); + + } return $currentstring; } @@ -1984,6 +2005,9 @@ sub end_table { my $output = ''; my $WARNING=''; #width of columns from TeXwidth attributes + &Apache::lonnet::logthis("----------------end_table-----------------"); + &debug_dump_table; + for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) { @@ -2168,13 +2192,15 @@ sub end_table { for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$#fwidth;$jn++) { if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { - $output.='\vspace*{-6 mm}\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}\vspace*{-6 mm}'; + # $output.='\end{center}\vspace*{-6 mm}'; + $output.='\end{center}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.='} '; } @@ -2187,6 +2213,36 @@ sub end_table { $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut '; if ($#Apache::londefdef::table > 0) { my $inmemory = $Apache::londefdef::table[-1]{'output'}; + &Apache::lonnet::logthis("--- popping nested table --"); + # Figure out max/and min width by summing us and then + # apply that to the current column of the table we nest in + # if it's larger than the current width or the current width + # is undefined. + # + my $min_nested_width = 0; + my $max_nested_width = 0; + for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) { + + $min_nested_width += $min_len[$col]; + $max_nested_width += $max_len[$col]; + } + # Fudge in an extra 5 mm for borders etc: + + $min_nested_width += 5; + $max_nested_width += 5; + + &Apache::lonnet::logthis("Nested min: $min_nested_width"); + &Apache::lonnet::logthis("Nested max: $max_nested_width"); + my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'}; + my $outer_row = $Apache::londefdef::table[-2]{'row_number'}; + &Apache::lonnet::logthis("Outer row/column: $outer_row : $outer_column"); + if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) { + $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width; + } + if ($max_nested_width > $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column]) { + $Apache::londefdef::table[-2]{'maxlen'}[$outer_row][$outer_column] = $max_nested_width; + } + pop @Apache::londefdef::table; push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory; } else { @@ -2194,6 +2250,9 @@ sub end_table { pop @Apache::londefdef::table; undef @Apache::londefdef::table; } + &debug_dump_table; + &Apache::lonnet::logthis("---------end table------"); + } return $currentstring; } @@ -2205,6 +2264,7 @@ sub start_tr { if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { + &Apache::lonnet::logthis("--------------start-tr----------"); $Apache::londefdef::table[-1]{'row_number'}++; my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($alignchar ne '') { @@ -2219,6 +2279,8 @@ sub start_tr { push @ {$Apache::londefdef::table[-1]{'minlen'}}, []; push @ {$Apache::londefdef::table[-1]{'maxlen'}}, []; push @ {$Apache::londefdef::table[-1]{'content'}}, []; + &debug_dump_table; + &Apache::lonnet::logthis("------------start-tr-----------"); } return $currentstring; } @@ -2229,9 +2291,13 @@ sub end_tr { if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { + &Apache::lonnet::logthis("-------end-tr-----"); if ($Apache::londefdef::TD_redirection) { &end_td_tex($parstack,$parser,$safeeval); } + &debug_dump_table; + &Apache::lonnet::logthis("------end-tr------"); + } return $currentstring; } @@ -2243,8 +2309,11 @@ sub start_td { if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { + &Apache::lonnet::logthis("------start-td----"); $Apache::londefdef::TD_redirection = 1; &tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval); + &debug_dump_table; + &Apache::lonnet::logthis("-----start-td-----"); } return $currentstring; } @@ -2365,7 +2434,7 @@ sub end_td_tex { } } for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) { - $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/; + $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in] \&/; } push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; return''; @@ -2377,8 +2446,11 @@ sub end_td { if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { + &Apache::lonnet::logthis("--------end_td-----"); $Apache::londefdef::TD_redirection =0; &end_td_tex($parstack,$parser,$safeeval); + &debug_dump_table; + &Apache::lonnet::logthis("--------end-td----"); } return $currentstring; } @@ -4056,7 +4128,11 @@ sub file_path { } return $file,$path; } - +# Converts a measurement in to mm from any of +# the other valid LaTeX units of measure. +# If the units of measure are missing from the +# parameter, it is assumed to be in and returned +# with mm units of measure sub recalc { my $argument = shift; if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}