# The LearningOnline Network # Printout # # $Id: lonprintout.pm,v 1.20 2002/04/01 18:23:12 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/ # # (Internal Server Error Handler # # (Login Screen # 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14, # 1/14/00,5/29,5/30,6/1,6/29,7/1,11/9 Gerd Kortemeyer) # # 3/1/1 Gerd Kortemeyer) # # 3/1 Gerd Kortemeyer # # 9/17 Alex Sakharuk # package Apache::lonprintout; use strict; use Apache::Constants qw(:common :http); use Apache::lonxml; use Apache::lonnet; use Apache::inputtags; use Apache::edit; use Apache::File(); sub headerform { my $r = shift; $r->print(< LON-CAPA output for printing

What do you want to print? Make a choice.


ENDHEADER } sub menu_for_output { my $r = shift; $r->print(< Current document (you will print what you see on the screen)
All problems from the primary sequence
The whole primary sequence (problems plus all html and xml files)
All problems from the top level sequence



And what page format do you prefer?

CBI
CAPA
ENDMENUOUT } sub output_data { my $r = shift; $r->print(< LON-CAPA output for printing
ENDPART my $choice = $ENV{'form.choice'}; my $layout = $ENV{'form.layout'}; my $laystyle = 'book'; my $result = ''; my %mystyle; my $filename; if ($choice eq 'Standard LaTeX output for current document') { my %moreenv; my $currequest=$ENV{'request.filename'}; $moreenv{'form.grade_target'}='tex'; $moreenv{'request.filename'}=$ENV{'form.url'}; &Apache::lonnet::appenv(%moreenv); my $texversion=&Apache::lonnet::ssi($ENV{'form.url'}); &Apache::lonnet::delenv('form.grade_target'); %moreenv = (); $moreenv{'request.filename'}=$currequest; &Apache::lonnet::appenv(%moreenv); $result .= $texversion; } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or $choice eq 'Standard LaTeX output for whole primary sequence') { #-- where is the primary sequence containing file? my %moreenv; my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'}); $_ = $symbolic; m/([^_]+)_/; my $primary_sequence = '/res/'.$1; #-- open and analyses the primary sequence my $sequence_file=&Apache::lonnet::filelocation("",$primary_sequence); my $sequencefilecontents=&Apache::lonnet::getfile($sequence_file); my @master_seq = &content_map($sequencefilecontents); #-- produce an output string for (my $i=0;$i<=$#master_seq;$i++) { $_ = $master_seq[$i]; m/\"(.*)\"/; $_ = $1; my $urlp = $1; if ($choice eq 'Standard LaTeX output for the primary sequence') { if (/\.problem/) { my %moreenv; $moreenv{'form.grade_target'}='tex'; &Apache::lonnet::appenv(%moreenv); my $texversion=&Apache::lonnet::ssi($urlp); &Apache::lonnet::delenv('form.grade_target'); $texversion =~ s!\.gif!\.eps!g; $result .= $texversion; } } else { $moreenv{'form.grade_target'}='tex'; &Apache::lonnet::appenv(%moreenv); my $texversion=&Apache::lonnet::ssi($urlp); &Apache::lonnet::delenv('form.grade_target'); $texversion =~ s!\.gif!\.eps!g; $result .= $texversion; } } #-- additional cleanup for output my $first_app = index($result,'\documentclass',0); $first_app = index($result,'\documentclass',$first_app+5); while ($first_app != -1) { my $second_app = index($result,'begin{document}',$first_app); $first_app = rindex($result,'\end{document}',$first_app); substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm'; $first_app = index($result,'\documentclass',$first_app+5); } } elsif ($choice eq 'Standard LaTeX output for the top level sequence') { my @master_seq = (); my @add_file_seq = (); #-- where is the main sequence of the course? my $main_seq = '/res/'.$ENV{'request.course.uri'}; my $file=&Apache::lonnet::filelocation("",$main_seq); my $filecontents=&Apache::lonnet::getfile($file); my @file_seq = &content_map($filecontents); #-- do we have any other sequence inside? my $i=0; while ($i<=$#file_seq) { $_ = $file_seq[$i]; if (/\.sequence$/) { $file = &Apache::lonnet::filelocation("",$file_seq[$i]); $filecontents=&Apache::lonnet::getfile($file); @add_file_seq = &content_map($filecontents); splice(@file_seq,$i,1,@add_file_seq); @add_file_seq = (); $i = -1; } $i++; } @master_seq = @file_seq; #-- produce an output string for (my $i=0;$i<=$#master_seq;$i++) { $_ = $master_seq[$i]; m/\"(.*)\"/; $_ = $1; my $urlp = $1; if (/\.problem/) { my %moreenv; $moreenv{'form.grade_target'}='tex'; &Apache::lonnet::appenv(%moreenv); my $texversion=&Apache::lonnet::ssi($urlp); &Apache::lonnet::delenv('form.grade_target'); $texversion =~ s!\.gif!\.eps!; $result .= $texversion; } } #-- additional cleanup for output my $first_app = index($result,'\documentclass',0); $first_app = index($result,'\documentclass',$first_app+5); while ($first_app != -1) { my $second_app = index($result,'begin{document}',$first_app); $first_app = rindex($result,'\end{document}',$first_app); substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm'; $first_app = index($result,'\documentclass',$first_app+5); } } #-- corrections for the different page formats if ($layout eq 'CBI') { $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/; $laystyle = 'album'; } elsif ($layout eq 'CAPA') { my $courseidinfo = $ENV{'request.role'}; $_ = $courseidinfo; m/.*\/(.*)/; $courseidinfo = $ENV{'course.physnet_'.$1.'.description'}; $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass\[twocolumn\]{article}/; $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 7\.7in\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}}\\hskip 1\.4in $courseidinfo \\vskip 5 mm /; $result =~ s/\\includegraphics/\\includegraphics\[width=9\.0 cm\]/g; $result =~ s/(\\end{document})/\\newline\\noindent\\makebox\[9.0cm\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Dept\. of Physics and Astronomy, MSU\\makebox\[1.0cm\]\[b\]{\\hfill}LON-CAPA\\copyright MSU GNU\/GPS $1/; } #-- LaTeX corrections $result =~ s/^\s+$//gm; #remove empty lines $result =~ s/%/\\%/g; #corrects % $result =~ s/(\s)+/$1/g; #removes more than one empty space $result =~ s/\\\\\s*(\\vskip)/ $1/gm; #-- writing .tex file in prtspool my $temp_file; $filename = "/home/httpd/prtspool/$ENV{'user.name'}$ENV{'user.domain'}temp$ENV{'user.login.time'}.tex"; unless ($temp_file = Apache::File->new('>'.$filename)) { $r->log_error("Couldn't open $filename for output $!"); return SERVER_ERROR; } print $temp_file $result; $r->print(< FINALEND } sub content_map { #-- find a list of files to print my $map_string = shift; my @number_seq = (); my @file_seq = (); my $startlink = index($map_string,'',$startlink); my $chunk = substr($map_string,$startlink,$endlink-$startlink+7); $_ = $chunk; m/from=\"(\d+)\"/; push @number_seq,$1; while ($startlink != -1) { $endlink = index($map_string,'',$startlink); $chunk = substr($map_string,$startlink,$endlink-$startlink+7); substr($map_string,$startlink,$endlink-$startlink+7) = ''; $_ = $chunk; m/to=\"(\d+)\"/; push @number_seq,$1; $startlink = index($map_string,'from="'.$1.'"',$startlink); $startlink = rindex($map_string,'',$startlink); $chunk = substr($map_string,$startlink,$endlink-$startlink+7); substr($map_string,$startlink,$endlink-$startlink+7) = ''; $_ = $chunk; m/from=\"(\d+)\"/; unshift @number_seq,$1; $stalink = index($map_string,' to="'.$number_seq[0].'"',0); } for (my $i=0;$i<=$#number_seq;$i++) { $stalink = index($map_string,' id="'.$number_seq[$i].'"',0); { my $ahed1 = index($map_string,'src="',$stalink); my $ahed2 = index($map_string,'',$stalink); if ($ahed1 != -1) { if ($ahed1 < $ahed2) { $startlink = $ahed1; } else { $startlink = rindex($map_string,'src="',$stalink); } } else { $startlink = rindex($map_string,'src="',$stalink); } } $startlink = index($map_string,'"',$startlink); $endlink = index($map_string,'"',$startlink+1); $chunk = substr($map_string,$startlink,$endlink-$startlink+1); push @file_seq,$chunk; } return @file_seq; } sub handler { my $r = shift; $r->content_type('text/html'); $r->send_http_header; #-- start form &headerform($r); #-- menu for output unless ($ENV{'form.phase'}) { &menu_for_output($r); } #-- core part if ($ENV{'form.phase'} eq 'two') { &output_data($r); } return OK; } 1; __END__ #### Test block # my $ere; # foreach $ere (%ENV) { # $result .= ' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n"; # } ####