--- loncom/xml/londefdef.pm 2005/09/22 10:27:25 1.287
+++ 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.287 2005/09/22 10:27:25 foxr 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;
@@ -110,8 +126,8 @@ sub start_m {
# detect simple math mode entry exits, and convert them
# to use \ensuremath
if ($currentstring=~/^\s*\$[^\$].*[^\$]\$\s*$/) {
- $currentstring=~s/^\$//;
- $currentstring=~s/\$$//;
+ $currentstring=~s/^(\s*)\$/$1/;
+ $currentstring=~s/\$(\s*)$/$1/;
$currentstring='\ensuremath{'.$currentstring.'}';
}
$Apache::lonxml::post_evaluate=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;
}
@@ -2531,7 +2603,7 @@ sub start_img {
my $inside = &Apache::lonxml::get_all_text("/img",$parser);
return '';
}
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
+ &Apache::lonxml::extlink($src);
my $currentstring = '';
my $scaling = .3;
@@ -2585,7 +2657,7 @@ sub start_img {
undef,0);
&Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
if(!$latex_rendering) {
- $latex_rendering = "parbox";
+ $latex_rendering = "texwrap";
}
&Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
@@ -2741,12 +2813,10 @@ sub start_applet {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1);
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$code;
-
+ &Apache::lonxml::extlink($code);
my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval,
undef,1);
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$archive;
-
+ &Apache::lonxml::extlink($archive);
my $currentstring = '';
if ($target eq 'web') {
if ($env{'browser.appletsuppress'} ne 'on') {
@@ -2792,7 +2862,7 @@ sub end_applet {
sub start_embed {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
+ &Apache::lonxml::extlink($src);
my $currentstring = '';
if ($target eq 'web') {
if ($env{'browser.embedsuppress'} ne 'on') {
@@ -2823,13 +2893,15 @@ sub end_embed {
#-- tag (end tag forbidden)
sub start_param {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- if (&Apache::lonxml::get_param
- ('name',$parstack,$safeeval,undef,1)=~/^cabbase$/i) {
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
- &Apache::lonxml::get_param('value',$parstack,$safeeval,undef,1);
- }
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
- &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
+ if (&Apache::lonxml::get_param('name',$parstack,
+ $safeeval,undef,1)=~/^cabbase$/i) {
+ my $value=&Apache::lonxml::get_param('value',$parstack,
+ $safeeval,undef,1);
+ &Apache::lonxml::extlink($value);
+ }
+
+ my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
+ &Apache::lonxml::extlink($src);
my $currentstring = '';
if ($target eq 'web') {
my %toconvert;
@@ -2861,9 +2933,8 @@ sub end_param {
sub start_allow {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
- $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
- $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
- &Apache::lonnet::clutter($src);
+ &Apache::lonxml::extlink($src);
+
if ($target eq 'tex') { &image_replication($src); }
my $result;
if ($target eq 'edit') {
@@ -3457,9 +3528,12 @@ sub end_legend {
#-- tag (end tag forbidden)
sub start_link {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web') {
+ my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval,
+ undef,1);
+ &Apache::lonxml::extlink($href);
$currentstring = $token->[4];
}
return $currentstring;
@@ -4054,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';}