--- loncom/interface/lonprintout.pm 2003/01/29 15:57:44 1.108 +++ loncom/interface/lonprintout.pm 2003/02/14 02:21:35 1.115 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.108 2003/01/29 15:57:44 sakharuk Exp $ +# $Id: lonprintout.pm,v 1.115 2003/02/14 02:21:35 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -144,6 +144,7 @@ ENDMENUOUT4 +
@@ -158,9 +159,13 @@ sub sequence_content_menu { my @sequence = split('___',$symbolic); if ($sequence[0]=~/^uploaded/) {$primary_sequence = '/'.$sequence[0];} else {$primary_sequence = '/res/'.$sequence[0];} - my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]); - my @titles_master_seq = &titles_coming_from_hash($primary_sequence,$sequence[0]); - foreach my $entity (@titles_master_seq) {$entity=~/^(.*)&&/; $entity=$1} + my @master_seq = &coming_from_hash($primary_sequence); + my @titles_master_seq = (); + for (my $i=0;$i<=$#master_seq;$i++) { + my ($path,$title,$symb) = split /&&/,$master_seq[$i]; + $master_seq[$i] = $path.'&&'.$symb; + push @titles_master_seq, $title; + } my @master_seq_view = @master_seq; if ($ENV{'user.adv'}) { for (my $i=0;$i<=$#master_seq_view;$i++) { @@ -183,8 +188,7 @@ sub sequence_content_menu { +DDD=$#titles_master_seq $titles_master_seq[0]
    @@ -240,7 +245,8 @@ sub problem_choice_menu { @content_directory = &Apache::lonnet::dirlist($subdirtoprint, $domain, $user,''); } else { - @content_directory = &Apache::lonnet::dirlist($subdirtoprint); + #local library server res space (allows to print only from the own library server) + @content_directory = &Apache::lonnet::dirlist($subdirtoprint,$ENV{'user.domain'}, $ENV{'user.name'},''); } for (my $iy=0;$iy<=$#content_directory;$iy++) { my @tempo_array = split(/&/,$content_directory[$iy]); @@ -469,7 +475,7 @@ ENDPART $LaTeXwidth = $1; } if ($choice eq 'Standard LaTeX output for current document') { - #-- single document - problem, page, html, xml + #-- single document - problem, page, html, xml, ... $selectionmade = 1; if ($ENV{'form.url'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { my %moreenv; @@ -548,7 +554,11 @@ ENDPART } else { $main_seq = '/res/'.$ENV{'request.course.uri'}; } - my @file_seq = &coming_from_hash_whole($main_seq); + my @file_seq = &coming_from_hash($main_seq); + for (my $i=0;$i<=$#file_seq;$i++) { + my ($path,$title,$symb) = split /&&/,$file_seq[$i]; + $file_seq[$i] = $path.'&&'.$symb; + } my $flag_latex_header_remove = 'NO'; #-- produce an output string for (my $i=0;$i<=$#file_seq;$i++) { @@ -585,8 +595,14 @@ ENDPART #where is the primary sequence containing current resource (the same for all students)? my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'}); my @sequence = split('___',$symbolic); - my $primary_sequence = '/res/'.$sequence[0]; - my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]); + my $primary_sequence; + if ($sequence[0]=~/^uploaded/) {$primary_sequence = '/'.$sequence[0];} + else {$primary_sequence = '/res/'.$sequence[0];} + my @master_seq = &coming_from_hash($primary_sequence); + for (my $i=0;$i<=$#master_seq;$i++) { + my ($path,$title,$symb) = split /&&/,$master_seq[$i]; + $master_seq[$i] = $path.'&&'.$symb; + } #loop over students my $flag_latex_header_remove = 'NO'; my %moreenv; @@ -616,7 +632,7 @@ ENDPART } if ($current_output=~/\\documentclass/) { my $courseidinfo = $ENV{'course.'.$ENV{'request.course.id'}.'.description'}; - $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\pagestyle{myheadings}\\markboth{}{{$courseidinfo - $assignment}}\\begin{document}\\noindent\\textit{\\textbf{$fullname}}\\vskip 3 mm /; + $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{$courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}} \\begin{document}\\noindent\\textit{\\textbf{$fullname}}\\vskip 3 mm /; } else { my $blanspages = ''; for (my $j=0;$j<$ENV{'form.addedpages'};$j++) {$blanspages.='\clearpage\strut\clearpage';} @@ -646,6 +662,8 @@ ENDPART &Apache::lonnet::appenv(%moreenv); if ($urlp =~ m|/home/([^/]+)/public_html|) { $urlp =~ s|/home/([^/]*)/public_html|/~$1|; + } else { + $urlp =~ s|^/home/httpd/html||; } my $texversion=&Apache::lonnet::ssi($urlp); &Apache::lonnet::delenv('form.grade_target','form.textwidth'); @@ -709,7 +727,7 @@ FINALEND } -sub coming_from_hash_whole { +sub coming_from_hash { my $mainsequence = shift; my @resourcelist = (); @@ -719,12 +737,12 @@ sub coming_from_hash_whole { my $current_resource = $mapstart; while ($current_resource ne $mapfinish) { if ($hash{'src_'.$current_resource}=~/\.sequence$/) { - push @resourcelist,&coming_from_hash_whole($hash{'src_'.$current_resource}); + push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource}); } else { my $presymb; if ($mainsequence =~ /\/res\/(.*)$/) {$presymb = $1;} elsif ($mainsequence =~ /\/?(uploaded\/(.*))$/) {$presymb = $1;} - my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}}; + my $rid = $current_resource; if ($rid=~/,/) { my @rid = split /,/, $rid; foreach my $rid_element (@rid) { @@ -739,98 +757,19 @@ sub coming_from_hash_whole { } $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/; my $symb = $presymb.'___'.$rid.'___'.$1; - push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb; - } - $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}}; - } - return @resourcelist; -} - - -sub coming_from_hash { - - my ($mainsequence,$symb) = @_; - my @resourcelist = (); - my $mapid = $hash{'map_pc_'.$mainsequence}; - my $mapstart = $hash{'map_start_'.$mainsequence}; - my $mapfinish = $hash{'map_finish_'.$mainsequence}; - my ($presymb); - if ($symb) { - ($presymb)=split(/___/,$symb); - } else { - $presymb=$mainsequence; - $presymb=~s|^/res/||; - } - $presymb = $presymb.'___'; - my $current_resource = $mapstart; - while ($current_resource ne $mapfinish) { - if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - 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}); + push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$hash{'title_'.$current_resource}.'&&'.$symb; } $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}}; - } + } #needs if final resource in the map (type="finish") contains something - if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - 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}); - } - return @resourcelist; -} - - -sub titles_coming_from_hash { - - my ($mainsequence,$symb) = @_; - my @resourcelist = (); - my $mapid = $hash{'map_pc_'.$mainsequence}; - my $mapstart = $hash{'map_start_'.$mainsequence}; - my $mapfinish = $hash{'map_finish_'.$mainsequence}; - my ($presymb); - if ($symb) { - ($presymb)=split(/___/,$symb); - } else { - $presymb=$mainsequence; - $presymb=~s|^/res/||; - } - $presymb = $presymb.'___'; - my $current_resource = $mapstart; - while ($current_resource ne $mapfinish) { - if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}}; - if ($rid=~/,/) { + if ($hash{'src_'.$current_resource}=~/\.sequence$/) { + push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource}); + } else { + my $presymb; + if ($mainsequence =~ /\/res\/(.*)$/) {$presymb = $1;} + elsif ($mainsequence =~ /\/?(uploaded\/(.*))$/) {$presymb = $1;} + my $rid = $current_resource; + if ($rid=~/,/) { my @rid = split /,/, $rid; foreach my $rid_element (@rid) { if ($rid_element =~ m/^$mapid\.(\d*)/) { @@ -839,41 +778,18 @@ sub titles_coming_from_hash { } } } else { - $rid =~ m/^$mapid\.(\d*)/; + $rid =~ m/^$mapid\.(\d*)/; $rid = $1; } $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/; - $symb = $presymb.$rid.'___'.$1; - push @resourcelist,$hash{'title_'.$current_resource}.'&&'.$symb; - } else { - push @resourcelist,&titles_coming_from_hash($hash{'src_'.$current_resource}); + my $symb = $presymb.'___'.$rid.'___'.$1; + push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$hash{'title_'.$current_resource}.'&&'.$symb; } $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}}; - } - #needs if final resource in the map (type="finish") contains something - if (not $hash{'src_'.$current_resource}=~/\.sequence$/) { - 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{'title_'.$current_resource}.'&&'.$symb; - } else { - push @resourcelist,&titles_coming_from_hash($hash{'src_'.$current_resource}); - } return @resourcelist; } + sub latex_header_footer_remove { my $text = shift; $text =~ s/\\end{document}//; @@ -1284,14 +1200,14 @@ sub page_format_transformation { } else { ($textwidth,$textheight,$oddoffset,$evenoffset) = ($ENV{'form.width'},$ENV{'form.height'},$ENV{'form.leftmargin'},$ENV{'form.leftmargin'}); } - my $firstname = &special_character_corrections(&Apache::lonnet::unescape($ENV{'environment.firstname'})); - my $lastname = &special_character_corrections(&Apache::lonnet::unescape($ENV{'environment.lastname'})); - my $courseidinfo = &special_character_corrections(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'})); + my $firstname = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($ENV{'environment.firstname'}),'','','header'); + my $lastname = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($ENV{'environment.lastname'}),'','','header'); + my $courseidinfo = &Apache::lonxml::latex_special_symbols(&Apache::lonnet::unescape($ENV{'course.'.$ENV{'request.course.id'}.'.description'}),'','','header'); if ($layout eq 'CBI') { $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm} \\begin{document}\\setcounter{page}{1}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$firstname $lastname}} \\hfill $courseidinfo} \\vskip 5 mm /; } elsif ($layout eq 'CAPA') { if ($choice ne 'All class print') { - $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\setlength{\\topmargin}{1cm}\\setlength{\\headheight}{1cm}\\setlength{\\headsep}{0.5cm}\\markboth{}{\\textbf{$firstname $lastname} $courseidinfo - $assignment}\\pagestyle{myheadings}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}/; + $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$firstname $lastname} - $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}/; } else { $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1} \\vskip 5 mm /; } @@ -1339,15 +1255,6 @@ sub details_for_menu { } -sub special_character_corrections { - my $argument = shift; - $argument =~ s/_/ /g; - $argument =~ s/\^/ /g; - $argument =~ s/&/\\&/g; - return $argument; -} - - sub latex_corrections { my ($number_of_columns,$result) = @_; @@ -1386,6 +1293,15 @@ sub handler { my $r = shift; + # not sure where the form.* was getting processed. + Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING}); + + # A hook for me to work without disturbing Alex. + if ($ENV{'form.jeremy'}) { + printWizard($r); + return OK; + } + my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } $loaderror= @@ -1439,6 +1355,69 @@ sub handler { } +use Apache::lonwizard; + +sub printWizard { + my $r = shift; + + if ($ENV{'request.course.id'}) { + my $fn=$ENV{'request.course.fn'}; + tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640); + } + + if ($r->header_only) { + if ($ENV{'browser.mathml'}) { + $r->content_type('text/xml'); + } else { + $r->content_type('text/html'); + } + $r->send_http_header; + return OK; + } + + # Send header, nocache + if ($ENV{'browser.mathml'}) { + $r->content_type('text/xml'); + } else { + $r->content_type('text/html'); + } + &Apache::loncommon::no_cache($r); + $r->send_http_header; + $r->rflush(); + + my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu; + + my $wizard = Apache::lonwizard->new("Printing Wizard"); + # PRINT_TYPE: What the user wants to print (current docs, + # whole sequence, etc. + $wizard->declareVars(['PRINT_TYPE']); + + my $subdir = $ENV{'form.postdata'}; + $subdir =~ s|http://[^/]+||; + $subdir =~ m/\/([^\/]+)$/; + $subdir =~ s/\Q$1\E//; + + # This code also shows up above... which is prefered? Is one + # right for this context? + #my $subdir = &Apache::lonnet::filelocation("",$ENV{'form.url'}); + #$subdir =~ s/\/[^\/]+$//; + + Apache::lonwizard::switch_state->new($wizard, "START", "Selecting Resources to Print", "PRINT_TYPE", [ + ['current_document', "$resourceTitle (exactly what was on the screen)", 'CHOOSE_FORMAT'], + ['map_problems', "Problems from $sequenceTitle", 'CHOOSE_FORMAT'], + ['map_problems_pages', "All of $sequenceTitle", 'CHOOSE_FORMAT'], + ['problems_for_students', "Problems from $sequenceTitle for selected students", 'CHOOSE_FORMAT'], + ['problems_from_directory', "Problems from $subdir", 'CHOOSE_FORMAT'] ], + "What do you want to print?"); + + $r->print($wizard->display()); + + untie %hash; + + return OK; + +} + 1; __END__