--- loncom/xml/londefdef.pm 2005/12/19 23:27:33 1.303
+++ loncom/xml/londefdef.pm 2006/03/23 22:34:53 1.323
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.303 2005/12/19 23:27:33 foxr Exp $
+# $Id: londefdef.pm,v 1.323 2006/03/23 22:34:53 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 {
@@ -106,11 +105,21 @@ sub start_m {
$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
#&Apache::lonxml::debug("M is evaulated to:$inside:");
}
+ my $tex = $inside;
my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
$currentstring = &Apache::lontexconvert::converted(\$inside,$display);
if ($Apache::lontexconvert::errorstring) {
- &Apache::lonxml::warning("tth error: ".
- $Apache::lontexconvert::errorstring);
+ my $errormsg='
tag (end tag required)
sub start_center {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack) = @_;
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) = @_;
+ my ($target,$token,$tagstack) = @_;
my $currentstring = '';
if ($target eq 'web') {
$currentstring = $token->[2];
@@ -1178,20 +1194,30 @@ sub start_p {
$closing_string = ''; # Deal correctly with e.g.
}
} elsif ($target eq 'tex' && !$para_disabled) {
+
$currentstring .= &end_p(); # close off prior para if in progress.
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
if ($align eq 'center') {
$currentstring .='\begin{center}\par';
$closing_string = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ }
} elsif ($align eq 'right') {
- $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
- $closing_string= '}}';
+ $currentstring.="\n".'{\flushright ';
+# $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
+ $closing_string= "}\n";
} elsif ($align eq 'left') {
- $currentstring.='\noindent\makebox['.$env{'form.textwidth'}.']{\rlap{';
- $closing_string = '}\hfill}';
+ $currentstring.= "\n".'{\flushleft ';
+# $currentstring.='\noindent\makebox['.$env{'form.textwidth'}.']{{';
+ $closing_string = "}\n";
} else {
$currentstring.='\par ';
- $closing_string = '\strut\\\\\strut ';
+ if (&is_inside_of($tagstack, 'table')) {
+ $closing_string = '\vskip 0pt'; # Seems to be consistent with in tables.
+ } else {
+ $closing_string = '\strut\\\\\strut ';
+ }
}
}
@@ -1524,6 +1550,9 @@ sub start_div {
if ($align eq 'center') {
$currentstring .= '\begin{center}';
$endstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ }
}
elsif ($align eq 'right') {
$currentstring .= '\begin{flushright}';
@@ -1944,11 +1973,16 @@ 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 (not defined $TeXwidth) {
- $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
-
+ if (!defined($TeXwidth)) {
+ my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,
+ $safeeval,undef,1);
+ if ($htmlwidth =~ /%/) {
+ $TeXwidth = $htmlwidth;
+ } else {
+ $TeXwidth = $textwidth;
+ }
} else {
$Apache::londefdef::table[-1]{'forcedtablewidth'} = 1;
}
@@ -1958,7 +1992,12 @@ sub start_table {
$Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
} else {
$Apache::londefdef::table[-1]{'width'}=$TeXwidth;
- }
+ }
+ # In the end, however the table width cannot be wider than $textwidth...
+
+ if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {
+ $Apache::londefdef::table[-1]{'width'} = $textwidth;
+ }
#table's border
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
@@ -2186,23 +2225,82 @@ sub end_table {
$header_of_table .= '}';
#fill the table
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+ my $have_rowspan = 0;
for (my $jn=0;$jn<=$#fwidth;$jn++) {
+
+ #-----------------------------------------------------------
+ # I think this order of doing things will ensure that
+ # single rowspan, columspan and combined row/colspans will
+ # work correctly. LaTeX is delicate here.
+ # RF.
+
+ # Start a rowspan if necessary:
+
+ my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
+ my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn];
+ #
+ # Do the appropriate magic if this has a colspan
+ #
+
+ if ($colspan > 1) {
+ $output .= '\multicolumn{'.
+ $colspan
+ .'}{|l|}{';
+ }
+
+ if ($rowspan > 1) {
+ $have_rowspan++;
+ $output .= '\multirow{'.$rowspan.'}[0]{'.$fwidth[$jn].'mm}{';
+ }
+ if (($rowspan eq '^') || ($rowspan eq '_')) {
+ $have_rowspan++;
+ }
+ #--------------------------------------------------------------
+
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- # $output.='\vspace*{-6 mm}\begin{center}';
- $output.='\begin{center}';
+ $output.=¢er_correction().'\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}';
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
$output.='} ';
}
+ # Close off any open multirow:
+
+ if ($rowspan > 1) {
+ $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'}.' ';
+ # If have_rowspan > 0, and borders are on, then
+ # we need to do more than put an \hline at the bottom of row.
+ # we need to do the appropriate \cline to ensure that
+ # the spanned rows don't have \hlines through them.
+
+ if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) {
+ $output .= ' \\\\ ';
+ for (my $jn=0; $jn<=$#fwidth;$jn++) {
+ my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
+ if ($rowspan ne "^") {
+ if (($rowspan <= 1) || ($rowspan eq '_')) {
+ my $column = $jn+1;
+ $output .= '\cline{'.$column.'-'.$column.'} ';
+ }
+ }
+ }
+
+ } else {
+ $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
+ }
}
# Note that \newline destroys alignment env's produced by e.g.
# $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';
@@ -2346,16 +2444,51 @@ sub start_td_tex {
sub end_td_tex {
my ($parstack,$parser,$safeeval) = @_;
- my $current_row = $Apache::londefdef::table[-1]{'row_number'};
+ 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.
+ # _ indicates the cell is at the bottom of 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] =~ /[\^\_]/)) {
+ # Part of a span.
+ push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
+ $current_column++;
+ }
+ $Apache::londefdef::table[-1]{'counter_columns'} = $current_column;
+
+
# Get the column and row spans.
# Colspan can be done via \multicolumn if I can figure out the data structs.
- # Rowspan, can be done using the multirow package which adds similar stuff to rowspanning.
my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0);
+ if (!$colspan) {
+ $colspan = 1;
+ }
+
my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0);
-
+ if (!$rowspan) {
+ $rowspan = 1;
+ }
+
+
+
+ for (my $c = 0; $c < $colspan; $c++) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column+$c] = $rowspan;
+ for (my $i = 1; $i < $rowspan; $i++) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '^';
+ if ($i == ($rowspan-1)) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '_';
+ }
+ }
+ }
+
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';
@@ -2444,7 +2577,30 @@ 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;
+
+
+
+
+ # 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]{'counter_columns'} += $colspan -1;
+ for (my $i = 0; $i < ($colspan -1); $i++) {
+ push @ {$Apache::londefdef::table[-1]{'content'}[-1] },'';
+ }
+ for (my $r = 0; $r < $rowspan; $r++) {
+ $Apache::londefdef::table[-1]{'colspan'}[$current_row+$r][$current_column] = $colspan;
+ # Put empty text in spanned cols.
+
+ }
+
+
+
return '';
}
@@ -2616,13 +2772,17 @@ sub start_img {
if ($target eq 'web') {
if ($env{'browser.imagesuppress'} ne 'on') {
- $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
- } else {
- my $alttag= &Apache::lonxml::get_param
- ('alt',$parstack,$safeeval,undef,1);
- unless ($alttag) {
- $alttag=&Apache::lonmeta::alttag
- ($Apache::lonxml::pwd[-1],$src);
+ my $enc = ('yes' eq
+ lc(&Apache::lonxml::get_param('encrypturl',$parstack,
+ $safeeval)));
+ $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},
+ $enc);
+ } else {
+ my $alttag = &Apache::lonxml::get_param('alt',$parstack,$safeeval,
+ undef,1);
+ if (!$alttag) {
+ $alttag = &Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
+ $src);
}
$currentstring.='[IMAGE: '.$alttag.']';
}
@@ -2641,11 +2801,7 @@ sub start_img {
$safeeval,
undef,1));
if(!$align) {
- 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");
@@ -2660,11 +2816,18 @@ sub start_img {
$parstack,
$safeeval,
undef,0);
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
if(!$latex_rendering) {
- $latex_rendering = "texwrap";
+ $latex_rendering = "texwrap";
+ }
+ # using texwrap inside a table does not work. So, if after all of this,
+ # texwrap is on, we turn it off if we detect we're in a table:
+ #
+ if (($latex_rendering eq 'texwrap') && &is_inside_of($tagstack, "table")) {
+ $latex_rendering = 'parpic';
}
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
+
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
#if original gif/jpg/png file exist do following:
my $origsrc=$src;
@@ -2746,6 +2909,8 @@ sub start_img {
['','bottom','middle','top','left','right'],$token,5);
$currentstring .=&Apache::edit::select_arg('TeXwrap:', 'TeXwrap',
['', 'parbox', 'parpic'], $token, 2);
+ $currentstring .=&Apache::edit::select_arg('Encyrpt URL:','encrypturl',
+ ['no','yes'], $token, 2);
$currentstring .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
my $src= &Apache::lonxml::get_param('src',$parstack,$safeeval);
my $alt= &Apache::lonxml::get_param('alt',$parstack,$safeeval);
@@ -2763,7 +2928,7 @@ sub start_img {
my $ctag=&Apache::edit::get_new_args($token,$parstack,
$safeeval,'src','alt','align',
'TeXwidth','TeXheight', 'TeXwrap',
- 'width','height');
+ 'width','height','encrypturl');
my ($nsrc,$nwidth,$nheight)=
($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
my $loc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$nsrc);
@@ -3038,6 +3203,7 @@ sub start_pre {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\begin{verbatim}';
+ &Apache::lonxml::disable_LaTeX_substitutions();
}
return $currentstring;
}
@@ -3049,6 +3215,7 @@ sub end_pre {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '\end{verbatim}';
+ &Apache::lonxml::enable_LaTeX_substitutions();
}
return $currentstring;
}