--- loncom/xml/londefdef.pm 2005/07/10 21:43:35 1.278
+++ loncom/xml/londefdef.pm 2006/01/04 23:02:40 1.309
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.278 2005/07/10 21:43:35 www Exp $
+# $Id: londefdef.pm,v 1.309 2006/01/04 23:02:40 albertel Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -47,7 +47,8 @@ use Image::Magick;
use Apache::lonmenu();
use Apache::lonmeta();
use Apache::Constants qw(:common);
-
+use File::Basename;
+# use Data::Dumper;
BEGIN {
@@ -55,6 +56,20 @@ 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 +124,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;
@@ -128,10 +143,11 @@ sub end_m {
}
sub start_tthoption {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $result;
if ($target eq 'web') {
- my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser);
+ my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser,
+ $style);
$inside=~s/^\s*//;
if ($env{'browser.mathml'}) {
&tth::ttmoptions($inside);
@@ -157,15 +173,17 @@ sub start_html {
if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) {
$currentstring = &Apache::lonxml::xmlbegin();
} elsif ($target eq 'tex') {
- $currentstring .= '\documentclass[letterpaper]{article}';
+ $currentstring .= '\documentclass[letterpaper,twoside]{article}';
if (($env{'form.latex_type'}=~'batchmode') ||
(!$env{'request.role.adv'})) {$currentstring .='\batchmode';}
$currentstring .= '\newcommand{\keephidden}[1]{}'.
'\renewcommand{\deg}{$^{\circ}$}'.
+ '\usepackage{multirow}'.
'\usepackage{longtable}'.
'\usepackage{textcomp}'.
'\usepackage{makeidx}'.
'\usepackage[dvips]{graphicx}'.
+ '\usepackage{wrapfig}'.
'\usepackage{picins}'.
'\usepackage{epsfig}'.
'\usepackage{calc}'.
@@ -367,13 +385,13 @@ sub end_title {
#-- tag (end tag forbidden)
sub start_meta {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $currentstring = '';
if ($target eq 'web') {
my $args='';
if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
if ($args eq '') {
- &Apache::lonxml::get_all_text("/meta",$parser);
+ &Apache::lonxml::get_all_text("/meta",$parser,$style);
} else {
$currentstring = $token->[4];
}
@@ -436,7 +454,7 @@ sub end_meta {
# accessrule
sub start_accessrule {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $currentstring = '';
my $eff=&Apache::lonxml::get_param
('effect',$parstack,$safeeval,undef,1);
@@ -455,7 +473,7 @@ sub start_accessrule {
my $args='';
if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
if ($args eq '') {
- &Apache::lonxml::get_all_text("/accessrule",$parser);
+ &Apache::lonxml::get_all_text("/accessrule",$parser,$style);
} else {
$currentstring = $token->[4];
}
@@ -540,6 +558,10 @@ sub start_body {
$currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
}
$currentstring.='>';
+ &Apache::lontexconvert::jsMath_reset();
+ if ($env{'environment.texengine'} eq 'jsMath') {
+ $currentstring.=&Apache::lontexconvert::jsMath_header();
+ }
if ($env{'request.state'} ne 'published') {
if ($env{'environment.remote'} eq 'off') {
$currentstring.=
@@ -563,7 +585,7 @@ EDITBUTTON
sub end_body {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off unclosed
+ my $currentstring = &end_p(); # Close off unclosed
if ($target eq 'web') {
$currentstring .= &Apache::lonxml::xmlend($target,$parser);
} elsif ($target eq 'tex') {
@@ -572,37 +594,48 @@ sub end_body {
return $currentstring;
}
+# \begin{center} causes a new paragprah spacing that looks odd inside
+# of a table cell
+sub center_correction { return '\vspace*{-6 mm}'; }
#--
tag (end tag required)
sub start_center {
- my ($target,$token) = @_;
- my $currentstring = &end_p; # Close off any prior para.
+ 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];
} elsif ($target eq 'tex') {
$currentstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring .= ¢er_correction();
+ }
}
return $currentstring;
}
#-- tag (end tag required)
+# NOTE: In TeX mode disables internal
sub start_b {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- $currentstring = '\textbf{';
+ &disable_para();
+ $currentstring .= '\textbf{';
}
return $currentstring;
}
@@ -613,18 +646,21 @@ sub end_b {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = '}';
+ &enable_para();
+ $currentstring = '}';
}
return $currentstring;
}
#-- tag (end tag required)
+# NOTE: in TeX mode disables internal
sub start_strong {
my ($target,$token) = @_;
my $currentstring = '';
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
+ &disable_para();
$currentstring = '\textbf{';
}
return $currentstring;
@@ -636,6 +672,7 @@ sub end_strong {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
+ &enable_para();
$currentstring = '}';
}
return $currentstring;
@@ -644,7 +681,7 @@ sub end_strong {
#--
tag (end tag required)
sub start_h1 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior para.
+ my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -693,7 +730,7 @@ sub end_h1 {
#--
tag
sub start_h2 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior para.
+ my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -736,7 +773,7 @@ sub end_h2 {
#--
tag
sub start_h3 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior para.
+ my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -779,7 +816,7 @@ sub end_h3 {
#--
tag
sub start_h4 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior para.
+ my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -822,7 +859,7 @@ sub end_h4 {
#--
tag
sub start_h5 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior paras.
+ my $currentstring = &end_p(); # Close off any prior paras.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -865,7 +902,7 @@ sub end_h5 {
#--
tag
sub start_h6 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # Close off any prior paras.
+ my $currentstring = &end_p(); # Close off any prior paras.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -1123,19 +1160,42 @@ sub end_q {
my $closing_string = ''; # String required to close
+# Some tags are
fragile meaning that
inside of them
+# does not work within TeX mode. This is managed via the
+# counter below:
+#
+
+ my $para_disabled = 0;
+
+sub disable_para {
+ $para_disabled++;
+}
+sub enable_para {
+ $para_disabled--;
+}
+
+
#--
tag (end tag optional)
#optional attribute - align="center|left|right"
sub start_p {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # close off prior para if in progress.
+ my $currentstring = '';
if ($target eq 'web') {
+ $currentstring .= &end_p(); # close off prior para if in progress.
$currentstring .= $token->[4];
- $closing_string = '
'; # Not sure this is correct.
- } elsif ($target eq 'tex') {
+ if (! ($currentstring =~ /\//)) {
+ $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;
+ $closing_string .= ¢er_correction();
+ }
} elsif ($align eq 'right') {
$currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
$closing_string= '}}';
@@ -1144,18 +1204,8 @@ sub start_p {
$closing_string = '}\hfill}';
} else {
$currentstring.='\par ';
- $closing_string = '\strut\\\\\strut';
+ $closing_string = '\strut\\\\\strut ';
}
- my $signal=1;#
does not work inside ...
- foreach my $tag (@$tagstack) {
- if (lc($tag) eq 'b') {
- $signal=0;
- }
- }
- if (!$signal) {
- $currentstring = &end_p; # Just close the prior? Not sure this is correct
- $closing_string = ''; # Probably correct?
- }
}
return $currentstring;
@@ -1164,9 +1214,16 @@ sub start_p {
# End paragraph processing just requires that we output the
# closing string that was saved and blank it.
sub end_p {
- my $current_string = $closing_string;
- $closing_string = ''; # Not in a para anymore.
- return $current_string;
+ # Note only 'tex' mode uses disable_para and enable_para
+ # so we don't need to know the target in the check below:
+
+ if (!$para_disabled) {
+ my $current_string = $closing_string;
+ $closing_string = ''; # Not in a para anymore.
+ return $current_string;
+ } else {
+ return '';
+ }
}
}
@@ -1179,6 +1236,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') ||
@@ -1415,7 +1475,7 @@ sub end_sup {
#--
tag (end tag forbidden)
sub start_hr {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = &end_p; # End enclosing para.
+ my $currentstring = &end_p(); # End enclosing para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
@@ -1453,12 +1513,48 @@ sub end_hr {
}
#--
tag (end tag required)
+{
+
+# Since div can be nested, the stack below is used
+# in 'tex' mode to store the ending strings
+# for the div stack.
+
+ my @div_end_stack;
+
sub start_div {
- my ($target,$token) = @_;
- my $currentstring = &end_p; # Close enclosing para.
+ my ($target,$token, $tagstack, $parstack, $parser, $safeeval) = @_;
+ my $currentstring = &end_p(); # Close enclosing para.
if ($target eq 'web') {
$currentstring .= $token->[4];
}
+ if ($target eq 'tex') {
+ # 4 possible alignments: left, right, center, and -missing-.
+
+ my $endstring = '';
+
+ my $align = lc(&Apache::lonxml::get_param('align', $parstack,
+ $safeeval, undef, 1));
+ if ($align eq 'center') {
+ $currentstring .= '\begin{center}';
+ $endstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ $endstring .= ¢er_correction();
+ }
+ }
+ elsif ($align eq 'right') {
+ $currentstring .= '\begin{flushright}';
+ $endstring .= '\end{flushright}';
+ } elsif ($align eq 'left') {
+ $currentstring .= '\begin{flushleft}';
+ $endstring = '\end{flushleft}';
+ } else {
+
+ }
+ $currentstring .= "\n"; # For human readability.
+ $endstring = "\n$endstring\n"; # For human readability
+ push(@div_end_stack, $endstring);
+ }
return $currentstring;
}
@@ -1467,9 +1563,14 @@ sub end_div {
my $currentstring = '';
if ($target eq 'web') {
$currentstring .= $token->[2];
- }
+ }
+ if ($target eq 'tex') {
+ my $endstring = pop @div_end_stack;
+ $currentstring .= $endstring;
+ }
return $currentstring;
}
+}
#-- tag (end tag required)
sub start_a {
@@ -1537,7 +1638,7 @@ sub start_li {
sub end_li {
my ($target,$token) = @_;
- my $currentstring = &end_p; # In case there's a