![]() ![]() | ![]() |
- works correctly 100% of the time now. :-)
# The LearningOnline Network with CAPA # Tags Default Definition Module # # $Id: londefdef.pm,v 1.187 2003/10/24 21:25:50 albertel 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); $Apache::londefdef::TD_redirection=0; 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')); } #======================= 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) = @_; my $currentstring = ''; if ($target eq 'web') { $Apache::lonxml::prevent_entity_encode++; my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); $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 = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); 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; } else { my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); } return $currentstring; } sub end_m { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $Apache::lonxml::prevent_entity_encode--; } elsif ($target eq 'tex') { $currentstring = ""; } elsif ($target eq 'meta') { } 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 = ''; if ($ENV{'browser.mathml'}) { &tth::ttminit(); if ($ENV{'browser.unicode'}) { &tth::ttmoptions('-L -u1'); } else { &tth::ttmoptions('-L -u0'); } } else { &tth::tthinit(); if ($ENV{'browser.unicode'}) { &tth::tthoptions('-L -u1'); } else { &tth::tthoptions('-L -u0'); } } if ($target eq 'web' || $target eq 'edit') { $currentstring = &Apache::lonxml::xmlbegin(). &Apache::lonxml::fontsettings(); } elsif ($target eq 'tex') { @Apache::londefdef::table = (); $currentstring .= '\documentclass[letterpaper]{article}'; if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} $currentstring .= '\newcommand{\keephidden}[1]{} \renewcommand{\deg}{$^{\circ}$} \usepackage{longtable} \usepackage{textcomp} \usepackage{makeidx} \usepackage[dvips]{graphicx} \usepackage{epsfig}\usepackage{calc} \newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}} \renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; } 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" value="Edit" /> </form> EDITBUTTON } else { $currentstring.=&Apache::lonmenu::menubuttons(undef,$target,1); } } 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=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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') || (not defined $align)) { $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; my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1); if (($align eq 'center') || (not defined $align)) { $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) sub start_p { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { my $signal=1; foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}} if ($signal) {$currentstring .= '\par ';} } return $currentstring; } sub end_p { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[2]; } 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] ne 'sub' && $$tagstack[-2] ne 'sup') { $currentstring .= '\vskip 0.2 mm '; } } 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) { $Apache::lonxml::prevent_entity_encode++; } else { 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') { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;} $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 .= "\$_{"; } 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 .= "\$^{"; } 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 .= '\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$}'; } 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 .= '\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}.}'; } 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) sub start_table { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $textwidth=''; if (not defined @Apache::londefdef::table) { $textwidth=&recalc($ENV{'form.textwidth'}); $textwidth=~/(\d+\.?\d*)/; $textwidth=0.95*$1; } else { $textwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); } my $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; #table's width 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=~/%/) { $htmlwidth=~/(\d+)/; my $value=$1*$textwidth/100; $Apache::londefdef::table[-1]{'width'}=$value; } else { $Apache::londefdef::table[-1]{'width'}=$textwidth; } } elsif ($TeXwidth=~/%/) { $TeXwidth=~/(\d+)/; my $value=$1*$textwidth/100; $Apache::londefdef::table[-1]{'width'}=$value; } else { $Apache::londefdef::table[-1]{'width'}=$textwidth; } #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); 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'} = ''; } $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; $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 = ''; #construct header of the table my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'}; for (my $in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) { $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'}; } $header_of_table .= '}'; #define the length of the table cells #always starts with TeXwidth (if defined everything else is ignored) my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]); for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]); for (my $jn=0;$jn<=$#length_row;$jn++) { if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];} } } #continues trying estimate the width of raw data my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]); for (my $jn=0;$jn<=$#length_row;$jn++) { if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];} } } #comparing of TeXwidth and raw data width my $available_length=$Apache::londefdef::table[-1]{'width'}; my $needed=0; for (my $jn=0;$jn<=$#length_row_final;$jn++) { if ($length_row_final[$jn]!=0) { $available_length=$available_length-$length_row_final[$jn]; $needed++; } } $needed=$#length_row_final-$needed+1; for (my $jn=0;$jn<=$#length_row_final;$jn++) { if ($length_row_final[$jn]==0) { if ($length_raw_row[$jn]<$available_length) { $length_row_final[$jn]=$length_raw_row[$jn]; $available_length=$available_length-$length_raw_row[$jn]; $needed--; } } } for (my $jn=0;$jn<=$#length_row_final;$jn++) { if ($length_row_final[$jn]==0) { $length_row_final[$jn]=0.9*$available_length/$needed; } } #fill the table for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { for (my $jn=0;$jn<=$#length_row_final;$jn++) { my $substituted=$length_row_final[$jn]; $Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/; } $output .= $Apache::londefdef::table[-1]{'rowdata'}[$in]; chop $output; $output .= ' \\\\ '; } $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm '; 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 = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1); if ($alignchar ne '') { push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar; } 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; $Apache::londefdef::table[-1]{'TeXlength'} = ''; $Apache::londefdef::table[-1]{'length'} = ''; } 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); } push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'}; push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'}; } 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 $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 ''; } 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) { 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+\.?\d*)/; $Apache::londefdef::table[-1]{'TeXlength'} .= $1.','; $Apache::londefdef::table[-1]{'length'} .= '0,'; } else { $data=~s/^\s+(\S.*)/$1/; $data=~s/(.*\S)\s+$/$1/; $data=~s/(\s)+/$1/; my $current_length=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=1.8*LATEX_length($elementdata); if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;} } } else { $current_length=1.8*LATEX_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]/; } @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; 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); $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src; my $currentstring = ''; my $width_param = ''; my $height_param = ''; 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); &image_replication($src); #if original gif/jpg/png file exist do following: if (-e $src) { #defines the default size of image my $image = Image::Magick->new; my $current_figure = $image->Read($src); $width_param = $image->Get('width') * $scaling;; $height_param = $image->Get('height') * $scaling;; undef $image; #do we have any specified size of the picture? my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); 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'}} my $file; my $path; if ($src =~ m!(.*)/([^/]*)$!) { $file = $2; $path = $1.'/'; } 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 { #there aren't eps or ps - so create eps my $temp_file; my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat"; $temp_file = Apache::File->new('>>'.$filename); print $temp_file "$src\n"; $newsrc=~s/\/home\/httpd\/html\/res//; $newsrc=~s/\/([^\/]+)\.(ps|eps)/\//; $currentstring .= '\vskip 1 mm \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} '; } } } 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 $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'src','alt', 'TeXwidth','TeXheight', 'width','height'); if (!$token->[2]{'width'} && !$token->[2]{'height'}) { $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); &image_replication($src); if (-e $src) { my $image = Image::Magick->new; my ($width, $height, $size, $format) = $image->Ping($src); if ($width && $height) { $token->[2]{'width'} =$width; $token->[2]{'height'}=$height; $constructtag=1; } } } if ($constructtag) {$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 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+(\S.*)/$1/; $garbage=~s/(.*\S)\s+$/$1/; $garbage=~s/(\s)+/$1/; $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g; $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$|\$)//g; $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)/1/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)/ /g; $garbage=~s/(\\hat{([^}]+)}|\\check{([^}]+)}|\\dot{([^}]+)}|\\breve{([^}]+)}|\\acute{([^}]+)}|\\ddot{([^}]+)}|\\grave{([^}]+)}|\\tilde{([^}]+)}|\\mathring{([^}]+)}|\\bar{([^}]+)}|\\vec{([^}]+)})/$1/g; my $value=length($garbage); return $value; } 1; __END__