--- loncom/xml/londefdef.pm 2004/01/08 19:49:59 1.192
+++ loncom/xml/londefdef.pm 2023/09/27 14:52:27 1.473
@@ -1,8 +1,8 @@
# The LearningOnline Network with CAPA
-# Tags Default Definition Module
+# Tags Default Definition Module
+#
+# $Id: londefdef.pm,v 1.473 2023/09/27 14:52:27 raeburn Exp $
#
-# $Id: londefdef.pm,v 1.192 2004/01/08 19:49:59 sakharuk Exp $
-#
#
# Copyright Michigan State University Board of Trustees
#
@@ -25,47 +25,52 @@
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
-## 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
+## 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
# distributed are hereby licensed only for use in the context
-# of a program or computational system for which the Licensee is the
-# primary author or distributor, and which performs substantial
+# of a program or computational system for which the Licensee is the
+# primary author or distributor, and which performs substantial
# additional tasks beyond the translation of (La)TeX into HTML.
# The C source of the Code may not be distributed by the Licensee
# to any other parties under any circumstances.
#
-#
-# last modified 06/26/00 by Alexander Sakharuk
-# 11/6,11/30,02/01/01,5/4 Gerd Kortemeyer
-# 01/18 Alex Sakharuk
-package Apache::londefdef;
+package Apache::londefdef;
-use Apache::lonnet();
+use Apache::lonnet;
use strict;
use Apache::lonxml;
-use Apache::File();
+use Apache::lontable;
use Image::Magick;
use Apache::lonmenu();
use Apache::lonmeta();
+use Apache::lonlocal;
+use Apache::loncommon();
use Apache::Constants qw(:common);
-
+use File::Basename;
+use LONCAPA();
+# use Data::Dumper;
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'));
+ &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','style','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
}
+
sub initialize_londefdef {
$Apache::londefdef::TD_redirection=0;
@Apache::londefdef::table = ();
$Apache::londefdef::select=0;
- @Apache::londefdef::description=();
- $Apache::londefdef::DD_redirection=0;
- $Apache::londefdef::DT_redirection=0;
+ undef(@Apache::londefdef::description);
+ @Apache::londefdef::DD=(0);
+ @Apache::londefdef::DT=(0);
+ @Apache::londefdef::seenDT=(0);
+ $Apache::londefdef::list_index=0;
+ undef($Apache::londefdef::head);
+ undef($Apache::londefdef::title);
}
#======================= TAG SUBROUTINES =====================
@@ -84,32 +89,70 @@ sub end_output {
sub start_m {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $currentstring = '';
- my $inside = &Apache::lonxml::get_all_text("/m",$parser,$style);
- $inside=~s-
'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'occurred while attempting to convert this TeX:
'; + $tex = &HTML::Entities::encode($tex,'<>&"'); + my ($linenumber) = + ($Apache::lontexconvert::errorstring =~ /Line (\d+)/); + if (defined($linenumber)) { + my @tex=split("\n",$tex); + $tex[$linenumber]=''. + $tex[$linenumber].''; + $tex=join("\n",@tex); + } + &Apache::lonxml::warning($errormsg.$tex.''); $Apache::lontexconvert::errorstring=''; } #&Apache::lonxml::debug("M is ends with:$currentstring:"); $Apache::lonxml::post_evaluate=0; } elsif ($target eq 'tex') { + $currentstring = $inside; my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); if ($eval eq 'on') { $currentstring=&Apache::run::evaluate($currentstring,$safeeval,$$parstack[-1]); } if ($currentstring=~/^(\s*\\\\\s*)*$/) {$currentstring = ' \vskip 0 mm ';} + # detect simple math mode entry exits, and convert them + # to use \ensuremath ... unless there's a \verb inside. + if (! ($currentstring=~/\\verb/)) { + if ($currentstring=~/^\s*\$[^\$].*\$\s*$/) { + $currentstring=~s/^(\s*)\$/$1/; + $currentstring=~s/\$(\s*)$/$1/; + $currentstring='\ensuremath{'.$currentstring.'}'; + } + } $Apache::lonxml::post_evaluate=0; } return $currentstring; @@ -118,22 +161,20 @@ sub start_m { sub end_m { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $Apache::lonxml::prevent_entity_encode--; - } elsif ($target eq 'tex') { + if ($target eq 'tex') { $currentstring = ""; - } elsif ($target eq 'meta') { } return $currentstring; } 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); + if ($target eq 'web' || $target eq 'webgrade') { + my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser, + $style); $inside=~s/^\s*//; - if ($ENV{'browser.mathml'}) { + if ($env{'browser.mathml'}) { &tth::ttmoptions($inside); } else { &tth::tthoptions($inside); @@ -152,46 +193,20 @@ sub end_tthoption { sub start_html { my ($target,$token) = @_; my $currentstring = ''; - if ($ENV{'browser.mathml'}) { - &tth::ttminit(); - if ($ENV{'browser.unicode'}) { - &tth::ttmoptions('-L -u1'); - } else { - &tth::ttmoptions('-L -u0'); - } - } else { - &tth::tthinit(); - if ($ENV{'browser.unicode'}) { - &tth::tthoptions('-L -u1'); - } else { - &tth::tthoptions('-L -u0'); - } - } - if ($target eq 'web' || $target eq 'edit') { - $currentstring = &Apache::lonxml::xmlbegin(). - &Apache::lonxml::fontsettings(); - } elsif ($target eq 'tex') { - @Apache::londefdef::table = (); - $currentstring .= '\documentclass[letterpaper]{article}'; - if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} - $currentstring .= '\newcommand{\keephidden}[1]{} - \renewcommand{\deg}{$^{\circ}$} - \usepackage{longtable} - \usepackage{textcomp} - \usepackage{makeidx} - \usepackage[dvips]{graphicx} - \usepackage{epsfig}\usepackage{calc} -\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}} -\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; + if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { + # start_body() takes care of emitting the + } elsif ($target eq 'tex') { + + $currentstring .= &latex_header(); } return $currentstring; } sub end_html { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = &Apache::lonxml::xmlend(); + if ($target eq 'web' || $target eq 'webgrade') { + # end_body takes care of the } return $currentstring; } @@ -200,19 +215,22 @@ sub end_html { sub start_head { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; - } + if ($target eq 'web' || $target eq 'webgrade') { + &Apache::lonxml::startredirection(); + } return $currentstring; } sub end_head { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web' && $ENV{'request.state'} eq 'published') { - $currentstring = &Apache::lonmenu::registerurl(undef,$target). - $token->[2]; - } + if (($target eq 'web' && $env{'request.state'} eq 'published') || + ($target eq 'webgrade' && $env{'request.state'} eq 'published')) { + # in case there is a but no + if ($Apache::lonxml::redirection) { + $Apache::londefdef::head = &Apache::lonxml::endredirection(); + } + } return $currentstring; } @@ -220,18 +238,18 @@ sub end_head { sub start_map { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; + } return $currentstring; } sub end_map { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; + } return $currentstring; } @@ -239,8 +257,8 @@ sub end_map { sub start_select { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; } elsif ($target eq 'tex') { $Apache::londefdef::select=0; } @@ -250,9 +268,9 @@ sub start_select { sub end_select { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; + } return $currentstring; } @@ -260,8 +278,8 @@ sub end_select { sub start_option { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; } elsif ($target eq 'tex') { $Apache::londefdef::select++; if ($Apache::londefdef::select == 1) { @@ -276,8 +294,8 @@ sub start_option { sub end_option { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring='}'; } @@ -288,18 +306,18 @@ sub end_option { sub start_input { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; + } return $currentstring; } sub end_input { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; + } return $currentstring; } @@ -307,18 +325,18 @@ sub end_input { sub start_textarea { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; + } return $currentstring; } sub end_textarea { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; + } return $currentstring; } @@ -326,29 +344,30 @@ sub end_textarea { sub start_form { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[4]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[4]; + } return $currentstring; } sub end_form { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $currentstring = $token->[2]; - } + if ($target eq 'web' || $target eq 'webgrade') { + $currentstring = $token->[2]; + } return $currentstring; } #--
+ if ($target eq 'web' || $target eq 'webgrade') { + $currentstring .= &Apache::loncommon::end_page({'discussion' => 1}); } elsif ($target eq 'tex') { - $currentstring = '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}'; - } + $currentstring .= '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}'; + } return $currentstring; } +# \begin{center} causes a new paragprah spacing that looks odd inside +# of a table cell. Same at the end of a \center but with a slightly +# larger space .. hence center_correction and center_end_correction. +# +sub center_correction { return '\vspace*{-6 mm}'; } +sub center_end_correction { return '\vspace*{-7 mm}'; } + #--
sub start_b {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
- $currentstring = $token->[4];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
- $currentstring = '\textbf{';
- }
+ &disable_para();
+ $currentstring .= '\textbf{';
+ }
return $currentstring;
}
sub end_b {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
- $currentstring = $token->[2];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $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];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
- $currentstring = '\textbf{';
- }
+ &disable_para();
+ $currentstring = '\textbf{';
+ }
return $currentstring;
}
sub end_strong {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
- $currentstring = $token->[2];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = '}';
+ &enable_para();
+ $currentstring = '}';
}
return $currentstring;
}
@@ -644,13 +820,13 @@ sub end_strong {
#-- is a bit strange since it does not require a closing
+
+# 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 = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring .= &end_p(); # close off prior para if in progress.
$currentstring .= $token->[4];
- } elsif ($target eq 'tex') {
- my $signal=1;
- foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}}
- if ($signal) {$currentstring .= '\par ';}
+ if (! ($currentstring =~ /\//)) {
+ $closing_string = ' in tables.
+ } else {
+ $closing_string = '\strut\\\\\strut ';
+ }
+ }
+
}
return $currentstring;
}
-
+#
+# End paragraph processing just requires that we output the
+# closing string that was saved and blank it.
sub end_p {
- my ($target,$token) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
- $currentstring .= $token->[2];
+ # 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 '';
}
- return $currentstring;
-}
+}
+}
#-- tag (end tag required)
sub start_h1 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior para.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
- my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -659,9 +835,9 @@ sub start_h1 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
} elsif ($target eq 'meta') {
- $currentstring='
tag
sub start_h2 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior para.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -708,20 +884,20 @@ sub start_h2 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
sub end_h2 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -729,20 +905,20 @@ sub end_h2 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
#--
tag
sub start_h3 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior para.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -751,20 +927,20 @@ sub start_h3 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
sub end_h3 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -772,20 +948,20 @@ sub end_h3 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
#--
tag
sub start_h4 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior para.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -794,20 +970,20 @@ sub start_h4 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
sub end_h4 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -815,20 +991,20 @@ sub end_h4 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
#--
tag
sub start_h5 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior paras.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -837,20 +1013,20 @@ sub start_h5 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
sub end_h5 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -858,20 +1034,20 @@ sub end_h5 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
#--
tag
sub start_h6 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # Close off any prior paras.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -880,20 +1056,20 @@ sub start_h6 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
- }
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
+ }
return $currentstring;
}
sub end_h6 {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -901,7 +1077,7 @@ sub end_h6 {
$post='}'.'\vskip 0 mm ';
}
$currentstring .= '}}'.$post;
- }
+ }
return $currentstring;
}
@@ -909,7 +1085,7 @@ sub end_h6 {
sub start_cite {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\textit{';
@@ -920,7 +1096,7 @@ sub start_cite {
sub end_cite {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -932,7 +1108,7 @@ sub end_cite {
sub start_i {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\textit{';
@@ -943,11 +1119,11 @@ sub start_i {
sub end_i {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -955,7 +1131,7 @@ sub end_i {
sub start_address {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\textit{';
@@ -966,7 +1142,7 @@ sub start_address {
sub end_address {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -978,18 +1154,18 @@ sub end_address {
sub start_dfn {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\textit{';
- }
+ }
return $currentstring;
}
sub end_dfn {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -1001,7 +1177,7 @@ sub end_dfn {
sub start_tt {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\texttt{';
@@ -1012,7 +1188,7 @@ sub start_tt {
sub end_tt {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -1024,7 +1200,7 @@ sub end_tt {
sub start_kbd {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\texttt{';
@@ -1035,7 +1211,7 @@ sub start_kbd {
sub end_kbd {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -1047,22 +1223,22 @@ sub end_kbd {
sub start_code {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\texttt{';
- }
+ }
return $currentstring;
}
sub end_code {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1070,7 +1246,7 @@ sub end_code {
sub start_em {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\emph{';
@@ -1081,11 +1257,11 @@ sub start_em {
sub end_em {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
@@ -1093,7 +1269,7 @@ sub end_em {
sub start_q {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\emph{';
@@ -1104,47 +1280,127 @@ sub start_q {
sub end_q {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
- }
+ }
return $currentstring;
}
+#
tag (end tag forbidden)
sub start_br {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
- if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
- $currentstring .= '\vskip 0.2 mm ';
+ 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')) {
+ $signal=1;
+ }
+ if (($tempo[$i] eq 'td') || ($tempo[$i] eq 'th')) {
+ $signal = 1;
+ }
}
+ if ($signal != 1) {
+ $currentstring .= '\strut \\\\ \strut ';
+ }
+
}
return $currentstring;
}
@@ -1152,7 +1408,7 @@ sub start_br {
sub end_br {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
}
return $currentstring;
@@ -1162,18 +1418,18 @@ sub end_br {
sub start_big {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '{\large ';
- }
+ }
return $currentstring;
}
sub end_big {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -1185,7 +1441,7 @@ sub end_big {
sub start_small {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '{\footnotesize ';
@@ -1196,7 +1452,7 @@ sub start_small {
sub end_small {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '}';
@@ -1208,8 +1464,8 @@ sub end_small {
sub start_basefont {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
- if ($target eq 'web') {
- $currentstring = $token->[4];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $basesize) {
@@ -1222,8 +1478,8 @@ sub start_basefont {
sub end_basefont {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
- if ($target eq 'web') {
- $currentstring = $token->[4];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $basesize) {
@@ -1237,15 +1493,9 @@ sub end_basefont {
sub start_font {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
- if ($face=~/symbol/i) {
- $Apache::lonxml::prevent_entity_encode++;
- } else {
- if (($ENV{'browser.fontenhance'} eq 'on') ||
- ($ENV{'browser.blackwhite'} eq 'on')) { return ''; }
- }
- $currentstring = $token->[4];
+ $currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $fontsize) {
@@ -1258,10 +1508,8 @@ sub start_font {
sub end_font {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
my $currentstring = '';
- if ($target eq 'web') {
- my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
- if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;}
- $currentstring = $token->[2];
+ if ($target eq 'web' || $target eq 'webgrade') {
+ $currentstring = $token->[2];
} elsif ($target eq 'tex') {
my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
if (defined $fontsize) {
@@ -1270,28 +1518,28 @@ sub end_font {
}
return $currentstring;
}
-
+
#-- tag (end tag required)
sub start_strike {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
sub end_strike {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring=&Apache::lonxml::endredirection();
- $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
- $currentstring=~s/^\s*(\S)/\\underline\{$1/;
+ $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
+ $currentstring=~s/^\s*(\S)/\\underline\{$1/;
$currentstring=~s/(\S)\s*$/$1\}/;
}
return $currentstring;
@@ -1301,18 +1549,18 @@ sub end_strike {
sub start_s {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
&Apache::lonxml::startredirection();
- }
+ }
return $currentstring;
}
sub end_s {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring=&Apache::lonxml::endredirection();
@@ -1327,21 +1575,21 @@ sub end_s {
sub start_sub {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
- $currentstring .= "\$_{";
- }
+ $currentstring .= '\raisebox{-\smallskipamount}{\scriptsize{';
+ }
return $currentstring;
}
sub end_sub {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- $currentstring .= "}\$";
+ $currentstring .= '}}';
}
return $currentstring;
}
@@ -1350,21 +1598,21 @@ sub end_sub {
sub start_sup {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
- $currentstring .= "\$^{";
- }
+ $currentstring .= '\raisebox{\smallskipamount}{\scriptsize{';
+ }
return $currentstring;
}
sub end_sup {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- $currentstring .= "}\$";
+ $currentstring .= '}}';
}
return $currentstring;
}
@@ -1372,10 +1620,31 @@ sub end_sup {
#--
tag (end tag forbidden)
sub start_hr {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
- my $currentstring = '';
- if ($target eq 'web') {
+ my $currentstring = &end_p(); # End enclosing para.
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
+
+ #
can't be inside of thank you LaTeX.
+ #
+ my $restart_sub = 0;
+ my $restart_sup = 0;
+
+ # Since and are simple tags it's ok to turn off/on
+ # using the start_ stop_ functions.. those tags only care about
+ # $target.
+
+ if (&is_inside_of($tagstack, "sub")) {
+ $restart_sub = 1;
+ $currentstring .= &end_sub($target, $token, $tagstack,
+ $parstack, $parser, $safeeval);
+ }
+ if (&is_inside_of($tagstack, "sup")) {
+ $restart_sup = 1;
+ $currentstring .= &end_sup($target, $token, $tagstack,
+ $parstack, $parser, $safeeval);
+ }
+
my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
if (defined $LaTeXwidth) {
if ($LaTeXwidth=~/^%/) {
@@ -1396,55 +1665,129 @@ sub start_hr {
}
$currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['.
$LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm ';
- }
+ # Turn stuff back on that we can't be inside of.
+
+ if ($restart_sub) {
+ $currentstring .= &start_sub($target, $token, $tagstack,
+ $parstack, $parser, $safeeval);
+ }
+ if ($restart_sup) {
+ $currentstring .= &start_sup($target, $token, $tagstack,
+ $parstack, $parser, $safeeval);
+ }
+ }
return $currentstring;
}
sub end_hr {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web') {
+ if ($target eq 'web' || $target eq 'webgrade') {
$currentstring .= $token->[2];
}
return $currentstring;
}
#--