# The LearningOnline Network with CAPA # Tags Default Definition Module # # $Id: londefdef.pm,v 1.390.2.2 2008/10/02 18:09:38 raeburn Exp $ # # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /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 # 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 # 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. # package Apache::londefdef; use Apache::lonnet; use strict; use Apache::lonxml; use Apache::File(); use Image::Magick; use Apache::lonmenu(); use Apache::lonmeta(); use Apache::lonlocal; 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')); } # # 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 = (); $Apache::londefdef::select=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 ===================== #-- sub start_output { my ($target) = @_; if ($target eq 'meta') { $Apache::lonxml::metamode--; } return ''; } sub end_output { my ($target) = @_; if ($target eq 'meta') { $Apache::lonxml::metamode++; } return ''; } #-- tag sub start_m { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_; my $currentstring = ''; my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); if ($target eq 'web' || $target eq 'analyze') { &Apache::lonxml::debug("M is starting with:$inside:"); my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); if ($eval eq 'on') { $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) { my $errormsg='
'.&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; } sub end_m { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'tex') { $currentstring = ""; } return $currentstring; } sub start_tthoption { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_; my $result; if ($target eq 'web' || $target eq 'webgrade') { my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser, $style); $inside=~s/^\s*//; if ($env{'browser.mathml'}) { &tth::ttmoptions($inside); } else { &tth::tthoptions($inside); } } return $result; } sub end_tthoption { my ($target,$token) = @_; my $result; return $result; } #-- tag (end tag optional) sub start_html { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { # start_body() takes care of emitting the } elsif ($target eq 'tex') { $currentstring .= '\documentclass[letterpaper,twoside]{article}\raggedbottom'; 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[T1]{fontenc}'."\n". '\usepackage{lmodern}'."\n". '\usepackage[postscript]{ucs}'."\n". '\usepackage[utf8x]{inputenc}'."\n". '\usepackage{pifont}' ."\n". '\usepackage{latexsym}'."\n". '\usepackage{epsfig}'. '\usepackage{calc}'. '\usepackage{amsmath}'. '\usepackage{amssymb}'. '\usepackage{amsfonts}'. '\usepackage{amsthm}'. '\usepackage{amscd}'. '\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}}'; } return $currentstring; } sub end_html { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { # end_body takes care of the } return $currentstring; } #-- tag (end tag optional) sub start_head { my ($target,$token) = @_; my $currentstring = ''; 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') || ($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; } #-- tag (end tag required) sub start_map { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[4]; } return $currentstring; } sub end_map { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[2]; } return $currentstring; } #-- tag (end tag forbidden) sub start_input { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[4]; } return $currentstring; } sub end_input { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web' || $target eq 'webgrade') { $currentstring = $token->[2]; } return $currentstring; } #--