--- loncom/xml/londefdef.pm	2003/07/25 10:44:36	1.155
+++ loncom/xml/londefdef.pm	2003/08/08 17:48:40	1.160
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.155 2003/07/25 10:44:36 www Exp $
+# $Id: londefdef.pm,v 1.160 2003/08/08 17:48:40 sakharuk Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -25,8 +25,7 @@
 # /home/httpd/html/adm/gpl.txt
 #
 # http://www.lon-capa.org/
-#
-# Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
+## Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
 # TtHfunc and TtMfunc (the "Code") may be compiled and linked into 
 # binary executable programs or libraries distributed by the 
 # Michigan State University (the "Licensee"), but any binaries so 
@@ -52,6 +51,8 @@ use Image::Magick;
 use Apache::lonmenu();
 use Apache::lonmeta();
 
+$Apache::londefdef::TD_redirection=0;
+
 BEGIN {
 
     &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
@@ -1079,12 +1080,14 @@ sub end_q {
 
 #-- <p> tag
 sub start_p {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= '\par ';
+	my $signal=1;
+	foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}}
+	if ($signal) {$currentstring .= '\par ';}
     }
     return $currentstring;
 }
@@ -1839,11 +1842,14 @@ sub start_tr {
 }
         
 sub end_tr {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
+	if ($Apache::londefdef::TD_redirection) {
+	    &end_td_tex($parstack,$parser,$safeeval);    
+	}
 	push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'};
 	push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};
     }
@@ -1857,49 +1863,80 @@ sub start_td {
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
-	if ($what_to_push eq '') {
-	    $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;
-	}
-	push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push;
-	$Apache::londefdef::table[-1]{'counter_columns'}++;
-	&Apache::lonxml::startredirection();
+	$Apache::londefdef::TD_redirection = 1;
+	&tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
     } 
     return $currentstring;
 }   
-     
+    
+sub tag_check {
+    my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
+    my @ar=@$parstack; 
+    for (my $i=$#ar-1;$i>=0;$i--) {
+	if (lc($$tagstack[$i]) eq $good_tag) {
+	    &start_td_tex($parstack,$parser,$safeeval);
+	    last;
+	} elsif (lc($$tagstack[$i]) eq $bad_tag) {
+	    splice @ar, $i+1;
+	    &end_td_tex(\@ar,$parser,$safeeval);
+	    &start_td_tex($parstack,$parser,$safeeval);
+	    last;
+	}
+    }
+    return '';
+}
+ 
+sub start_td_tex {
+    my ($parstack,$parser,$safeeval) = @_;
+    my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
+    if ($what_to_push eq '') {
+	$what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;
+    }
+    push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push;
+    $Apache::londefdef::table[-1]{'counter_columns'}++;
+    &Apache::lonxml::startredirection();
+    return '';
+}
+
+sub end_td_tex {
+    my ($parstack,$parser,$safeeval) = @_;
+    my $current_row = $Apache::londefdef::table[-1]{'row_number'};
+    my $data=&Apache::lonxml::endredirection();
+    my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
+    if (defined $TeXwidth) {		
+	my $current_length=&recalc($TeXwidth);
+	$current_length=~/(\d+)/;
+	$Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
+	$Apache::londefdef::table[-1]{'length'} .= '0,';
+    } else {
+	if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
+	    my $current_length=&recalc($1);
+	    $current_length=~/(\d+\.?\d*)/;
+	    $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
+	    $Apache::londefdef::table[-1]{'length'} .= '0,';
+	} else {  
+	    $data=~s/^\s+(\S.*)/$1/;
+	    $data=~s/(.*\S)\s+$/$1/;
+	    my $current_length=2*length($data);
+	    $Apache::londefdef::table[-1]{'length'} .= $current_length.',';
+	    $Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
+	}        
+    }
+	for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {         
+	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
+	}
+    @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
+    return'';
+}
+
 sub end_td {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	my $current_row = $Apache::londefdef::table[-1]{'row_number'};
-	my $data=&Apache::lonxml::endredirection();
-	my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
-	if (defined $TeXwidth) {		
-	    my $current_length=&recalc($TeXwidth);
-	    $current_length=~/(\d+)/;
-	    $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
-	    $Apache::londefdef::table[-1]{'length'} .= '0,';
-	} else {
-	    if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
-		my $current_length=&recalc($1);
-		$current_length=~/(\d+\.?\d*)/;
-		$Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
-		$Apache::londefdef::table[-1]{'length'} .= '0,';
-	    } else {  
-		$data=~s/^\s+(\S.*)/$1/;
-		$data=~s/(.*\S)\s+$/$1/;
-		my $current_length=2*length($data);
-		$Apache::londefdef::table[-1]{'length'} .= $current_length.',';
-		$Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
-	    }        
-	}
-	for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {         
-	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
-	}
-	@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
+        $Apache::londefdef::TD_redirection =0;
+	&end_td_tex($parstack,$parser,$safeeval);
     }
     return $currentstring;
 }
@@ -1970,10 +2007,9 @@ sub start_img {
     my $width_param = '';
     my $height_param = '';
     my $scaling = .3;
-    
     if ($target eq 'web') {
 	if ($ENV{'browser.imagesuppress'} ne 'on') {
-	    $currentstring = $token->[4];
+	    $currentstring.= $token->[4];
 	} else {
 	    my $alttag= &Apache::lonxml::get_param
 		('alt',$parstack,$safeeval,undef,1);
@@ -1981,12 +2017,11 @@ sub start_img {
 		$alttag=&Apache::lonmeta::alttag
 		    ($Apache::lonxml::pwd[-1],$src);
 	    }
-	    $currentstring='[IMAGE: '.$alttag.']';
+	    $currentstring.='[IMAGE: '.$alttag.']';
 	}
     } elsif ($target eq 'tex') {
 	$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
 	&image_replication($src);
-	
 	#if original gif/jpg/png file exist do following:
 	if (-e $src) {          
 	    #defines the default size of image
@@ -2011,6 +2046,7 @@ sub start_img {
 	    } elsif ($width ne '') {
 		$width_param = $width*$scaling;      
 	    }
+	    if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
 	    my $file;
 	    my $path;	
 	    if ($src =~ m!(.*)/([^/]*)$!) {