# The LearningOnline Network with CAPA # .tex help system web server handler # # 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/ # # .tex file help handler # YEAR=2002 # 7/4 Jeremy Bowers package Apache::lonhelp; use strict; use Apache::Constants qw(:common :http); use Apache::File(); use Apache::loncommon(); use Apache::lonacc(); use Apache::lontexconvert(); use Apache::lonnavmaps; # for advancedUser use tth(); use GDBM_File(); # This sub takes the name of a label in, and converts it to something # that is a valid anchor name. sub processLabelName { my ($name) = @_; $name =~ tr/a-zA-Z0-9/_/cs; return $name; } # Serve out the Tex sub serveTex { my ($tex, $r) = @_; $r->print(< LON-CAPA Help

LON-CAPA Help

HEADER $r->print($tex); if (Apache::lonnavmaps::advancedUser()) { $r->print(<
About LON-CAPA help and More Help
FOOTER } else { $r->print(< FOOTER } } # Render takes a tex fragment, transforms it for TtH, and returns the # HTML equivalent sub render { my ($tex, $docroot, $serverroot) = @_; tie (my %fragmentLabels, 'GDBM_File', $docroot . '/adm/help/fragmentLabels.gdbm', 0, 0); # This tells TtH what to do with captions, labels, and other # things $tex = "\\documentclass{article}\n" . $tex; # We process these ourselves because TtH can't handle then without # LaTeX .aux files # absolute paths for use with help.loncapa.org $tex =~ s| \\ref\{([^}]*)\} |'\\begin{html}' . '\\end{html}' |gxe; # Backslashes $tex =~ s|\\textbackslash|###BACKSLASH###|g; # Figures leftover without captions $tex =~ s| \\includegraphics(\[[^]]*\])*\{([^}]*)\} | '\\begin{html}\\end{html}' |gxe; $tex=&Apache::lontexconvert::converted(\$tex); # Finish backslashes $tex =~ s/###BACKSLASH###/'\\'/ge; # Fix the pretty quotes $tex =~ s/('')|(``)/"/g; #" to get emacs syntax highlighter happy # For some reason all captions come out as "Figure 0:", so # just duck the issue... $tex =~ s/Figure 0://g; $tex.=$Apache::lontexconvert::errorstring; untie %fragmentLabels; return $tex; } sub handler { my $r = shift; my $docroot = $r->dir_config('lonDocRoot'); my $serverroot = $ENV{'HTTP_HOST'}; my $filenames = substr ($ENV{'REQUEST_URI'} , rindex($ENV{'REQUEST_URI'}, '/') + 1, -4); # Security check on the file; the whole filename must consist # of nothing but alphanums, ' ,, or ., or the file # will be "not found", no matter what. return HTTP_NOT_FOUND if ($filenames !~ /\A[-0-9a-zA-z_'',:.]+\Z/); &Apache::lonlocal::get_language_handle($r); # Join together the tex files, return HTTP_NOT_FOUND if any of # them are not found my $tex = ''; # Since in insertlist.tab I want to specify multiple files, # and insertlist.tab also uses commas, I need something else # so replace : with , $filenames =~ s/:/,/g; my @files = split(/,/, $filenames); for my $filename (@files) { if (-e $docroot.'/adm/help/tex/'.$filename.'_'. &Apache::lonlocal::current_language().'.tex') { $filename.='_'.&Apache::lonlocal::current_language(); } (my $file = Apache::File->new($docroot . '/adm/help/tex/'.$filename.'.tex')) or return HTTP_NOT_FOUND; $tex .= join('', <$file>); } # get me my environment if it exists &Apache::lonacc::handler($r); if ($ENV{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); &tth::ttminit(); if ($ENV{'browser.unicode'}) { &tth::ttmoptions('-L -u1'); } else { &tth::ttmoptions('-L -u0'); } } else { &Apache::loncommon::content_type($r,"text/html"); &tth::tthinit(); if ($ENV{'browser.unicode'}) { &tth::tthoptions('-L -u1'); } else { &tth::tthoptions('-L -u0'); } } $tex = render($tex, $docroot, $serverroot); serveTex($tex, $r); return OK; } 1;