--- loncom/interface/lonprintout.pm 2017/12/30 19:51:30 1.660 +++ loncom/interface/lonprintout.pm 2024/11/11 00:43:39 1.703 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.660 2017/12/30 19:51:30 raeburn Exp $ +# $Id: lonprintout.pm,v 1.703 2024/11/11 00:43:39 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -75,7 +75,7 @@ my $font_size = 'normalsize'; # Default #---------------------------- Helper helpers. ------------------------- -## +## # Filter function to determine if a resource is a printable sequence. # # @param $res -Resource to check. @@ -143,12 +143,13 @@ sub printable_sequence { # Parameters: # helper - the helper which already contains info about the current folder we can # purloin. -# url - Top url of the sequence +# map - the map for which incomplete problems are to be printed +# nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps # Return: # XML that can be parsed by the helper to drive the state machine. # sub create_incomplete_folder_selstud_helper { - my ($helper, $map) = @_; + my ($helper, $map, $nocurrloc) = @_; my $symbFilter = '$res->shown_symb()'; @@ -157,13 +158,13 @@ sub create_incomplete_folder_selstud_hel my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', 'Select problem(s) to print', - 'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', + 'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', 'RESOURCES', 'CHOOSE_STUDENTS_INCOMPLETE', $map, $selFilter, '', - $symbFilter, + $symbFilter, ''); my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE', @@ -176,7 +177,7 @@ sub create_incomplete_folder_selstud_hel 'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. return $resource_chooser . $student_chooser . $format_chooser; -} +} # BZ 5209 @@ -196,17 +197,17 @@ sub create_incomplete_folder_selstud_hel # helper - Helper we are creating states for. # Returns: # Text that can be parsed by the helper. -# +# sub create_incomplete_course_helper { my $helper = shift; my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; my $symbfilter = '$res->shown_symb()'; - + my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', 'Select problem(s) to print', - 'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"', + 'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"', 'RESOURCES', 'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', '', @@ -229,12 +230,13 @@ sub create_incomplete_course_helper { } -# BZ5209 +# BZ5209 # Creates the states needed to run the print helper for a student # that wants to print his incomplete problems from the current folder. # Parameters: # $helper - helper we are generating states for. # $map - The map for which the student wants incomplete problems. +# $nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps # Returns: # XML that defines the helper states being created. # @@ -242,7 +244,7 @@ sub create_incomplete_course_helper { # CHOOSE_INCOMPLETE_SEQ - Resource selector. # sub create_incomplete_folder_helper { - my ($helper, $map) = @_; + my ($helper, $map, $nocurrloc) = @_; my $filter = '$res->is_problem()'; $filter .= ' && $res->resprintable() '; @@ -252,11 +254,11 @@ sub create_incomplete_folder_helper { my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', 'Select problem(s) to print', - 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1"', + 'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', 'RESOURCES', 'PAGESIZE', $map, - $filter, '', + $filter, '', $symfilter, ''); @@ -274,9 +276,9 @@ sub create_incomplete_folder_helper { sub generate_student_chooser { - my ($this_state, - $sort_choice, - $variable, + my ($this_state, + $sort_choice, + $variable, $next_state) = @_; my $result = < @@ -288,7 +290,7 @@ sub generate_student_chooser {


- @@ -306,7 +308,8 @@ CHOOSE_STUDENTS # this_state - State name of the chooser. # prompt_text - Text to use to prompt user. # resource_options - Resource tag options e.g. -# "multichoice='1', toponly='1', addstatus='1'" +# "multichoice='1', toponly='1', addstatus='1', +# modallink='1'" # that control the selection and appearance of the # resource selector. # variable - Name of the variable to hold the choice @@ -317,7 +320,7 @@ CHOOSE_STUDENTS # filter - How to filter the resources. # value_func - function. # choice_func - If not empty generates a with this function. -# start_new_option +# start_new_option # - Fragment appended after valuefunc. # # @@ -443,13 +446,141 @@ CHOOSE_ANON1 return $result; } -# Returns the XML for choosing how assignments are to be formatted +sub generate_common_choosers { + my ($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option) = @_; + + my $randomly_ordered_warning = + &get_randomly_ordered_warning($helper, $map); + + # code for a few states used for printout launched from both + # /adm/navmaps and from a resource by a privileged user: + # - To allow resources to be selected for printing. + # - To determine pagination between assignments. + # - To determine how many assignments should be bundled into a single PDF. + + my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', + 'Select resources to print', + 'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', + 'RESOURCES', + 'PRINT_FORMATTING', + $map, + $isProblem, '', $symbFilter, + $start_new_option); + $resource_selector .= &generate_format_selector($helper, + 'How should results be printed?', + 'PRINT_FORMATTING'). + &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', + 'Select Problem(s) to print', + "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", + 'RESOURCES', + 'PRINT_FORMATTING', + $url, + $isProblem, '', $symbFilter, + $start_new_option); + +# Generate student choosers. + + &Apache::lonxml::xmlparse($r, 'helper', + &generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', + 'student_sort', + 'STUDENTS', + 'CHOOSE_STUDENTS_PAGE')); + &Apache::lonxml::xmlparse($r, 'helper', + &generate_student_chooser('CHOOSE_STUDENTS', + 'student_sort', + 'STUDENTS', + 'SELECT_PROBLEMS')); + &Apache::lonxml::xmlparse($r, 'helper', $resource_selector); + + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); + my $namechoice=''; + foreach my $name (sort {uc($a) cmp uc($b)} @names) { + if ($name =~ /^error: 2 /) { next; } + if ($name =~ /^type\0/) { next; } + $namechoice.=''.$name.''; + } + + my %code_values; + my %codes_to_print; + foreach my $key (@names) { + %code_values = &Apache::grades::get_codes($key, $cdom, $cnum); + foreach my $key (keys(%code_values)) { + $codes_to_print{$key} = 1; + } + } + + my $code_selection; + foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { + my $choice = $code; + if ($code =~ /^[A-Z]+$/) { # Alpha code + $choice = &letters_to_num($code); + } + push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); + } + if (%codes_to_print) { + $code_selection .=' + Choose single CODE from list: + + + + + push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); + + + + '.$/; + } + + my @lines = &Apache::lonnet::get_scantronformat_file(); + my $codechoice=''; + foreach my $line (@lines) { + next if (($line =~ /^\#/) || ($line eq '')); + my ($name,$description,$code_type,$code_length)= + (split(/:/,$line))[0,1,2,4]; + if ($code_length > 0 && + $code_type =~/^(letter|number|-1)/) { + $codechoice.=''.$description.''; + } + } + if ($codechoice eq '') { + $codechoice='Default'; + } + my $anon1 = &generate_code_selector($helper, + 'CHOOSE_ANON1', + 'SELECT_PROBLEMS', + $codechoice, + $code_selection, + $namechoice) . $resource_selector; + + &Apache::lonxml::xmlparse($r, 'helper',$anon1); + + my $anon_page = &generate_code_selector($helper, + 'CHOOSE_ANON1_PAGE', + 'SELECT_PROBLEMS_PAGE', + $codechoice, + $code_selection, + $namechoice) . + &generate_resource_chooser('SELECT_PROBLEMS_PAGE', + 'Select Problem(s) to print', + "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", + 'RESOURCES', + 'PRINT_FORMATTING', + $url, + $isProblem, '', $symbFilter, + $start_new_option); + &Apache::lonxml::xmlparse($r, 'helper', $anon_page); + return ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice); +} + +# Returns the XML for choosing how assignments are to be formatted # that text must still be parsed by the helper xml parser. # Parameters: 3 (required) # helper - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used # to check if splitting PDFs by section can be offered. -# title - Title for the current state. +# title - Title for the current state. # this_state - State name of the chooser. sub generate_format_selector { @@ -457,7 +588,9 @@ sub generate_format_selector { my $secpdfoption; unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || - ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_problems_for_anon') || + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) { $secpdfoption = 'Each PDF contains exactly one section'; } return <{NAV_MAP}; # Slightly OO dirty. - # Don't bother looping over undefined or empty parts arraY; + # Don't bother looping over undefined or empty parts array; if (@parts) { foreach my $part (@parts) { @@ -662,7 +795,7 @@ sub map_print_dates { my $navmap = $res->{NAV_MAP}; # slightly OO dirty. - # Don't bother looping over undefined or empty parts arraY; + # Don't bother looping over undefined or empty parts array; if (@parts) { foreach my $part (@parts) { @@ -689,7 +822,7 @@ sub incomplete { my $navmap = Apache::lonnavmaps::navmap->new($username, $domain); - + if (defined($navmap)) { my $res = $navmap->getResourceByUrl($map); @@ -725,7 +858,7 @@ sub incomplete { # Returns: # reference to an array of resources that can be passed to # print_resources. -# +# sub master_seq_to_person_seq { my ($map, $seq, $who, $code, $nohidemap) = @_; @@ -743,7 +876,7 @@ sub master_seq_to_person_seq { if ($nohidemap) { $unhidden = &Apache::lonnet::clutter($map); } - + my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, $code, $unhidden); my ($start,$finish); @@ -763,8 +896,8 @@ sub master_seq_to_person_seq { my $iterator = $navmap->getIterator($start,$finish,{},1); # Iterate on the resource..select the items that are randomly selected - # and that are in the seq_has. Presumably the iterator will take care - # of the random ordering part of the deal. + # and that are in the seq_hash. Presumably the iterator will take care + # of the random ordering part of the deal. # my $curres; while ($curres = $iterator->next()) { @@ -781,7 +914,7 @@ sub master_seq_to_person_seq { } return \@output_seq; # for now. - + } @@ -804,10 +937,10 @@ sub fetch_raw_resource { } return $contents; - + } -# Fetch the annotations associated with a URL and +# Fetch the annotations associated with a URL and # put a centered 'annotations:' title. # This is all suppressed if the annotations are empty. # @@ -840,29 +973,30 @@ sub set_font_size { my ($text) = @_; # There appear to be cases where the font directive is empty.. in which - # case the first substituion would insert a spurious \ oh happy day. + # case the first substitution would insert a spurious \ oh happy day. # as this has been the cause of much mystery and hair pulling _sigh_ if ($font_size ne '') { $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; + $text =~ s/\\end\{document}/}\\end{document}/; + } - $text =~ s/\\end\{document}/}\\end{document}/; return $text; } -# include_pdf - PDF files are included into the +# include_pdf - PDF files are included into the # output as follows: # - The PDF, if necessary, is replicated. # - The PDF is added to the list of files to convert to postscript (along with the images). # - The LaTeX is added to include the final converted postscript in the file as an included -# job. The assumption is that the includedpsheader.ps header will be included. +# job. The assumption is that the includepsheader.ps header will be included. # # Parameters: # pdf_uri - URI of the PDF file to include. -# +# # Returns: # The LaTeX to include. # @@ -882,9 +1016,9 @@ sub include_pdf { $file = &Apache::lonnet::filelocation('',$pdf_uri); } - # The file isn ow replicated locally.. or it did not exist in the first place + # The file is now replicated locally ... or it did not exist in the first place # (unlikely). If it did exist, add the pdf to the set of files/images that - # need tob e converted for this print job: + # need to be converted for this print job: my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; $file =~ s{(.*)/res/}{$londocroot/res/}; @@ -942,7 +1076,7 @@ sub collect_languages { # the number of times requested by the caller. # If we still have a proble, no text is appended to the # output and we set some global variables. -# to indicate to the caller an SSI error occurred. +# to indicate to the caller an SSI error occurred. # All of this is supposed to deal with the issues described # in LonCAPA BZ 5631 see: # http://bugs.lon-capa.org/show_bug.cgi?id=5631 @@ -952,7 +1086,7 @@ sub collect_languages { # resource - The resource to include. This is passed directly, without # interpretation to lonnet::ssi. # form - The form hash parameters that guide the interpretation of the resource -# +# # retries - Number of retries allowed before giving up completely. # Returns: # On success, returns the rendered resource identified by the resource parameter. @@ -1003,12 +1137,12 @@ sub get_student_view_with_retries { # # printf_style_subst item format_string repl -# +# # Does printf style substitution for a format string that # can have %[n]item in it.. wherever, %[n]item occurs, # rep is substituted in format_string. Note that # [n] is an optional integer length. If provided, -# repl is truncated to at most [n] characters prior to +# repl is truncated to at most [n] characters prior to # substitution. # sub printf_style_subst { @@ -1020,15 +1154,15 @@ sub printf_style_subst { my $subst = $repl; if ($size ne "") { $subst = substr($subst, 0, $size); - - # Here's a nice edge case.. supose the end of the - # substring is a \. In that case may have just + + # Here's a nice edge case ... suppose the end of the + # substring is a \. In that case may have just # chopped off a TeX escape... in that case, we append - # " " for the trailing character, and let the field + # " " for the trailing character, and let the field # spill over a bit (sigh). # We don't just chop off the last character in order to deal # with one last pathology, and that would be if substr had - # trimmed us to e.g. \\\ + # trimmed us to e.g. \\\ if ($subst =~ /\\$/) { @@ -1048,8 +1182,8 @@ sub printf_style_subst { } -# Format a header according to a format. -# +# Format a header according to a format. +# # Substitutions: # %a - Assignment name. @@ -1073,7 +1207,7 @@ sub format_page_header { # we assume that each character is about 2mm in width. # (correct for the header text size??). We ignore # any formatting (e.g. boldfacing in this). - # + # # - Allow the student/course to be one line. # but only truncate the course. # - Allow the assignment to be 2 lines (wrapped). @@ -1089,9 +1223,10 @@ sub format_page_header { if ($section) { $format .= ' - Sec: '."%$sec_length".'s'; } + $format .= '\\hfill\\thepage'; $format .= '\\\\%c \\\\ %a'; - + } # An open question is how to handle long user formatted page headers... @@ -1102,12 +1237,12 @@ sub format_page_header { $format = &printf_style_subst("c", $format, $course); $format = &printf_style_subst("n", $format, $student); $format = &printf_style_subst("s", $format, $section); - - + + # If the user put %'s in the format string, they must be escaped # to \% else LaTeX will think they are comments and terminate # the line.. which is bad!!! - + # If the user has role author, $course and $assignment are empty so # there is '\\ \\ ' in the page header. That's cause a error in LaTeX if($format =~ /\\\\\s\\\\\s/) { @@ -1130,7 +1265,7 @@ sub format_page_header { return $format; - + } # @@ -1178,7 +1313,7 @@ sub is_valid_numeric_code { # Remove leading/trailing whitespace; $value =~ s/^\s*//g; $value =~ s/\s*$//g; - + # All digits? if ($value !~ /^[0-9]+$/) { return "Numeric code $value has invalid characters - must only be digits"; @@ -1199,7 +1334,7 @@ sub is_valid_numeric_code { # sub is_valid_alpha_code { my ($value, $num_letters) = @_; - + # strip leading and trailing spaces. $value =~ s/^\s*//g; @@ -1217,7 +1352,7 @@ sub is_valid_alpha_code { # Determine if a code entered by the user in a helper is valid. # valid depends on the code type and the type of code selected. -# The type of code selected can either be numeric or +# The type of code selected can either be numeric or # Alphabetic. If alphabetic, the code, in fact is a simple # substitution cipher for the actual numeric code: 0->A, 1->B ... # We'll be nice and be case insensitive for alpha codes. @@ -1232,8 +1367,9 @@ sub is_valid_alpha_code { sub is_code_valid { my ($code_value, $code_option) = @_; my ($code_type, $code_length) = ('letter', 6); # defaults. - my @lines = &Apache::grades::get_scantronformat_file(); + my @lines = &Apache::lonnet::get_scantronformat_file(); foreach my $line (@lines) { + next if (($line =~ /^\#/) || ($line eq '')); my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; if($name eq $code_option) { $code_length = $length; @@ -1253,7 +1389,7 @@ sub is_code_valid { # # Compare two students by section (Used to sort by section). # -# Implicit inputs, +# Implicit inputs, # $a - The first one # $b - The second one. # @@ -1305,11 +1441,11 @@ sub compare_names { } # Break the tie on the first name, but there are leading (possibly trailing - # whitespaces to get rid of first + # whitespaces to get rid of first) # $f1 =~ s/^\s+//; # Remove leading... $f1 =~ s/\s+$//; # Trailing spaces from first 1... - + $f2 =~ s/^\s+//; $f2 =~ s/\s+$//; # And the same for first 2... @@ -1319,7 +1455,7 @@ sub compare_names { if($f1 gt $f2) { return 1; } - + # Must be the same name. return 0; @@ -1332,13 +1468,13 @@ sub latex_header_footer_remove { return $text; } # -# If necessary, encapsulate text inside +# If necessary, encapsulate text inside # a minipage env. # necessity is determined by the problem_split param. # sub encapsulate_minipage { - my ($text) = @_; - if (!($env{'form.problem.split'} =~ /yes/i)) { + my ($text,$problem_split) = @_; + if (!($problem_split =~ /yes/i)) { $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; } return $text; @@ -1356,7 +1492,7 @@ sub adjust_number_to_print { my $helper = shift; my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'}; - + if ($split_pdf eq 'all') { $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all'; } elsif ($split_pdf eq 'oneper') { @@ -1388,8 +1524,8 @@ sub old_character_chart { $result =~ s/&(\#0?34|quot);/\"/g; $result =~ s/&\#0?35;/\\\#/g; $result =~ s/&\#0?36;/\\\$/g; - $result =~ s/&\#0?37;/\\%/g; - $result =~ s/&(\#0?38|amp);/\\&/g; + $result =~ s/&\#0?37;/\\%/g; + $result =~ s/&(\#0?38|amp);/\\&/g; $result =~ s/&\#(0?39|146);/\'/g; $result =~ s/&\#0?40;/(/g; $result =~ s/&\#0?41;/)/g; @@ -1496,7 +1632,7 @@ sub old_character_chart { $result =~ s/&(\#160|nbsp);/~/g; $result =~ s/&(\#161|iexcl);/!\`/g; $result =~ s/&(\#162|cent);/\\textcent /g; - $result =~ s/&(\#163|pound);/\\pounds /g; + $result =~ s/&(\#163|pound);/\\pounds /g; $result =~ s/&(\#164|curren);/\\textcurrency /g; $result =~ s/&(\#165|yen);/\\textyen /g; $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g; @@ -1522,32 +1658,32 @@ sub old_character_chart { $result =~ s/&(\#188|frac14);/\\textonequarter /g; $result =~ s/&(\#189|frac12);/\\textonehalf /g; $result =~ s/&(\#190|frac34);/\\textthreequarters /g; - $result =~ s/&(\#191|iquest);/?\`/g; - $result =~ s/&(\#192|Agrave);/\\\`{A}/g; - $result =~ s/&(\#193|Aacute);/\\\'{A}/g; + $result =~ s/&(\#191|iquest);/?\`/g; + $result =~ s/&(\#192|Agrave);/\\\`{A}/g; + $result =~ s/&(\#193|Aacute);/\\\'{A}/g; $result =~ s/&(\#194|Acirc);/\\^{A}/g; $result =~ s/&(\#195|Atilde);/\\~{A}/g; - $result =~ s/&(\#196|Auml);/\\\"{A}/g; + $result =~ s/&(\#196|Auml);/\\\"{A}/g; $result =~ s/&(\#197|Aring);/{\\AA}/g; $result =~ s/&(\#198|AElig);/{\\AE}/g; $result =~ s/&(\#199|Ccedil);/\\c{c}/g; - $result =~ s/&(\#200|Egrave);/\\\`{E}/g; - $result =~ s/&(\#201|Eacute);/\\\'{E}/g; + $result =~ s/&(\#200|Egrave);/\\\`{E}/g; + $result =~ s/&(\#201|Eacute);/\\\'{E}/g; $result =~ s/&(\#202|Ecirc);/\\^{E}/g; $result =~ s/&(\#203|Euml);/\\\"{E}/g; $result =~ s/&(\#204|Igrave);/\\\`{I}/g; - $result =~ s/&(\#205|Iacute);/\\\'{I}/g; + $result =~ s/&(\#205|Iacute);/\\\'{I}/g; $result =~ s/&(\#206|Icirc);/\\^{I}/g; - $result =~ s/&(\#207|Iuml);/\\\"{I}/g; + $result =~ s/&(\#207|Iuml);/\\\"{I}/g; $result =~ s/&(\#209|Ntilde);/\\~{N}/g; $result =~ s/&(\#210|Ograve);/\\\`{O}/g; $result =~ s/&(\#211|Oacute);/\\\'{O}/g; $result =~ s/&(\#212|Ocirc);/\\^{O}/g; $result =~ s/&(\#213|Otilde);/\\~{O}/g; - $result =~ s/&(\#214|Ouml);/\\\"{O}/g; + $result =~ s/&(\#214|Ouml);/\\\"{O}/g; $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g; $result =~ s/&(\#216|Oslash);/{\\O}/g; - $result =~ s/&(\#217|Ugrave);/\\\`{U}/g; + $result =~ s/&(\#217|Ugrave);/\\\`{U}/g; $result =~ s/&(\#218|Uacute);/\\\'{U}/g; $result =~ s/&(\#219|Ucirc);/\\^{U}/g; $result =~ s/&(\#220|Uuml);/\\\"{U}/g; @@ -1578,7 +1714,7 @@ sub old_character_chart { $result =~ s/&(\#246|ouml);/\\\"{o}/g; $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g; $result =~ s/&(\#248|oslash);/{\\o}/g; - $result =~ s/&(\#249|ugrave);/\\\`{u}/g; + $result =~ s/&(\#249|ugrave);/\\\`{u}/g; $result =~ s/&(\#250|uacute);/\\\'{u}/g; $result =~ s/&(\#251|ucirc);/\\^{u}/g; $result =~ s/&(\#252|uuml);/\\\"{u}/g; @@ -1725,12 +1861,12 @@ sub old_character_chart { my %page_formats= ('letter' => { 'book' => { - '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'], - '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'] + '1' => [ '7.1 in','9.7 in', '-0.57 in','-0.57 in','0.1 in'], + '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.1 in'] }, 'album' => { - '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','0.394 in'], - '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in'] + '1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','-0.5 in'], + '2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in'] }, }, 'legal' => { @@ -1740,7 +1876,7 @@ my %page_formats= }, 'album' => { '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], - '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in'] + '2' => ['5.7 in','7.1 in','-1 in','-1 in','5 in'] }, }, 'tabloid' => { @@ -1789,8 +1925,8 @@ my %page_formats= '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'] }, 'album' => { - '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'], - '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm'] + '1' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'], + '2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm'] }, }, 'a5' => { @@ -1822,8 +1958,8 @@ sub page_format { # "A2 [420x594 mm]", "A3 [297x420 mm]", # "A4 [210x297 mm]", "A5 [148x210 mm]", # "A6 [105x148 mm]" -# - my ($papersize,$layout,$numberofcolumns) = @_; +# + my ($papersize,$layout,$numberofcolumns) = @_; return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; } @@ -1843,13 +1979,14 @@ sub get_course { if (defined($env{'request.course.id'})) { $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); my $sec = $env{'request.course.sec'}; - + } return $courseidinfo; } sub page_format_transformation { - my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; + my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents, + $indexlist,$selectionmade,$mostrecent) = @_; my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); if ($selectionmade eq '4') { @@ -1863,8 +2000,12 @@ sub page_format_transformation { } ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); - - my $name = &get_name(); + my $name; + if ($mostrecent ne '') { + $name = $mostrecent; + } else { + $name = &get_name(); + } my $courseidinfo = &get_course(); my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, $assignment, @@ -1874,26 +2015,53 @@ sub page_format_transformation { my $fancypagestatement=''; if ($numberofcolumns eq '2') { $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}"; + if ($parmhash{'print_header_format'} eq '') { + $fancypagestatement .= "\\fancyhead[RE]{\\thepage \\\\[\\baselineskip]}"; + } } else { $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; } + $fancypagestatement .= "\\fancyfoot{}"; + my ($paperwidth,$paperheight); if ($layout eq 'album') { $text =~ s/\\begin\{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; + if ($papersize eq 'a4') { + $paperwidth = '29.7cm'; + $paperheight = '21cm'; + } elsif ($numberofcolumns eq '1') { + if ($papersize eq 'letter') { + $paperwidth = '11in'; + $paperheight = '8.5in'; + } elsif ($papersize eq 'legal') { + $paperwidth = '14in'; + $paperheight = '8.5in'; + } + } } elsif ($layout eq 'book') { - if ($choice ne 'All class print') { + if ($choice ne 'All class print') { $text =~ s/\\begin\{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; } else { $text =~ s/\\pagestyle\{fancy}\\rhead\{}\\chead\{}\s*\\begin\{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; } - if ($papersize eq 'a4') { - my $papersize_text; - if ($perm{'pav'}) { - $papersize_text = '\\special{papersize=210mm,297mm}'; - } else { - $papersize_text = '\special{papersize=210mm,297mm}'; - } - $text =~ s/(\\begin\{document})/$1$papersize_text/; - } + if ($papersize eq 'a4') { + $paperwidth = '21cm'; + $paperheight = '29.7cm'; + } elsif ($papersize eq 'letter') { + $paperwidth = '8.5in'; + $paperheight = '11.5in'; + } elsif ($papersize eq 'legal') { + $paperwidth = '8.5in'; + $paperheight = '14.0in'; + } + } + if ($paperwidth ne '' && $paperheight ne '') { + my $papersize_text; + if ($perm{'pav'}) { + $papersize_text = '\\special{papersize='.$paperwidth.','.$paperheight.'}'; + } else { + $papersize_text = '\special{papersize='.$paperwidth.','.$paperheight.'}'; + } + $text =~ s/(\\begin\{document})/$1$papersize_text/; } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} if ($indexlist eq 'yes') { @@ -1906,7 +2074,7 @@ sub page_format_transformation { sub page_cleanup { my $result = shift; - + $result =~ m/\\end\{document}(\d*)$/; my $number_of_columns = $1; my $insert = '{'; @@ -1956,9 +2124,9 @@ sub latex_corrections { $result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; } $result =~ s/\$number_of_columns/$number_of_columns/g; - $result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; + $result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g; $result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g; -#-- LaTeX corrections +#-- LaTeX corrections my $first_comment = index($result,'',$first_comment); @@ -2070,16 +2238,28 @@ sub get_textwidth { sub unsupported { my ($currentURL,$mode,$symb)=@_; + my $cleanURL=&Apache::lonenc::check_decrypt($currentURL); + my $shown = $currentURL; + if (($cleanURL ne $currentURL) || ($symb =~ m{/^enc/})) { + $shown = &mt('URL not shown (encrypted)'); + } if ($mode ne '') {$mode='\\'.$mode} - my $result.= &print_latex_header($mode); - if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { - $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; - $currentURL=~s|^http://https://|https://|; - my $title=&Apache::lonnet::gettitle($symb); - $title = &Apache::lonxml::latex_special_symbols($title); - $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; + my $result = &print_latex_header($mode); + if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) { + $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|; + $cleanURL=~s|^http://https://|https://|; + if ($shown eq $currentURL) { + $shown = &Apache::lonxml::latex_special_symbols($cleanURL); + } + my $title=&Apache::lonnet::gettitle($symb); + $title = &Apache::lonxml::latex_special_symbols($title); + $result.=' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.' '; } else { - $result.=$currentURL; + if ($shown eq $currentURL) { + $result.=&Apache::lonxml::latex_special_symbols($currentURL); + } else { + $result.=$shown; + } } $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; return $result; @@ -2115,21 +2295,14 @@ sub print_page_in_course { $laystyle = &map_laystyle($laystyle); my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, $numberofcolumns); - my $LaTeXwidth=&recalcto_mm($textwidth); - + my $LaTeXwidth=&recalcto_mm($textwidth); if ($mode ne '') {$mode='\\'.$mode} my $result = &print_latex_header($mode); - if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { - $currentURL=~s|^(/adm/wrapper/)?ext/|http://|; - my $title=&Apache::lonnet::gettitle($symb); - $title = &Apache::lonxml::latex_special_symbols($title); - } else { - my $esc_currentURL= $currentURL; - $esc_currentURL =~ s/_/\\_/g; - $result.=$esc_currentURL; - } - $result .= '\\\\'; + + my $title=&Apache::lonnet::gettitle($currentURL); + $title = &Apache::lonxml::latex_special_symbols($title); + $result .= '\noindent\textit{'.$title.'}\\\\'; if ($helper->{'VARS'}->{'style_file'}=~/\w/) { &Apache::lonnet::appenv({'construct.style' => @@ -2138,28 +2311,27 @@ sub print_page_in_course { &Apache::lonnet::delenv('construct.style'); } - # First is the overall page description. This is then followed by the + # First is the overall page description. This is then followed by the # components of the page. Each of which must be printed independently. - my $the_page = shift(@page_resources); + my $the_page = shift(@page_resources); foreach my $resource (@page_resources) { my $resource_src = $resource->src(); # Essentially the URL of the resource. - $result .= $resource->title() . '\\\\'; + my $current_url = $resource->link(); # Recurse if a .page: if ($resource_src =~ /.page$/i) { my $navmap = Apache::lonnavmaps::navmap->new(); my @page_resources = $navmap->retrieveResources($resource_src); - $result .= &print_page_in_course($helper, $rparmhash, + $result .= &print_page_in_course($helper, $rparmhash, $resource_src, \@page_resources); } elsif ($resource->ext()) { - $result .= &unsupported($currentURL,$mode,$symb); - } - # these resources go through the XML transformer: - - elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { + $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb)); + } elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { + # these resources go through the XML transformer: + $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\'; my $urlp = &Apache::lonnet::clutter($resource_src); @@ -2172,9 +2344,9 @@ sub print_page_in_course { $form{'grade_target'} = 'tex'; $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); - $form{'pdfFormFields'} = $pdfFormFields; # - $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; - + $form{'pdfFormFields'} = $pdfFormFields; # + $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -2190,7 +2362,7 @@ sub print_page_in_course { } $form{'rndseed'}=$rndseed; &Apache::lonnet::appenv(\%moreenv); - + &Apache::lonxml::clear_problem_counter(); my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); @@ -2230,11 +2402,6 @@ sub print_page_in_course { } $texversion.='\vskip 1 mm '.$answer.'\end{document}'; } - - - - - } # Print annotations. @@ -2243,7 +2410,7 @@ sub print_page_in_course { my $annotation .= &annotate($currentURL); $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; } - + if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { $texversion=&IndexCreation($texversion,$currentURL); } @@ -2281,7 +2448,7 @@ sub recently_generated { my $pdf_result; opendir(DIR,$prtspool); - my @files = + my @files = grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR)); closedir(DIR); @@ -2361,7 +2528,7 @@ sub get_page_breaks { } return %page_breaks; } -# +# # Returns text to insert for any extra vskip prior to the resource. # Parameters: # helper - Reference to the helper object driving the printout. @@ -2372,7 +2539,7 @@ sub get_page_breaks { # EXTRASPACE has the list of extra space values. # EXTRASPACE_UNITS is the set of resources for which the units are # mm. All others are 'in'. -# +# # The resource is found in the POSSIBLE_RESOURCES to get the index # of the EXTRASPACE value. # @@ -2393,7 +2560,7 @@ sub load_skips { my ($helper) = @_; - # If this is the first time, unrap the resources and extra spaces: + # If this is the first time, unwrap the resources and extra spaces: if (!$skips_loaded) { @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); @@ -2441,7 +2608,7 @@ sub get_extra_vspaces { # The resource chooser part of the helper needs more than just # the value of the extraspaces var to recover the value into a text # field option. This sub produces the required format for the saved var: -# specifically +# specifically # ||| separated fields of the form resourcename=value # # Parameters: @@ -2475,7 +2642,7 @@ sub set_form_extraspace { $env{'form.extraspace'} = $result; $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; return $result; - + } # Output a sequence (recursively if neeed) @@ -2501,11 +2668,11 @@ sub print_construction_sequence { } my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL)); - # + # # These make this all support recursing for subsequences. # my @order = @LONCAPA::map::order; - my @resources = @LONCAPA::map::resources; + my @resources = @LONCAPA::map::resources; for (my $member=0;$member<=$#order;$member++) { $resources[$order[$member]]=~/^([^:]*):([^:]*):/; @@ -2521,7 +2688,7 @@ sub print_construction_sequence { $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); } if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || - ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && ($urlp=~/$LONCAPA::assess_page_re/)) { # Don't permanently modify %$form... my %answerform = %form; @@ -2536,14 +2703,14 @@ sub print_construction_sequence { $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; } else { # If necessary, encapsulate answer in minipage: - + $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); $title = &Apache::lonxml::latex_special_symbols($title); my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body.=&path_to_problem($urlp,$LaTeXwidth); $body.='\vskip 1 mm '.$answer.'\end{document}'; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerform{'problem_split'}); $texversion.=$body; } } @@ -2558,16 +2725,16 @@ sub print_construction_sequence { $result.=$texversion; } elsif ($urlp=~/\.(sequence|page)$/) { - + # header: $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; # IF sequence, recurse: - + if ($urlp =~ /\.sequence$/) { - $result .= &print_construction_sequence($urlp, - $helper, %form, + $result .= &print_construction_sequence($urlp, + $helper, %form, $LaTeXwidth); } } @@ -2582,7 +2749,7 @@ sub print_construction_sequence { if ($member != $#order) { $texversion .= '\\ \cleardoublepage'; } - + $result .= $texversion; } } @@ -2606,6 +2773,7 @@ sub print_construction_sequence { # 6 Print selected problems from a folder. # 7 Print print selected resources from some scope. # 8 Print resources for selected students. +# 9 Print for anonymous CODEs # #BZ 5209 # 2 map_incomplete_problems_seq Print incomplete problems from the current @@ -2643,7 +2811,7 @@ sub output_data { url += 'form=' + formname + '&'; if (only != null) { url += 'only=' + only + '&'; - } + } if (omit != null) { url += 'omit=' + omit + '&'; } @@ -2678,7 +2846,7 @@ ENDPART $env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; &set_form_extraspace($helper); - $env{'form.lastprinttype'} = $print_type; + $env{'form.lastprinttype'} = $print_type; &Apache::loncommon::store_course_settings('print', {'pagebreaks' => 'scalar', 'extraspace' => 'scalar', @@ -2695,13 +2863,13 @@ ENDPART $laystyle = &map_laystyle($laystyle); my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); my $assignment = $env{'form.assignment'}; - my $LaTeXwidth=&recalcto_mm($textwidth); + my $LaTeXwidth=&recalcto_mm($textwidth); my @print_array=(); my @student_names=(); + my $lastprinted; - - # Common settings for the %form has: - # In some cases these settings get overriddent by specific cases, but the + # Common settings for the %form hash: + # In some cases these settings get overridden by specific cases, but the # settings are common enough to make it worthwhile factoring them out # here. # @@ -2711,16 +2879,16 @@ ENDPART $form{'pdfFormFields'} = $pdfFormFields; # If form.showallfoils is set, then request all foils be shown: - # privilege will be enforced both by not allowing the + # privilege will be enforced both by not allowing the # check box selecting this option to be presnt unless it's ok, # and by lonresponse's priv. check. # The if is here because lonresponse.pm only cares that # showallfoils is defined, not what the value is. - if ($helper->{'VARS'}->{'showallfoils'} eq "1") { + if ($helper->{'VARS'}->{'showallfoils'} eq "1") { $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; } - + if ($helper->{'VARS'}->{'style_file'}=~/\w/) { &Apache::lonnet::appenv({'construct.style' => $helper->{'VARS'}->{'style_file'}}); @@ -2773,7 +2941,7 @@ ENDPART $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form); # Add annotations if required: - + &Apache::lonxml::clear_problem_counter(); &Apache::lonnet::delenv('request.filename'); @@ -2816,7 +2984,7 @@ ENDPART - + } # Print annotations. @@ -2842,12 +3010,12 @@ ENDPART && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { $result .= &print_construction_sequence($currentURL, $helper, %form, $LaTeXwidth); - $result .= '\end{document}'; + $result .= '\end{document}'; if (!($result =~ /\\begin\{document\}/)) { $result = &print_latex_header() . $result; } # End construction space sequence. - } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { + } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} if ($currentURL=~/\/ext\.tool$/) {$currentURL=~s/^\/adm\/wrapper//;} @@ -2883,7 +3051,7 @@ ENDPART $result .= &print_page_in_course($helper, $rparmhash, $cleanURL, \@page_resources); - + } else { $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); @@ -2897,7 +3065,7 @@ ENDPART ($print_type eq 'select_sequences') or ($print_type eq 'map_incomplete_problems_seq') ) { - + #-- produce an output string if (($print_type eq 'map_problems') or ($print_type eq 'map_incomplete_problems_seq') or @@ -2907,7 +3075,7 @@ ENDPART ($print_type eq 'map_resources_in_page')) { $selectionmade = 3; - } elsif (($print_type eq 'all_problems') + } elsif (($print_type eq 'all_problems') ) { $selectionmade = 4; } elsif ($print_type eq 'all_resources') { #BUGBUG @@ -2936,7 +3104,6 @@ ENDPART &Apache::lonenc::reset_enc(); - # Note due to document structure, not allowed to put \newpage # prior to the first resource @@ -2973,7 +3140,7 @@ ENDPART $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); if ($urlp=~/\.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;} + 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'; } @@ -3009,7 +3176,7 @@ ENDPART my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body .= &path_to_problem ($urlp,$LaTeXwidth); $body .='\vskip 1 mm '.$answer; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerform{'problem_split'}); $texversion .= $body; } else { $texversion=''; @@ -3036,8 +3203,8 @@ ENDPART $prevassignment=$assignment; my $header_text = $parmhash{'print_header_format'}; $header_text = &format_page_header($textwidth, $header_text, - $assignment, - $courseidinfo, + $assignment, + $courseidinfo, $name); if ($numberofcolumns eq '1') { $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; @@ -3046,8 +3213,8 @@ ENDPART } } $result .= $texversion; - $flag_latex_header_remove = 'YES'; - } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { + $flag_latex_header_remove = 'YES'; + } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;} @@ -3064,7 +3231,7 @@ ENDPART $texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; } $result .= $texversion; - $flag_latex_header_remove = 'YES'; + $flag_latex_header_remove = 'YES'; } elsif ($urlp=~ /\.pdf$/i) { if ($i > 0) { $result .= '\cleardoublepage'; @@ -3095,10 +3262,10 @@ ENDPART $texversion =~ s/\\end\{document}//; } $result .= $texversion; - $flag_latex_header_remove = 'YES'; + $flag_latex_header_remove = 'YES'; } - if (&Apache::loncommon::connection_aborted($r)) { - last; + if (&Apache::loncommon::connection_aborted($r)) { + last; } } &Apache::lonxml::clear_problem_counter(); @@ -3111,19 +3278,23 @@ ENDPART ($print_type eq 'all_problems_students') || ($print_type eq 'resources_for_students') || ($print_type eq 'incomplete_problems_selpeople_course') || - ($print_type eq 'map_incomplete_problems_people_seq')){ + ($print_type eq 'map_incomplete_problems_people_seq') || + ($print_type eq 'select_sequences_problems_for_students') || + ($print_type eq 'select_sequences_resources_for_students')) { - #-- prints assignments for whole class or for selected students + #-- prints assignments for whole class or for selected students my $type; if (($print_type eq 'problems_for_students') || ($print_type eq 'problems_for_students_from_page') || ($print_type eq 'all_problems_students') || ($print_type eq 'incomplete_problems_selpeople_course') || - ($print_type eq 'map_incomplete_problems_people_seq')) { + ($print_type eq 'map_incomplete_problems_people_seq') || + ($print_type eq 'select_sequences_problems_for_students')) { $selectionmade=5; $type='problems'; - } elsif ($print_type eq 'resources_for_students') { + } elsif (($print_type eq 'resources_for_students') || + ($print_type eq 'select_sequences_resources_for_students')) { $selectionmade=8; $type='resources'; } @@ -3133,15 +3304,15 @@ ENDPART # to override this and output the students by name. # Each element of the students array is of the form: # username:domain:section:last, first:status - # - # Note that student sort is not compatible with printing + # + # Note that student sort is not compatible with printing # 1 section per pdf...so that setting overrides. - # - if (($helper->{'VARS'}->{'student_sort'} eq 1) && + # + if (($helper->{'VARS'}->{'student_sort'} eq 1) && ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { @students = sort compare_names @students; } else { - @students = sort compare_sections @students; + @students = sort compare_sections @students; } &adjust_number_to_print($helper); @@ -3149,8 +3320,8 @@ ENDPART $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) { $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; } - # If we are splitting on section boundaries, we need - # to remember that in split_on_sections and + # If we are splitting on section boundaries, we need + # to remember that in split_on_sections and # print all of the students in the list. # my $split_on_sections = 0; @@ -3162,8 +3333,14 @@ ENDPART my $map; if ($helper->{VARS}->{'symb'}) { - ($map, my $id, my $resource) = - &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); + unless ((($print_type eq 'all_problems_students') || + ($print_type eq 'incomplete_problems_selpeople_course')) && + $perm{'pfo'}) { + ($map, my $id, my $resource) = + &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); + } + } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) { + $map = $helper->{'VARS'}->{'SEQUENCE'}; } #loop over students @@ -3217,13 +3394,19 @@ ENDPART # &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname); &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); $flag_latex_header_remove = 'YES'; + if ($printed) { + $lastprinted = $fullname; + } if (&Apache::loncommon::connection_aborted($r)) { last; } } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $result .= $print_array[0].' \end{document}'; } elsif (($print_type eq 'problems_for_anon') || ($print_type eq 'problems_for_anon_page') || - ($print_type eq 'resources_for_anon') ) { + ($print_type eq 'resources_for_anon') || + ($print_type eq 'select_sequences_problems_for_anon') || + ($print_type eq 'select_sequences_resources_for_anon')) { + $selectionmade = 9; my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; @@ -3232,36 +3415,31 @@ ENDPART my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; - my @lines = &Apache::grades::get_scantronformat_file(); + my @lines = &Apache::lonnet::get_scantronformat_file(); my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); foreach my $line (@lines) { - chomp($line); - my ($name,$type,$length,$bubbles_per_item) = + next if (($line =~ /^\#/) || ($line eq '')); + my ($name,$type,$length,$bubbles_per_item) = (split(/:/,$line))[0,2,4,17]; if ($name eq $code_option) { $code_length=$length; if ($type eq 'number') { $code_type = 'number'; } - chomp($bubbles_per_item); + chomp($bubbles_per_item); if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) { - $bubbles_per_row = $bubbles_per_item; + $bubbles_per_row = $bubbles_per_item; } } } - my ($randomorder,$randompick,$map); + my $map; if ($helper->{VARS}{'symb'}) { ($map, my $id, my $resource) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); - my $navmap = Apache::lonnavmaps::navmap->new(); - if (defined($navmap)) { - if ($map) { - my $mapres = $navmap->getResourceByUrl($map); - $randomorder = $mapres->randomorder(); - $randompick = $mapres->randompick(); - } - } + } elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) { + $map = $helper->{'VARS'}->{'SEQUENCE'}; } my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; + $moreenv{'suppress_tries'} = $parmhash{'suppress_tries'}; $moreenv{'instructor_comments'}='hide'; $moreenv{'bubbles_per_row'} = $bubbles_per_row; my $seed=time+($$<<16)+($$); @@ -3313,7 +3491,7 @@ ENDPART || $number_per_page eq 'section') { $number_per_page=$num_todo > 0 ? $num_todo : 1; } - my $flag_latex_header_remove = 'NO'; + my $flag_latex_header_remove = 'NO'; my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo); my $count=0; my $nohidemap; @@ -3322,19 +3500,16 @@ ENDPART } foreach my $code (sort(@allcodes)) { my $file_num=int($count/$number_per_page); - if ($code_type eq 'number') { + if ($code_type eq 'number') { $moreenv{'CODE'}=$code; } else { $moreenv{'CODE'}=&num_to_letters($code); } - my $actual_seq = \@master_seq; - if ($randomorder || $randompick) { - $env{'form.CODE'} = $moreenv{'CODE'}; - $actual_seq = master_seq_to_person_seq($map, \@master_seq, - undef, - $moreenv{'CODE'}, $nohidemap); - delete($env{'form.CODE'}); - } + $env{'form.CODE'} = $moreenv{'CODE'}; + my $actual_seq = master_seq_to_person_seq($map, \@master_seq, + undef, + $moreenv{'CODE'}, $nohidemap); + delete($env{'form.CODE'}); my ($output,$fullname, $printed)= &print_resources($r,$helper,'anonymous',$type,\%moreenv, $actual_seq,$flag_latex_header_remove, @@ -3345,16 +3520,19 @@ ENDPART &mt('last assignment').' '.$fullname); $flag_latex_header_remove = 'YES'; $count++; + if ($printed) { + $lastprinted = $fullname; + } if (&Apache::loncommon::connection_aborted($r)) { last; } } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $result .= $print_array[0].' \end{document}'; - } elsif ($print_type eq 'problems_from_directory') { - #prints selected problems from the subdirectory + } elsif ($print_type eq 'problems_from_directory') { + #prints selected problems from the subdirectory $selectionmade = 6; my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'}; @list_of_files=sort @list_of_files; - my $flag_latex_header_remove = 'NO'; + my $flag_latex_header_remove = 'NO'; my $rndseed=time; if ($helper->{'VARS'}->{'curseed'}) { $rndseed=$helper->{'VARS'}->{'curseed'}; @@ -3410,11 +3588,11 @@ ENDPART } if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /; - + } $result .= $texversion; } - $flag_latex_header_remove = 'YES'; + $flag_latex_header_remove = 'YES'; } if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;} $result .= '\end{document}'; @@ -3424,13 +3602,18 @@ ENDPART # Only post process if that has not been turned off e.g. by a raw latex resource. if ($do_postprocessing) { + my $mostrecent; + if ((($selectionmade == 5) || ($selectionmade == 8) || ($selectionmade == 9)) && + (($numberofcolumns == 1) || ($laystyle eq 'album' && $papersize eq 'a4'))) { + $mostrecent = $lastprinted; + } $result = &page_format_transformation($papersize, $laystyle,$numberofcolumns, $print_type,$result, $helper->{VARS}->{'assignment'}, $helper->{'VARS'}->{'TABLE_CONTENTS'}, $helper->{'VARS'}->{'TABLE_INDEX'}, - $selectionmade); + $selectionmade,$mostrecent); $result = &latex_corrections($number_of_columns,$result,$selectionmade, $helper->{'VARS'}->{'ANSWER_TYPE'}); #if ($numberofcolumns == 1) { @@ -3450,13 +3633,42 @@ ENDPART $URLback=$helper->{'VARS'}->{'filename'}; } elsif ($helper->{VARS}{'symb'}) { my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); + my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; + my ($anchor,$usehttp,$plainurl); $url = &Apache::lonnet::clutter($url); + $plainurl = $url; + if (($ENV{'SERVER_PORT'} == 443) && ($env{'request.course.id'}) && + (($url =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) || + ($url =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}))) { + unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) { + $usehttp = 1; + } + } if ($env{'request.enc'}) { - $url = &Apache::lonenc::encrypted($url); + $url = &Apache::lonenc::encrypted($url); } if ($url ne '') { - $URLback = $url.(($url =~ /\?/) ? '&':'?').'symb='.$helper->{VARS}{'symb'}; + my $symb = $helper->{VARS}{'symb'}; + if ($url =~ m{^\Q/adm/wrapper/ext/\E}) { + my $link = $url; + ($link,$anchor) = ($url =~ /^([^\#]+)(?:|(\#[^\#]+))$/); + if ($anchor) { + ($symb) = ($helper->{VARS}{'symb'} =~ /^([^\#]+)/); + } + $url = $link; + } + $URLback = $url; + if ($usehttp) { + $URLback .= (($URLback =~ /\?/) ? '&':'?').'usehttp=1'; + } + unless ($plainurl =~ /\.page$/) { + $URLback .= (($URLback =~ /\?/) ? '&':'?').'symb='.&escape($symb.$anchor); + } } + } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && + ($env{'request.course.id'})) { + $URLback=$helper->{VARS}->{'postdata'}; } # # Final adjustment of the font size: @@ -3469,18 +3681,18 @@ ENDPART $result = &collect_languages($result); -#-- writing .tex file in prtspool +#-- writing .tex file in prtspool my $temp_file; my $identifier = &Apache::loncommon::get_cgi_id(); my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex"; - if (!($#print_array>0)) { + if (!($#print_array>0)) { unless ($temp_file = Apache::File->new('>'.$filename)) { $r->log_error("Couldn't open $filename for output $!"); - return SERVER_ERROR; + return SERVER_ERROR; } print $temp_file $result; my $begin=index($result,'\begin{document}',0); - my $inc=substr($result,0,$begin+16); + my $inc=substr($result,0,$begin+16); } else { my $begin=index($result,'\begin{document}',0); my $inc=substr($result,0,$begin+16); @@ -3489,11 +3701,11 @@ ENDPART $print_array[$i]=$result; } else { $print_array[$i].='\end{document}'; - $print_array[$i] = + $print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i], - $selectionmade, + $selectionmade, $helper->{'VARS'}->{'ANSWER_TYPE'}); - + my $anobegin=index($print_array[$i],'\setcounter{page}',0); substr($print_array[$i],0,$anobegin)=''; $print_array[$i]=$inc.$print_array[$i]; @@ -3501,11 +3713,11 @@ ENDPART my $temp_file; my $newfilename=$filename; my $num=$i+1; - $newfilename =~s/\.tex$//; + $newfilename =~s/\.tex$//; $newfilename=sprintf("%s_%03d.tex",$newfilename, $num); unless ($temp_file = Apache::File->new('>'.$newfilename)) { $r->log_error("Couldn't open $newfilename for output $!"); - return SERVER_ERROR; + return SERVER_ERROR; } print $temp_file $print_array[$i]; } @@ -3543,8 +3755,8 @@ ENDPART 'cgi.'.$identifier.'.backref' => &escape($URLback),}); &Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, "cgi.$identifier.domain" => $env{'user.domain'}, - "cgi.$identifier.courseid" => $cnum, - "cgi.$identifier.coursedom" => $cdom, + "cgi.$identifier.courseid" => $cnum, + "cgi.$identifier.coursedom" => $cdom, "cgi.$identifier.resources" => $resources_printed}); my $end_page = &Apache::loncommon::end_page(); @@ -3591,7 +3803,7 @@ sub get_CODE { sub print_resources { my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header, $LaTeXwidth)=@_; - my $current_output = ''; + my $current_output = ''; my $printed = ''; my ($username,$userdomain,$usersection) = split /:/,$person; my $fullname = &get_name($username,$userdomain); @@ -3618,20 +3830,20 @@ sub print_resources { my $i = 0; my $actually_printed = 0; # Count of resources printed. - #goes through all resources, checks if they are available for - #current student, and produces output + #goes through all resources, checks if they are available for + #current student, and produces output &Apache::lonxml::clear_problem_counter(); my %page_breaks = &get_page_breaks($helper); my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1]; # - # end each student with a + # end each student with a # Special that allows the post processor to even out the page # counts later. Nasty problem this... it would be really # nice to put the special in as a postscript comment # e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately, # The special gets passed the \ and dvips puts it in the output file - # so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the + # so we will just rely on printout.pl to strip ENDOFSTUDENTSTAMP from the # postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. # @@ -3653,7 +3865,7 @@ sub print_resources { # See if we need to emit a new header: - if ( !($type eq 'problems' && + if ( !($type eq 'problems' && ($curresline!~ m/$LONCAPA::assess_page_re/)) ) { if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) { next; @@ -3664,7 +3876,7 @@ sub print_resources { if ($res_url!~m|^ext/| && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $printed .= $curresline.':'; - &Apache::lonxml::remember_problem_counter(); + &Apache::lonxml::remember_problem_counter(); my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); if ($res_url =~ /\.page$/) { @@ -3696,8 +3908,6 @@ sub print_resources { if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/; } else { - - my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { $header =~ s/\\begin\{document}//; #<<<<< @@ -3707,7 +3917,7 @@ sub print_resources { my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; $body .=&path_to_problem($res_url,$LaTeXwidth); $body .='\vskip 1 mm '.$ansrendered; - $body = &encapsulate_minipage($body); + $body = &encapsulate_minipage($body,$answerenv{'problem_split'}); $rendered = $header.$body; } } @@ -3722,7 +3932,7 @@ sub print_resources { } else { $rendered =~ s/\\end\{document}//; } - $current_output .= $rendered; + $current_output .= $rendered; } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { if ($i == 1) { $syllabus_first = 1; @@ -3740,7 +3950,7 @@ sub print_resources { $rendered =~ s/\\end\{document}//; } $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; - } elsif($res_url = ~/\.pdf$/) { + } elsif($res_url =~ /\.pdf$/) { my $url = &Apache::lonnet::clutter($res_url); my $rendered = &include_pdf($url); if ($remove_latex_header ne 'NO') { @@ -3763,7 +3973,7 @@ sub print_resources { &Apache::lonnet::gettitle($map), 'header'); if (($assignment ne $current_assignment) && ($assignment ne "")) { my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, - $assignment, $courseidinfo, + $assignment, $courseidinfo, $fullname, $usersection); my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; @@ -3796,8 +4006,8 @@ sub print_resources { } elsif ($print_incomplete) { $message = &mt('No incomplete resources'); } - if ($message) { - $current_output = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n"); + if ($message) { + $current_output = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'}); } if ($remove_latex_header eq "NO") { $current_output = &print_latex_header() . $current_output; @@ -3819,7 +4029,7 @@ sub print_resources { $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /; } else { - my $blankpages = + my $blankpages = '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; $current_output = '\strut\vspace*{-6 mm}\\newline'. @@ -3859,32 +4069,30 @@ sub handler { if ($env{'request.course.id'}) { my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my ($blocked,$blocktext) = - &Apache::loncommon::blocking_status('printout',$cnum,$cdom); + my $clientip = &Apache::lonnet::get_requestor_ip($r); + my ($blocked,$blocktext) = + &Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom); if ($blocked) { my $checkrole = "cm./$cdom/$cnum"; if ($env{'request.course.sec'} ne '') { $checkrole .= "/$env{'request.course.sec'}"; } - unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && + unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) { &printing_blocked($r,$blocktext); return OK; } } } - + &init_perm(); my $helper = printHelper($r); if (!ref($helper)) { return $helper; } - - - %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); - + %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); # If a figure conversion queue file exists for this user.domain # we delete it since it can only be bad (if it were good, printout.pl @@ -3894,7 +4102,6 @@ sub handler { if(-e $conversion_queuefile) { unlink $conversion_queuefile; } - &output_data($r,$helper,\%parmhash); return OK; @@ -3940,13 +4147,13 @@ sub get_randomly_ordered_warning { if (defined($navmap)) { my $res = $navmap->getResourceByUrl($map); if ($res) { - my $func = + my $func = sub { return ($_[0]->is_map() && $_[0]->randomorder); }; my @matches = $navmap->retrieveResources($res, $func,1,1,1); } } else { - $message = "Retrieval of information about ordering of resources failed."; + $message = "Retrieval of information about ordering of resources failed."; return ''.$message.''; } return; @@ -3979,12 +4186,12 @@ sub printHelper { # write it by hand Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING}); - + my $helper = Apache::lonhelper::helper->new("Printing Helper"); $helper->declareVar('symb'); - $helper->declareVar('postdata'); - $helper->declareVar('curseed'); - $helper->declareVar('probstatus'); + $helper->declareVar('postdata'); + $helper->declareVar('curseed'); + $helper->declareVar('probstatus'); $helper->declareVar('filename'); $helper->declareVar('construction'); $helper->declareVar('assignment'); @@ -3996,7 +4203,7 @@ sub printHelper { $helper->declareVar("STUDENTS"); $helper->declareVar("EXTRASPACE"); - + # The page breaks and extra spaces @@ -4004,19 +4211,19 @@ sub printHelper { # But we only do this in the initial state so that they are allowed to change. # - + &Apache::loncommon::restore_course_settings('print', {'pagebreaks' => 'scalar', 'extraspace' => 'scalar', 'extraspace_units' => 'scalar', 'lastprinttype' => 'scalar'}); - + # This will persistently load in the data we want from the # very first screen. - + if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { if (!defined ($env{"form.CURRENT_STATE"})) { - + $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; @@ -4038,7 +4245,9 @@ sub printHelper { $helper->{VARS}->{'construction'} = 1; } else { if ($env{'form.postdata'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); + unless ($env{'form.postdata'} eq '/adm/navmaps') { + $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); + } if ( $helper->{VARS}->{'symb'} eq '') { $helper->{VARS}->{'postdata'} = $env{'form.postdata'}; } @@ -4047,30 +4256,51 @@ sub printHelper { $helper->{VARS}->{'symb'} = $env{'form.symb'}; } if ($env{'form.url'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); + unless ($env{'form.url'} eq '/adm/navmaps') { + $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); + } } - - } - - if ($env{'form.symb'}) { - $helper->{VARS}->{'symb'} = $env{'form.symb'}; } - if ($env{'form.url'}) { - $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); + if ($helper->{VARS}->{'symb'} ne '') { + $helper->{VARS}->{'symb'}= + &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); + } + my ($resourceTitle,$sequenceTitle,$mapTitle,$cdom,$cnum); + if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my @toplevelres = $navmap->retrieveResources('',sub { !(($_[0]->is_map()) || ($_[0]->src =~ /^\/adm\/navmaps/)) },0,0); + if (@toplevelres) { + my @printable; + if ($perm{'pav'} || $perm{'pfo'}) { + @printable = @toplevelres; + } else { + @printable = $navmap->retrieveResources(undef,sub { $_[0]->resprintable() },0,1); + } + if (@printable) { + $sequenceTitle = 'Main Content'; + $mapTitle = $sequenceTitle; + } + } + } + } + } else { + ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); } - $helper->{VARS}->{'symb'}= - &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); - my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} - # Extract map my $symb = $helper->{VARS}->{'symb'}; my ($map, $id, $url); my $subdir; my $is_published=0; # True when printing from resource space. - my $res_printable = 1; # By default the current resource is printable. + my $res_printable = 1; # By default the current resource is printable. + my $res_error; my $userCanPrint = ($perm{'pav'} || $perm{'pfo'}); my $res_printstartdate; my $res_printenddate; @@ -4081,7 +4311,7 @@ sub printHelper { # Get the resource name from construction space if ($helper->{VARS}->{'construction'}) { - $resourceTitle = substr($helper->{VARS}->{'filename'}, + $resourceTitle = substr($helper->{VARS}->{'filename'}, rindex($helper->{VARS}->{'filename'}, '/')+1); $subdir = substr($helper->{VARS}->{'filename'}, 0, rindex($helper->{VARS}->{'filename'}, '/') + 1); @@ -4090,15 +4320,38 @@ sub printHelper { if ($symb ne '') { ($map, $id, $url) = &Apache::lonnet::decode_symb($symb); - $helper->{VARS}->{'postdata'} = + $helper->{VARS}->{'postdata'} = &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); - my $navmap = Apache::lonnavmaps::navmap->new(); - my $res = $navmap->getBySymb($symb); - $res_printable = $res->resprintable() || $userCanPrint; #printability in course context - ($res_printstartdate, $res_printenddate) = &get_print_dates($res); - ($course_open, $course_close) = &course_print_dates($res); - ($map_open, $map_close) = &map_print_dates($res); - + } elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && + ($env{'request.course.id'} ne '')) { + if ($env{'course.'.$env{'request.course.id'}.'.url'} eq + "uploaded/$cdom/$cnum/default.sequence") { + $map = $env{'course.'.$env{'request.course.id'}.'.url'}; + $url = $helper->{VARS}->{'postdata'}; + } + } + if (($symb ne '') || ($map ne '')) { + if (!$userCanPrint) { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my $res; + if ($symb ne '') { + $res = $navmap->getBySymb($symb); + } elsif ($map ne '') { + $res = $navmap->getResourceByUrl($map); + } + if (ref($res)) { + $res_printable = $res->resprintable(); #printability in course context + ($res_printstartdate, $res_printenddate) = &get_print_dates($res); + ($course_open, $course_close) = &course_print_dates($res); + ($map_open, $map_close) = &map_print_dates($res); + } else { + $res_error = 1; + } + } else { + $res_error = 1; + } + } } else { # Resource space. @@ -4110,7 +4363,11 @@ sub printHelper { my $postdata = $helper->{VARS}->{'postdata'}; $resourceTitle = substr($postdata, rindex($postdata, '/') + 1); } - $subdir = &Apache::lonnet::filelocation("", $url); + if (($url eq '/adm/navmaps') && ($map eq $env{'course.'.$env{'request.course.id'}.'.url'})) { + $res_printable=0; + } else { + $subdir = &Apache::lonnet::filelocation("", $url); + } } @@ -4148,7 +4405,7 @@ sub printHelper { if ($resourceTitle && $res_printable) { push @{$printChoices}, ["$resourceTitle (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; - } + } # Useful filter strings @@ -4173,7 +4430,7 @@ sub printHelper { my $start_new_option; if ($perm{'pav'}) { - $start_new_option = + $start_new_option = "