--- loncom/interface/lonprintout.pm 2002/09/16 14:20:33 1.65 +++ loncom/interface/lonprintout.pm 2002/09/19 18:33:20 1.71 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.65 2002/09/16 14:20:33 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.71 2002/09/19 18:33:20 sakharuk Exp $ # # Copyright Michigan State University Board of Trustees # @@ -48,6 +48,7 @@ use Apache::inputtags; use Apache::grades; use Apache::edit; use Apache::File(); +use Apache::lonnavmaps; use POSIX qw(strftime); use GDBM_File; @@ -92,7 +93,7 @@ ENDMENUOUT1 if ((not $ENV{'request.role'}=~m/^au\./) and (not $ENV{'request.role'}=~m/^ca\./)) { $r->print(< All problems from $title_for_sequence
- All problems plus any html/xml files from $title_for_sequence
+ All problems plus any pages or html/xml files from $title_for_sequence
ENDMENUOUT2 } if ($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) { @@ -344,7 +345,7 @@ ENDPART my $numberofcolumns = $ENV{'form.numberofcolumns'}; my $laystyle = 'book'; my $result = ''; - my $number_of_columns = 1; + my $number_of_columns = 1; #used only for pages to determine the width of the cell my $selectionmade = ''; if ($choice eq 'Standard LaTeX output for current document') { @@ -358,13 +359,10 @@ ENDPART $moreenv{'request.filename'}=$ENV{'form.url'}; &Apache::lonnet::appenv(%moreenv); my $texversion=&Apache::lonnet::ssi($ENV{'form.url'}); - &Apache::lonnet::logthis(" Got $result"); &Apache::lonnet::delenv('form.grade_target'); $result .= $texversion; if ($ENV{'form.url'}=~m/\.page\s*$/) { ($result,$number_of_columns) = &page_cleanup($result); - } else { - $result = &additional_cleanup($result); } } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or $choice eq 'Standard LaTeX output for whole primary sequence') { @@ -372,32 +370,53 @@ ENDPART #-- where is the primary sequence containing file? my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'}); $symbolic =~ m/([^_]+)_/; - my $primary_sequence = '/res/'.$1; - my @master_seq = &coming_from_hash($primary_sequence); + my $primary_sequence = '/res/'.$1; + my @master_seq = &coming_from_hash($primary_sequence); #-- produce an output string + my $flag_latex_header_remove = 'NO'; + my $flag_page_in_sequence = 'NO'; for (my $i=0;$i<=$#master_seq;$i++) { - my $urlp = $master_seq[$i]; + my ($urlp,$symb) = split /&&/, $master_seq[$i]; if ($choice eq 'Standard LaTeX output for the primary sequence') { $selectionmade = 2; if ($urlp =~ m/\.(problem|exam|quiz|assess|survey|form|library)/) { my %moreenv; $moreenv{'form.grade_target'}='tex'; &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($urlp); + my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb)); &Apache::lonnet::delenv('form.grade_target'); + if ($flag_latex_header_remove ne 'NO') { + $texversion = &latex_header_footer_remove($texversion); + } else { + $texversion =~ s/\\end{document}//; + } $result .= $texversion; + $flag_latex_header_remove = 'YES'; } } elsif ($urlp =~ /\S+/) { $selectionmade = 3; my %moreenv; $moreenv{'form.grade_target'}='tex'; &Apache::lonnet::appenv(%moreenv); - my $texversion=&Apache::lonnet::ssi($urlp); + my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb)); &Apache::lonnet::delenv('form.grade_target'); - $result .= $texversion; + if ($urlp =~ m/\.page/) { + ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); + if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} + $texversion =~ s/\\end{document}\d*/\\end{document}/; + $flag_page_in_sequence = 'YES'; + } + if ($flag_latex_header_remove ne 'NO') { + $texversion = &latex_header_footer_remove($texversion); + } else { + $texversion =~ s/\\end{document}//; + } + $result .= $texversion; + $flag_latex_header_remove = 'YES'; } - } - $result = &additional_cleanup($result); + } + if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;} + $result .= '\end{document}'; } elsif ($choice eq 'Standard LaTeX output for the top level sequence') { # where is the main sequence of the course? $selectionmade = 4; @@ -405,7 +424,7 @@ ENDPART my @file_seq = &coming_from_hash($main_seq); #-- produce an output string for (my $i=0;$i<=$#file_seq;$i++) { - my $urlp = $file_seq[$i]; + my ($urlp,$symb) = split /&&/, $file_seq[$i]; $urlp=~s/\/home\/httpd\/html//; if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) { my %moreenv; @@ -437,11 +456,11 @@ ENDPART my ($usersection,$username,$userdomain) = split /:/,$person; my $fullname = &Apache::grades::get_fullname($username,$userdomain); #goes through all resources, checks if they are available for current student, and produces output - foreach my $curres (@master_seq) { + foreach my $curresline (@master_seq) { + my ($curres,$symb) = split /&&/, $curresline; $curres =~ s/^"//; $curres =~ s/"$//; if ($curres=~/\w+/) { - my $symb = &Apache::lonnet::symbread($curres); my ($map,$id,$res_url) = split(/___/,$symb); if (&Apache::lonnet::allowed('bre',$res_url)) { my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain, @@ -557,20 +576,54 @@ sub coming_from_hash { my $mainsequence = shift; my @resourcelist = (); + my $mapid = $hash{'map_pc_'.$mainsequence}; my $mapstart = $hash{'map_start_'.$mainsequence}; my $mapfinish = $hash{'map_finish_'.$mainsequence}; + my $symb = &Apache::lonnet::symbread($hash{'src_'.$mapstart}); + my ($presymb) = split(/___/,$symb); + $presymb = $presymb.'___'; my $current_resource = $mapstart; while ($current_resource ne $mapfinish) { if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - push @resourcelist,$hash{'src_'.$current_resource}; + my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}}; + if ($rid=~/,/) { + my @rid = split /,/, $rid; + foreach my $rid_element (@rid) { + if ($rid_element =~ m/^$mapid\.(\d*)/) { + $rid = $1; + last; + } + } + } else { + $rid =~ m/^$mapid\.(\d*)/; + $rid = $1; + } + $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/; + $symb = $presymb.$rid.'___'.$1; + push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb; } else { push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource}); } $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}}; } - #needs if final resource in the map (type=finish) contains something + #needs if final resource in the map (type="finish") contains something if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - push @resourcelist,$hash{'src_'.$current_resource}; + my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}}; + if ($rid=~/,/) { + my @rid = split /,/, $rid; + foreach my $rid_element (@rid) { + if ($rid_element =~ m/^$mapid\.(\d*)/) { + $rid = $1; + last; + } + } + } else { + $rid =~ m/^$mapid\.(\d*)/; + $rid = $1; + } + $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/; + $symb = $presymb.$rid.'___'.$1; + push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb; } else { push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource}); } @@ -578,6 +631,14 @@ sub coming_from_hash { } +sub latex_header_footer_remove { + my $text = shift; + $text =~ s/\\end{document}//; + $text =~ s/\\documentclass([^&]*)\\begin{document}//; + return $text; +} + + sub character_chart { my $result = shift; $result =~ s/�?0?7;//g; @@ -912,11 +973,14 @@ sub additional_cleanup { while ($first_app != -1) { my $second_app = index($result,'begin{document}',$first_app); $first_app = rindex($result,'\end{document}',$first_app); + if ($first_app == -1) {last;} substr($result,$first_app,$second_app-$first_app+15) = '\vskip 3 mm'; $first_app = index($result,'\documentclass',$first_app+5); } return $result; } + + sub page_cleanup { my $result = shift; @@ -954,6 +1018,14 @@ sub details_for_menu { sub handler { my $r = shift; + + my $loaderror=&Apache::lonnet::overloaderror($r); + if ($loaderror) { return $loaderror; } + $loaderror= + &Apache::lonnet::overloaderror($r, + $ENV{'course.'.$ENV{'request.course.id'}.'.home'}); + if ($loaderror) { return $loaderror; } + $r->content_type('text/html'); $r->send_http_header; $r->print(&Apache::loncommon::bodytag("Printing"));