--- loncom/xml/londefdef.pm 2005/08/11 22:04:09 1.285
+++ loncom/xml/londefdef.pm 2005/11/28 22:37:41 1.297
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.285 2005/08/11 22:04:09 foxr Exp $
+# $Id: londefdef.pm,v 1.297 2005/11/28 22:37:41 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,22 @@ 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;
@Apache::londefdef::table = ();
@@ -109,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;
@@ -166,6 +183,7 @@ sub start_html {
'\usepackage{textcomp}'.
'\usepackage{makeidx}'.
'\usepackage[dvips]{graphicx}'.
+ '\usepackage{wrapfig}'.
'\usepackage{picins}'.
'\usepackage{epsfig}'.
'\usepackage{calc}'.
@@ -1205,6 +1223,9 @@ sub start_br {
} elsif ($target eq 'tex') {
my @tempo=@$tagstack;
my $signal=0;
+ # Not going to factor this to is_inside_of since that would require
+ # multiple stack traversals.
+ #
for (my $i=$#tempo;$i>=0;$i--) {
if (($tempo[$i] eq 'b') || ($tempo[$i] eq 'strong') ||
($tempo[$i] eq 'ol') || ($tempo[$i] eq 'ul') ||
@@ -1920,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);
@@ -1965,7 +1987,9 @@ sub start_table {
$Apache::londefdef::table[-1]{'content'}=[];
$Apache::londefdef::table[-1]{'align'}=[];
$currentstring.='\keephidden{NEW TABLE ENTRY}';
- }
+
+
+ }
return $currentstring;
}
@@ -1979,6 +2003,7 @@ sub end_table {
my $output = '';
my $WARNING='';
#width of columns from TeXwidth attributes
+
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]) {
@@ -2163,13 +2188,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.='} ';
}
@@ -2182,6 +2209,32 @@ 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'};
+ # 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;
+
+ my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};
+ my $outer_row = $Apache::londefdef::table[-2]{'row_number'};
+ 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 {
@@ -2227,6 +2280,9 @@ sub end_tr {
if ($Apache::londefdef::TD_redirection) {
&end_td_tex($parstack,$parser,$safeeval);
}
+
+
+
}
return $currentstring;
}
@@ -2360,7 +2416,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'';
@@ -2526,7 +2582,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;
@@ -2559,7 +2615,11 @@ sub start_img {
$safeeval,
undef,1));
if(!$align) {
- $align = "bottom"; # This is html's default so it's ours too.
+ if (&is_inside_of($tagstack, "table")) {
+ $align = "right"; # Force wraptext use.
+ } else {
+ $align = "bottom"; # This is html's default so it's ours too.
+ }
}
#
&Apache::lonxml::debug("Alignemnt = $align");
@@ -2576,7 +2636,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");
@@ -2617,16 +2677,17 @@ sub start_img {
} elsif ($align eq "left") {
if ($latex_rendering eq "parpic") {
$currentstring = '\parpic[l]{'.$currentstring.'}';
- } else { # parbox rendering
- $currentstring = "\\strut\\newline\n".
- '\parbox{'.$width_param.'mm}{'.$currentstring.'}';
+ } else { # wrapfig render
+ $currentstring = '\begin{wrapfigure}{l}{'.$width_param.'mm}'
+ .'\scalebox{1.0}{'.$currentstring.'}\end{wrapfigure}';
}
} elsif ($align eq "right") {
if ($latex_rendering eq "parpic") {
$currentstring = '\parpic[r]{'.$currentstring.'}';
- } else { # parbox rendering.
- $currentstring = '\parbox{'.$width_param.'mm}{\begin{flushright}'
- .$currentstring.'\end{flushright}} \newline'."\n";
+ } else { # wrapfig rendering
+ $currentstring = '\begin{wrapfigure}{r}{'.$width_param.'mm}'
+ .'\scalebox{1.0}{'.$currentstring.'}\end{wrapfigure}';
+
}
} else { # Bottom is also default.
# $currentstring = '\raisebox{'.$height_param.'mm}{'.$currentstring.'}';
@@ -2731,12 +2792,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') {
@@ -2782,7 +2841,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') {
@@ -2813,13 +2872,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;
@@ -2851,9 +2912,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') {
@@ -3447,9 +3507,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;
@@ -4044,7 +4107,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';}
@@ -4089,6 +4156,26 @@ sub LATEX_length {
}
+# is_inside_of $tagstack $tag
+# This sub returns true if the current state of Xml processing
+# is inside of the tag.
+# Parameters:
+# tagstack - The tagstack from the parser.
+# tag - The tag (without the <>'s.).
+# Sample usage:
+# if (is_inside_of($tagstack "table")) {
+# # I'm in a table....
+# }
+sub is_inside_of {
+ my ($tagstack, $tag) = @_;
+ my @stack = @$tagstack;
+ for (my $i = ($#stack - 1); $i >= 0; $i--) {
+ if ($stack[$i] eq $tag) {
+ return 1;
+ }
+ }
+ return 0;
+}
1;