version 1.568.2.10, 2010/11/13 01:57:14
|
version 1.686, 2023/01/17 17:38:20
|
Line 1
|
Line 1
|
# |
|
# The LearningOnline Network |
# The LearningOnline Network |
# Printout |
# Printout |
# |
# |
Line 41 use Apache::admannotations;
|
Line 40 use Apache::admannotations;
|
use Apache::lonenc; |
use Apache::lonenc; |
use Apache::entities; |
use Apache::entities; |
use Apache::londefdef; |
use Apache::londefdef; |
|
# use Apache::structurelags; # for language management. |
|
|
use File::Basename; |
use File::Basename; |
|
|
use HTTP::Response; |
use HTTP::Response; |
|
|
use LONCAPA::map(); |
use LONCAPA::map(); |
use POSIX qw(strftime); |
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Carp; |
use Carp; |
use LONCAPA; |
use LONCAPA; |
|
|
|
|
my %perm; |
my %perm; |
my %parmhash; |
my %parmhash; |
my $resources_printed; |
my $resources_printed; |
Line 76 my $font_size = 'normalsize'; # Default
|
Line 75 my $font_size = 'normalsize'; # Default
|
|
|
#---------------------------- Helper helpers. ------------------------- |
#---------------------------- Helper helpers. ------------------------- |
|
|
# Returns the text needd for a student chooser. |
## |
|
# Filter function to determine if a resource is a printable sequence. |
|
# |
|
# @param $res -Resource to check. |
|
# |
|
# @return 1 - printable and a resource |
|
# 0 - either notm a sequence or not printable. |
|
# |
|
sub printable_sequence { |
|
my $res = shift; |
|
|
|
# Non-sequences are not listed: |
|
|
|
if (!$res->is_sequence()) { |
|
return 0; |
|
} |
|
|
|
# Person with pav or pfo can always print: |
|
|
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
return 1; |
|
} |
|
|
|
if ($res->is_sequence()) { |
|
my $symb = $res->symb(); |
|
my $navmap = $res->{NAV_MAP}; |
|
|
|
# Find the first resource in the map: |
|
|
|
my $iterator = $navmap->getIterator($res, undef, undef, 1, 1); |
|
my $first = $iterator->next(); |
|
|
|
while (1) { |
|
if ($first == $iterator->END_ITERATOR) { last; } |
|
if (ref($first) && ! $first->is_sequence()) {last; } |
|
$first = $iterator->next(); |
|
} |
|
|
|
|
|
# Might be an empty map: |
|
|
|
if (!ref($first)) { |
|
return 0; |
|
} |
|
my $partsref = $first->parts(); |
|
my @parts = @$partsref; |
|
my ($open, $close) = $navmap->map_printdates($first, $parts[0]); |
|
return &printable($open, $close); |
|
} |
|
return 0; |
|
} |
|
|
|
# BZ5209: |
|
# Create the states needed to run the helper for incomplete problems from |
|
# the current folder for selected students. |
|
# This includes: |
|
# - A resource selector limited to problems (incompleteness must be |
|
# calculated on a student per student basis. |
|
# - A student selector. |
|
# - Tie in to the FORMAT of the print job. |
|
# |
|
# States: |
|
# CHOOSE_INCOMPLETE_PEOPLE_SEQ - Resource selection. |
|
# CHOOSE_STUDENTS_INCOMPLETE - Student selection. |
|
# CHOOSE_STUDENTS_INCOMPLETE_FORMAT - Format selection |
|
# Parameters: |
|
# helper - the helper which already contains info about the current folder we can |
|
# purloin. |
|
# 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, $nocurrloc) = @_; |
|
|
|
|
|
my $symbFilter = '$res->shown_symb()'; |
|
my $selFilter = '$res->is_problem()'; |
|
|
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', |
|
'Select problem(s) to print', |
|
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
|
'RESOURCES', |
|
'CHOOSE_STUDENTS_INCOMPLETE', |
|
$map, |
|
$selFilter, |
|
'', |
|
$symbFilter, |
|
''); |
|
|
|
my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE', |
|
'student_sort', |
|
'STUDENTS', |
|
'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); |
|
|
|
my $format_chooser = &generate_format_selector($helper, |
|
'Format of the print job', |
|
'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. |
|
|
|
return $resource_chooser . $student_chooser . $format_chooser; |
|
} |
|
|
|
|
|
# BZ 5209 |
|
# Create the states needed to run the helper for incomplete problems from |
|
# the current folder for selected students. |
|
# This includes: |
|
# - A resource selector limited to problems. (incompleteness must be calculated |
|
# on a student per student basis. |
|
# - A student selector. |
|
# - Tie in to format for the print job. |
|
# States: |
|
# INCOMPLETE_PROBLEMS_COURSE_RESOURCES - Resource selector. |
|
# INCOMPLETE_PROBLEMS_COURSE_STUDENTS - Student selector. |
|
# INCOMPLETE_PROBLEMS_COURSE_FORMAT - Format selection. |
|
# |
|
# Parameters: |
|
# 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" modallink="1"', |
|
'RESOURCES', |
|
'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
|
'', |
|
$filter, |
|
'', |
|
$symbfilter, |
|
''); |
|
|
|
my $people_chooser = &generate_student_chooser('INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
|
'student_sort', |
|
'STUDENTS', |
|
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); |
|
|
|
my $format = &generate_format_selector($helper, |
|
'Format of the print job', |
|
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); # end state. |
|
|
|
return $resource_chooser . $people_chooser . $format; |
|
|
|
|
|
} |
|
|
|
# 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. |
|
# |
|
# States: |
|
# CHOOSE_INCOMPLETE_SEQ - Resource selector. |
|
# |
|
sub create_incomplete_folder_helper { |
|
my ($helper, $map, $nocurrloc) = @_; |
|
|
|
my $filter = '$res->is_problem()'; |
|
$filter .= ' && $res->resprintable() '; |
|
$filter .= ' && $res->is_incomplete() '; |
|
|
|
my $symfilter = '$res->shown_symb()'; |
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', |
|
'Select problem(s) to print', |
|
'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$map, |
|
$filter, '', |
|
$symfilter, |
|
''); |
|
|
|
return $resource_chooser; |
|
} |
|
|
|
|
|
# Returns the text neded for a student chooser. |
# that text must still be parsed by the helper xml parser. |
# that text must still be parsed by the helper xml parser. |
# Parameters: |
# Parameters: |
# this_state - State name of the chooser. |
# this_state - State name of the chooser. |
Line 118 CHOOSE_STUDENTS
|
Line 308 CHOOSE_STUDENTS
|
# this_state - State name of the chooser. |
# this_state - State name of the chooser. |
# prompt_text - Text to use to prompt user. |
# prompt_text - Text to use to prompt user. |
# resource_options - Resource tag options e.g. |
# 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 |
# that control the selection and appearance of the |
# resource selector. |
# resource selector. |
# variable - Name of the variable to hold the choice |
# variable - Name of the variable to hold the choice |
Line 164 CHOOSE_RESOURCES
|
Line 355 CHOOSE_RESOURCES
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_RESOURCES |
CHOOSE_RESOURCES |
|
|
return $result; |
return $result; |
} |
} |
# |
# |
Line 196 sub generate_code_selector {
|
Line 386 sub generate_code_selector {
|
<message><br /><hr /> <br /></message> |
<message><br /><hr /> <br /></message> |
<message><h3>Generate new CODEd Assignments</h3></message> |
<message><h3>Generate new CODEd Assignments</h3></message> |
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5" noproceed="1"> |
<validator> |
<validator> |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'} ) { |
|
|
return "You need to specify the number of assignments to print"; |
return "You need to specify the number of assignments to print"; |
} |
} |
|
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) >= 1) && |
|
(\$helper->{'VARS'}{'SINGLE_CODE'} ne '') ) { |
|
return 'Specifying number of codes to print and a specific code is not compatible'; |
|
} |
return undef; |
return undef; |
</validator> |
</validator> |
</string> |
</string> |
Line 212 sub generate_code_selector {
|
Line 407 sub generate_code_selector {
|
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Bubble sheet type:</b></message> |
<message><b>Bubblesheet type:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$bubble_types |
$bubble_types |
Line 228 sub generate_code_selector {
|
Line 423 sub generate_code_selector {
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
\$helper->{'VARS'}{'CODE_OPTION'}); |
\$helper->{'VARS'}{'CODE_OPTION'}); |
|
} elsif (\$helper->{'VARS'}{'SINGLE_CODE'} ne ''){ |
|
return 'Specifying a code name is incompatible with specifying number of codes.'; |
} else { |
} else { |
return undef; # Other forces control us. |
return undef; # Other forces control us. |
} |
} |
Line 249 CHOOSE_ANON1
|
Line 446 CHOOSE_ANON1
|
return $result; |
return $result; |
} |
} |
|
|
|
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/navmpas 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='<choice></choice>'; |
|
foreach my $name (sort {uc($a) cmp uc($b)} @names) { |
|
if ($name =~ /^error: 2 /) { next; } |
|
if ($name =~ /^type\0/) { next; } |
|
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
|
} |
|
|
|
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 .=' |
|
<message><b>Choose single CODE from list:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
<choice></choice> |
|
<exec> |
|
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
|
</exec> |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
|
'.$/; |
|
} |
|
|
|
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.='<choice computer="'.$name.'">'.$description.'</choice>'; |
|
} |
|
} |
|
if ($codechoice eq '') { |
|
$codechoice='<choice computer="default">Default</choice>'; |
|
} |
|
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. |
|
# this_state - State name of the chooser. |
|
|
|
sub generate_format_selector { |
|
my ($helper,$title,$this_state) = @_; |
|
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 'select_sequences_problems_for_anon') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) { |
|
$secpdfoption = '<choice computer="sections">Each PDF contains exactly one section</choice>'; |
|
} |
|
return <<RESOURCE_SELECTOR; |
|
<state name="$this_state" title="$title"> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
$secpdfoption |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
|
} |
|
|
#----------------------------------------------------------------------- |
#----------------------------------------------------------------------- |
|
|
|
# Computes an open and close date from a list of open/close dates for a resource's |
|
# parts. |
|
# |
|
# @param \@opens - reference to an array of open dates. |
|
# @param \@closes - reference to an array of close dates. |
|
# |
|
# @return ($open, $close) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# |
|
sub compute_open_window { |
|
my ($opensref, $closesref) = @_; |
|
|
|
my @opens = @$opensref; |
|
my @closes = @$closesref; |
|
|
|
# latest open date: |
|
my $latest_open; |
|
|
|
foreach my $open (@opens) { |
|
if (!defined($latest_open) || ($open > $latest_open)) { |
|
$latest_open = $open; |
|
} |
|
} |
|
# Earliest close: |
|
|
|
my $earliest_close; |
|
foreach my $close (@closes) { |
|
if (!defined($earliest_close) || ($close < $earliest_close)) { |
|
$earliest_close = $close; |
|
} |
|
} |
|
|
|
# If no overlap...both are -1 as promised. |
|
|
|
if (($earliest_close ne '') && ($latest_open ne '') |
|
&& ($earliest_close < $latest_open)) { |
|
$latest_open = -1; |
|
$earliest_close = -1; |
|
} |
|
|
|
return ($latest_open, $earliest_close); |
|
|
|
} |
|
|
|
## |
|
# Determines if 'now' is within the set of printable dates. |
|
# |
|
# @param $open_date - Starting date/timestamp. |
|
# @param $close_date - Ending date/timestamp. |
|
# |
|
# @return 0 - Not open. |
|
# @return 1 - open. |
|
# |
|
sub printable { |
|
my ($open_date, $close_date) = @_; |
|
|
|
|
|
my $now = time(); |
|
|
|
# Have to do a bit of fancy footwork around undefined open/close dates: |
|
|
|
if ($open_date && ($open_date > $now)) { |
|
return 0; |
|
} |
|
|
|
if ($close_date && ($close_date < $now)) { |
|
return 0; |
|
} |
|
|
|
return 1; |
|
|
|
} |
|
|
|
## |
|
# Returns the innermost print start/print end dates for a resource. |
|
# This is done by looking at the start/end dates for its parts and choosing |
|
# the intersection of those dates. |
|
# |
|
# @param res - lonnvamaps::resource object that represents the resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# For consistency with &printable() in lonnavmaps.pm determination of start |
|
# date for printing checks printstartdate param first, then, if not set, |
|
# opendate param, then, if not set, contentopen param. |
|
|
|
sub get_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts; |
|
if (ref($partsref) eq 'ARRAY') { |
|
@parts = @{$partsref}; |
|
} |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
|
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my $partopen = $res->parmval('printstartdate', $part); |
|
my $partclose = $res->parmval('printenddate', $part); |
|
if (!$partopen) { |
|
$partopen = $res->parmval('opendate',$part); |
|
} |
|
if (!$partopen) { |
|
$partopen = $res->parmval('contentopen',$part); |
|
} |
|
if ($partopen) { |
|
push(@open_dates, $partopen); |
|
} |
|
if ($partclose) { |
|
push(@close_dates, $partclose); |
|
} |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
} |
|
|
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
|
|
return ($open_date, $close_date); |
|
} |
|
|
|
## |
|
# Get the dates for which a course says a resource can be printed. This is like |
|
# get_print_dates but namvaps::course_print_dates are gotten...and not converted |
|
# to times either. |
|
# |
|
# @param $res - Reference to a resource has from lonnvampas::resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
sub course_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # Slightly OO dirty. |
|
|
|
# Don't bother looping over undefined or empty parts arraY; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->course_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
## |
|
# Same as above but for the enclosing map: |
|
# |
|
sub map_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # slightly OO dirty. |
|
|
|
|
|
# Don't bother looping over undefined or empty parts arraY; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->map_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
|
|
# Determine if a resource is incomplete given the map: |
|
# Parameters: |
|
# $username - Name of user for whom we are checking. |
|
# $domain - Domain of user we are checking. |
|
# $map - map name. |
|
# Returns: |
|
# 0 - map is not incomplete. |
|
# 1 - map is incomplete. |
|
# |
|
sub incomplete { |
|
my ($username, $domain, $map) = @_; |
|
|
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $domain); |
|
|
|
|
|
if (defined($navmap)) { |
|
my $res = $navmap->getResourceByUrl($map); |
|
my $result = $res->is_incomplete(); |
|
return $result; |
|
} else { |
|
return 1; |
|
} |
|
} |
|
# |
|
# When printing for students, the resources and order of the |
|
# resources may need to be altered if there are folders with |
|
# random selectiopn or random ordering (or both) enabled. |
|
# This sub computes the set of resources to print for a student |
|
# modified both by random ordering and selection and filtered |
|
# to only those that are in the original set selected to be printed. |
|
# |
|
# Parameters: |
|
# $map - The URL of the folder being printed. |
|
# Used to determine which startResource and finishResource |
|
# to use when using the navmap's getIterator method. |
|
# $seq - The original set of resources to print. |
|
# (really an array of resource names (array of symb's). |
|
# $who - Student/domain for whome the sequence will be generated. |
|
# $code - CODE being printed when printing Problems/Resources |
|
# from folder for CODEd assignments |
|
# $nohidemap - If true, parameter in map for hiddenresource will be |
|
# ignored. The user calling the routine should have |
|
# both the pav and vgr privileges if this is set to true). |
|
# |
|
# Implicit inputs: |
|
# $ |
|
# 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) = @_; |
|
|
|
|
|
my ($username, $userdomain, $usersection) = split(/:/, $who); |
|
|
|
# Toss the sequence up into a hash so that we have O(1) lookup time. |
|
# on the items that come out of the user's list of resources. |
|
# |
|
|
|
my %seq_hash = map {$_ => 1} @$seq; |
|
my @output_seq; |
|
|
|
my $unhidden; |
|
if ($nohidemap) { |
|
$unhidden = &Apache::lonnet::clutter($map); |
|
} |
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, |
|
$code, $unhidden); |
|
my ($start,$finish); |
|
|
|
if ($map) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
if ($mapres->is_map()) { |
|
$start = $mapres->map_start(); |
|
$finish = $mapres->map_finish(); |
|
} |
|
} |
|
unless ($start && $finish) { |
|
$start = $navmap->firstResource(); |
|
$finish = $navmap->finishResource(); |
|
} |
|
|
|
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. |
|
# |
|
my $curres; |
|
while ($curres = $iterator->next()) { |
|
# |
|
# Only process resources..that are not removed by randomout... |
|
# and are selected for printint as well. |
|
# |
|
if (ref($curres) && ! $curres->randomout()) { |
|
my $currsymb = $curres->symb(); |
|
if (exists($seq_hash{$currsymb})) { |
|
push(@output_seq, $currsymb); |
|
} |
|
} |
|
} |
|
|
|
return \@output_seq; # for now. |
|
|
|
} |
|
|
|
|
# Fetch the contents of a resource, uninterpreted. |
# Fetch the contents of a resource, uninterpreted. |
# This is used here to fetch a latex file to be included |
# This is used here to fetch a latex file to be included |
Line 312 sub set_font_size {
|
Line 978 sub set_font_size {
|
|
|
if ($font_size ne '') { |
if ($font_size ne '') { |
|
|
$text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; |
$text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; |
|
$text =~ s/\\end\{document}/}\\end{document}/; |
|
|
} |
} |
$text =~ s/\\end{document}/}\\end{document}/; |
|
return $text; |
return $text; |
|
|
|
|
} |
} |
|
|
# include_pdf - PDF files are included into the |
# include_pdf - PDF files are included into the |
Line 351 sub include_pdf {
|
Line 1020 sub include_pdf {
|
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# need tob e converted for this print job: |
# need tob e converted for this print job: |
|
|
$file =~ s|(.*)/res/|/home/httpd/html/res/|; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$file =~ s{(.*)/res/}{$londocroot/res/}; |
|
|
open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
print FILE ("$file\n"); |
print FILE ("$file\n"); |
close (FILE); |
close (FILE); |
|
|
Line 376 sub include_pdf {
|
Line 1046 sub include_pdf {
|
|
|
|
|
} |
} |
|
## |
|
# Collect the various \select_language{language_name} |
|
# latex tags to build a \usepackage[lang-list]{babel} which will |
|
# appear just prior to the \begin{document} at the front of the concatenated |
|
# set of resources: |
|
# @param doc - The string of latex to search/replace. |
|
# @return string |
|
# @retval - the modified document stringt. |
|
# |
|
sub collect_languages { |
|
my $doc = shift; |
|
my %languages; |
|
while ($doc =~ /\\selectlanguage\{(\w+)}/mg) { |
|
$languages{$1} = 1; # allows us to request each language exactly once. |
|
} |
|
my @lang_list = (keys(%languages)); # List of unique languages |
|
if (scalar @lang_list) { |
|
my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n"; |
|
$doc =~ s/\\begin\{document}/$babel_header\\begin{document}/; |
|
} |
|
return $doc; |
|
} |
|
#------------------------------------------------------------------- |
|
|
# |
# |
# ssi_with_retries- Does the server side include of a resource. |
# ssi_with_retries- Does the server side include of a resource. |
Line 423 sub ssi_with_retries {
|
Line 1115 sub ssi_with_retries {
|
$ssi_last_error_resource = $resource; |
$ssi_last_error_resource = $resource; |
$ssi_last_error = $response->code . " " . $response->message; |
$ssi_last_error = $response->code . " " . $response->message; |
$content='\section*{!!! An error occurred !!!}'; |
$content='\section*{!!! An error occurred !!!}'; |
&Apache::lonnet::logthis("Error in SSI resource: $resource Error: $ssi_last_error"); |
|
} |
} |
|
|
return $content; |
return $content; |
Line 439 sub get_student_view_with_retries {
|
Line 1130 sub get_student_view_with_retries {
|
$ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain; |
$ssi_last_error_resource = $curresline.' for user '.$username.':'.$userdomain; |
$ssi_last_error = $response->code . " " . $response->message; |
$ssi_last_error = $response->code . " " . $response->message; |
$content='\section*{!!! An error occurred !!!}'; |
$content='\section*{!!! An error occurred !!!}'; |
&Apache::lonnet::logthis("Error in SSI (student view) resource: $curresline Error: $ssi_last_error User: $username:$userdomain"); |
|
} |
} |
return $content; |
return $content; |
|
|
Line 499 sub printf_style_subst {
|
Line 1189 sub printf_style_subst {
|
# %a - Assignment name. |
# %a - Assignment name. |
# %c - Course name. |
# %c - Course name. |
# %n - Student name. |
# %n - Student name. |
|
# %s - The section if it is supplied. |
# |
# |
sub format_page_header { |
sub format_page_header { |
my ($width, $format, $assignment, $course, $student) = @_; |
my ($width, $format, $assignment, $course, $student, $section) = @_; |
|
|
|
|
|
|
$width = &recalcto_mm($width); # Get width in mm. |
$width = &recalcto_mm($width); # Get width in mm. |
my $chars_per_line = int($width/2); # Character/textline. |
my $chars_per_line = int($width/1.6); # Character/textline. |
|
|
# Default format? |
# Default format? |
|
|
Line 520 sub format_page_header {
|
Line 1213 sub format_page_header {
|
# - Allow the assignment to be 2 lines (wrapped). |
# - Allow the assignment to be 2 lines (wrapped). |
# |
# |
|
|
my $firstline = "$student $course"; |
|
if (length($firstline) > $chars_per_line) { |
|
my $lastchar = $chars_per_line - length($student) - 1; |
|
if ($lastchar > 0) { |
|
$course = substr($course, 0, $lastchar); |
|
} else { # Nothing left of course: |
|
$course = ''; |
|
} |
|
} |
|
if (length($assignment) > $chars_per_line) { |
|
$assignment = substr($assignment, 0, $chars_per_line); |
|
} |
|
|
|
$format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; |
my $name_length = int($chars_per_line *3 /4); |
|
my $sec_length = int($chars_per_line / 5); |
|
|
|
$format = "%$name_length".'n'; |
|
|
|
if ($section) { |
|
$format .= ' - Sec: '."%$sec_length".'s'; |
|
} |
|
|
|
$format .= '\\\\%c \\\\ %a'; |
|
|
|
|
} else { |
|
# An open question is how to handle long user formatted page headers... |
|
# A possible future is to support e.g. %na so that the user can control |
|
# the truncation of the elements that can appear in the header. |
|
# |
|
$format = &printf_style_subst("a", $format, $assignment); |
|
$format = &printf_style_subst("c", $format, $course); |
|
$format = &printf_style_subst("n", $format, $student); |
|
|
|
# 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!!! |
|
} |
} |
|
# An open question is how to handle long user formatted page headers... |
|
# A possible future is to support e.g. %na so that the user can control |
|
# the truncation of the elements that can appear in the header. |
|
# |
|
$format = &printf_style_subst("a", $format, $assignment); |
|
$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/) { |
|
#TODO find sensible caption for page header |
|
my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout '); |
|
$format =~ s/\\\\\s\\\\\s/$testPrintout/; |
|
} |
|
# |
|
# We're going to trust LaTeX to break lines appropriately, but |
|
# we'll truncate anything that's more than 3 lines worth of |
|
# text. This is also assuming (which will probably end badly) |
|
# nobody's going to embed LaTeX control sequences in the title |
|
# header or rather that those control sequences won't get broken |
|
# by the stuff below. |
|
# |
|
my $total_length = 3*$chars_per_line; |
|
if (length($format) > $total_length) { |
|
$format = substr($format, 0, $total_length); |
|
} |
|
|
|
|
return $format; |
return $format; |
|
|
} |
} |
|
|
# |
# |
Line 651 sub is_valid_alpha_code {
|
Line 1366 sub is_valid_alpha_code {
|
sub is_code_valid { |
sub is_code_valid { |
my ($code_value, $code_option) = @_; |
my ($code_value, $code_option) = @_; |
my ($code_type, $code_length) = ('letter', 6); # defaults. |
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) { |
foreach my $line (@lines) { |
|
next if (($line =~ /^\#/) || ($line eq '')); |
my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; |
my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; |
if($name eq $code_option) { |
if($name eq $code_option) { |
$code_length = $length; |
$code_length = $length; |
Line 669 sub is_code_valid {
|
Line 1385 sub is_code_valid {
|
} |
} |
|
|
} |
} |
|
# |
|
# Compare two students by section (Used to sort by section). |
|
# |
|
# Implicit inputs, |
|
# $a - The first one |
|
# $b - The second one. |
|
# |
|
# Returns: |
|
# a-section cmp b-section |
|
# |
|
sub compare_sections { |
|
my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a); |
|
my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b); |
|
|
|
return $s1 cmp $s2; |
|
} |
|
|
# Compare two students by name. The students are in the form |
# Compare two students by name. The students are in the form |
# returned by the helper: |
# returned by the helper: |
Line 730 sub compare_names {
|
Line 1462 sub compare_names {
|
|
|
sub latex_header_footer_remove { |
sub latex_header_footer_remove { |
my $text = shift; |
my $text = shift; |
$text =~ s/\\end{document}//; |
$text =~ s/\\end\{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin\{document}//; |
return $text; |
return $text; |
} |
} |
# |
# |
Line 740 sub latex_header_footer_remove {
|
Line 1472 sub latex_header_footer_remove {
|
# necessity is determined by the problem_split param. |
# necessity is determined by the problem_split param. |
# |
# |
sub encapsulate_minipage { |
sub encapsulate_minipage { |
my ($text) = @_; |
my ($text,$problem_split) = @_; |
if (!($env{'form.problem.split'} =~ /yes/i)) { |
if (!($problem_split =~ /yes/i)) { |
$text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; |
$text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; |
} |
} |
return $text; |
return $text; |
Line 1245 sub get_course {
|
Line 1977 sub get_course {
|
my $courseidinfo; |
my $courseidinfo; |
if (defined($env{'request.course.id'})) { |
if (defined($env{'request.course.id'})) { |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
|
my $sec = $env{'request.course.sec'}; |
|
|
} |
} |
return $courseidinfo; |
return $courseidinfo; |
} |
} |
Line 1267 sub page_format_transformation {
|
Line 2001 sub page_format_transformation {
|
|
|
my $name = &get_name(); |
my $name = &get_name(); |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
my $header_text = $parmhash{'print_header_format'}; |
my $header_text = $parmhash{'print_header_format'}; |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$courseidinfo, $name); |
$courseidinfo, $name); |
Line 1280 sub page_format_transformation {
|
Line 2013 sub page_format_transformation {
|
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
} |
} |
if ($layout eq 'album') { |
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 /; |
$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 /; |
} elsif ($layout eq 'book') { |
} 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/; |
$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 { |
} 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 /; |
$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') { |
if ($papersize eq 'a4') { |
my $papersize_text; |
my $papersize_text; |
if ($perm{'pav'}) { |
if ($perm{'pav'}) { |
$papersize_text = '\\special{papersize=210mm,297mm}'; |
$papersize_text = '\\special{papersize=210mm,297mm}'; |
} else { |
} else { |
$papersize_text = '\special{papersize=210mm,297mm}'; |
$papersize_text = '\special{papersize=210mm,297mm}'; |
} |
} |
$text =~ s/(\\begin{document})/$1$papersize_text/; |
$text =~ s/(\\begin\{document})/$1$papersize_text/; |
} |
} |
} |
} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($indexlist eq 'yes') { |
if ($indexlist eq 'yes') { |
$text=~s/(\\begin{document})/\\makeindex $1/; |
$text=~s/(\\begin\{document})/\\makeindex $1/; |
$text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/; |
$text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/; |
} |
} |
return $text; |
return $text; |
} |
} |
Line 1309 sub page_format_transformation {
|
Line 2042 sub page_format_transformation {
|
sub page_cleanup { |
sub page_cleanup { |
my $result = shift; |
my $result = shift; |
|
|
$result =~ m/\\end{document}(\d*)$/; |
$result =~ m/\\end\{document}(\d*)$/; |
my $number_of_columns = $1; |
my $number_of_columns = $1; |
my $insert = '{'; |
my $insert = '{'; |
for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } |
for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } |
$insert .= '}'; |
$insert .= '}'; |
$result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; |
$result =~ s/(\\begin\{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; |
$result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; |
$result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; |
return $result,$number_of_columns; |
return $result,$number_of_columns; |
} |
} |
Line 1350 my $end_of_student = "\n".'\special{ps:E
|
Line 2083 my $end_of_student = "\n".'\special{ps:E
|
|
|
sub latex_corrections { |
sub latex_corrections { |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; |
# $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g; |
my $copyright = ©right_line(); |
my $copyright = ©right_line(); |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
$result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
$result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
} else { |
} else { |
$result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; |
$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/\$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; |
$result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g; |
#-- LaTeX corrections |
#-- LaTeX corrections |
my $first_comment = index($result,'<!--',0); |
my $first_comment = index($result,'<!--',0); |
while ($first_comment != -1) { |
while ($first_comment != -1) { |
Line 1378 sub latex_corrections {
|
Line 2111 sub latex_corrections {
|
if ($result =~ m/&(\w+|#\d+);/) { |
if ($result =~ m/&(\w+|#\d+);/) { |
$result = &character_chart($result); |
$result = &character_chart($result); |
} |
} |
$result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g; |
$result =~ s/(\\end\{tabular})\s*\\vskip 0 mm/$1/g; |
$result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g; |
$result =~ s/(\\begin\{enumerate})\s*\\noindent/$1/g; |
return $result; |
return $result; |
} |
} |
|
|
Line 1472 sub get_textwidth {
|
Line 2205 sub get_textwidth {
|
|
|
sub unsupported { |
sub unsupported { |
my ($currentURL,$mode,$symb)=@_; |
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} |
if ($mode ne '') {$mode='\\'.$mode} |
my $result.= &print_latex_header($mode); |
my $result = &print_latex_header($mode); |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) { |
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
$cleanURL=~s|^(/adm/wrapper)?/ext/|http://|; |
my $title=&Apache::lonnet::gettitle($symb); |
$cleanURL=~s|^http://https://|https://|; |
$title = &Apache::lonxml::latex_special_symbols($title); |
if ($shown eq $currentURL) { |
$result.=' \strut \\\\ '.$title.' \strut \\\\ '.$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 { |
} 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}'; |
$result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; |
return $result; |
return $result; |
Line 1501 sub map_laystyle {
|
Line 2247 sub map_laystyle {
|
|
|
sub print_page_in_course { |
sub print_page_in_course { |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
|
|
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
my @page_resources = @$resources; |
my @page_resources = @$resources; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
Line 1517 sub print_page_in_course {
|
Line 2264 sub print_page_in_course {
|
$numberofcolumns); |
$numberofcolumns); |
my $LaTeXwidth=&recalcto_mm($textwidth); |
my $LaTeXwidth=&recalcto_mm($textwidth); |
|
|
|
|
if ($mode ne '') {$mode='\\'.$mode} |
if ($mode ne '') {$mode='\\'.$mode} |
my $result = &print_latex_header($mode); |
my $result = &print_latex_header($mode); |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
|
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
my $title=&Apache::lonnet::gettitle($currentURL); |
my $title=&Apache::lonnet::gettitle($symb); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$result .= '\noindent\textit{'.$title.'}\\\\'; |
} else { |
|
my $esc_currentURL= $currentURL; |
|
$esc_currentURL =~ s/_/\\_/g; |
|
$result.=$esc_currentURL; |
|
} |
|
$result .= '\\\\'; |
|
|
|
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
&Apache::lonnet::appenv({'construct.style' => |
&Apache::lonnet::appenv({'construct.style' => |
Line 1545 sub print_page_in_course {
|
Line 2285 sub print_page_in_course {
|
|
|
foreach my $resource (@page_resources) { |
foreach my $resource (@page_resources) { |
my $resource_src = $resource->src(); # Essentially the URL of the resource. |
my $resource_src = $resource->src(); # Essentially the URL of the resource. |
$result .= $resource->title() . '\\\\'; |
my $current_url = $resource->link(); |
|
|
# Recurse if a .page: |
# Recurse if a .page: |
|
|
Line 1554 sub print_page_in_course {
|
Line 2294 sub print_page_in_course {
|
my @page_resources = $navmap->retrieveResources($resource_src); |
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); |
$resource_src, \@page_resources); |
} |
} elsif ($resource->ext()) { |
# these resources go through the XML transformer: |
$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()) . '\\\\'; |
|
|
elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
my $urlp = &Apache::lonnet::clutter($resource_src); |
my $urlp = &Apache::lonnet::clutter($resource_src); |
|
|
my %form; |
my %form; |
my %moreenv; |
my %moreenv; |
|
|
Line 1568 sub print_page_in_course {
|
Line 2311 sub print_page_in_course {
|
|
|
$form{'grade_target'} = 'tex'; |
$form{'grade_target'} = 'tex'; |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'pdfFormFields'} = 'no'; |
$form{'pdfFormFields'} = $pdfFormFields; # |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
Line 1611 sub print_page_in_course {
|
Line 2354 sub print_page_in_course {
|
my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); |
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
Line 1620 sub print_page_in_course {
|
Line 2363 sub print_page_in_course {
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
Line 1638 sub print_page_in_course {
|
Line 2380 sub print_page_in_course {
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
Line 1674 sub print_page_in_course {
|
Line 2416 sub print_page_in_course {
|
sub recently_generated { |
sub recently_generated { |
my ($prtspool) = @_; |
my ($prtspool) = @_; |
my $output; |
my $output; |
|
|
my $zip_result; |
my $zip_result; |
my $pdf_result; |
my $pdf_result; |
opendir(DIR,$prtspool); |
opendir(DIR,$prtspool); |
Line 1707 sub recently_generated {
|
Line 2448 sub recently_generated {
|
if ($ext eq 'zip') { $zip_result .= $result; } |
if ($ext eq 'zip') { $zip_result .= $result; } |
} |
} |
if ($zip_result || $pdf_result) { |
if ($zip_result || $pdf_result) { |
$output = '<hr />'; |
$output ='<hr />'; |
} |
} |
if ($zip_result) { |
if ($zip_result) { |
$output .='<h3>'.&mt('Recently generated printout zip files')."</h3>\n" |
$output .='<h3>'.&mt('Recently generated printout zip files')."</h3>\n" |
Line 1744 sub recently_generated {
|
Line 2485 sub recently_generated {
|
# |
# |
# |
# |
# use Data::Dumper; |
# use Data::Dumper; |
#sub dump_helper_vars { |
# sub dump_helper_vars { |
# my ($helper) = @_; |
# my ($helper) = @_; |
# my $helpervars = Dumper($helper->{'VARS'}); |
# my $helpervars = Dumper($helper->{'VARS'}); |
# &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars"); |
# &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars"); |
Line 1759 sub get_page_breaks {
|
Line 2500 sub get_page_breaks {
|
} |
} |
return %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. |
|
# resource - Identifies the resource about to be printed. |
|
# |
|
# This is done as follows: |
|
# POSSIBLE_RESOURCES has the list of possible resources. |
|
# 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. |
|
# |
|
# In order to speed this up for lengthy printouts, the first time, |
|
# POSSIBLE_RESOURCES is turned into a look up hash and |
|
# EXTRASPACE is turned into an array. |
|
# |
|
|
|
|
|
my %possible_resources; |
|
my %extraspace_mm; |
|
my @extraspace; |
|
my $skips_loaded = 0; |
|
|
|
# Function to load the skips hash and array |
|
|
|
sub load_skips { |
|
|
|
my ($helper) = @_; |
|
|
|
# If this is the first time, unrap the resources and extra spaces: |
|
|
|
if (!$skips_loaded) { |
|
@extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); |
|
my @resource_list = (split(/\|\|\|/, $helper->{'VARS'}->{'POSSIBLE_RESOURCES'})); |
|
my $i = 0; |
|
foreach my $resource (@resource_list) { |
|
$possible_resources{$resource} = $i; |
|
$i++; |
|
} |
|
foreach my $mm_resource (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE_UNITS'})) { |
|
$extraspace_mm{$mm_resource} = 1; |
|
} |
|
$skips_loaded = 1; |
|
} |
|
} |
|
|
|
sub get_extra_vspaces { |
|
my ($helper, $resource) = @_; |
|
|
|
&load_skips($helper); |
|
|
|
# Lookup the resource in the possible resources hash.. that is the index |
|
# into the extraspace array that gives us either an empty string or |
|
# the number of mm to skip: |
|
|
|
my $index = $possible_resources{$resource}; |
|
my $skip = $extraspace[$index]; |
|
|
|
my $result = ''; |
|
if ($skip ne '') { |
|
my $units = 'in'; |
|
if (defined($extraspace_mm{$resource})) { |
|
$units = 'mm'; |
|
} |
|
$result = '\vskip '.$skip.' '.$units; |
|
} |
|
|
|
|
|
return $result; |
|
|
|
|
|
} |
|
|
|
# |
|
# 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 |
|
# ||| separated fields of the form resourcename=value |
|
# |
|
# Parameters: |
|
# $helper - Refers to the helper we are configuring |
|
# Implicit input: |
|
# $helper->{'VARS'}->{'EXTRASPACE'} - the spaces helper var has the text field |
|
# value. |
|
# $helper->{'VARS'}->{'EXTRASPACE_UNITS'} - units for the skips (checkboxes). |
|
# $helper->{'VARS'}->{'POSSIBLE_RESOURCES'} - has the list of resources. ||| |
|
# separated of course. |
|
# Implicit outputs: |
|
# $env{'form.extraspace'} |
|
# $env{'form.extraspace_units'} |
|
# |
|
sub set_form_extraspace { |
|
my ($helper) = @_; |
|
|
|
# the most convenient way to do this is to drive from the skips arrays/hash. |
|
# may not be the fastest, but this is once per print request so it's not so |
|
# speed critical: |
|
|
|
&load_skips($helper); |
|
|
|
my $result = ''; |
|
|
|
foreach my $resource (keys(%possible_resources)) { |
|
my $vskip = $extraspace[$possible_resources{$resource}]; |
|
$result .= $resource .'=' . $vskip . '|||'; |
|
} |
|
|
|
$env{'form.extraspace'} = $result; |
|
$env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; |
|
return $result; |
|
|
|
} |
|
|
# Output a sequence (recursively if neeed) |
# Output a sequence (recursively if neeed) |
# from construction space. |
# from construction space. |
Line 1775 sub get_page_breaks {
|
Line 2632 sub get_page_breaks {
|
# |
# |
sub print_construction_sequence { |
sub print_construction_sequence { |
my ($currentURL, $helper, %form, $LaTeXwidth) = @_; |
my ($currentURL, $helper, %form, $LaTeXwidth) = @_; |
|
|
my $result; |
my $result; |
my $rndseed=time; |
my $rndseed=time; |
if ($helper->{'VARS'}->{'curseed'}) { |
if ($helper->{'VARS'}->{'curseed'}) { |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
} |
} |
my $errtext=&LONCAPA::map::mapread($currentURL); |
my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL)); |
|
|
# |
# |
# These make this all support recursing for subsequences. |
# These make this all support recursing for subsequences. |
# |
# |
my @order = @LONCAPA::map::order; |
my @order = @LONCAPA::map::order; |
my @resources = @LONCAPA::map::resources; |
my @resources = @LONCAPA::map::resources; |
|
|
for (my $member=0;$member<=$#order;$member++) { |
for (my $member=0;$member<=$#order;$member++) { |
$resources[$order[$member]]=~/^([^:]*):([^:]*):/; |
$resources[$order[$member]]=~/^([^:]*):([^:]*):/; |
my $urlp=$2; |
my $urlp=$2; |
Line 1801 sub print_construction_sequence {
|
Line 2661 sub print_construction_sequence {
|
} |
} |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { |
($urlp=~/$LONCAPA::assess_page_re/)) { |
# Don't permanently modify %$form... |
# Don't permanently modify %$form... |
my %answerform = %form; |
my %answerform = %form; |
$answerform{'grade_target'}='answer'; |
$answerform{'grade_target'}='answer'; |
Line 1812 sub print_construction_sequence {
|
Line 2672 sub print_construction_sequence {
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
# If necessary, encapsulate answer in minipage: |
# If necessary, encapsulate answer in minipage: |
|
|
Line 1822 sub print_construction_sequence {
|
Line 2682 sub print_construction_sequence {
|
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body.=&path_to_problem($urlp,$LaTeXwidth); |
$body.=&path_to_problem($urlp,$LaTeXwidth); |
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerform{'problem_split'}); |
$texversion.=$body; |
$texversion.=$body; |
} |
} |
} |
} |
Line 1845 sub print_construction_sequence {
|
Line 2705 sub print_construction_sequence {
|
# IF sequence, recurse: |
# IF sequence, recurse: |
|
|
if ($urlp =~ /\.sequence$/) { |
if ($urlp =~ /\.sequence$/) { |
my $sequence_url = $urlp; |
$result .= &print_construction_sequence($urlp, |
my $domain = $env{'user.domain'}; # Constr. space only on local |
|
my $user = $env{'user.name'}; |
|
|
|
$sequence_url =~ s/^\/res\/$domain/\/home/; |
|
$sequence_url =~ s/^(\/home\/$user)/$1\/public_html/; |
|
# $sequence_url =~ s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($sequence_url, |
|
$helper, %form, |
$helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
} |
} |
Line 1872 sub print_construction_sequence {
|
Line 2725 sub print_construction_sequence {
|
$result .= $texversion; |
$result .= $texversion; |
} |
} |
} |
} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin\{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
return $result; |
return $result; |
} |
} |
|
|
|
# |
|
# Top level for generating print output. |
|
# |
|
# May call print_resources if multiple resources will be printed. |
|
# |
|
# The main driver is $selectionmade which reflects the type of print out |
|
# requested: |
|
# Value Print type: |
|
# 1 Print resource that's being looked at. |
|
# 2 Print problems in a map or in a page. |
|
# 3 Print pages in a map or resources in a page. |
|
# 4 Print all problems or all resources. |
|
# 5 Print problems for seleted students. |
|
# 6 Print selected problems from a folder. |
|
# 7 Print print selected resources from some scope. |
|
# 8 Print resources for selected students. |
|
# |
|
#BZ 5209 |
|
# 2 map_incomplete_problems_seq Print incomplete problems from the current |
|
# folder in student context. |
|
# 5 map_incomplete_problems_people_seq Print incomplete problems from the |
|
# current folder in privileged context. |
|
# 5 incomplete_problems_selpeople_course Print incomplete problems for |
|
# selected people from the entire course. |
|
# |
|
# Item 101 has much the same processing as 8, |
|
# |
|
# Differences: Item 101, 102 require per-student filtering of the resource |
|
# set so that only the incomplete resources are printed. |
|
# For item 100, filtering was done at the helper level. |
|
|
sub output_data { |
sub output_data { |
|
|
my ($r,$helper,$rparmhash) = @_; |
my ($r,$helper,$rparmhash) = @_; |
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
$ssi_error = 0; # This will be set nonzero by failing ssi's. |
$ssi_error = 0; # This will be set nonzero by failing ssi's. |
$resources_printed = ''; |
$resources_printed = ''; |
$font_size = $helper->{'VARS'}->{'fontsize'}; |
$font_size = $helper->{'VARS'}->{'fontsize'}; |
|
my $print_type = $helper->{'VARS'}->{'PRINT_TYPE'}; # Allows textual simplification. |
my $do_postprocessing = 1; |
my $do_postprocessing = 1; |
my $js = <<ENDPART; |
my $js = <<ENDPART; |
<script type="text/javascript"> |
<script type="text/javascript"> |
Line 1930 ENDPART
|
Line 2816 ENDPART
|
# indexed by symb and contains 1's for each break. |
# indexed by symb and contains 1's for each break. |
|
|
$env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; |
$env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; |
$env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; |
&set_form_extraspace($helper); |
|
$env{'form.lastprinttype'} = $print_type; |
&Apache::loncommon::store_course_settings('print', |
&Apache::loncommon::store_course_settings('print', |
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
|
'extraspace' => 'scalar', |
|
'extraspace_units' => 'scalar', |
'lastprinttype' => 'scalar'}); |
'lastprinttype' => 'scalar'}); |
|
|
my %page_breaks = &get_page_breaks($helper); |
my %page_breaks = &get_page_breaks($helper); |
|
|
my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; |
my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; |
Line 1959 ENDPART
|
Line 2847 ENDPART
|
my %form; |
my %form; |
$form{'grade_target'} = 'tex'; |
$form{'grade_target'} = 'tex'; |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'pdfFormFields'} = 'no'; |
$form{'pdfFormFields'} = $pdfFormFields; |
|
|
# If form.showallfoils is set, then request all foils be shown: |
# 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 |
Line 1979 ENDPART
|
Line 2867 ENDPART
|
&Apache::lonnet::delenv('construct.style'); |
&Apache::lonnet::delenv('construct.style'); |
} |
} |
|
|
|
if ($print_type eq 'current_document') { |
if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { |
|
#-- single document - problem, page, html, xml, ... |
#-- single document - problem, page, html, xml, ... |
my ($currentURL,$cleanURL); |
my ($currentURL,$cleanURL); |
|
|
Line 1991 ENDPART
|
Line 2878 ENDPART
|
} else { |
} else { |
|
|
#prints resource from the construction space |
#prints resource from the construction space |
$currentURL='/'.$helper->{'VARS'}->{'filename'}; |
$currentURL=$helper->{'VARS'}->{'filename'}; |
if ($currentURL=~/([^?]+)/) {$currentURL=$1;} |
|
$cleanURL=$currentURL; |
$cleanURL=$currentURL; |
} |
} |
$selectionmade = 1; |
$selectionmade = 1; |
|
|
if ($cleanURL!~m|^/adm/| |
if ($cleanURL!~m|^/adm/| |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
my $rndseed=time; |
my $rndseed=time; |
Line 2035 ENDPART
|
Line 2922 ENDPART
|
|
|
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'grade_target'}='answer'; |
$form{'grade_target'}='answer'; |
$form{'answer_output_mode'}='tex'; |
$form{'answer_output_mode'}='tex'; |
Line 2047 ENDPART
|
Line 2935 ENDPART
|
|
|
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
Line 2056 ENDPART
|
Line 2944 ENDPART
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$cleanURL; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
|
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
Line 2074 ENDPART
|
Line 2962 ENDPART
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
|
|
Line 2091 ENDPART
|
Line 2979 ENDPART
|
} |
} |
} elsif ($cleanURL!~m|^/adm/| |
} elsif ($cleanURL!~m|^/adm/| |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
#printing content of sequence from the construction space |
|
|
|
|
|
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
Line 2102 ENDPART
|
Line 2986 ENDPART
|
$result = &print_latex_header() . $result; |
$result = &print_latex_header() . $result; |
} |
} |
# End construction space sequence. |
# End construction space sequence. |
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
|
if ($currentURL=~/\/ext\.tool$/) {$currentURL=~s/^\/adm\/wrapper//;} |
$resources_printed .= $currentURL.':'; |
$resources_printed .= $currentURL.':'; |
my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($currentURL); |
my $annotation = &annotate($currentURL); |
$texversion =~ s/(\\end{document})/$annotation$1/; |
$texversion =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
} elsif ($cleanURL =~/\.tex$/) { |
} elsif ($cleanURL =~/\.tex$/) { |
Line 2120 ENDPART
|
Line 3005 ENDPART
|
$result = &fetch_raw_resource($currentURL); |
$result = &fetch_raw_resource($currentURL); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($currentURL); |
my $annotation = &annotate($currentURL); |
$result =~ s/(\\end{document})/$annotation$1/; |
$result =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
|
|
$do_postprocessing = 0; # Don't massage the result. |
$do_postprocessing = 0; # Don't massage the result. |
Line 2142 ENDPART
|
Line 3027 ENDPART
|
$result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, |
$result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, |
$helper->{'VARS'}->{'symb'}); |
$helper->{'VARS'}->{'symb'}); |
} |
} |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or |
} elsif (($print_type eq 'map_problems') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') or |
($print_type eq 'map_problems_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or |
($print_type eq 'map_resources_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or |
($print_type eq 'map_problems_pages') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or |
($print_type eq 'all_problems') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG |
($print_type eq 'all_resources') or # BUGBUG |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') |
($print_type eq 'select_sequences') or |
) { |
($print_type eq 'map_incomplete_problems_seq') |
|
) { |
|
|
#-- produce an output string |
#-- produce an output string |
if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or |
if (($print_type eq 'map_problems') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) { |
($print_type eq 'map_incomplete_problems_seq') or |
|
($print_type eq 'map_problems_in_page') ) { |
$selectionmade = 2; |
$selectionmade = 2; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or |
} elsif (($print_type eq 'map_problems_pages') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')) |
($print_type eq 'map_resources_in_page')) |
{ |
{ |
$selectionmade = 3; |
$selectionmade = 3; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') |
} elsif (($print_type eq 'all_problems') |
) { |
) { |
$selectionmade = 4; |
$selectionmade = 4; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG |
} elsif ($print_type eq 'all_resources') { #BUGBUG |
$selectionmade = 4; |
$selectionmade = 4; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') { |
} elsif ($print_type eq 'select_sequences') { |
$selectionmade = 7; |
$selectionmade = 7; |
} |
} |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
Line 2184 ENDPART
|
Line 3071 ENDPART
|
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
my $pbreakresources = keys %page_breaks; |
|
for (my $i=0;$i<=$#master_seq;$i++) { |
for (my $i=0;$i<=$#master_seq;$i++) { |
|
|
&Apache::lonenc::reset_enc(); |
&Apache::lonenc::reset_enc(); |
|
|
|
|
# Note due to document structure, not allowed to put \newpage |
# Note due to document structure, not allowed to put \newpage |
# prior to the first resource |
# prior to the first resource |
|
|
Line 2198 ENDPART
|
Line 3083 ENDPART
|
$result.="\\newpage\n"; |
$result.="\\newpage\n"; |
} |
} |
} |
} |
|
$result .= &get_extra_vspaces($helper, $master_seq[$i]); |
my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); |
my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); |
$urlp=&Apache::lonnet::clutter($urlp); |
$urlp=&Apache::lonnet::clutter($urlp); |
$form{'symb'}=$master_seq[$i]; |
$form{'symb'}=$master_seq[$i]; |
Line 2209 ENDPART
|
Line 3095 ENDPART
|
my $texversion=''; |
my $texversion=''; |
if ($urlp!~m|^/adm/| |
if ($urlp!~m|^/adm/| |
&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
|
my $extension = $1; |
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
&Apache::lonxml::remember_problem_counter(); |
&Apache::lonxml::remember_problem_counter(); |
if ($flag_latex_header_remove eq 'NO') { |
if ($flag_latex_header_remove eq 'NO') { |
Line 2216 ENDPART
|
Line 3103 ENDPART
|
unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || |
unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || |
(($i==0) && |
(($i==0) && |
(($urlp=~/\.page$/) || |
(($urlp=~/\.page$/) || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') || |
($print_type eq 'map_problems_in_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) { |
(($print_type eq 'map_resources_in_page') && ($extension !~ /^x?html?$/))))) { |
|
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
|
} |
} |
} |
} |
$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
if ($urlp=~/\.page$/) { |
if ($urlp=~/\.page$/) { |
($texversion,my $number_of_columns_page) = &page_cleanup($texversion); |
($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}/; |
$texversion =~ s/\\end\{document}\d*/\\end{document}/; |
$flag_page_in_sequence = 'YES'; |
$flag_page_in_sequence = 'YES'; |
} |
} |
|
|
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
Line 2240 ENDPART
|
Line 3126 ENDPART
|
|
|
&Apache::lonxml::restore_problem_counter(); |
&Apache::lonxml::restore_problem_counter(); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
|
|
if ($urlp =~ /\.page$/) { |
if ($urlp =~ /\.page$/) { |
$answer =~ s/\\end{document}(\d*)$//; |
$answer =~ s/\\end\{document}(\d*)$//; |
} |
} |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($urlp =~ /\.page$/) { |
if ($urlp =~ /\.page$/) { |
my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion); |
my @probs = split(/\\keephidden\{ENDOFPROBLEM}/,$texversion); |
my $lastprob = pop(@probs); |
my $lastprob = pop(@probs); |
$texversion = join('\keephidden{ENDOFPROBLEM}',@probs). |
$texversion = join('\keephidden{ENDOFPROBLEM}',@probs). |
$answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; |
$answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; |
} else { |
} else { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} |
} |
} else { |
} else { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) { |
if ($urlp=~/$LONCAPA::assess_page_re/) { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
# $texversion =~ s/\\begin{document}//; |
# $texversion =~ s/\\begin\{document}//; # FIXME |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .='\vskip 1 mm '.$answer; |
$body .='\vskip 1 mm '.$answer; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerform{'problem_split'}); |
$texversion .= $body; |
$texversion .= $body; |
} else { |
} else { |
$texversion=''; |
$texversion=''; |
Line 2272 ENDPART
|
Line 3157 ENDPART
|
} |
} |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($urlp); |
my $annotation .= &annotate($urlp); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$urlp); |
$texversion=&IndexCreation($texversion,$urlp); |
Line 2286 ENDPART
|
Line 3171 ENDPART
|
if (($selectionmade == 4) and ($assignment ne $prevassignment)) { |
if (($selectionmade == 4) and ($assignment ne $prevassignment)) { |
my $name = &get_name(); |
my $name = &get_name(); |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
$prevassignment=$assignment; |
$prevassignment=$assignment; |
my $header_text = $parmhash{'print_header_format'}; |
my $header_text = $parmhash{'print_header_format'}; |
$header_text = &format_page_header($textwidth, $header_text, |
$header_text = &format_page_header($textwidth, $header_text, |
$assignment, |
$assignment, |
$courseidinfo, |
$courseidinfo, |
$name); |
$name); |
|
|
if ($numberofcolumns eq '1') { |
if ($numberofcolumns eq '1') { |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; |
} else { |
} else { |
Line 2302 ENDPART
|
Line 3185 ENDPART
|
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} |
if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} |
|
if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;} |
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($urlp); |
my $annotation = &annotate($urlp); |
$texversion =~ s/(\\end{document)/$annotation$1/; |
$texversion =~ s/(\\end\{document)/$annotation$1/; |
} |
} |
|
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
$texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
Line 2346 ENDPART
|
Line 3230 ENDPART
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} |
} |
if (&Apache::loncommon::connection_aborted($r)) { |
if (&Apache::loncommon::connection_aborted($r)) { |
last; |
last; |
} |
} |
} |
} |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
if ($flag_page_in_sequence eq 'YES') { |
if ($flag_page_in_sequence eq 'YES') { |
$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/; |
$result =~ s/\\usepackage\{calc}/\\usepackage{calc}\\usepackage{longtable}/; |
} |
} |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || |
} elsif (($print_type eq 'problems_for_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') || |
($print_type eq 'all_problems_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_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 '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; |
my $type; |
if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || |
if (($print_type eq 'problems_for_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) { |
($print_type eq 'all_problems_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq') || |
|
($print_type eq 'select_sequences_problems_for_students')) { |
$selectionmade=5; |
$selectionmade=5; |
$type='problems'; |
$type='problems'; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { |
} elsif (($print_type eq 'resources_for_students') || |
|
($print_type eq 'select_sequences_resources_for_students')) { |
$selectionmade=8; |
$selectionmade=8; |
$type='resources'; |
$type='resources'; |
} |
} |
Line 2390 ENDPART
|
Line 3282 ENDPART
|
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
@students = sort compare_names @students; |
@students = sort compare_names @students; |
|
} else { |
|
@students = sort compare_sections @students; |
} |
} |
&adjust_number_to_print($helper); |
&adjust_number_to_print($helper); |
|
|
Line 2408 ENDPART
|
Line 3302 ENDPART
|
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
|
|
|
my $map; |
|
if ($helper->{VARS}->{'symb'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); |
|
} |
|
|
#loop over students |
#loop over students |
|
|
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
Line 2422 ENDPART
|
Line 3322 ENDPART
|
($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { |
($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { |
$moreenv{'problem_split'}='yes'; |
$moreenv{'problem_split'}='yes'; |
} |
} |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75'); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$#students+1); |
my $student_counter=-1; |
my $student_counter=-1; |
my $i = 0; |
my $i = 0; |
my $last_section = (split(/:/,$students[0]))[2]; |
my $last_section = (split(/:/,$students[0]))[2]; |
|
my $nohidemap; |
|
if ($perm{'pav'} && $perm{'vgr'}) { |
|
$nohidemap = 1; |
|
} |
foreach my $person (@students) { |
foreach my $person (@students) { |
|
|
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
if (-e $duefile) { |
if (-e $duefile) { |
my $temp_file = Apache::File->new('>>'.$duefile); |
my $temp_file = Apache::File->new('>>'.$duefile); |
Line 2443 ENDPART
|
Line 3346 ENDPART
|
} else { |
} else { |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
} |
} |
|
my $actual_seq = master_seq_to_person_seq($map, \@master_seq, |
|
$person, undef, $nohidemap); |
my ($output,$fullname, $printed)=&print_resources($r,$helper, |
my ($output,$fullname, $printed)=&print_resources($r,$helper, |
$person,$type, |
$person,$type, |
\%moreenv,\@master_seq, |
\%moreenv, $actual_seq, |
$flag_latex_header_remove, |
$flag_latex_header_remove, |
$LaTeXwidth); |
$LaTeXwidth); |
$resources_printed .= ":"; |
$resources_printed .= ":"; |
$print_array[$i].=$output; |
$print_array[$i].=$output; |
$student_names[$i].=$person.':'.$fullname.'_END_'; |
$student_names[$i].=$person.':'.$fullname.'_END_'; |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname); |
# &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'; |
$flag_latex_header_remove = 'YES'; |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
$result .= $print_array[0].' \end{document}'; |
$result .= $print_array[0].' \end{document}'; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || |
} elsif (($print_type eq 'problems_for_anon') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || |
($print_type eq 'problems_for_anon_page') || |
($helper->{'VARS'}->{'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')) { |
my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; |
my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; |
my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; |
Line 2467 ENDPART
|
Line 3375 ENDPART
|
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; |
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; |
my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; |
my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; |
my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; |
my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; |
|
|
my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; |
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)=('letter',6); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; |
next if (($line =~ /^\#/) || ($line eq '')); |
|
my ($name,$type,$length,$bubbles_per_item) = |
|
(split(/:/,$line))[0,2,4,17]; |
if ($name eq $code_option) { |
if ($name eq $code_option) { |
$code_length=$length; |
$code_length=$length; |
if ($type eq 'number') { $code_type = 'number'; } |
if ($type eq 'number') { $code_type = 'number'; } |
|
chomp($bubbles_per_item); |
|
if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) { |
|
$bubbles_per_row = $bubbles_per_item; |
|
} |
} |
} |
} |
} |
|
my $map; |
|
if ($helper->{VARS}{'symb'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); |
|
} |
my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); |
my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); |
$moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; |
$moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; |
$moreenv{'instructor_comments'}='hide'; |
$moreenv{'instructor_comments'}='hide'; |
|
$moreenv{'bubbles_per_row'} = $bubbles_per_row; |
my $seed=time+($$<<16)+($$); |
my $seed=time+($$<<16)+($$); |
my @allcodes; |
my @allcodes; |
if ($old_name) { |
if ($old_name) { |
Line 2510 ENDPART
|
Line 3429 ENDPART
|
$moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length, |
$moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length, |
$code_type); |
$code_type); |
} |
} |
|
$code_name =~ s/^\s+//; |
|
$code_name =~ s/\s+$//; |
if ($code_name) { |
if ($code_name) { |
&Apache::lonnet::put('CODEs', |
&Apache::lonnet::put('CODEs', |
{ |
{ |
Line 2521 ENDPART
|
Line 3442 ENDPART
|
@allcodes=keys(%allcodes); |
@allcodes=keys(%allcodes); |
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); |
my ($type) = split(/_/,$print_type); |
&adjust_number_to_print($helper); |
&adjust_number_to_print($helper); |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
if ($number_per_page eq '0' || $number_per_page eq 'all') { |
if ($number_per_page eq '0' || $number_per_page eq 'all' |
$number_per_page=$num_todo; |
|| $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,'Print Status','Class Print Status',$num_todo,'inline','75'); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo); |
my $count=0; |
my $count=0; |
|
my $nohidemap; |
|
if ($perm{'pav'} && $perm{'vgr'}) { |
|
$nohidemap = 1; |
|
} |
foreach my $code (sort(@allcodes)) { |
foreach my $code (sort(@allcodes)) { |
my $file_num=int($count/$number_per_page); |
my $file_num=int($count/$number_per_page); |
if ($code_type eq 'number') { |
if ($code_type eq 'number') { |
Line 2537 ENDPART
|
Line 3463 ENDPART
|
} else { |
} else { |
$moreenv{'CODE'}=&num_to_letters($code); |
$moreenv{'CODE'}=&num_to_letters($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)= |
my ($output,$fullname, $printed)= |
&print_resources($r,$helper,'anonymous',$type,\%moreenv, |
&print_resources($r,$helper,'anonymous',$type,\%moreenv, |
\@master_seq,$flag_latex_header_remove, |
$actual_seq,$flag_latex_header_remove, |
$LaTeXwidth); |
$LaTeXwidth); |
$resources_printed .= ":"; |
$resources_printed .= ":"; |
$print_array[$file_num].=$output; |
$print_array[$file_num].=$output; |
Line 2551 ENDPART
|
Line 3482 ENDPART
|
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
$result .= $print_array[0].' \end{document}'; |
$result .= $print_array[0].' \end{document}'; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') { |
} elsif ($print_type eq 'problems_from_directory') { |
#prints selected problems from the subdirectory |
#prints selected problems from the subdirectory |
$selectionmade = 6; |
$selectionmade = 6; |
my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'}; |
my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'}; |
Line 2570 ENDPART
|
Line 3501 ENDPART
|
if ($urlp=~/\//) { |
if ($urlp=~/\//) { |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'rndseed'}=$rndseed; |
$form{'rndseed'}=$rndseed; |
if ($urlp =~ m|/home/([^/]+)/public_html|) { |
$urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; |
$urlp =~ s|/home/([^/]*)/public_html|/~$1|; |
|
} else { |
|
$urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||; |
|
} |
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
Line 2588 ENDPART
|
Line 3515 ENDPART
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
} |
} |
#this chunk is responsible for printing the path to problem |
#this chunk is responsible for printing the path to problem |
|
|
my $newurlp=$urlp; |
my $newurlp=&path_to_problem($urlp,$LaTeXwidth); |
if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;} |
$texversion =~ s/(\\begin\{minipage}\{\\textwidth})/$1 $newurlp/; |
$newurlp=&path_to_problem($newurlp,$LaTeXwidth); |
|
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$urlp); |
$texversion=&IndexCreation($texversion,$urlp); |
Line 2633 ENDPART
|
Line 3557 ENDPART
|
# Only post process if that has not been turned off e.g. by a raw latex resource. |
# Only post process if that has not been turned off e.g. by a raw latex resource. |
|
|
if ($do_postprocessing) { |
if ($do_postprocessing) { |
$result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); |
$result = &page_format_transformation($papersize, |
|
$laystyle,$numberofcolumns, |
|
$print_type,$result, |
|
$helper->{VARS}->{'assignment'}, |
|
$helper->{'VARS'}->{'TABLE_CONTENTS'}, |
|
$helper->{'VARS'}->{'TABLE_INDEX'}, |
|
$selectionmade); |
$result = &latex_corrections($number_of_columns,$result,$selectionmade, |
$result = &latex_corrections($number_of_columns,$result,$selectionmade, |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
#if ($numberofcolumns == 1) { |
#if ($numberofcolumns == 1) { |
Line 2644 ENDPART
|
Line 3574 ENDPART
|
#} |
#} |
} |
} |
|
|
# Set URLback if this is a construction space print so we can provide |
# Set URLback so we can provide a link back to the resource and to change options. |
# a link to the resource being edited. |
# (Since the browser back button does not currently work with https, |
# |
# the back link is useful even when there is an easy-to-miss LON-CAPA back button.) |
|
|
my $URLback=''; #link to original document |
my $URLback=''; #link to original document |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
#prints resource from the construction space |
$URLback=$helper->{'VARS'}->{'filename'}; |
$URLback='/'.$helper->{'VARS'}->{'filename'}; |
} elsif ($helper->{VARS}{'symb'}) { |
if ($URLback=~/([^?]+)/) { |
my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); |
$URLback=$1; |
my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; |
$URLback=~s|^/~|/priv/|; |
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); |
|
} |
|
if ($url ne '') { |
|
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: |
# Final adjustment of the font size: |
Line 2663 ENDPART
|
Line 3626 ENDPART
|
|
|
$result = set_font_size($result); |
$result = set_font_size($result); |
|
|
|
# Insert any babel headers required. |
|
|
|
$result = &collect_languages($result); |
|
|
|
|
#-- writing .tex file in prtspool |
#-- writing .tex file in prtspool |
my $temp_file; |
my $temp_file; |
my $identifier = &Apache::loncommon::get_cgi_id(); |
my $identifier = &Apache::loncommon::get_cgi_id(); |
Line 2734 ENDPART
|
Line 3702 ENDPART
|
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.backref' => $URLback,}); |
'cgi.'.$identifier.'.backref' => &escape($URLback),}); |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.courseid" => $cnum, |
"cgi.$identifier.courseid" => $cnum, |
Line 2790 sub print_resources {
|
Line 3758 sub print_resources {
|
my ($username,$userdomain,$usersection) = split /:/,$person; |
my ($username,$userdomain,$usersection) = split /:/,$person; |
my $fullname = &get_name($username,$userdomain); |
my $fullname = &get_name($username,$userdomain); |
my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace. |
my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace. |
if ($person =~ 'anon') { |
|
$namepostfix .="Name: "; |
|
|
# |
|
# Figure out if we need to filter the output by |
|
# the incomplete problems for that person |
|
# |
|
my $print_type = $helper->{'VARS'}->{'PRINT_TYPE'}; |
|
my $print_incomplete = 0; |
|
if (($print_type eq 'map_incomplete_problems_people_seq') || |
|
($print_type eq 'incomplete_problems_selpeople_course')) { |
|
$print_incomplete = 1; |
|
} |
|
if ($person eq 'anonymous') { |
|
$namepostfix .=&mt('Name:')." "; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
} |
} |
|
|
# Fullname may have special latex characters that need \ prefixing: |
# Fullname may have special latex characters that need \ prefixing: |
# |
# |
|
|
my $i = 0; |
my $i = 0; |
|
my $actually_printed = 0; # Count of resources printed. |
#goes through all resources, checks if they are available for |
#goes through all resources, checks if they are available for |
#current student, and produces output |
#current student, and produces output |
|
|
Line 2814 sub print_resources {
|
Line 3796 sub print_resources {
|
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# |
# |
|
|
my $syllabus_first = 0; |
my $syllabus_first = 0; |
|
my $current_assignment = ""; |
|
my $assignment; |
|
my $courseidinfo = &get_course(); |
|
my $possprint = scalar(@{$master_seq}); |
|
|
foreach my $curresline (@{$master_seq}) { |
foreach my $curresline (@{$master_seq}) { |
if (defined $page_breaks{$curresline}) { |
if (defined $page_breaks{$curresline}) { |
if($i != 0) { |
if($i != 0) { |
$current_output.= "\\newpage\n"; |
$current_output.= "\\newpage\n"; |
} |
} |
} |
} |
|
$current_output .= &get_extra_vspaces($helper, $curresline); |
$i++; |
$i++; |
|
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
|
|
|
# See if we need to emit a new header: |
|
|
if ( !($type eq 'problems' && |
if ( !($type eq 'problems' && |
($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { |
($curresline!~ m/$LONCAPA::assess_page_re/)) ) { |
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) { |
|
next; |
|
} |
|
$actually_printed++; # we're going to print one. |
|
|
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if ($res_url!~m|^ext/| |
if ($res_url!~m|^ext/| |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
Line 2839 sub print_resources {
|
Line 3835 sub print_resources {
|
$rendered = &print_latex_header().$rendered; |
$rendered = &print_latex_header().$rendered; |
} |
} |
} |
} |
|
; |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}\d*//; |
$rendered =~ s/\\end\{document}\d*//; |
} |
} |
} |
} |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
Line 2850 sub print_resources {
|
Line 3847 sub print_resources {
|
# Use a copy of the hash so we don't pervert it on future loop passes. |
# Use a copy of the hash so we don't pervert it on future loop passes. |
my %answerenv = %{$moreenv}; |
my %answerenv = %{$moreenv}; |
$answerenv{'answer_output_mode'}='tex'; |
$answerenv{'answer_output_mode'}='tex'; |
|
|
|
|
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
|
&Apache::lonxml::restore_problem_counter(); |
&Apache::lonxml::restore_problem_counter(); |
Line 2857 sub print_resources {
|
Line 3856 sub print_resources {
|
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; |
$rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/; |
} else { |
} else { |
|
|
|
|
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
$header =~ s/\\begin{document}//; #<<<<< |
$header =~ s/\\begin\{document}//; #<<<<< |
} |
} |
my $title = &Apache::lonnet::gettitle($curresline); |
my $title = &Apache::lonnet::gettitle($curresline); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$body .='\vskip 1 mm '.$ansrendered; |
$body .='\vskip 1 mm '.$ansrendered; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerenv{'problem_split'}); |
$rendered = $header.$body; |
$rendered = $header.$body; |
} |
} |
} |
} |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $annotation = &annotate($url); |
my $annotation = &annotate($url); |
$rendered =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$rendered =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
my $junk; |
my $junk; |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered; |
$current_output .= $rendered; |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
if ($i == 1) { |
if ($i == 1) { |
$syllabus_first = 1; |
$syllabus_first = 1; |
} |
} |
Line 2895 sub print_resources {
|
Line 3894 sub print_resources {
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $annotation = &annotate($url); |
my $annotation = &annotate($url); |
$annotation =~ s/(\\end{document})/$annotation$1/; |
$annotation =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; |
$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$/) { |
Line 2915 sub print_resources {
|
Line 3914 sub print_resources {
|
if ($remove_latex_header ne 'NO') { |
if ($remove_latex_header ne 'NO') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered; |
$current_output .= $rendered; |
} |
} |
} |
} |
$remove_latex_header = 'YES'; |
$remove_latex_header = 'YES'; |
} |
} |
|
$assignment = &Apache::lonxml::latex_special_symbols( |
|
&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, |
|
$fullname, $usersection); |
|
my $header_start = ($columns_in_format == 1) ? '\lhead' |
|
: '\fancyhead[LO]'; |
|
$header_line = $header_start.'{'.$header_line.'}'; |
|
$current_output = $current_output . $header_line; |
|
$current_assignment = $assignment; |
|
} |
|
|
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
} |
} |
|
# If we are printing incomplete it's possible we don't have |
|
# anything to print. The print subsystem is not so good at handling |
|
# that so we're going to generate a stub that says there are no |
|
# incomplete resources for the person. |
|
# |
|
|
|
if ($actually_printed == 0) { |
|
my $message = &mt('No resources to print'); |
|
if (!$possprint) { |
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
$message = &mt('There are no unhidden resources to print.')."\n\n". |
|
&mt('The most likely reason is one of the following: ')."\n". |
|
'\begin{itemize}'."\n". |
|
'\item '.&mt("The 'Resource hidden from students' parameter is set for the folder being printed.")."\n". |
|
'\item '.&mt("'Hidden' is checked in the Course Editor individually for each resource in the folder being printed.")."\n". |
|
'\end{itemize}'."\n\n". |
|
&mt("Note: to print a bubblesheet exam which you want to hide from students, ". |
|
"use the Course Editor to check the 'Hidden' checkbox for the exam folder itself.")."\n"; |
|
} |
|
} elsif ($print_incomplete) { |
|
$message = &mt('No incomplete resources'); |
|
} |
|
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; |
|
} else { |
|
$current_output = &latex_header_footer_remove($current_output); |
|
} |
|
} |
|
|
if ($syllabus_first) { |
if ($syllabus_first) { |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
} |
} |
my $courseidinfo = &get_course(); |
|
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} |
|
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $header_line = |
my $header_line = |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
$currentassignment, $courseidinfo, $fullname); |
$currentassignment, $courseidinfo, $fullname, $usersection); |
my $header_start = ($columns_in_format == 1) ? '\lhead' |
my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; |
: '\fancyhead[LO]'; |
my $newheader = $header_start.'{'.$header_line.'}'; |
$header_line = $header_start.'{'.$header_line.'}'; |
|
if ($current_output=~/\\documentclass/) { |
if ($current_output=~/\\documentclass/) { |
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; |
$current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /; |
|
|
} else { |
} else { |
my $blankpages = |
my $blankpages = |
'\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; |
'\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; |
|
|
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
©right_line().' \newpage '.$blankpages.$end_of_student. |
©right_line().' \newpage '.$blankpages.$end_of_student. |
'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. |
'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. |
$header_line.$namepostfix.'} \vskip 5 mm '.$current_output; |
$newheader.$namepostfix. '} \vskip 5 mm '.$current_output; |
|
|
} |
} |
# |
# |
# Close the student bracketing. |
# Close the student bracketing. |
Line 2956 sub print_resources {
|
Line 3997 sub print_resources {
|
|
|
} |
} |
|
|
|
sub printing_blocked { |
|
my ($r,$blocktext) = @_; |
|
my $title = &mt('Preparing Printout'); |
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
|
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/printout', |
|
text=> $title}); |
|
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs($title); |
|
&Apache::loncommon::content_type($r,'text/html'); |
|
&Apache::loncommon::no_cache($r); |
|
$r->send_http_header; |
|
$r->print(&Apache::loncommon::start_page('Preparing Printout'). |
|
$breadcrumbs. |
|
$blocktext. |
|
&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
|
sub handler { |
sub handler { |
|
|
my $r = shift; |
my $r = shift; |
|
|
|
if ($env{'request.course.id'}) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
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)) && |
|
($env{'request.role'} !~ m{^st\./$cdom/$cnum})) { |
|
&printing_blocked($r,$blocktext); |
|
return OK; |
|
} |
|
} |
|
} |
|
|
&init_perm(); |
&init_perm(); |
|
|
|
|
|
|
my $helper = printHelper($r); |
my $helper = printHelper($r); |
if (!ref($helper)) { |
if (!ref($helper)) { |
return $helper; |
return $helper; |
Line 2987 sub handler {
|
Line 4061 sub handler {
|
|
|
&output_data($r,$helper,\%parmhash); |
&output_data($r,$helper,\%parmhash); |
return OK; |
return OK; |
} |
} |
|
|
use Apache::lonhelper; |
use Apache::lonhelper; |
|
|
Line 3012 sub init_perm {
|
Line 4086 sub init_perm {
|
$perm{'pfo'}=&Apache::lonnet::allowed('pfo', |
$perm{'pfo'}=&Apache::lonnet::allowed('pfo', |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
} |
} |
|
$perm{'vgr'}=&Apache::lonnet::allowed('vgr',$env{'request.course.id'}); |
|
if (!$perm{'vgr'}) { |
|
$perm{'vgr'}=&Apache::lonnet::allowed('vgr', |
|
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
|
} |
} |
} |
|
|
sub get_randomly_ordered_warning { |
sub get_randomly_ordered_warning { |
Line 3027 sub get_randomly_ordered_warning {
|
Line 4106 sub get_randomly_ordered_warning {
|
my $func = |
my $func = |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
if (@matches) { |
|
$message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; |
|
} |
|
} |
|
if ($message) { |
|
return '<message type="warning">'.$message.'</message>'; |
|
} |
} |
} else { |
} else { |
$message = "Retrieval of information about ordering of resources failed."; |
$message = "Retrieval of information about ordering of resources failed."; |
Line 3083 sub printHelper {
|
Line 4157 sub printHelper {
|
$helper->declareVar('PRINT_TYPE'); |
$helper->declareVar('PRINT_TYPE'); |
$helper->declareVar("showallfoils"); |
$helper->declareVar("showallfoils"); |
$helper->declareVar("STUDENTS"); |
$helper->declareVar("STUDENTS"); |
|
$helper->declareVar("EXTRASPACE"); |
|
|
|
|
|
|
|
|
# The page breaks can get loaded initially from the course environment: |
# The page breaks and extra spaces |
|
# can get loaded initially from the course environment: |
# But we only do this in the initial state so that they are allowed to change. |
# But we only do this in the initial state so that they are allowed to change. |
# |
# |
|
|
# $helper->{VARS}->{FINISHPAGE} = ''; |
|
|
|
&Apache::loncommon::restore_course_settings('print', |
&Apache::loncommon::restore_course_settings('print', |
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
|
'extraspace' => 'scalar', |
|
'extraspace_units' => 'scalar', |
'lastprinttype' => 'scalar'}); |
'lastprinttype' => 'scalar'}); |
|
|
# This will persistently load in the data we want from the |
# This will persistently load in the data we want from the |
Line 3105 sub printHelper {
|
Line 4181 sub printHelper {
|
if (!defined ($env{"form.CURRENT_STATE"})) { |
if (!defined ($env{"form.CURRENT_STATE"})) { |
|
|
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
|
$helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; |
|
$helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; |
} else { |
} else { |
my $state = $env{"form.CURRENT_STATE"}; |
my $state = $env{"form.CURRENT_STATE"}; |
if ($state eq "START") { |
if ($state eq "START") { |
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
|
$helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; |
|
$helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; |
|
|
} |
} |
} |
} |
|
|
} |
} |
|
|
# Detect whether we're coming from construction space |
# Detect whether we're coming from construction space |
if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { |
if ($env{'form.postdata'}=~m{^/priv}) { |
$helper->{VARS}->{'filename'} = "~$1/$2"; |
$helper->{VARS}->{'filename'} = $env{'form.postdata'}; |
$helper->{VARS}->{'construction'} = 1; |
$helper->{VARS}->{'construction'} = 1; |
} else { |
} else { |
if ($env{'form.postdata'}) { |
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 '') { |
if ( $helper->{VARS}->{'symb'} eq '') { |
$helper->{VARS}->{'postdata'} = $env{'form.postdata'}; |
$helper->{VARS}->{'postdata'} = $env{'form.postdata'}; |
} |
} |
Line 3129 sub printHelper {
|
Line 4212 sub printHelper {
|
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
} |
} |
if ($env{'form.url'}) { |
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'}) { |
if ($helper->{VARS}->{'symb'} ne '') { |
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
$helper->{VARS}->{'symb'}= |
} |
&Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); |
if ($env{'form.url'}) { |
} |
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); |
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;} |
if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} |
|
|
|
|
Line 3152 sub printHelper {
|
Line 4256 sub printHelper {
|
my ($map, $id, $url); |
my ($map, $id, $url); |
my $subdir; |
my $subdir; |
my $is_published=0; # True when printing from resource space. |
my $is_published=0; # True when printing from resource space. |
|
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; |
|
my $map_open = 0; |
|
my $map_close = 0xffffffff; |
|
my $course_open = 0; |
|
my $course_close = 0xffffffff; |
|
|
# Get the resource name from construction space |
# Get the resource name from construction space |
if ($helper->{VARS}->{'construction'}) { |
if ($helper->{VARS}->{'construction'}) { |
Line 3166 sub printHelper {
|
Line 4279 sub printHelper {
|
($map, $id, $url) = &Apache::lonnet::decode_symb($symb); |
($map, $id, $url) = &Apache::lonnet::decode_symb($symb); |
$helper->{VARS}->{'postdata'} = |
$helper->{VARS}->{'postdata'} = |
&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); |
&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); |
|
} 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 { |
} else { |
|
# Resource space. |
|
|
$url = $helper->{VARS}->{'postdata'}; |
$url = $helper->{VARS}->{'postdata'}; |
$is_published=1; # From resource space. |
$is_published=1; # From resource space. |
} |
} |
Line 3175 sub printHelper {
|
Line 4320 sub printHelper {
|
my $postdata = $helper->{VARS}->{'postdata'}; |
my $postdata = $helper->{VARS}->{'postdata'}; |
$resourceTitle = substr($postdata, rindex($postdata, '/') + 1); |
$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); |
|
} |
|
|
|
|
} |
} |
if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { |
if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { |
$helper->{VARS}->{'curseed'}=$env{'form.curseed'}; |
$helper->{VARS}->{'curseed'}=$env{'form.curseed'}; |
} |
} |
|
|
if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) { |
if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) { |
$helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'}; |
$helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'}; |
} |
} |
Line 3205 sub printHelper {
|
Line 4357 sub printHelper {
|
my $printChoices = []; |
my $printChoices = []; |
my $paramHash; |
my $paramHash; |
|
|
if ($resourceTitle) { |
# If there is a current resource and it is printable |
|
# Give that as a choice. |
|
|
|
if ($resourceTitle && $res_printable) { |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; |
} |
} |
|
|
# Useful filter strings |
# Useful filter strings |
my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) '; |
|
|
my $isPrintable = ' && $res->resprintable()'; |
|
|
|
my $isProblem = '(($res->is_problem()||$res->contains_problem() ||$res->is_practice()))'; |
|
$isProblem .= $isPrintable unless $userCanPrint; |
$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; |
$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; |
my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()'; |
my $isProblemOrMap = '($res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; |
my $isNotMap = '!$res->is_sequence()'; |
$isProblemOrMap .= $isPrintable unless $userCanPrint; |
|
my $isNotMap = '(!$res->is_sequence())'; |
|
$isNotMap .= $isPrintable unless $userCanPrint; |
$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; |
$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; |
my $isMap = '$res->is_map()'; |
my $isMap = '$res->is_map()'; |
my $symbFilter = '$res->shown_symb()'; |
$isMap .= $isPrintable unless $userCanPrint; |
|
my $symbFilter = '$res->shown_symb() '; |
my $urlValue = '$res->link()'; |
my $urlValue = '$res->link()'; |
|
|
$helper->declareVar('SEQUENCE'); |
$helper->declareVar('SEQUENCE'); |
Line 3226 sub printHelper {
|
Line 4388 sub printHelper {
|
my $start_new_option; |
my $start_new_option; |
if ($perm{'pav'}) { |
if ($perm{'pav'}) { |
$start_new_option = |
$start_new_option = |
"<option text='".&mt('Start new page<br />before selected'). |
"<option text='".&mt('Start new page[_1]before selected','<br />'). |
"' variable='FINISHPAGE' />"; |
"' variable='FINISHPAGE' />". |
|
"<option text='".&mt('Extra space[_1]before selected','<br />'). |
|
"' variable='EXTRASPACE' type='text' />" . |
|
"<option " . |
|
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
|
"<option text='".&mt('Space units[_1]check for mm','<br />'). |
|
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
|
; |
|
|
|
|
} |
} |
|
|
# If not construction space user can print the components of a page: |
# If not construction space user can print the components of a page: |
Line 3257 sub printHelper {
|
Line 4428 sub printHelper {
|
} |
} |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1'", |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1' modallink='1'", |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
Line 3267 sub printHelper {
|
Line 4438 sub printHelper {
|
|
|
$helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', |
$helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', |
'Select Resource(s) to print', |
'Select Resource(s) to print', |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
$isNotMap, '', $symbFilter, |
$isNotMap, '', $symbFilter, |
$start_new_option); |
$start_new_option); |
|
|
|
|
|
|
|
|
|
|
Line 3287 sub printHelper {
|
Line 4458 sub printHelper {
|
if (($helper->{'VAR'}->{'construction'} ne '1' ) && |
if (($helper->{'VAR'}->{'construction'} ne '1' ) && |
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'assignment'}) { |
$helper->{VARS}->{'assignment'}) { |
|
|
|
# BZ 5209 - Print incomplete problems from sequence: |
|
# the exact form of this depends on whether or not we are privileged or a mere |
|
# plebe of s student: |
|
|
|
my $optionText = ''; |
|
my $printSelector = 'map_incomplete_problems_seq'; |
|
my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; |
|
my $textSuffix = ''; |
|
my $nocurrloc = ''; |
|
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$nocurrloc = 1; |
|
} |
|
|
|
if ($userCanPrint) { |
|
$printSelector = 'map_incomplete_problems_people_seq'; |
|
$nextState = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ'; |
|
$textSuffix = ' for selected students'; |
|
my $helperStates = |
|
&create_incomplete_folder_selstud_helper($helper, $map, $nocurrloc); |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
if (&printable($map_open, $map_close)) { |
|
my $helperStates = &create_incomplete_folder_helper($helper, $map, $nocurrloc); # Create needed states for student. |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
# TODO: Figure out how to break the news...this folder is not printable. |
|
} |
|
} |
|
|
|
if ($userCanPrint || &printable($map_open, $map_close)) { |
|
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$optionText = &mt('Selected [_1]Incomplete Problems[_2] [_3]not in a folder[_4]' . $textSuffix, |
|
'<b>','</b>','<i>','</i>'); |
|
} else { |
|
$optionText = &mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, |
|
'<b>','</b>','<b><i>'.$sequenceTitle.'</b></i>'); |
|
} |
|
push(@{$printChoices}, |
|
[$optionText, |
|
$printSelector, |
|
$nextState]); |
|
} |
# Allow problems from sequence |
# Allow problems from sequence |
push @{$printChoices}, |
if ($userCanPrint || &printable($map_open, $map_close)) { |
[&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$optionText = &mt('Selected [_1]Problems[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>'); |
|
} else { |
|
$optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'); |
|
} |
|
push @{$printChoices}, |
|
[$optionText, |
'map_problems', |
'map_problems', |
'CHOOSE_PROBLEMS']; |
'CHOOSE_PROBLEMS']; |
# Allow all resources from sequence |
# Allow all resources from sequence |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
'map_problems_pages', |
$optionText = &mt('Selected [_1]Resources[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>'); |
'CHOOSE_PROBLEMS_HTML']; |
} else { |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
$optionText = &mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'); |
'Select Problem(s) to print', |
} |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
push @{$printChoices}, [$optionText, |
'RESOURCES', |
'map_problems_pages', |
'PAGESIZE', |
'CHOOSE_PROBLEMS_HTML']; |
$map, |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
$isProblem, '', |
'Select Problem(s) to print', |
$symbFilter, |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
$start_new_option); |
'RESOURCES', |
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
'PAGESIZE', |
'Select Resource(s) to print', |
$map, |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
$isProblem, '', |
'RESOURCES', |
$symbFilter, |
'PAGESIZE', |
$start_new_option); |
$map, |
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
$isNotMap, '', |
'Select Resource(s) to print', |
$symbFilter, |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'" suppressNavmap="1"', |
$start_new_option); |
'RESOURCES', |
|
'PAGESIZE', |
|
$map, |
|
$isNotMap, '', |
|
$symbFilter, |
|
$start_new_option); |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
|
} else { |
|
# TODO: Figure out how to tell them the folder is not printable. |
|
} |
|
} |
|
# If the user has pfo (print for others) allow them to print all |
|
# problems and resources in the entire course, optionally for selected students |
|
my $post_data = $helper->{VARS}->{'postdata'}; |
|
|
|
if ($perm{'pfo'} && !$is_published && |
|
($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
|
|
|
# BZ 5209 - incomplete problems from entire course: |
|
|
|
push(@{$printChoices}, |
|
[&mt('Selected [_1]Incomplete Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); |
|
my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. |
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
} |
|
|
|
# If the user has pfo (print for others) allow them to print all |
# Selected problems/resources from entire course: |
# problems and resources in the entire course, optionally for selected students |
|
my $post_data = $helper->{VARS}->{'postdata'}; |
|
if ($perm{'pfo'} && !$is_published && |
|
($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
|
|
|
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES']; |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_resources', 'ALL_RESOURCES']; |
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]','<b>','</b>','<b>','</b>','<b>','</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; |
my $suffixXml = <<ALL_PROBLEMS; |
my $suffixXml = <<ALL_PROBLEMS; |
<state name="STUDENTS1" title="Select People"> |
<state name="STUDENTS1" title="Select People"> |
<message><b>Select sorting order of printout</b> </message> |
<message><b>Select sorting order of printout</b> </message> |
Line 3340 my $suffixXml = <<ALL_PROBLEMS;
|
Line 4580 my $suffixXml = <<ALL_PROBLEMS;
|
ALL_PROBLEMS |
ALL_PROBLEMS |
&Apache::lonxml::xmlparse($r, 'helper', |
&Apache::lonxml::xmlparse($r, 'helper', |
&generate_resource_chooser('ALL_PROBLEMS', |
&generate_resource_chooser('ALL_PROBLEMS', |
'SelectProblem(s) to print', |
'Select Problem(s) to print', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3350 ALL_PROBLEMS
|
Line 4590 ALL_PROBLEMS
|
$start_new_option) . |
$start_new_option) . |
&generate_resource_chooser('ALL_RESOURCES', |
&generate_resource_chooser('ALL_RESOURCES', |
'Select Resource(s) to print', |
'Select Resource(s) to print', |
" toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'", |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3358 ALL_PROBLEMS
|
Line 4598 ALL_PROBLEMS
|
$start_new_option) . |
$start_new_option) . |
&generate_resource_chooser('ALL_PROBLEMS_STUDENTS', |
&generate_resource_chooser('ALL_PROBLEMS_STUDENTS', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'STUDENTS1', |
'STUDENTS1', |
'', |
'', |
Line 3388 ALL_PROBLEMS
|
Line 4628 ALL_PROBLEMS
|
'problems_for_anon', 'CHOOSE_ANON1']; |
'problems_for_anon', 'CHOOSE_ANON1']; |
} |
} |
|
|
my $randomly_ordered_warning = |
my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) = |
&get_randomly_ordered_warning($helper,$map); |
&generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option); |
|
|
# resource_selector will hold a few states that: |
if ($helper->{VARS}->{'assignment'}) { |
# - Allow resources to be selected for printing. |
|
# - Determine pagination between assignments. |
|
# - Determine how many assignments should be bundled into a single PDF. |
|
# TODO: |
|
# Probably good to do things like separate this up into several vars, each |
|
# with one state, and use REGEXPs at inclusion time to set state names |
|
# and next states for better mix and match capability |
|
# |
|
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
|
'Select resources to print', |
|
'multichoice="1" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$map, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
$resource_selector .= <<RESOURCE_SELECTOR; |
|
<state name="PRINT_FORMATTING" title="How should results be printed?"> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
<choice computer="sections">Each PDF contains exactly one section</choice> |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
|
$resource_selector .= &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' addstatus='1' closeallpages ='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='<choice></choice>'; |
|
foreach my $name (sort {uc($a) cmp uc($b)} @names) { |
|
if ($name =~ /^error: 2 /) { next; } |
|
if ($name =~ /^type\0/) { next; } |
|
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
|
} |
|
|
|
|
|
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 .=' |
|
<message><b>Choose single CODE from list:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
<choice></choice> |
|
<exec> |
|
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
|
</exec> |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
|
'.$/; |
|
|
|
} |
|
|
|
my @lines = &Apache::grades::get_scantronformat_file(); |
|
my $codechoice=''; |
|
foreach my $line (@lines) { |
|
my ($name,$description,$code_type,$code_length)= |
|
(split(/:/,$line))[0,1,2,4]; |
|
if ($code_length > 0 && |
|
$code_type =~/^(letter|number|-1)/) { |
|
$codechoice.='<choice computer="'.$name.'">'.$description.'</choice>'; |
|
} |
|
} |
|
if ($codechoice eq '') { |
|
$codechoice='<choice computer="default">Default</choice>'; |
|
} |
|
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'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
&Apache::lonxml::xmlparse($r, 'helper', $anon_page); |
|
|
|
|
# Assignment printing: |
|
|
if ($helper->{VARS}->{'assignment'}) { |
|
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1']; |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1']; |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2']; |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2']; |
} |
} |
|
|
|
|
$resource_selector=<<RESOURCE_SELECTOR; |
# resource_selector will hold a few states that: |
|
# - Allow resources to be selected for printing. |
|
# - Determine pagination between assignments. |
|
# - Determine how many assignments should be bundled into a single PDF. |
|
# TODO: |
|
# Probably good to do things like separate this up into several vars, each |
|
# with one state, and use REGEXPs at inclusion time to set state names |
|
# and next states for better mix and match capability |
|
# |
|
|
|
my $resource_selector=<<RESOURCE_SELECTOR; |
<state name="SELECT_RESOURCES" title="Select Resources"> |
<state name="SELECT_RESOURCES" title="Select Resources"> |
$randomly_ordered_warning |
$randomly_ordered_warning |
<nextstate>PRINT_FORMATTING</nextstate> |
<nextstate>PRINT_FORMATTING</nextstate> |
<message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message> |
<message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message> |
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
closeallpages="1"> |
closeallpages="1" modallink="1"> |
<filterfunc>return $isNotMap;</filterfunc> |
<filterfunc>return $isNotMap;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
$start_new_option |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
|
|
<state name="PRINT_FORMATTING" title="Format of the print job"> |
|
<nextstate>NUMBER_PER_PDF</nextstate> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
<choice computer="sections">Each PDF contains exactly one section</choice> |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
RESOURCE_SELECTOR |
|
|
|
$resource_selector .= &generate_format_selector($helper, |
|
'Format of the print job', |
|
'PRINT_FORMATTING'); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<choices variable='student_sort'> |
<choices variable='student_sort'> |
Line 3598 CHOOSE_STUDENTS1
|
Line 4687 CHOOSE_STUDENTS1
|
<message><br /><hr /> <br /></message> |
<message><br /><hr /> <br /></message> |
<message><h3>Generate new CODEd Assignments</h3></message> |
<message><h3>Generate new CODEd Assignments</h3></message> |
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5" noproceed="1"> |
<validator> |
<validator> |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
Line 3606 CHOOSE_STUDENTS1
|
Line 4695 CHOOSE_STUDENTS1
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return "You need to specify the number of assignments to print"; |
return "You need to specify the number of assignments to print"; |
} |
} |
|
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) >= 1) && |
|
(\$helper->{'VARS'}{'SINGLE_CODE'} ne '') ) { |
|
return 'Specifying number of codes to print and a specific code is not compatible'; |
|
} |
return undef; |
return undef; |
</validator> |
</validator> |
</string> |
</string> |
Line 3614 CHOOSE_STUDENTS1
|
Line 4707 CHOOSE_STUDENTS1
|
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Bubble sheet type:</b></message> |
<message><b>Bubblesheet type:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$codechoice |
$codechoice |
Line 3629 CHOOSE_STUDENTS1
|
Line 4722 CHOOSE_STUDENTS1
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
\$helper->{'VARS'}{'CODE_OPTION'}); |
\$helper->{'VARS'}{'CODE_OPTION'}); |
|
} elsif (\$helper->{'VARS'}{'SINGLE_CODE'} ne ''){ |
|
return 'Specifying a code name is incompatible specifying number of codes.'; |
} else { |
} else { |
return undef; # Other forces control us. |
return undef; # Other forces control us. |
} |
} |
Line 3651 CHOOSE_ANON2
|
Line 4746 CHOOSE_ANON2
|
|
|
# FIXME: That RE should come from a library somewhere. |
# FIXME: That RE should come from a library somewhere. |
if (($perm{'pav'} |
if (($perm{'pav'} |
|
&& ($subdir ne '') |
&& $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' |
&& $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' |
&& (defined($helper->{'VARS'}->{'construction'}) |
&& (defined($helper->{'VARS'}->{'construction'}) |
|| |
|| |
Line 3684 CHOOSE_FROM_SUBDIR
|
Line 4780 CHOOSE_FROM_SUBDIR
|
|
|
# Allow the user to select any sequence in the course, feed it to |
# Allow the user to select any sequence in the course, feed it to |
# another resource selector for that sequence |
# another resource selector for that sequence |
if (!$helper->{VARS}->{'construction'} && !$is_published) { |
if ((!$helper->{VARS}->{'construction'}) && |
push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"), |
(!$is_published || (($subdir eq '') && ($url eq '/adm/navmaps')))) { |
'select_sequences', 'CHOOSE_SEQUENCE']; |
push(@$printChoices,[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course', |
my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
'<b>','</b>','<b>','</b>'), |
#Escape apostrophes and backslashes for Perl |
'select_sequences','CHOOSE_SEQUENCE']); |
$escapedSequenceName =~ s/\\/\\\\/g; |
my $escapedSequenceName; |
$escapedSequenceName =~ s/'/\\'/g; |
if ($helper->{VARS}->{'SEQUENCE'} ne '') { |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
$escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
|
} elsif (($subdir eq '') && ($url eq '/adm/navmaps')) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
|
"uploaded/$cdom/$cnum/default.sequence") { |
|
$escapedSequenceName = $env{'course.'.$env{'request.course.id'}.'.url'}; |
|
} |
|
} |
|
#Escape apostrophes and backslashes for Perl |
|
$escapedSequenceName =~ s/\\/\\\\/g; |
|
$escapedSequenceName =~ s/'/\\'/g; |
|
my $nocurrloc; |
|
if (($subdir eq '') && ($url eq '/adm/navmaps')) { |
|
$nocurrloc = 'nocurrloc="1"'; |
|
if ($perm{'pfo'}) { |
|
push(@{$printChoices}, |
|
[&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_problems_for_students','CHOOSE_SEQUENCE_STUDENTS'], |
|
[&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_problems_for_anon','CHOOSE_SEQUENCE_ANON1'], |
|
[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_resources_for_students','CHOOSE_SEQUENCE_STUDENTS1'], |
|
[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_resources_for_anon','CHOOSE_SEQUENCE_ANON2']); |
|
if ($escapedSequenceName) { |
|
&generate_common_choosers($r,$helper,$escapedSequenceName,$escapedSequenceName,$isProblem,$symbFilter,$start_new_option); |
|
} |
|
} |
|
} |
|
if (($subdir eq '') && ($url eq '/adm/navmaps') && ($perm{'pfo'})) { |
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
|
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_STUDENTS" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_STUDENTS</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_ANON1" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_ANON1</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_STUDENTS1" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_STUDENTS</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_ANON2" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_ANON1</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
|
<message>(mark desired resources then click "next" button) <br /></message> |
|
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
|
closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> |
|
<nextstate>PAGESIZE</nextstate> |
|
<filterfunc>return $isNotMap</filterfunc> |
|
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
CHOOSE_FROM_ANY_SEQUENCE |
|
} else { |
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
<message>Select the sequence to print resources from:</message> |
<message>Select the sequence to print resources from:</message> |
<resource variable="SEQUENCE"> |
<resource variable="SEQUENCE"> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<filterfunc>return \$res->is_sequence;</filterfunc> |
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
<valuefunc>return $urlValue;</valuefunc> |
<valuefunc>return $urlValue;</valuefunc> |
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
</choicefunc> |
</choicefunc> |
Line 3705 CHOOSE_FROM_SUBDIR
|
Line 4900 CHOOSE_FROM_SUBDIR
|
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
<message>(mark desired resources then click "next" button) <br /></message> |
<message>(mark desired resources then click "next" button) <br /></message> |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
closeallpages="1"> |
closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isNotMap</filterfunc> |
<filterfunc>return $isNotMap</filterfunc> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
Line 3714 CHOOSE_FROM_SUBDIR
|
Line 4909 CHOOSE_FROM_SUBDIR
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_FROM_ANY_SEQUENCE |
CHOOSE_FROM_ANY_SEQUENCE |
} |
} |
|
} |
|
my $numchoices = 0; |
|
if (ref($printChoices) eq 'ARRAY') { |
|
$numchoices = @{$printChoices}; |
|
} |
|
# Early out if nothing to print |
|
if (!$numchoices) { |
|
$r->print(&Apache::loncommon::start_page('Printing Helper'). |
|
'<h2>'.&mt('Unable to determine print context').'</h2>'. |
|
'<p>'.&mt('Please display a resource, and then click the "Print" button/icon').'</p>'); |
|
my $prtspool=$r->dir_config('lonPrtDir'); |
|
my $footer = &recently_generated($prtspool); |
|
$r->print($footer.&Apache::loncommon::end_page()); |
|
return OK; |
|
} |
|
|
# Generate the first state, to select which resources get printed. |
# Generate the first state, to select which resources get printed. |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
|
if (!$res_printable) { |
|
my $noprintmsg; |
|
if ($res_error) { |
|
$noprintmsg = &mt('Print availability for current resource could not be determined'); |
|
} else { |
|
my $now = time; |
|
my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate); |
|
my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate); |
|
if (($res_printenddate) && ($res_printenddate < $now)) { |
|
$noprintmsg = &mt('Printing for current resource no longer available (ended: [_1])', |
|
$shownprintend); |
|
} else { |
|
if (($res_printstartdate) && ($res_printstartdate > $now)) { |
|
if (($res_printenddate) && ($res_printenddate > $now) && ($res_printenddate > $res_printstartdate)) { |
|
$noprintmsg = &mt('Printing for current resource is only possible between [_1] and [_2]', |
|
$shownprintstart,$shownprintend); |
|
} elsif (!$res_printenddate) { |
|
$noprintmsg = &mt('Printing for current resource will only be possible starting [_1]', |
|
$shownprintstart); |
|
} else { |
|
$noprintmsg = &mt('Printing for current resource is unavailable'); |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ($noprintmsg) { |
|
$paramHash = Apache::lonhelper::getParamHash(); |
|
$paramHash->{MESSAGE_TEXT} = |
|
'<p class="LC_info">'.$noprintmsg.'</p>'; |
|
Apache::lonhelper::message->new(); |
|
} |
|
} |
|
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{MESSAGE_TEXT} = ""; |
$paramHash->{MESSAGE_TEXT} = ""; |
Apache::lonhelper::message->new(); |
Apache::lonhelper::message->new(); |
Line 3729 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4973 CHOOSE_FROM_ANY_SEQUENCE
|
my $startedTable = 0; # have we started an HTML table yet? (need |
my $startedTable = 0; # have we started an HTML table yet? (need |
# to close it later) |
# to close it later) |
|
|
if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or |
if (($perm{'pav'} and $perm{'vgr'}) or |
($helper->{VARS}->{'construction'} eq '1')) { |
($helper->{VARS}->{'construction'} eq '1')) { |
&addMessage('<br />' |
&addMessage('<br />' |
.'<h3>'.&mt('Print Options').'</h3>' |
.'<h3>'.&mt('Print Options').'</h3>' |
Line 3761 CHOOSE_FROM_ANY_SEQUENCE
|
Line 5005 CHOOSE_FROM_ANY_SEQUENCE
|
my $xmlfrag = << "FONT_SELECTION"; |
my $xmlfrag = << "FONT_SELECTION"; |
|
|
|
|
<dropdown variable='fontsize' multichoice='0', allowempty='0'> |
<dropdown variable='fontsize' multichoice='0' allowempty='0'> |
<defaultvalue> |
<defaultvalue> |
return 'normalsize'; |
return 'normalsize'; |
</defaultvalue> |
</defaultvalue> |
Line 3939 FONT_SELECTION
|
Line 5183 FONT_SELECTION
|
return "$helper->{VARS}->{'probstatus'}"; |
return "$helper->{VARS}->{'probstatus'}"; |
</defaultvalue> |
</defaultvalue> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="exam">Exam Problem</choice> |
<choice computer="exam">Bubblesheet Exam Problem</choice> |
<choice computer="survey">Survey question</choice> |
<choice computer="survey">Survey question</choice> |
|
,choice computer="anonsurvey"Anonymous survey question</choice> |
</dropdown> |
</dropdown> |
PROBTYPE |
PROBTYPE |
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); |
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); |
Line 3977 PROBTYPE
|
Line 5222 PROBTYPE
|
|
|
my $footer; |
my $footer; |
if ($helper->{STATE} eq 'START') { |
if ($helper->{STATE} eq 'START') { |
my $prtspool=$r->dir_config('lonPrtDir'); |
my $prtspool=$r->dir_config('lonPrtDir'); |
$footer = &recently_generated($prtspool); |
$footer = &recently_generated($prtspool); |
} |
} |
$r->print($helper->display($footer)); |
$r->print($helper->display($footer)); |
&Apache::lonhelper::unregisterHelperTags(); |
&Apache::lonhelper::unregisterHelperTags(); |
Line 4056 sub render {
|
Line 5301 sub render {
|
my $PaperType=&mt('Paper type'); |
my $PaperType=&mt('Paper type'); |
my $landscape=&mt('Landscape'); |
my $landscape=&mt('Landscape'); |
my $portrait=&mt('Portrait'); |
my $portrait=&mt('Portrait'); |
|
my $pdfFormLabel=&mt('PDF Form Fields'); |
|
my $with=&mt('with Form Fields'); |
|
my $without=&mt('without Form Fields'); |
|
|
|
|
$result.='<h3>'.&mt('Layout Options').'</h3>' |
$result.='<h3>'.&mt('Layout Options').'</h3>' |
Line 4064 sub render {
|
Line 5312 sub render {
|
.'<th>'.$PageLayout.'</th>' |
.'<th>'.$PageLayout.'</th>' |
.'<th>'.$NumberOfColumns.'</th>' |
.'<th>'.$NumberOfColumns.'</th>' |
.'<th>'.$PaperType.'</th>' |
.'<th>'.$PaperType.'</th>' |
|
.'<th>'.$pdfFormLabel.'</th>' |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::start_data_table_row() |
.&Apache::loncommon::start_data_table_row() |
.'<td>' |
.'<td>' |
Line 4103 sub render {
|
Line 5352 sub render {
|
} |
} |
$result .= <<HTML; |
$result .= <<HTML; |
</select> |
</select> |
<hidden name="${var}.pdfFormFields" value="no" /> |
</td> |
|
<td align='center'> |
|
<select name='${var}.pdfFormFields'> |
|
<option selected="selected" value="no">$without</option> |
|
<option value="yes">$with</option> |
|
</select> |
</td> |
</td> |
HTML |
HTML |
$result.=&Apache::loncommon::end_data_table_row() |
$result.=&Apache::loncommon::end_data_table_row() |
Line 4350 sub postprocess {
|
Line 5604 sub postprocess {
|
} |
} |
} |
} |
|
|
|
|
|
|
__END__ |
__END__ |
|
|