![]() ![]() | ![]() |
rt of bug 3103 is fixed. </p> is corrected.
# The LearningOnline Network with CAPA # Tags Default Definition Module # # $Id: londefdef.pm,v 1.226 2004/07/12 17:19:13 sakharuk 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. # # # 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; use Apache::lonnet(); use strict; use Apache::lonxml; use Apache::File(); use Image::Magick; use Apache::lonmenu(); use Apache::lonmeta(); use Apache::Constants qw(:common); 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')); } 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; } #======================= TAG SUBROUTINES ===================== #-- <output> 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 ''; } #-- <m> 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') { $inside ='\\documentstyle{article}'.$inside; &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:"); } $currentstring = &Apache::lontexconvert::converted(\$inside); if ($Apache::lontexconvert::errorstring) { &Apache::lonxml::warning("tth error: ". $Apache::lontexconvert::errorstring); $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 ';} $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) = @_; my $result; if ($target eq 'web') { my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser); $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; } #-- <html> tag (end tag optional) sub start_html { my ($target,$token) = @_; my $currentstring = ''; my $options=$ENV{'course.'.$ENV{'request.course.id'}.'.tthoptions'}; &Apache::lontexconvert::init_tth(); 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}'. '\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) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = &Apache::lonxml::xmlend(); } return $currentstring; } #-- <head> tag (end tag optional) sub start_head { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } 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]; } return $currentstring; } #-- <map> tag (end tag required) sub start_map { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_map { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <select> tag (end tag required) sub start_select { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $Apache::londefdef::select=0; } return $currentstring; } sub end_select { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <option> tag (end tag optional) sub start_option { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $Apache::londefdef::select++; if ($Apache::londefdef::select == 1) { $currentstring='\noindent\fbox{'.&Apache::lonxml::get_param('value',$parstack,$safeeval).'}\keephidden{'; } else { $currentstring='\keephidden{'; } } return $currentstring; } sub end_option { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring='}'; } return $currentstring; } #-- <input> tag (end tag forbidden) sub start_input { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_input { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <textarea> tag (end tag required) sub start_textarea { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_textarea { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <form> tag (end tag required) sub start_form { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_form { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <title> tag (end tag required) sub start_title { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\keephidden{Title of the document: ' } if ($target eq 'meta') { $currentstring='<title>'; &start_output($target); } return $currentstring; } sub end_title { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } if ($target eq 'meta') { &end_output($target); $currentstring='</title>'; } return $currentstring; } #-- <meta> tag (end tag forbidden) sub start_meta { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { my $args=''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } if ($args eq '') { &Apache::lonxml::get_all_text("/meta",$parser); } else { $currentstring = $token->[4]; } } elsif ($target eq 'meta') { unless (&Apache::lonxml::get_param ('http-equiv',$parstack,$safeeval,undef,1)) { my $name=$token->[2]->{'name'}; $name=~tr/A-Z/a-z/; $name=~s/\s/\_/gs; $name=~s/\W//gs; if ($name) { $currentstring='<'.$name; my $display=&Apache::lonxml::get_param ('display',$parstack,$safeeval,undef,1); if ($display) { $display=~s/\"/\'/g; $currentstring.=' display="'.$display.'"'; } $currentstring.='>'. &Apache::lonxml::get_param ('content',$parstack,$safeeval,undef,1). '</'.$name.'>'; } my $display=&Apache::lonxml::get_param ('display',$parstack,$safeeval,undef,1); if ($display) { $display=&HTML::Entities::encode($display,'<>&"'); $currentstring.='<'.$name.'.display>'.$display. '</'.$name.'.display>'; } } } elsif ($target eq 'tex') { my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval); my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval); if ((not defined $content) && (not defined $name)) { &Apache::lonxml::startredirection(); } } return $currentstring; } sub end_meta { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { my $args=''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } if ($args ne '') { $currentstring = $token->[4]; } } elsif ($target eq 'tex') { my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval); my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval); if ((not defined $content) && (not defined $name)) { &Apache::lonxml::endredirection(); } } return $currentstring; } # accessrule sub start_accessrule { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; my $eff=&Apache::lonxml::get_param ('effect',$parstack,$safeeval,undef,1); my $realm=&Apache::lonxml::get_param ('realm',$parstack,$safeeval,undef,1); my $role=&Apache::lonxml::get_param ('role',$parstack,$safeeval,undef,1); $realm=~s/\s+//g; $realm=~s/\//\_/g; $realm=~s/^\_//; $realm=~s/\W/\;/g; $role=~s/\s+//g; $role=~s/\//\_/g; $role=~s/\W/\;/g; if ($target eq 'web') { my $args=''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } if ($args eq '') { &Apache::lonxml::get_all_text("/accessrule",$parser); } else { $currentstring = $token->[4]; } } if ($target eq 'meta') { $currentstring='<rule>'.$eff.':'.$realm.':'.$role.'</rule>'; } return $currentstring; } sub end_accessrule { my ($target,$token,$tagstack,$parstack,$parser) = @_; my $currentstring = ''; if ($target eq 'web') { my $args=''; if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; } if ($args ne '') { $currentstring = $token->[4]; } } return $currentstring; } #-- <body> tag (end tag required) sub start_body { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { if ($Apache::lonhomework::parsing_a_problem) { &Apache::lonxml::warning("<body> tag found inside of <problem> tag this can cause problems."); return ''; } if (!$Apache::lonxml::registered && $ENV{'request.state'} eq 'published') { $currentstring.='<head>'. &Apache::lonmenu::registerurl(undef,$target).'</head>'; } # Accessibility if ($ENV{'browser.imagesuppress'} eq 'on') { delete($token->[2]->{'background'}); } if ($ENV{'browser.fontenhance'} eq 'on') { my $style=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^style$/i) { $style.=$token->[2]->{$key}.';'; delete($token->[2]->{$key}); } } $token->[2]->{'style'}=$style.'; font-size: x-large;'; } if ($ENV{'browser.blackwhite'} eq 'on') { delete($token->[2]->{'font'}); delete($token->[2]->{'link'}); delete($token->[2]->{'alink'}); delete($token->[2]->{'vlink'}); delete($token->[2]->{'bgcolor'}); delete($token->[2]->{'background'}); } # Overload loads my $onLoad=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^onload$/i) { $onLoad.=$token->[2]->{$key}.';'; delete($token->[2]->{$key}); } } $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad; my $onUnload=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^onunload$/i) { $onUnload.=$token->[2]->{$key}.';'; delete($token->[2]->{$key}); } } $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents(). ';'.$onUnload; $currentstring .= '<'.$token->[1]; foreach (keys %{$token->[2]}) { $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"'; } $currentstring.='>'; if ($ENV{'request.state'} ne 'published') { $currentstring.=(<<EDITBUTTON); <form method="post"> <input type="submit" name="editmode" accesskey="e" value="Edit" /> </form> EDITBUTTON } else { $currentstring.=&Apache::lonmenu::menubuttons(undef,$target,1); } $currentstring.=&Apache::lonxml::message_location(); } elsif ($target eq 'tex') { $currentstring = '\begin{document}'; } return $currentstring; } sub end_body { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}'; } return $currentstring; } #-- <center> tag (end tag required) sub start_center { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\begin{center}'; } return $currentstring; } sub end_center { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{center}'; } return $currentstring; } #-- <b> tag (end tag required) sub start_b { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\textbf{'; } return $currentstring; } sub end_b { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '}'; } return $currentstring; } #-- <strong> tag (end tag required) sub start_strong { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\textbf{'; } return $currentstring; } sub end_strong { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '}'; } return $currentstring; } #-- <h1> tag (end tag required) sub start_h1 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; 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{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } elsif ($target eq 'meta') { $currentstring='<subject>'; &start_output($target); } return $currentstring; } sub end_h1 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } elsif ($target eq 'meta') { &end_output($target); $currentstring='</subject>'; } return $currentstring; } #-- <h2> tag sub start_h2 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $pre='\begin{center}'; } elsif ($align eq 'left') { $pre='\rlap{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } return $currentstring; } sub end_h2 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } return $currentstring; } #-- <h3> tag sub start_h3 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $pre='\begin{center}'; } elsif ($align eq 'left') { $pre='\rlap{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } return $currentstring; } sub end_h3 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } return $currentstring; } #-- <h4> tag sub start_h4 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $pre='\begin{center}'; } elsif ($align eq 'left') { $pre='\rlap{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } return $currentstring; } sub end_h4 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } return $currentstring; } #-- <h5> tag sub start_h5 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $pre='\begin{center}'; } elsif ($align eq 'left') { $pre='\rlap{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } return $currentstring; } sub end_h5 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } return $currentstring; } #-- <h6> tag sub start_h6 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $pre; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $pre='\begin{center}'; } elsif ($align eq 'left') { $pre='\rlap{'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; } my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0); if (not defined $TeXsize) {$TeXsize="large";} $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; } return $currentstring; } sub end_h6 { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $post='\vskip 0 mm '; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $post='\end{center}'; } elsif ($align eq 'left') { $post='} \hfill'.'\vskip 0 mm '; } elsif ($align eq 'right') { $post='}'.'\vskip 0 mm '; } $currentstring .= '}}'.$post; } return $currentstring; } #--- <cite> tag (end tag required) sub start_cite { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\textit{'; } return $currentstring; } sub end_cite { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <i> tag (end tag required) sub start_i { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\textit{'; } return $currentstring; } sub end_i { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <address> tag (end tag required) sub start_address { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\textit{'; } return $currentstring; } sub end_address { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <dfn> tag (end tag required) sub start_dfn { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\textit{'; } return $currentstring; } sub end_dfn { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <tt> tag (end tag required) sub start_tt { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\texttt{'; } return $currentstring; } sub end_tt { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <kbd> tag (end tag required) sub start_kbd { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\texttt{'; } return $currentstring; } sub end_kbd { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <code> tag (end tag required) sub start_code { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\texttt{'; } return $currentstring; } sub end_code { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <em> tag (end tag required) sub start_em { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\emph{'; } return $currentstring; } sub end_em { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <q> tag (end tag required) sub start_q { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\emph{'; } return $currentstring; } sub end_q { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <p> 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') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $currentstring='\begin{center}\par'; } elsif ($align eq 'right') { $currentstring='\makebox['.$ENV{'form.textwidth'}.']{\hfill\llap{'; } elsif ($align eq 'left') { $currentstring='\noindent\makebox['.$ENV{'form.textwidth'}.']{\rlap{'; } else { $currentstring='\par '; } my $signal=1;#<p> does not work inside <b>...</b> foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;} if (!$signal) {$currentstring = '';} } } return $currentstring; } sub end_p { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($align eq 'center') { $currentstring .= '\end{center}'; } elsif ($align eq 'right') { $currentstring .= '}}'; } elsif ($align eq 'left') { $currentstring .= '}\hfill}'; } } return $currentstring; } #-- <br> tag (end tag forbidden) sub start_br { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { if (($$tagstack[-2] eq 'b') || ($$tagstack[-2] eq 'strong') || ($$tagstack[-2] eq 'ol') || ($$tagstack[-2] eq 'ul')) { $currentstring .= ' \vskip 0 mm '; } elsif ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') { $currentstring .= '\strut \\\\ \strut '; } } return $currentstring; } sub end_br { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } return $currentstring; } #-- <big> tag (end tag required) sub start_big { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '{\large '; } return $currentstring; } sub end_big { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <small> tag (end tag required) sub start_small { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '{\footnotesize '; } return $currentstring; } sub end_small { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}'; } return $currentstring; } #-- <basefont> tag (end tag forbidden) sub start_basefont { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); if (defined $basesize) { $currentstring = '{\\'.$basesize.' '; } } return $currentstring; } sub end_basefont { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); if (defined $basesize) { $currentstring = '}'; } } return $currentstring; } #-- <font> tag (end tag required) sub start_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) { if (($ENV{'browser.fontenhance'} eq 'on') || ($ENV{'browser.blackwhite'} eq 'on')) { return ''; } } $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); if (defined $fontsize) { $currentstring = '{\\'.$fontsize.' '; } } return $currentstring; } sub end_font { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); if (defined $fontsize) { $currentstring = '}'; } } return $currentstring; } #-- <strike> tag (end tag required) sub start_strike { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { &Apache::lonxml::startredirection(); } return $currentstring; } sub end_strike { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $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*$/$1\}/; } return $currentstring; } #-- <s> tag (end tag required) sub start_s { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { &Apache::lonxml::startredirection(); } return $currentstring; } sub end_s { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $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*$/$1\}/; } return $currentstring; } #-- <sub> tag (end tag required) sub start_sub { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\ensuremath{_{'; } return $currentstring; } sub end_sub { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}}'; } return $currentstring; } #-- <sup> tag (end tag required) sub start_sup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\ensuremath{^{'; } return $currentstring; } sub end_sup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '}}'; } return $currentstring; } #-- <hr> tag (end tag forbidden) sub start_hr { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); if (defined $LaTeXwidth) { if ($LaTeXwidth=~/^%/) { substr($LaTeXwidth,0,1)=''; $LaTeXwidth=($LaTeXwidth/100).'\textwidth'; } } else { $LaTeXwidth ='0.9\textwidth'; } my ($pre,$post); my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $pre=''; $post=''; } elsif ($align eq 'left') { $pre='\rlap{'; $post='} \hfill'; } elsif ($align eq 'right') { $pre=' \hfill \llap{'; $post='}'; } $currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['. $LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm '; } return $currentstring; } sub end_hr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } return $currentstring; } #-- <div> tag (end tag required) sub start_div { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } return $currentstring; } sub end_div { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } return $currentstring; } #-- <a> tag (end tag required) sub start_a { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $a=&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1); my $b=&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1); if ($a=~/\S/) { $a=~s/([^\\])%/$1\\\%/g; $currentstring .= '\ref{URI: '.$a.'}'; } elsif ($b=~/\S/) { $currentstring .= '\ref{Anchor: '.$b.'}'; } else { $currentstring.=''; } } return $currentstring; } sub end_a { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } return $currentstring; } #-- <li> tag (end tag optional) sub start_li { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,1); if ($type=~/circle/) { $currentstring .= ' \item[o] '; } elsif ($type=~/square/) { $currentstring .= ' \item[$\Box$] '; } elsif ($type ne '') { $currentstring .= ' \item['.$type.'] '; } else { $currentstring .= ' \item '; } } return $currentstring; } sub end_li { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <u> tag (end tag required) sub start_u { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { &Apache::lonxml::startredirection(); } return $currentstring; } sub end_u { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $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*$/$1\}/; } return $currentstring; } #-- <ul> tag (end tag required) sub start_ul { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0); if ($TeXtype eq 'disc') { $currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'. '\renewcommand{\labelitemii}{$\bullet$}'. '\renewcommand{\labelitemiii}{$\bullet$}'. '\renewcommand{\labelitemiv}{$\bullet$}'; } elsif ($TeXtype eq 'circle') { $currentstring .= '\renewcommand{\labelitemi}{$\circ$}'. '\renewcommand{\labelitemii}{$\circ$}'. '\renewcommand{\labelitemiii}{$\circ$}'. '\renewcommand{\labelitemiv}{$\circ$}'; } elsif ($TeXtype eq 'square') { $currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'. '\renewcommand{\labelitemii}{$\diamond$}'. '\renewcommand{\labelitemiii}{$\diamond$}'. '\renewcommand{\labelitemiv}{$\diamond$}'; } $currentstring .= '\strut \begin{itemize}'; } return $currentstring; } sub end_ul { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'. '\renewcommand{\labelitemii}{$\bullet$}'. '\renewcommand{\labelitemiii}{$\bullet$}'. '\renewcommand{\labelitemiv}{$\bullet$}\strut '; } return $currentstring; } #-- <menu> tag (end tag required) sub start_menu { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = " \\begin{itemize} "; } return $currentstring; } sub end_menu { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = " \\end{itemize}"; } return $currentstring; } #-- <dir> tag (end tag required) sub start_dir { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = " \\begin{itemize} "; } return $currentstring; } sub end_dir { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = " \\end{itemize}"; } return $currentstring; } #-- <ol> tag (end tag required) sub start_ol { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0); if ($type eq '1') { $currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'. '\renewcommand{\labelenumii}{\arabic{enumii}.}'. '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'. '\renewcommand{\labelenumiv}{\arabic{enumiv}.}'; } elsif ($type eq 'A') { $currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'. '\renewcommand{\labelenumii}{\Alph{enumii}.}'. '\renewcommand{\labelenumiii}{\Alph{enumiii}.}'. '\renewcommand{\labelenumiv}{\Alph{enumiv}.}'; } elsif ($type eq 'a') { $currentstring .= '\renewcommand{\labelenumi}{\alph{enumi}.}'. '\renewcommand{\labelenumii}{\alph{enumii}.}'. '\renewcommand{\labelenumiii}{\alph{enumiii}.}'. '\renewcommand{\labelenumiv}{\alph{enumiv}.}'; } elsif ($type eq 'i') { $currentstring .= '\renewcommand{\labelenumi}{\roman{enumi}.}'. '\renewcommand{\labelenumii}{\roman{enumii}.}'. '\renewcommand{\labelenumiii}{\roman{enumiii}.}'. '\renewcommand{\labelenumiv}{\roman{enumiv}.}'; } elsif ($type eq 'I') { $currentstring .= '\renewcommand{\labelenumi}{\Roman{enumi}.}'. '\renewcommand{\labelenumii}{\Roman{enumii}.}'. '\renewcommand{\labelenumiii}{\Roman{enumiii}.}'. '\renewcommand{\labelenumiv}{\Roman{enumiv}.}'; } $currentstring .= '\strut \begin{enumerate}'; } return $currentstring; } sub end_ol { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'. '\renewcommand{\labelenumii}{\arabic{enumii}.}'. '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'. '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut '; } return $currentstring; } #-- <dl> tag (end tag required) sub start_dl { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\begin{description}'; @Apache::londefdef::description=(); $Apache::londefdef::DD_redirection=0; $Apache::londefdef::DT_redirection=0; } return $currentstring; } sub end_dl { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { if ($Apache::londefdef::DT_redirection) { my $data=&item_cleanup; push @Apache::londefdef::description,'\item['.$data.']'; $Apache::londefdef::DT_redirection=0; } elsif ($Apache::londefdef::DD_redirection) { $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection(); } foreach my $element (@Apache::londefdef::description) { $currentstring.=' '.$element.' '; } @Apache::londefdef::description=(); $currentstring.='\end{description}'; } return $currentstring; } #-- <dt> tag (end tag optional) sub start_dt { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring=''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { if ($Apache::londefdef::DT_redirection) { my $data=&item_cleanup; push @Apache::londefdef::description,'\item['.$data.']'; $Apache::londefdef::DT_redirection=0; } elsif ($Apache::londefdef::DD_redirection) { $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection(); $Apache::londefdef::DD_redirection=0; } &Apache::lonxml::startredirection(); $Apache::londefdef::DT_redirection=1; } return $currentstring; } sub end_dt { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $data=&item_cleanup; push @Apache::londefdef::description,'\item['.$data.']'; $Apache::londefdef::DT_redirection=0; } return $currentstring; } sub item_cleanup { my $item=&Apache::lonxml::endredirection(); $item=~s/\\begin{center}//g; $item=~s/\\end{center}//g; return $item; } #-- <dd> tag (end tag optional) sub start_dd { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { if ($Apache::londefdef::DT_redirection) { my $data=&item_cleanup; push @Apache::londefdef::description,'\item['.$data.']'; $Apache::londefdef::DT_redirection=0; } $Apache::londefdef::DD_redirection=1; &Apache::lonxml::startredirection(); } return $currentstring; } sub end_dd { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection(); $Apache::londefdef::DD_redirection=0; } return $currentstring; } #-- <table> tag (end tag required) #list of supported attributes: border,width,TeXwidth sub start_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my ($textwidth,$currentstring)=('',''); if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { my $aa = {}; push @Apache::londefdef::table, $aa; $Apache::londefdef::table[-1]{'row_number'} = -1; #maximum table's width (default coincides with text line length) if ($#Apache::londefdef::table==0) { $textwidth=&recalc($ENV{'form.textwidth'}); #result is always in mm $textwidth=~/(\d+\.?\d*)/; $textwidth=0.95*$1; #accounts "internal" LaTeX space for table frame } else { if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) { #the maximum width of nested table is determined by LATeX width of parent cell $textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]; } else { #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly my $textwidth=$Apache::londefdef::table[-2]{'width'}; for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) { $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i]; } } } my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); if (not defined $TeXwidth) { my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); if ($htmlwidth=~/%/) { $Apache::londefdef::table[-1]{'percent'}=1; $htmlwidth=~/(\d+)/; $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;; } else { $Apache::londefdef::table[-1]{'width'}=$textwidth; } } elsif ($TeXwidth=~/%/) { $Apache::londefdef::table[-1]{'percent'}=1; $TeXwidth=~/(\d+)/; $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100; } else { $Apache::londefdef::table[-1]{'forcetablewidth'}=1; $Apache::londefdef::table[-1]{'width'}=$TeXwidth; } #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0); unless (defined $border) { $border = 0; } if ($border) { $Apache::londefdef::table[-1]{'hinc'} = '\hline '; $Apache::londefdef::table[-1]{'vinc'} = '&'; $Apache::londefdef::table[-1]{'vvinc'} = '|'; } else { $Apache::londefdef::table[-1]{'hinc'} = ''; $Apache::londefdef::table[-1]{'vinc'} = '&'; $Apache::londefdef::table[-1]{'vvinc'} = ''; } if ($#Apache::londefdef::table==0) { $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}'; } $Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} '; $Apache::londefdef::table[-1]{'TeXlen'}=[]; $Apache::londefdef::table[-1]{'objectlen'}=[]; $Apache::londefdef::table[-1]{'maxlen'}=[]; $Apache::londefdef::table[-1]{'minlen'}=[]; $Apache::londefdef::table[-1]{'content'}=[]; $Apache::londefdef::table[-1]{'align'}=[]; $currentstring='\keephidden{NEW TABLE ENTRY}'; } return $currentstring; } sub end_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $inmemory = ''; my $output = ''; my $WARNING=''; #width of columns from TeXwidth attributes for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) { $Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]=$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]; } } } #free space and number of empty columns my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0); ## &Apache::lonnet::logthis("Available space $Apache::londefdef::table[-1]{'width'}"); for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) { $empty_columns++; } else { $available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]; } } #boundaries for contents columns my @min_len=();#columns can not be narrower my @max_len=();#maximum length of column for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { my ($localmin,$localmax)=(0,0); for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) { $localmin=$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]; } if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) { $localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]; } } push @min_len, $localmin; push @max_len, $localmax; } for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { my $localmin=0,; for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) { $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]; } } if ($max_len[$jn]<$localmin) {$max_len[$jn]=$localmin;}#object size is bigger if ($min_len[$jn]<$localmin) {$min_len[$jn]=$localmin;}#object size is bigger if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) { $min_len[$jn]=0; $max_len[$jn]=0; } } #final adjustment of column width my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array my @adjust=(); #step 1. adjustment by maximum value my $space_neeeded=0; for (my $jn=0;$jn<=$#max_len;$jn++) { $space_neeeded=$space_neeeded+$max_len[$jn]; } if ($space_neeeded<=$available_space) { for (my $jn=0;$jn<=$#max_len;$jn++) { if ($fwidth[$jn]==0) { $fwidth[$jn]=$max_len[$jn]; } } } else { #step 2. adjustment by minimum value (estimation) $space_neeeded=0; for (my $jn=0;$jn<=$#min_len;$jn++) { $space_neeeded+=$min_len[$jn]; } if ($space_neeeded>$available_space) { $WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} '; for (my $jn=0;$jn<=$#max_len;$jn++) { if ($fwidth[$jn]==0) { $fwidth[$jn]=$min_len[$jn]; } } } else { #step 3. adjustment over minimal + corrections my $enlarge_coef=$available_space/$space_neeeded; my $acsessive=0; for (my $jn=0;$jn<=$#min_len;$jn++) { $adjust[$jn]=$min_len[$jn]*$enlarge_coef; if ($adjust[$jn]>$max_len[$jn]) { $fwidth[$jn]=$max_len[$jn]; $acsessive=$acsessive+$adjust[$jn]-$max_len[$jn]; $adjust[$jn]=0; } } if ($acsessive>0) { #we have an excess of space and can redistribute it my $notempty_columns=0; for (my $jn=0;$jn<=$#min_len;$jn++) { if ($adjust[$jn]!=0) { $notempty_columns++; } } my $per_column=$acsessive/$notempty_columns; for (my $jn=0;$jn<=$#min_len;$jn++) { if ($adjust[$jn]!=0) { $adjust[$jn]+=$per_column; $fwidth[$jn]=$adjust[$jn]; } } } else { for (my $jn=0;$jn<=$#min_len;$jn++) { $fwidth[$jn]=$adjust[$jn]; } } } } #use all available width if it is defined in % or as TeXwidth if (($Apache::londefdef::table[-1]{'percent'}==1) || ($Apache::londefdef::table[-1]{'forcetablewidth'}==1)) { my $current=0; for (my $i=0;$i<=$#fwidth;$i++) { $current+=$fwidth[$i]; } my $coef=$Apache::londefdef::table[-1]{'width'}/$current; for (my $i=0;$i<=$#fwidth;$i++) { $fwidth[$i]*=$coef; } } #removing of empty columns if allowed my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0); if ($permission eq 'yes') { my @cleaned_table=(); my @cleaned_header=(); my $colind=0; for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) { if ($fwidth[$jn]!=0) { #we need to copy column for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { $cleaned_table[$in][$colind]=$Apache::londefdef::table[-1]{'content'}[$in][$jn]; $cleaned_header[$colind]=$fwidth[$jn]; } $colind++; } } $Apache::londefdef::table[-1]{'content'}=\@cleaned_table; @fwidth=@cleaned_header; } #construct header of the table my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'}; for (my $in=0;$in<=$#fwidth;$in++) { $header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'}; } $header_of_table .= '}'; #fill the table for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$#fwidth;$jn++) { if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { $output.='\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}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.='} '; } if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};} } $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; } $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut '; if ($#Apache::londefdef::table > 0) { my $inmemory = $Apache::londefdef::table[-1]{'output'}; pop @Apache::londefdef::table; push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory; } else { $currentstring .= $Apache::londefdef::table[-1]{'output'}; pop @Apache::londefdef::table; undef @Apache::londefdef::table; } } return $currentstring; } #-- <tr> tag (end tag optional) sub start_tr { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $Apache::londefdef::table[-1]{'row_number'}++; my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if ($alignchar ne '') { push @ {$Apache::londefdef::table[-1]{'rows'} },substr($alignchar,0,1); } else { push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l'; } push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'}); $Apache::londefdef::table[-1]{'counter_columns'} = -1; push @ {$Apache::londefdef::table[-1]{'TeXlen'}}, []; push @ {$Apache::londefdef::table[-1]{'objectlen'}}, []; push @ {$Apache::londefdef::table[-1]{'minlen'}}, []; push @ {$Apache::londefdef::table[-1]{'maxlen'}}, []; push @ {$Apache::londefdef::table[-1]{'content'}}, []; } return $currentstring; } sub end_tr { 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); } } return $currentstring; } #-- <td> tag (end tag optional) sub start_td { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $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 $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); if ($alignchar eq '') { $alignchar = $Apache::londefdef::table[-1]{'rows'}[-1]; } push @{ $Apache::londefdef::table[-1]{'align'}[$Apache::londefdef::table[-1]{'row_number'}] }, $alignchar; $Apache::londefdef::table[-1]{'counter_columns'}++; my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); if (defined $TeXwidth) { my $current_length=&recalc($TeXwidth); $current_length=~/(\d+\.?\d*)/; push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1; } &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) { push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; } else { if (($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) or ($data=~m/\[(\d+\.?\d*)\s*mm\]/)) { my $garbage_data=$data; my $fwidth=0; while ($garbage_data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) { my $current_length=&recalc($1); $current_length=~/(\d+\.?\d*)/; if ($fwidth<$1) {$fwidth=$1;} $garbage_data=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)//; } while ($garbage_data=~m/\[(\d+\.?\d*)\s*mm\]/) { my $current_length=$1; if ($fwidth<$current_length) {$fwidth=$current_length;} $garbage_data=~s/\[(\d+\.?\d*)\s*mm\]//; } push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth; push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; } else { $data=~s/^\s+(\S.*)/$1/; $data=~s/(.*\S)\s+$/$1/; $data=~s/(\s)+/$1/; my ($current_length,$min_length)=(0,0); if ($data=~/\\vskip/) { my $newdata=$data; $newdata=~s/\\vskip \d*\.?\d*\s*mm/THISISJUSTTEMPORARYSEPARATOR/g; my @newdata=split(/THISISJUSTTEMPORARYSEPARATOR/,$newdata); foreach my $elementdata (@newdata) { my $lengthnewdata=2.5*&LATEX_length($elementdata); if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;} my @words=split(/ /,$elementdata); foreach my $word (@words) { my $lengthword=2.5*&LATEX_length($word); if ($min_length<$lengthword) {$min_length=$lengthword;} } } } else { $current_length=2.5*&LATEX_length($data); my @words=split(/ /,$data); foreach my $word (@words) { my $lengthword=2.5*&LATEX_length($word); if ($min_length<$lengthword) {$min_length=$lengthword;} } } push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0'; push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length; push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length; } } for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) { $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/; } push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; return''; } sub end_td { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $Apache::londefdef::TD_redirection =0; &end_td_tex($parstack,$parser,$safeeval); } return $currentstring; } #-- <th> tag (end tag optional) sub start_th { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; 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(); } return $currentstring; } sub end_th { 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+)/; $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; $Apache::londefdef::table[-1]{'length'} .= '0,'; } else { $data=~/^\s*(\S.*)/; $data=$1; $data=~/(.*\S)\s*$/; $data=$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]/; } $data='\textbf{'.$data.'}'; @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; } return $currentstring; } #-- <img> tag (end tag forbidden) sub start_img { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval, undef,1); if (not $src and ($target eq 'web' or $target eq 'tex')) { my $inside = &Apache::lonxml::get_all_text("/img",$parser); return ''; } $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src; my $currentstring = ''; my $scaling = .3; if ($target eq 'web') { if ($ENV{'browser.imagesuppress'} ne 'on') { $currentstring.= $token->[4]; } else { my $alttag= &Apache::lonxml::get_param ('alt',$parstack,$safeeval,undef,1); unless ($alttag) { $alttag=&Apache::lonmeta::alttag ($Apache::lonxml::pwd[-1],$src); } $currentstring.='[IMAGE: '.$alttag.']'; } } elsif ($target eq 'tex') { $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); #if uploaded restore the path if ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/simplepage\/([^\/]+)$/) { $src=&Apache::loncommon::propath($1,$2).'/userfiles/simplepage/'.$3; } elsif ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/aboutme\/([^\/]+)$/) { $src=&Apache::loncommon::propath($1,$2).'/userfiles/aboutme/'.$3; } #if original gif/jpg/png file exist do following: if (-e $src) { #what is the image size? my $width_param=&image_size($src,$scaling,$parstack,$safeeval); my ($file,$path)=&file_path($src); my $newsrc = $src; $newsrc =~ s/\.(gif|jpg|png)$/.eps/i; $file=~s/\.(gif|jpg|png)$/.eps/i; #where can we find the picture? if (-e $newsrc) { #eps counterpart for image exist if ($path) { $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } } else { #there is no eps counterpart for image - check for ps one $newsrc =~ s/\.eps$/\.ps/; if (-e $newsrc) { #ps counterpart for image exist $file =~ s/\.eps$/\.ps/; if ($path) { $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } } else { #care about eps dynamical generation $currentstring.='\vskip 1 mm '.&eps_generation($src,$file,$width_param); } } } else { #original image file doesn't exist so check the alt attribute my $alt = &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1); unless ($alt) { $alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src); } if ($alt) { $currentstring .= ' '.$alt.' '; } else { #<allow> tag will care about replication } } } elsif ($target eq 'edit') { $currentstring .=&Apache::edit::tag_start($target,$token); $currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70). &Apache::edit::browse('src',undef,'alt').' '. &Apache::edit::search('src',undef,'alt').'<br />'; $currentstring .=&Apache::edit::text_arg('Description:','alt',$token,70).'<br />'; $currentstring .=&Apache::edit::text_arg('width (pixel):','width',$token,5); $currentstring .=&Apache::edit::text_arg('height (pixel):','height',$token,5).'<br />'; $currentstring .=&Apache::edit::text_arg('TeXwidth (mm):','TeXwidth',$token,5); $currentstring .=&Apache::edit::text_arg('TeXheight (mm):','TeXheight',$token,5); $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); my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval); my $height=&Apache::lonxml::get_param('height',$parstack,$safeeval); $currentstring .= '<img src="'.$src.'" alt="'.$alt.'" '; if ($width) { $currentstring.=' width="'.$width.'" '; } if ($height) { $currentstring.=' height="'.$height.'" '; } $currentstring .= ' />'; } elsif ($target eq 'modified') { my ($osrc,$owidth,$oheight)= ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'}); my $ctag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'src','alt', 'TeXwidth','TeXheight', 'width','height'); my ($nsrc,$nwidth,$nheight)= ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'}); my $loc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$nsrc); &image_replication($loc); my ($iwidth,$iheight); if (-e $loc) { my $image = Image::Magick->new; $image->Read($loc); ($iwidth, $iheight) = ($image->Get('width'), $image->Get('height')); } if ($osrc ne $nsrc || (!$nwidth && !$nheight)) { # changed image or no size specified, # if they didn't explicitly change the # width or height use the ones from the image if ($iwidth && $iheight) { if ($owidth == $nwidth || (!$nwidth && !$nheight)) { $token->[2]{'width'} = $iwidth;$ctag=1; } if ($oheight == $nheight || (!$nwidth && !$nheight)) { $token->[2]{'height'}=$iheight;$ctag=1; } } } my ($cwidth,$cheight)=($token->[2]{'width'},$token->[2]{'height'}); # if we don't have a width or height if ($iwidth && $cwidth && !$cheight) { $token->[2]{'height'}=int(($cwidth/$iwidth)*$iheight);$ctag=1; } if ($iheight && $cheight && !$cwidth) { $token->[2]{'width'}=int(($cheight/$iheight)*$iwidth);$ctag=1; } if ($ctag) {$currentstring=&Apache::edit::rebuild_tag($token);} } return $currentstring; } sub end_img { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = ''; } return $currentstring; } #-- <applet> tag (end tag required) sub start_applet { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1); $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$code; my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval, undef,1); $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$archive; my $currentstring = ''; if ($target eq 'web') { if ($ENV{'browser.appletsuppress'} ne 'on') { $currentstring = $token->[4]; } else { my $alttag= &Apache::lonxml::get_param('alt',$parstack, $safeeval,undef,1); unless ($alttag) { $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1], $code); } $currentstring='[APPLET: '.$alttag.']'; } } elsif ($target eq 'tex') { my $alttag= &Apache::lonxml::get_param('alt',$parstack, $safeeval,undef,1); unless ($alttag) { my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval, undef,1); $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1], $code); } $currentstring.='\begin{center} \fbox{Java Applet: '.$alttag. '.}\end{center}'; } return $currentstring; } sub end_applet { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { } return $currentstring; } #-- <embed> tag (end tag optional/required) sub start_embed { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src; my $currentstring = ''; if ($target eq 'web') { if ($ENV{'browser.embedsuppress'} ne 'on') { $currentstring = $token->[4]; } else { my $alttag=&Apache::lonxml::get_param ('alt',$parstack,$safeeval,undef,1); unless ($alttag) { $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src); } $currentstring='[EMBED: '.$alttag.']'; } } elsif ($target eq 'tex') { } return $currentstring; } sub end_embed { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { } return $currentstring; } #-- <param> tag (end tag forbidden) sub start_param { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; if (&Apache::lonxml::get_param ('name',$parstack,$safeeval,undef,1)=~/^cabbase$/i) { $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]= &Apache::lonxml::get_param('value',$parstack,$safeeval,undef,1); } $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]= &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { } return $currentstring; } sub end_param { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { } return $currentstring; } #-- <allow> tag sub start_allow { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1); $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]= &Apache::lonnet::clutter($src); &image_replication($src); my $result; if ($target eq 'edit') { $result .=&Apache::edit::tag_start($target,$token); $result .=&Apache::edit::text_arg('File Spec:','src',$token,70); $result .=&Apache::edit::end_row();#.&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'src'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } return $result; } sub end_allow { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; if ( $target eq 'edit') { return (&Apache::edit::end_table()); } return ''; } #-- Frames (end tag required) #-- <frameset> sub start_frameset { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { if (!$Apache::lonxml::registered && $ENV{'request.state'} eq 'published') { $currentstring.='<head>'. &Apache::lonmenu::registerurl(undef,$target).'</head>'; } my $onLoad=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^onload$/i) { $onLoad.=$token->[2]->{$key}.';'; delete($token->[2]->{$key}); } } $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad; my $onUnload=''; foreach my $key (keys(%{$token->[2]})) { if ($key =~ /^onunload$/i) { $onUnload.=$token->[2]->{$key}.';'; delete($token->[2]->{$key}); } } $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents(). ';'.$onUnload; $currentstring .= '<'.$token->[1]; foreach (keys %{$token->[2]}) { $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"'; } $currentstring.='>'; } return $currentstring; } sub end_frameset { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <xmp> (end tag required) sub start_xmp { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\begin{verbatim}'; } return $currentstring; } sub end_xmp { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '\end{verbatim}'; } return $currentstring; } #-- <pre> (end tag required) sub start_pre { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\begin{verbatim}'; } return $currentstring; } sub end_pre { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '\end{verbatim}'; } return $currentstring; } #-- <insert> sub start_insert { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1); $currentstring .= '<b>'.$display.'</b>';; } return $currentstring; } sub end_insert { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= ''; } return $currentstring; } #-- <externallink> sub start_externallink { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1); $currentstring .= '<b>'.$display.'</b>';; } return $currentstring; } sub end_externallink { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= ''; } return $currentstring; } #-- <blankspace heigth=""> sub start_blankspace { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'tex') { my $howmuch = &Apache::lonxml::get_param('heigth',$parstack,$safeeval,undef,1); $currentstring .= '\vskip '.$howmuch.' '; } return $currentstring; } sub end_blankspace { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'tex') { $currentstring .= ''; } return $currentstring; } #-- <abbr> tag (end tag required) sub start_abbr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_abbr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <acronym> tag (end tag required) sub start_acronym { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_acronym { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <area> tag (end tag forbidden) sub start_area { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_area { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <base> tag (end tag forbidden) sub start_base { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_base { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <bdo> tag (end tag required) sub start_bdo { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_bdo { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <bgsound> tag (end tag optional) sub start_bgsound { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_bgsound { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <blink> tag (end tag required) sub start_blink { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_blink { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <blockquote> tag (end tag required) sub start_blockquote { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_blockquote { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <button> tag (end tag required) sub start_button { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_button { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <caption> tag (end tag required) sub start_caption { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_caption { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <col> tag (end tag forbdden) sub start_col { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_col { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <colgroup> tag (end tag optional) sub start_colgroup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_colgroup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <del> tag (end tag required) sub start_del { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_del { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <fieldset> tag (end tag required) sub start_fieldset { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_fieldset { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <frame> tag (end tag forbidden) sub start_frame { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_frame { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <iframe> tag (end tag required) sub start_iframe { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_iframe { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <ins> tag (end tag required) sub start_ins { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_ins { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <isindex> tag (end tag forbidden) sub start_isindex { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_isindex { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <keygen> tag (end tag forbidden) sub start_keygen { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_keygen { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <label> tag sub start_label { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_label { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <layer> tag (end tag required) sub start_layer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_layer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <legend> tag (end tag required) sub start_legend { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_legend { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <link> tag (end tag forbidden) sub start_link { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_link { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <marquee> tag (end tag optional) sub start_marquee { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_marquee { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <multicol> tag (end tag required) sub start_multicol { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_multicol { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <nobr> tag (end tag required) sub start_nobr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring='\mbox{'; } return $currentstring; } sub end_nobr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring='}'; } return $currentstring; } #-- <noembed> tag (end tag required) sub start_noembed { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_noembed { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <noframes> tag (end tag required) sub start_noframes { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_noframes { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <nolayer> tag (end tag required) sub start_nolayer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_nolayer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <noscript> tag (end tag required) sub start_noscript { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_noscript { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <object> tag (end tag required) sub start_object { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_object { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <optgroup> tag (end tag required) sub start_optgroup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_optgroup { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <samp> tag (end tag required) sub start_samp { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring='\texttt{'; } return $currentstring; } sub end_samp { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring='}'; } return $currentstring; } #-- <server> tag sub start_server { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_server { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <spacer> tag (end tag forbidden) sub start_spacer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_spacer { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <span> tag (end tag required) sub start_span { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_span { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <tbody> tag (end tag optional) sub start_tbody { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_tbody { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <tfoot> tag (end tag optional) sub start_tfoot { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_tfoot { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <thead> tag (end tag optional) sub start_thead { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_thead { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <var> tag sub start_var { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { $currentstring = '\textit{'; } return $currentstring; } sub end_var { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '}'; } return $currentstring; } #-- <wbr> tag (end tag forbidden) sub start_wbr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[4]; } return $currentstring; } sub end_wbr { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } return $currentstring; } #-- <hideweboutput> tag sub start_hideweboutput { my ($target,$token) = @_; if ($target eq 'web') { &Apache::lonxml::startredirection(); } return ''; } sub end_hideweboutput { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = &Apache::lonxml::endredirection(); } return ''; } sub image_replication { my $src = shift; if (not -e $src) { &Apache::lonnet::repcopy($src); } #replicates eps or ps my $epssrc = my $pssrc = $src; $epssrc =~ s/\.(gif|jpg|jpeg|png)$/.eps/i; $pssrc =~ s/\.(gif|jpg|jpeg|png)$/.ps/i; if (not -e $epssrc && not -e $pssrc) { my $result=&Apache::lonnet::repcopy($epssrc); if ($result ne OK) { &Apache::lonnet::repcopy($pssrc); } } return ''; } sub image_size { my ($src,$scaling,$parstack,$safeeval)=@_; #size of image from gif/jpg/jpeg/png my $image = Image::Magick->new; my $current_figure = $image->Read($src); my $width_param = $image->Get('width') * $scaling;; my $height_param = $image->Get('height') * $scaling;; undef $image; #do we have any specified LaTeX size of the picture? my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); #do we have any specified web size of the picture? my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval, undef,1); if ($TeXwidth ne '') { if ($TeXwidth=~/(\d+)\s*\%/) { $width_param = $1*$ENV{'form.textwidth'}/100; } else { $width_param = $TeXwidth; } } elsif ($TeXheight ne '') { $width_param = $TeXheight/$height_param*$width_param; } elsif ($width ne '') { $width_param = $width*$scaling; } if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}} return $width_param; } sub eps_generation { my ($src,$file,$width_param) = @_; my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat"; my $temp_file = Apache::File->new('>>'.$filename); print $temp_file "$src\n"; my $newsrc = $src; $newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i; $newsrc=~s/\/home\/httpd\/html\/res//; $newsrc=~s/\/home\/([^\/]*)\/public_html\//\/$1\//; $newsrc=~s/\/\.\//\//; $newsrc=~s/\/([^\/]+)\.(ps|eps)/\//; if ($newsrc=~/\/home\/httpd\/lonUsers\//) { $newsrc=~s/\/home\/httpd\/lonUsers//; $newsrc=~s/\/([^\/]+)\/(\w)\/(\w)\/(\w)\//\/$1\//; } return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } sub file_path { my $src=shift; my ($file,$path); if ($src =~ m!(.*)/([^/]*)$!) { $file = $2; $path = $1.'/'; } return $file,$path; } sub recalc { my $argument = shift; if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';} $argument=~/\s*(\d+\.?\d*)\s*(mm|cm|in|pc|pt)/; my $value=$1; my $units=$2; if ($units eq 'cm') { $value*=10; } elsif ($units eq 'in') { $value*=25.4; } elsif ($units eq 'pc') { $value*=(25.4*12/72.27); } elsif ($units eq 'pt') { $value*=(25.4/72.27); } return $value.' mm'; } sub LATEX_length { my $garbage=shift; $garbage=~s/^\s+$//; $garbage=~s/^\s+(\S.*)/$1/;#space before $garbage=~s/(.*\S)\s+$/$1/;#space after $garbage=~s/(\s)+/$1/;#only one space $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...} $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$ $garbage=~s/([^\\])\$/$1/g;#$ $garbage=~s/(\\ensuremath\{\_\{|\\ensuremath\{\_|\\ensuremath\{\^{|\\ensuremath\{\^|\})//g;#remove \ensuremath{...} $garbage=~s/(\\alpha|\\beta|\\gamma|\\delta|\\epsilon|\\verepsilon|\\zeta|\\eta|\\theta|\\vartheta|\\iota|\\kappa|\\lambda|\\mu|\\nu|\\xi|\\pi|\\varpi|\\rho|\\varrho|\\sigma|\\varsigma|\\tau|\\upsilon|\\phi|\\varphi|\\chi|\\psi|\\omega|\\Gamma|\\Delta|\\Theta|\\Lambda|\\Xi|\\Pi|\\Sigma|\\Upsilon|\\Phi|\\Psi|\\Omega)/1/g; $garbage=~s/(\\pm|\\mp|\\times|\\div|\\cdot|\\ast|\\star|\\dagger|\\ddagger|\\amalg|\\cap|\\cup|\\uplus|\\sqcap|\\sqcup|\\vee|\\wedge|\\oplus|\\ominus|\\otimes|\\circ|\\bullet|\\diamond|\\lhd|\\rhd|\\unlhd|\\unrhd|\\oslash|\\odot|\\bigcirc|\\Box|\\Diamond|\\bigtriangleup|\\bigtriangledown|\\triangleleft|\\triangleright|\\setminus|\\wr)/1/g; $garbage=~s/(\\le|\\ll|\\leq|\\ge|\\geq|\\gg|\\neq|\\doreq|\\sim|\\simeq|\\subset|\\subseteq|\\sqsubset|\\sqsubseteq|\\in|\\vdash|\\models|\\supset|\\supseteq|\\sqsupset|\\sqsupseteq|\\ni|\\dash|\\perp|\\approx|\\cong|\\equiv|\\propto|\\prec|\\preceq|\\parallel|\\asymp|\\smile|\\frown|\\bowtie|\\succ|\\succeq|\\mid)/1/g; $garbage=~s/(\\not<|\\\\not\\le|\\not\\prec|\\not\\preceq|\\not\\subset|\\not\\subseteq|\\not\\sqsubseteq|\\not\\in|\\not>|\\not\\ge|\\not\\succ|\\notsucceq|\\not\\supset|\\notsupseteq|\\not\\sqsupseteq|\\notin|\\not=|\\not\\equiv|\\not\\sim|\\not\\simeq|\\not\\approx|\\not\\cong|\\not\\asymp)/1/g; $garbage=~s/(\\leftarrow|\\gets|\\Leftarrow|\\rightarrow|\\to|\\Rightarrow|\\leftrightarrow|\\Leftrightarrow|\\mapsto|\\hookleftarrow|\\leftharpoonup|\\leftkarpoondown|\\rightleftharpoons|\\longleftarrow|\\Longleftarrow|\\longrightarrow|\\Longrightarrow|\\longleftrightarrow|\\Longleftrightarrow|\\longmapsto|\\hookrightarrow|\\rightharpoonup|\\rightharpoondown|\\uparrow|\\Uparrow|\\downarrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\nearrow|\\searrow|\\swarrow|\\nwarrow)/11/g; $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g; $garbage=~s/(\\hat{([^}]+)}|\\check{([^}]+)}|\\dot{([^}]+)}|\\breve{([^}]+)}|\\acute{([^}]+)}|\\ddot{([^}]+)}|\\grave{([^}]+)}|\\tilde{([^}]+)}|\\mathring{([^}]+)}|\\bar{([^}]+)}|\\vec{([^}]+)})/$1/g; #remove some other LaTeX command $garbage=~s|\\(\w+)\\|\\|g; $garbage=~s|\\(\w+)(\s*)|$2|g; $garbage=~s|\+|11|g; my $value=length($garbage); return $value; } 1; __END__