# The LearningOnline Network # Printout # # $Id: lonprintout.pm,v 1.17 2002/03/20 22:14:30 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)
Standard LaTeX output for the primary sequence
All documents 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') { my @master_seq = (); my $keyword = 0; my $output_seq = ''; my $current_file = '/res/'.$ENV{'request.ambiguous'}; $current_file =~ s/(\/res\/physnet\/physnet)(\/m\d+)\/(.*)/$1$2$2\.sequence/; while ($current_file ne '') { my $file=&Apache::lonnet::filelocation("",$current_file); my $filecontents=&Apache::lonnet::getfile($file); my @file_seq = &content_map($filecontents); if (defined @file_seq) { #-- adding an additional array to the master one if (defined @master_seq) { my $old_value = $#master_seq; my $total_value = $#master_seq + $#file_seq +2; for (my $j=0; $j<=$old_value-$keyword+1; $j++) { $master_seq[$total_value-$j] = $master_seq[$old_value-$j]; } for (my $j=0; $j<=$#file_seq; $j++){ $master_seq[$keyword+$j] = $file_seq[$j]; } @file_seq = (); $keyword = 0; } else { @master_seq = @file_seq; @file_seq = (); } } #-- checking wether .sequence file is among the set of files $current_file = ''; for (my $i=0; $i<=$#file_seq; $i++) { $_ = $file_seq[$i]; if (m/(.*)\.sequence/) { $current_file = $_; $keyword = $i; last; } } } #-- produce an output string for (my $i=0;$i<=$#master_seq;$i++) { $_ = $master_seq[$i]; m/\"(.*)\"/; if (index($1,'-tc.xml',0)==-1) { my $file=&Apache::lonnet::filelocation("",$1); my $filecontents=&Apache::lonnet::getfile($file); $output_seq .= $filecontents; } } #-- cleanup of output string (temporary cbi-specific) $output_seq =~ s///g; $output_seq =~ s/<\/physnet>//g; $output_seq = ''.$output_seq.' '; #-- final accord $result = &Apache::lonxml::xmlparse('tex',$output_seq,'',%mystyle); } elsif ($choice eq 'Standard LaTeX output for the top level sequence') { my @master_seq = (); my $keyword = 0; my $output_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); #-- temporary solution (without sequence inside sequence) - have to be generalized # if (defined @master_seq) { # my $old_value = $#master_seq; # my $total_value = $#master_seq + $#file_seq +2; # for (my $j=0; $j<=$old_value-$keyword+1; $j++) { # $master_seq[$total_value-$j] = $master_seq[$old_value-$j]; # } # for (my $j=0; $j<=$#file_seq; $j++){ # $master_seq[$keyword+$j] = $file_seq[$j]; # } # @file_seq = (); # $keyword = 0; # } else { @master_seq = @file_seq; # @file_seq = (); # } #-- checking wether .sequence file is among the set of files # my $current_file = ''; # for (my $i=0; $i<=$#file_seq; $i++) { # $_ = $file_seq[$i]; # if (m/(.*)\.sequence/) { # $current_file = $_; # $keyword = $i; # last; # } # } #-- 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 7 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; } #-- LaTeX corrections $result =~ s/^\s+$//gm; #remove empty lines $result =~ s/%/\\%/g; #corrects % #-- writing .tex file in prtspool my $temp_file; $filename = "/home/httpd/prtspool/$ENV{'environment.firstname'}$ENV{'environment.lastname'}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); } my $stalink = index($map_string,' to="'.$number_seq[0].'"',$startlink); while ($stalink != -1) { $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"; # } ####