version 1.537, 2008/08/25 10:16:27
|
version 1.617, 2012/05/28 10:44:42
|
Line 26
|
Line 26
|
# |
# |
# |
# |
package Apache::lonprintout; |
package Apache::lonprintout; |
|
|
use strict; |
use strict; |
|
use POSIX; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::lonnet; |
use Apache::lonnet; |
Line 40 use Apache::lonnavmaps;
|
Line 40 use Apache::lonnavmaps;
|
use Apache::admannotations; |
use Apache::admannotations; |
use Apache::lonenc; |
use Apache::lonenc; |
use Apache::entities; |
use Apache::entities; |
|
use Apache::londefdef; |
|
# use Apache::structurelags; # for language management. |
|
|
use HTTP::Response; |
use File::Basename; |
|
|
|
use HTTP::Response; |
use LONCAPA::map(); |
use LONCAPA::map(); |
use POSIX qw(strftime); |
use POSIX qw(ctime); |
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 67 my $ssi_last_error; # The error text fr
|
Line 71 my $ssi_last_error; # The error text fr
|
my $ssi_retry_count = 5; # Some arbitrary value. |
my $ssi_retry_count = 5; # Some arbitrary value. |
|
|
|
|
|
# Font size: |
|
|
|
my $font_size = 'normalsize'; # Default is normalsize... |
|
|
|
#---------------------------- Helper helpers. ------------------------- |
|
|
|
## |
|
# 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. |
|
# url - Top url of the sequence |
|
# Return: |
|
# XML that can be parsed by the helper to drive the state machine. |
|
# |
|
sub create_incomplete_folder_selstud_helper($helper) |
|
{ |
|
my ($helper, $map) = @_; |
|
|
|
|
|
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"', |
|
'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"', |
|
'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. |
|
# Returns: |
|
# XML that defines the helper states being created. |
|
# |
|
# States: |
|
# CHOOSE_INCOMPLETE_SEQ - Resource selector. |
|
# |
|
sub create_incomplete_folder_helper { |
|
my ($helper, $map) = @_; |
|
|
|
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"', |
|
'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. |
|
# Parameters: |
|
# this_state - State name of the chooser. |
|
# sort_choice - variable to hold the sorting choice. |
|
# variable - Name of variable to hold students. |
|
# next_state - State after chooser. |
|
|
|
|
|
sub generate_student_chooser { |
|
my ($this_state, |
|
$sort_choice, |
|
$variable, |
|
$next_state) = @_; |
|
my $result = <<CHOOSE_STUDENTS; |
|
<state name="$this_state" title="Select Students and Resources"> |
|
<message><b>Select sorting order of printout</b> </message> |
|
|
|
<choices variable="$sort_choice"> |
|
<choice computer='0'>Sort by section then student</choice> |
|
<choice computer='1'>Sort by students across sections.</choice> |
|
</choices> |
|
|
|
<message><br /><hr /><br /> </message> |
|
<student multichoice='1' |
|
variable="$variable" |
|
nextstate="$next_state" |
|
coursepersonnel="1" /> |
|
</state> |
|
|
|
CHOOSE_STUDENTS |
|
|
|
return $result; |
|
} |
|
|
|
# Generate the text needed for a resource chooser given the top level of |
|
# the sequence/page |
|
# |
|
# Parameters: |
|
# this_state - State name of the chooser. |
|
# prompt_text - Text to use to prompt user. |
|
# resource_options - Resource tag options e.g. |
|
# "multichoice='1', toponly='1', addstatus='1'" |
|
# that control the selection and appearance of the |
|
# resource selector. |
|
# variable - Name of the variable to hold the choice |
|
# next_state - Name of the next state the helper should transition |
|
# to |
|
# top_url - Top level URL within which to make the selector. |
|
# If empty the top level sequence is shown. |
|
# filter - How to filter the resources. |
|
# value_func - <valuefunc> function. |
|
# choice_func - If not empty generates a <choicefunc> with this function. |
|
# start_new_option |
|
# - Fragment appended after valuefunc. |
|
# |
|
# |
|
sub generate_resource_chooser { |
|
my ($this_state, |
|
$prompt_text, |
|
$resource_options, |
|
$variable, |
|
$next_state, |
|
$top_url, |
|
$filter, |
|
$choice_func, |
|
$value_func, |
|
$start_new_option) = @_; |
|
|
|
my $result = <<CHOOSE_RESOURCES; |
|
<state name="$this_state" title="$prompt_text"> |
|
<resource variable="$variable" $resource_options |
|
closeallpages="1"> |
|
<nextstate>$next_state</nextstate> |
|
<filterfunc>return $filter;</filterfunc> |
|
CHOOSE_RESOURCES |
|
if ($choice_func ne '') { |
|
$result .= "<choicefunc>return $choice_func;</choicefunc>"; |
|
} |
|
if ($top_url ne '') { |
|
$result .= "<mapurl>$top_url</mapurl>"; |
|
} |
|
$result .= <<CHOOSE_RESOURCES; |
|
<valuefunc>return $value_func;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
CHOOSE_RESOURCES |
|
return $result; |
|
} |
|
# |
|
# Generate the helper XML for a code choice helper dialog: |
|
# |
|
# Paramters: |
|
# $helper - Reference to the helper. |
|
# $state - Name of the state for the chooser. |
|
# $next_state - Name fo the state to follow the chooser. |
|
# $bubble_types - Populates the bubble sheet type dropt down. |
|
# $code_selections - Provides set of code choices that have been used |
|
# $saved_codes - Provides the list of saved codes. |
|
# |
|
# Returns; |
|
# The Xml of the code chooser. |
|
# |
|
sub generate_code_selector { |
|
my ($helper, |
|
$state, |
|
$next_state, |
|
$bubble_types, |
|
$code_selections, |
|
$saved_codes) = @_; # Unpack the parameters. |
|
|
|
my $result = <<CHOOSE_ANON1; |
|
<state name="$state" title="Specify CODEd Assignments"> |
|
<nextstate>$next_state</nextstate> |
|
<message><h4>Fill out one of the forms below</h4></message> |
|
<message><br /><hr /> <br /></message> |
|
<message><h3>Generate new CODEd Assignments</h3></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" noproceed="1"> |
|
<validator> |
|
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
|
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'} ) { |
|
|
|
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; |
|
</validator> |
|
</string> |
|
<message></td></tr><tr><td></message> |
|
<message><b>Names to save the CODEs under for later:</b></message> |
|
<message></td><td></message> |
|
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
|
<message></td></tr><tr><td></message> |
|
<message><b>Bubblesheet type:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
|
$bubble_types |
|
</dropdown> |
|
<message></td></tr><tr><td colspan="2"></td></tr><tr><td></message> |
|
<message></td></tr><tr><td></table></message> |
|
<message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message> |
|
<message><tr><td><b>Enter a CODE to print:</b></td><td></message> |
|
<string variable="SINGLE_CODE" size="10"> |
|
<validator> |
|
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
|
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
|
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
|
\$helper->{'VARS'}{'CODE_OPTION'}); |
|
} elsif (\$helper->{'VARS'}{'SINGLE_CODE'} ne ''){ |
|
return 'Specifying a code name is incompatible with specifying number of codes.'; |
|
} else { |
|
return undef; # Other forces control us. |
|
} |
|
</validator> |
|
</string> |
|
<message></td></tr><tr><td></message> |
|
$code_selections |
|
<message></td></tr></table></message> |
|
<message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message> |
|
<message><b>Select saved CODEs:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="REUSE_OLD_CODES"> |
|
$saved_codes |
|
</dropdown> |
|
<message></td></tr></table></message> |
|
</state> |
|
CHOOSE_ANON1 |
|
|
|
return $result; |
|
} |
|
|
|
# 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') ) { |
|
$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 retunred 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 (defined($earliest_close) && defined($latest_open) |
|
&& ($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 retunred 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 get_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
|
|
|
|
if (defined(@parts) && (scalar(@parts) > 0)) { |
|
foreach my $part (@parts) { |
|
my $partopen = $res->parmval('printstartdate', $part); |
|
my $partclose = $res->parmval('printenddate', $part); |
|
|
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
} |
|
|
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
|
|
if ($open_date) { |
|
$open_date = POSIX::strftime('%D', localtime($open_date)); |
|
} |
|
if ($close_date) { |
|
$close_date = POSIX::strftime('%D', localtime($close_date)); |
|
} |
|
|
|
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 (defined(@parts) && (scalar(@parts) > 0)) { |
|
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 (defined(@parts) && (scalar(@parts) > 0)) { |
|
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 resoures 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 selcted to be printed. |
|
# |
|
# Parameters: |
|
# $helper - The helper we need $helper->{'VARS'}->{'symb'} |
|
# to construct the navmap and the iteration. |
|
# $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. |
|
# |
|
# Implicit inputs: |
|
# $ |
|
# Returns: |
|
# reference to an array of resources that can be passed to |
|
# print_resources. |
|
# |
|
sub master_seq_to_person_seq { |
|
my ($helper, $seq, $who) = @_; |
|
|
|
|
|
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 ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); |
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain); |
|
my $iterator = $navmap->getIterator($navmap->firstResource(), |
|
$navmap->finishResource(), |
|
{}, 1); |
|
my %nonResourceItems = ( |
|
$iterator->BEGIN_MAP => 1, |
|
$iterator->BEGIN_BRANCH => 1, |
|
$iterator->END_BRANCH => 1, |
|
$iterator->END_MAP => 1, |
|
$iterator->FORWARD => 1, |
|
$iterator->BACKWARD => 1 |
|
|
|
); # These items are not resources but appear in the midst of iteration. |
|
|
|
# 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 (! exists $nonResourceItems{$curres} && ! $curres->randomout()) { |
|
my $symb = $curres->symb(); |
|
if (exists $seq_hash{$symb}) { |
|
push(@output_seq, $symb); |
|
} |
|
} |
|
} |
|
|
|
|
|
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 97 sub fetch_raw_resource {
|
Line 797 sub fetch_raw_resource {
|
sub annotate { |
sub annotate { |
my ($symb) = @_; |
my ($symb) = @_; |
|
|
my $annotation_text = &Apache::admannotations::get_annotation($symb, 1); |
my $annotation_text = &Apache::loncommon::get_annotation($symb, 1); |
|
|
|
|
my $result = ""; |
my $result = ""; |
Line 111 sub annotate {
|
Line 811 sub annotate {
|
return $result; |
return $result; |
} |
} |
|
|
|
# |
|
# Set a global document font size: |
|
# This is done by replacing \begin{document} |
|
# with \begin{document}{\some-font-directive |
|
# and \end{document} with |
|
# }\end{document |
|
# |
|
sub set_font_size { |
|
|
|
my ($text) = @_; |
|
|
|
# There appear to be cases where the font directive is empty.. in which |
|
# case the first substituion would insert a spurious \ oh happy day. |
|
# as this has been the cause of much mystery and hair pulling _sigh_ |
|
|
|
if ($font_size ne '') { |
|
|
|
$text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; |
|
} |
|
$text =~ s/\\end{document}/}\\end{document}/; |
|
return $text; |
|
|
|
|
|
} |
|
|
|
# include_pdf - PDF files are included into the |
|
# output as follows: |
|
# - The PDF, if necessary, is replicated. |
|
# - The PDF is added to the list of files to convert to postscript (along with the images). |
|
# - The LaTeX is added to include the final converted postscript in the file as an included |
|
# job. The assumption is that the includedpsheader.ps header will be included. |
|
# |
|
# Parameters: |
|
# pdf_uri - URI of the PDF file to include. |
|
# |
|
# Returns: |
|
# The LaTeX to include. |
|
# |
|
# Assumptions: |
|
# The uri is actually a PDF file |
|
# The postscript will have the includepsheader.ps included. |
|
# |
|
# |
|
sub include_pdf { |
|
my ($pdf_uri) = @_; |
|
|
|
# Where is the file? If not local we'll need to repcopy it:' |
|
|
|
my $file = &Apache::lonnet::filelocation('', $pdf_uri); |
|
if (! -e $file) { |
|
&Apache::lonnet::repcopy($file); |
|
$file = &Apache::lonnet::filelocation('',$pdf_uri); |
|
} |
|
|
|
# The file isn ow replicated locally.. or it did not exist in the first place |
|
# (unlikely). If it did exist, add the pdf to the set of files/images that |
|
# need tob e converted for this print job: |
|
|
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$file =~ s{(.*)/res/}{$londocroot/res/}; |
|
|
|
open(FILE,">>$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
|
print FILE ("$file\n"); |
|
close (FILE); |
|
|
|
# Construct the special to put out. To do this we need to get the |
|
# resulting filename after conversion. The file will have the same name |
|
# but will be in the user's spool directory with converted images. |
|
|
|
my $dirname = "/home/httpd/prtspool/$env{'user.name'}/"; |
|
my ( $base, $path, $ext) = &fileparse($file, '.pdf'); |
|
# my $destname = $dirname.'/'.$base.'.eps'; # Not really an eps but easier in printout.pl |
|
$base =~ s/ /\_/g; |
|
|
|
|
|
my $output = &print_latex_header(); |
|
$output .= '\special{ps: _begin_job_ (' |
|
.$base.'.pdf.eps'. |
|
')run _end_job_}'; |
|
|
|
return $output; |
|
|
|
|
|
} |
|
## |
|
# 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. |
# if the ssi call returns an error we'll retry it up to |
# if the ssi call returns an error we'll retry it up to |
# the number of times requested by the caller. |
# the number of times requested by the caller. |
# If we still have a proble, no text is appended to the |
# If we still have a proble, no text is appended to the |
Line 146 sub annotate {
|
Line 953 sub annotate {
|
sub ssi_with_retries { |
sub ssi_with_retries { |
my ($resource, $retries, %form) = @_; |
my ($resource, $retries, %form) = @_; |
|
|
|
my $target = $form{'grade_target'}; |
|
my $aom = $form{'answer_output_mode'}; |
|
|
|
|
|
|
my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form); |
my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form); |
if (!$response->is_success) { |
if (!$response->is_success) { |
Line 153 sub ssi_with_retries {
|
Line 964 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 169 sub get_student_view_with_retries {
|
Line 979 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 234 sub printf_style_subst {
|
Line 1043 sub printf_style_subst {
|
sub format_page_header { |
sub format_page_header { |
my ($width, $format, $assignment, $course, $student, $section) = @_; |
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/1.6); # Character/textline. |
|
|
# Default format? |
# Default format? |
|
|
if ($format eq '') { |
if ($format eq '') { |
Line 249 sub format_page_header {
|
Line 1061 sub format_page_header {
|
# but only truncate the course. |
# but only truncate the course. |
# - Allow the assignment to be 2 lines (wrapped). |
# - Allow the assignment to be 2 lines (wrapped). |
# |
# |
my $chars_per_line = $width/2; # Character/textline. |
|
|
|
|
|
|
|
|
|
my $name_length = int($chars_per_line *3 /4); |
my $name_length = int($chars_per_line *3 /4); |
my $sec_length = int($chars_per_line / 5); |
my $sec_length = int($chars_per_line / 5); |
Line 280 sub format_page_header {
|
Line 1091 sub format_page_header {
|
# to \% else LaTeX will think they are comments and terminate |
# to \% else LaTeX will think they are comments and terminate |
# the line.. which is bad!!! |
# 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('Construction 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 385 sub is_valid_alpha_code {
|
Line 1215 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. |
open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my @lines = &Apache::grades::get_scantronformat_file(); |
foreach my $line (<FG>) { |
foreach my $line (@lines) { |
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 853 sub old_character_chart {
|
Line 1683 sub old_character_chart {
|
$result =~ s/&(rdquo|#8221);/\'\'/g; |
$result =~ s/&(rdquo|#8221);/\'\'/g; |
|
|
|
|
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 990 sub page_format_transformation {
|
Line 1821 sub page_format_transformation {
|
|
|
if ($selectionmade eq '4') { |
if ($selectionmade eq '4') { |
if ($choice eq 'all_problems') { |
if ($choice eq 'all_problems') { |
$assignment='Problems from the Whole Course'; |
$assignment=&mt('Problems from the Whole Course'); |
} else { |
} else { |
$assignment='Resources from the Whole Course'; |
$assignment=&mt('Resources from the Whole Course'); |
} |
} |
} else { |
} else { |
$assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); |
$assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); |
Line 1014 sub page_format_transformation {
|
Line 1845 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\\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\\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{}\\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') { |
$text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/; |
my $papersize_text; |
|
if ($perm{'pav'}) { |
|
$papersize_text = '\\special{papersize=210mm,297mm}'; |
|
} else { |
|
$papersize_text = '\special{papersize=210mm,297mm}'; |
|
} |
|
$text =~ s/(\\begin{document})/$1$papersize_text/; |
} |
} |
} |
} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
Line 1142 sub IndexCreation {
|
Line 1979 sub IndexCreation {
|
|
|
sub print_latex_header { |
sub print_latex_header { |
my $mode=shift; |
my $mode=shift; |
my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom'; |
|
if (($mode eq 'batchmode') || (!$perm{'pav'})) { |
return &Apache::londefdef::latex_header($mode); |
$output.='\batchmode'; |
|
} |
|
$output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". |
|
'\usepackage{multirow}'."\n". |
|
'\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". |
|
'\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". |
|
'\usepackage{wrapfig}'. |
|
'\usepackage{picins}\usepackage{calc}'."\n". |
|
'\usepackage[T1]{fontenc}'."\n". |
|
'\usepackage[postscript]{ucs}'."\n". |
|
'\usepackage[utf8x]{inputenc}'."\n". |
|
'\usepackage{pifont}' . "\n". |
|
'\usepackage{latexsym}'."\n". |
|
'\usepackage{amsmath}'. |
|
'\usepackage{amssymb}'. |
|
'\usepackage{amsfonts}'. |
|
'\usepackage{amsthm}'. |
|
'\usepackage{amscd}'. |
|
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". |
|
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". |
|
'\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". |
|
'\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n". |
|
'\setlength{\abovedisplayshortskip}{-0.04in}'."\n". |
|
'\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n". |
|
'\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n". |
|
'\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n". |
|
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n". |
|
'\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n". |
|
'\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n". |
|
'\setlength{\abovedisplayshortskip}{-0.04in}'."\n". |
|
'\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n"; |
|
return $output; |
|
} |
} |
|
|
sub path_to_problem { |
sub path_to_problem { |
Line 1246 sub unsupported {
|
Line 2051 sub unsupported {
|
return $result; |
return $result; |
} |
} |
|
|
|
# |
|
# Map from helper layout style to the book/album: |
|
# |
|
sub map_laystyle { |
|
my ($laystyle) = @_; |
|
if ($laystyle eq 'L') { |
|
$laystyle='album'; |
|
} else { |
|
$laystyle='book'; |
|
} |
|
return $laystyle; |
|
} |
|
|
|
sub print_page_in_course { |
|
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
|
|
|
my %parmhash = %$rparmhash; |
|
my @page_resources = @$resources; |
|
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
|
my $symb = $helper->{'VARS'}->{'symb'}; |
|
|
|
|
|
my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; |
|
|
|
|
|
my @temporary_array=split /\|/,$format_from_helper; |
|
my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; |
|
$laystyle = &map_laystyle($laystyle); |
|
my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, |
|
$numberofcolumns); |
|
my $LaTeXwidth=&recalcto_mm($textwidth); |
|
|
|
|
|
if ($mode ne '') {$mode='\\'.$mode} |
|
my $result = &print_latex_header($mode); |
|
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
|
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
|
my $title=&Apache::lonnet::gettitle($symb); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
} else { |
|
my $esc_currentURL= $currentURL; |
|
$esc_currentURL =~ s/_/\\_/g; |
|
$result.=$esc_currentURL; |
|
} |
|
$result .= '\\\\'; |
|
|
|
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
|
&Apache::lonnet::appenv({'construct.style' => |
|
$helper->{'VARS'}->{'style_file'}}); |
|
} elsif ($env{'construct.style'}) { |
|
&Apache::lonnet::delenv('construct.style'); |
|
} |
|
|
|
# First is the overall page description. This is then followed by the |
|
# components of the page. Each of which must be printed independently. |
|
my $the_page = shift(@page_resources); |
|
|
|
|
|
foreach my $resource (@page_resources) { |
|
my $resource_src = $resource->src(); # Essentially the URL of the resource. |
|
$result .= $resource->title() . '\\\\'; |
|
|
|
# Recurse if a .page: |
|
|
|
if ($resource_src =~ /.page$/i) { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
my @page_resources = $navmap->retrieveResources($resource_src); |
|
$result .= &print_page_in_course($helper, $rparmhash, |
|
$resource_src, \@page_resources); |
|
} |
|
# these resources go through the XML transformer: |
|
|
|
elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
|
|
my $urlp = &Apache::lonnet::clutter($resource_src); |
|
|
|
my %form; |
|
my %moreenv; |
|
|
|
&Apache::lonxml::remember_problem_counter(); |
|
$moreenv{'request.filename'}=$urlp; |
|
if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';} |
|
|
|
$form{'grade_target'} = 'tex'; |
|
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
|
$form{'pdfFormFields'} = $pdfFormFields; # |
|
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
|
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
|
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
$form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; |
|
$form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'}; |
|
if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') || |
|
($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { |
|
$form{'problem_split'}='yes'; |
|
} |
|
my $rndseed = time; |
|
if ($helper->{'VARS'}->{'curseed'}) { |
|
$rndseed=$helper->{'VARS'}->{'curseed'}; |
|
} |
|
$form{'rndseed'}=$rndseed; |
|
&Apache::lonnet::appenv(\%moreenv); |
|
|
|
&Apache::lonxml::clear_problem_counter(); |
|
|
|
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
|
|
|
|
|
# current document with answers.. no need to encap in minipage |
|
# since there's only one answer. |
|
|
|
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
|
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { |
|
my %answerform = %form; |
|
|
|
|
|
$answerform{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
$answerform{'grade_target'}='answer'; |
|
$answerform{'answer_output_mode'}='tex'; |
|
$answerform{'rndseed'}=$rndseed; |
|
if ($helper->{'VARS'}->{'probstatus'} eq 'exam') { |
|
$answerform{'problemtype'}='exam'; |
|
} |
|
$resources_printed .= $urlp.':'; |
|
my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); |
|
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
|
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
|
} else { |
|
$texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
|
if ($helper->{'VARS'}->{'construction'} ne '1') { |
|
my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
|
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
|
} else { |
|
$texversion.='\vskip 0 mm \noindent\textbf{'. |
|
&mt("Printing from Construction Space: No Title").'}\vskip 0 mm '; |
|
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
|
} |
|
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
# Print annotations. |
|
|
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
|
my $annotation .= &annotate($currentURL); |
|
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
|
} |
|
|
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
|
$texversion=&IndexCreation($texversion,$currentURL); |
|
} |
|
if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { |
|
$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /; |
|
|
|
} |
|
$texversion = &latex_header_footer_remove($texversion); |
|
|
|
# the first remaining line is a comment from londefdef the second |
|
# line seems to be an extraneous \vskip 1mm \\\\ : |
|
# (imperfect removal from header_footer_remove? |
|
|
|
$texversion =~ s/\\vskip 1mm \\\\\\\\//; |
|
|
|
$result .= $texversion; |
|
if ($currentURL=~m/\.page\s*$/) { |
|
($result,$numberofcolumns) = &page_cleanup($result); |
|
} |
|
} |
|
} |
|
|
|
$result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; |
|
return $result; |
|
} |
|
|
|
|
# |
# |
# List of recently generated print files |
# List of recently generated print files |
# |
# |
sub recently_generated { |
sub recently_generated { |
my $r=shift; |
my ($prtspool) = @_; |
my $prtspool=$r->dir_config('lonPrtDir'); |
my $output; |
my $zip_result; |
my $zip_result; |
my $pdf_result; |
my $pdf_result; |
opendir(DIR,$prtspool); |
opendir(DIR,$prtspool); |
Line 1273 sub recently_generated {
|
Line 2261 sub recently_generated {
|
$cuid,$cgid,$crdev,$csize, |
$cuid,$cgid,$crdev,$csize, |
$catime,$cmtime,$cctime, |
$catime,$cmtime,$cctime, |
$cblksize,$cblocks)=stat($prtspool.'/'.$filename); |
$cblksize,$cblocks)=stat($prtspool.'/'.$filename); |
my $result="<a href='/prtspool/$filename'>". |
my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File'); |
&mt('Generated [_1] ([_2] bytes)', |
my $result=&Apache::loncommon::start_data_table_row() |
&Apache::lonlocal::locallocaltime($cctime),$csize). |
.'<td>' |
'</a><br />'; |
.'<a href="/prtspool/'.$filename.'">'.$ext_text.'</a>' |
|
.'</td>' |
|
.'<td>'.&Apache::lonlocal::locallocaltime($cctime).'</td>' |
|
.'<td align="right">'.$csize.'</td>' |
|
.&Apache::loncommon::end_data_table_row(); |
if ($ext eq 'pdf') { $pdf_result .= $result; } |
if ($ext eq 'pdf') { $pdf_result .= $result; } |
if ($ext eq 'zip') { $zip_result .= $result; } |
if ($ext eq 'zip') { $zip_result .= $result; } |
} |
} |
|
if ($zip_result || $pdf_result) { |
|
$output ='<hr />'; |
|
} |
if ($zip_result) { |
if ($zip_result) { |
$r->print('<h4>'.&mt('Recently generated printout zip files')."</h4>\n" |
$output .='<h3>'.&mt('Recently generated printout zip files')."</h3>\n" |
.$zip_result); |
.&Apache::loncommon::start_data_table() |
|
.&Apache::loncommon::start_data_table_header_row() |
|
.'<th>'.&mt('Download').'</th>' |
|
.'<th>'.&mt('Creation Date').'</th>' |
|
.'<th>'.&mt('File Size (Bytes)').'</th>' |
|
.&Apache::loncommon::end_data_table_header_row() |
|
.$zip_result |
|
.&Apache::loncommon::end_data_table(); |
} |
} |
if ($pdf_result) { |
if ($pdf_result) { |
$r->print('<h4>'.&mt('Recently generated printouts')."</h4>\n" |
$output .='<h3>'.&mt('Recently generated printouts')."</h3>\n" |
.$pdf_result); |
.&Apache::loncommon::start_data_table() |
|
.&Apache::loncommon::start_data_table_header_row() |
|
.'<th>'.&mt('Download').'</th>' |
|
.'<th>'.&mt('Creation Date').'</th>' |
|
.'<th>'.&mt('File Size (Bytes)').'</th>' |
|
.&Apache::loncommon::end_data_table_header_row() |
|
.$pdf_result |
|
.&Apache::loncommon::end_data_table(); |
} |
} |
|
return $output; |
} |
} |
|
|
# |
# |
Line 1299 sub recently_generated {
|
Line 2309 sub recently_generated {
|
# A reference to a page break hash. |
# A reference to a page break hash. |
# |
# |
# |
# |
#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 1315 sub get_page_breaks {
|
Line 2325 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 1331 sub get_page_breaks {
|
Line 2457 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 1357 sub print_construction_sequence {
|
Line 2486 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 1393 sub print_construction_sequence {
|
Line 2522 sub print_construction_sequence {
|
$result.=$texversion; |
$result.=$texversion; |
|
|
} elsif ($urlp=~/\.(sequence|page)$/) { |
} elsif ($urlp=~/\.(sequence|page)$/) { |
|
|
# header: |
# header: |
|
|
$result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; |
$result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; |
Line 1401 sub print_construction_sequence {
|
Line 2530 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); |
} |
} |
} |
} |
|
elsif ($urlp =~ /\.pdf$/i) { |
|
my $texversion; |
|
if ($member != 0) { |
|
$texversion .= '\cleardoublepage'; |
|
} |
|
|
|
$texversion .= &include_pdf($urlp); |
|
$texversion = &latex_header_footer_remove($texversion); |
|
if ($member != $#order) { |
|
$texversion .= '\\ \cleardoublepage'; |
|
} |
|
|
|
$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'}; |
|
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 1452 sub output_data {
|
Line 2621 sub output_data {
|
ENDPART |
ENDPART |
|
|
|
|
|
# Breadcrumbs |
my $start_page = &Apache::loncommon::start_page('Preparing Printout',$js); |
#FIXME: Choose better/different breadcrumbs?!? Links? |
|
my $brcrum = [{'href' => '', |
|
'text' => 'Helper'}, #FIXME: Different origin possible than print out helper? |
|
{'href' => '', |
|
'text' => 'Preparing Printout'}]; |
|
|
|
my $start_page = &Apache::loncommon::start_page('Preparing Printout', |
|
$js, |
|
{'bread_crumbs' => $brcrum,}); |
my $msg = &mt('Please stand by while processing your print request, this may take some time ...'); |
my $msg = &mt('Please stand by while processing your print request, this may take some time ...'); |
|
|
$r->print($start_page."\n<p>\n$msg\n</p>\n"); |
$r->print($start_page."\n<p>\n$msg\n</p>\n"); |
Line 1463 ENDPART
|
Line 2640 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'}; |
my ($result,$selectionmade) = ('',''); |
my ($result,$selectionmade) = ('',''); |
my $number_of_columns = 1; #used only for pages to determine the width of the cell |
my $number_of_columns = 1; #used only for pages to determine the width of the cell |
my @temporary_array=split /\|/,$format_from_helper; |
my @temporary_array=split /\|/,$format_from_helper; |
my ($laystyle,$numberofcolumns,$papersize)=@temporary_array; |
my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; |
if ($laystyle eq 'L') { |
|
$laystyle='album'; |
$laystyle = &map_laystyle($laystyle); |
} else { |
|
$laystyle='book'; |
|
} |
|
my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); |
my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); |
my $assignment = $env{'form.assignment'}; |
my $assignment = $env{'form.assignment'}; |
my $LaTeXwidth=&recalcto_mm($textwidth); |
my $LaTeXwidth=&recalcto_mm($textwidth); |
Line 1495 ENDPART
|
Line 2671 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'} = $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 1511 ENDPART
|
Line 2688 ENDPART
|
&Apache::lonnet::appenv({'construct.style' => |
&Apache::lonnet::appenv({'construct.style' => |
$helper->{'VARS'}->{'style_file'}}); |
$helper->{'VARS'}->{'style_file'}}); |
} elsif ($env{'construct.style'}) { |
} elsif ($env{'construct.style'}) { |
&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 1526 ENDPART
|
Line 2702 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|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
my $rndseed=time; |
my $rndseed=time; |
my $texversion=''; |
my $texversion=''; |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { |
Line 1570 ENDPART
|
Line 2746 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 1591 ENDPART
|
Line 2768 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 Construction 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 1602 ENDPART
|
Line 2779 ENDPART
|
|
|
|
|
|
|
|
|
} |
} |
# Print annotations. |
# Print annotations. |
|
|
Line 1624 ENDPART
|
Line 2802 ENDPART
|
($result,$number_of_columns) = &page_cleanup($result); |
($result,$number_of_columns) = &page_cleanup($result); |
} |
} |
} elsif ($cleanURL!~m|^/adm/| |
} elsif ($cleanURL!~m|^/adm/| |
&& $currentURL=~/\.sequence$/ && $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_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
|
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
Line 1639 ENDPART
|
Line 2814 ENDPART
|
$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//;} |
$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$/) { |
# For this sort of print of a single LaTeX file, |
# For this sort of print of a single LaTeX file, |
# We can just print the LaTeX file as it is uninterpreted in any way: |
# We can just print the LaTeX file as it is uninterpreted in any way: |
# |
# |
Line 1658 ENDPART
|
Line 2833 ENDPART
|
|
|
$do_postprocessing = 0; # Don't massage the result. |
$do_postprocessing = 0; # Don't massage the result. |
|
|
|
} elsif ($cleanURL =~ /\.pdf$/i) { |
|
$result .= &include_pdf($cleanURL); |
|
$result .= '\end{document}'; |
|
} elsif ($cleanURL =~ /\.page$/i) { # Print page in non construction space contexts. |
|
|
|
# Determine the set of resources in the map of the page: |
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
my @page_resources = $navmap->retrieveResources($cleanURL); |
|
$result .= &print_page_in_course($helper, $rparmhash, |
|
$cleanURL, \@page_resources); |
|
|
|
|
} else { |
} else { |
$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_pages') or |
($print_type eq 'map_problems_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or |
($print_type eq 'map_resources_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG |
($print_type eq 'map_problems_pages') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') |
($print_type eq 'all_problems') or |
) { |
($print_type eq 'all_resources') or # BUGBUG |
|
($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') { |
if (($print_type eq 'map_problems') or |
|
($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') { |
} elsif (($print_type eq 'map_problems_pages') or |
|
($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 1713 ENDPART
|
Line 2909 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]; |
|
|
|
|
my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem |
my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem |
|
|
if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} |
if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} |
Line 1727 ENDPART
|
Line 2923 ENDPART
|
&& $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)$/) { |
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
&Apache::lonxml::remember_problem_counter(); |
&Apache::lonxml::remember_problem_counter(); |
|
if ($flag_latex_header_remove eq 'NO') { |
|
$texversion.=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); # RF |
|
unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || |
|
(($i==0) && |
|
(($urlp=~/\.page$/) || |
|
($print_type eq 'map_problems_in_page') || |
|
($print_type eq 'map_resources_in_page')))) { |
|
$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 1745 ENDPART
|
Line 2951 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$/) { |
|
$answer =~ s/\\end{document}(\d*)$//; |
|
} |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
if ($urlp =~ /\.page$/) { |
|
my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion); |
|
my $lastprob = pop(@probs); |
|
$texversion = join('\keephidden{ENDOFPROBLEM}',@probs). |
|
$answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; |
|
} else { |
|
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
|
} |
} else { |
} else { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { |
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}//; # 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 '; |
Line 1786 ENDPART
|
Line 3002 ENDPART
|
$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 1798 ENDPART
|
Line 3015 ENDPART
|
$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//;} |
$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/; |
Line 1806 ENDPART
|
Line 3023 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}/\\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'; |
|
} elsif ($urlp=~ /\.pdf$/i) { |
|
if ($i > 0) { |
|
$result .= '\cleardoublepage'; |
|
} |
|
my $texfrompdf = &include_pdf($urlp); |
|
if ($flag_latex_header_remove ne 'NO') { |
|
$texfrompdf = &latex_header_footer_remove($texfrompdf); |
|
} |
|
$result .= $texfrompdf; |
|
if ($i != $#master_seq) { |
|
if ($numberofcolumns eq '1') { |
|
$result .= '\newpage'; |
|
} else { |
|
# the \\'s seem to be needed to let LaTeX know there's something |
|
# on the page since LaTeX seems to not like to clear an empty page. |
|
# |
|
$result .= '\\ \cleardoublepage'; |
|
} |
|
} |
|
$flag_latex_header_remove = 'YES'; |
|
|
} else { |
} else { |
$texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}, |
$texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}, |
$master_seq[$i]); |
$master_seq[$i]); |
Line 1821 ENDPART
|
Line 3059 ENDPART
|
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} |
} |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { |
|
last; |
|
} |
} |
} |
&Apache::lonxml::clear_problem_counter(); |
&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 'all_problems_students') || |
($print_type eq 'problems_for_students_from_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ |
($print_type eq 'all_problems_students') || |
|
($print_type eq 'resources_for_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq')){ |
|
|
|
|
#-- 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 'all_problems_students') ) { |
($print_type eq 'problems_for_students_from_page') || |
|
($print_type eq 'all_problems_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq')) { |
$selectionmade=5; |
$selectionmade=5; |
$type='problems'; |
$type='problems'; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { |
} elsif ($print_type eq 'resources_for_students') { |
$selectionmade=8; |
$selectionmade=8; |
$type='resources'; |
$type='resources'; |
} |
} |
Line 1876 ENDPART
|
Line 3122 ENDPART
|
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
|
|
#loop over students |
#loop over students |
my $flag_latex_header_remove = 'NO'; |
|
|
my $flag_latex_header_remove = 'NO'; |
my %moreenv; |
my %moreenv; |
$moreenv{'instructor_comments'}='hide'; |
$moreenv{'instructor_comments'}='hide'; |
$moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); |
$moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); |
Line 1888 ENDPART
|
Line 3135 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]; |
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 1909 ENDPART
|
Line 3155 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($helper, \@master_seq, $person); |
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 'resources_for_anon') ) { |
($print_type eq 'problems_for_anon_page') || |
|
($print_type eq '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 1934 ENDPART
|
Line 3183 ENDPART
|
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'}; |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my @lines = &Apache::grades::get_scantronformat_file(); |
my ($code_type,$code_length)=('letter',6); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
foreach my $line (<FH>) { |
foreach my $line (@lines) { |
my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; |
chomp($line); |
|
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 %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 1986 ENDPART
|
Line 3242 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; |
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); |
Line 2016 ENDPART
|
Line 3273 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 2035 ENDPART
|
Line 3292 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 2060 ENDPART
|
Line 3313 ENDPART
|
$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 Construction 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\/|;} |
|
$newurlp=&path_to_problem($newurlp,$LaTeXwidth); |
|
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
$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); |
Line 2098 ENDPART
|
Line 3348 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 2115 ENDPART
|
Line 3371 ENDPART
|
|
|
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'}; |
|
if ($URLback=~/([^?]+)/) { |
|
$URLback=$1; |
|
$URLback=~s|^/~|/priv/|; |
|
} |
|
} |
} |
|
# |
|
# Final adjustment of the font size: |
|
# |
|
|
|
$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; |
Line 2206 ENDPART
|
Line 3467 ENDPART
|
# If there's been an unrecoverable SSI error, report it to the user |
# If there's been an unrecoverable SSI error, report it to the user |
if ($ssi_error) { |
if ($ssi_error) { |
my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); |
my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); |
$r->print('<br /><h2>'.&mt('An unrecoverable network error occurred:').'</h2><p> '. |
$r->print('<br /><p class="LC_error">'.&mt('An unrecoverable network error occurred:').'</p><p>'. |
&mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:'). |
&mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:'). |
'<br />'.$ssi_last_error_resource.'<br />'.$ssi_last_error. |
'<br />'.$ssi_last_error_resource.'<br />'.$ssi_last_error. |
'</p><p>'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'<br />'. |
'</p><p>'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'<br />'. |
Line 2250 sub print_resources {
|
Line 3511 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 2275 sub print_resources {
|
Line 3549 sub print_resources {
|
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# |
# |
|
|
|
my $syllabus_first = 0; |
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++; |
|
|
if ( !($type eq 'problems' && |
if ( !($type eq 'problems' && |
($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { |
($curresline!~ m/$LONCAPA::assess_page_re/)) ) { |
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
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)$/) { |
$printed .= $curresline.':'; |
$printed .= $curresline.':'; |
|
|
&Apache::lonxml::remember_problem_counter(); |
&Apache::lonxml::remember_problem_counter(); |
|
|
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); |
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); |
|
if ($res_url =~ /\.page$/) { |
|
if ($remove_latex_header eq 'NO') { |
|
if (!($rendered =~ /\\begin\{document\}/)) { |
|
$rendered = &print_latex_header().$rendered; |
|
} |
|
} |
|
; |
|
if ($remove_latex_header eq 'YES') { |
|
$rendered = &latex_header_footer_remove($rendered); |
|
} else { |
|
$rendered =~ s/\\end{document}\d*//; |
|
} |
|
} |
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')) { |
# 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 2313 sub print_resources {
|
Line 3604 sub print_resources {
|
|
|
|
|
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') { |
|
$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 '; |
Line 2322 sub print_resources {
|
Line 3616 sub print_resources {
|
$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; |
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 { |
Line 2335 sub print_resources {
|
Line 3629 sub print_resources {
|
} |
} |
$current_output .= $rendered; |
$current_output .= $rendered; |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
|
if ($i == 1) { |
|
$syllabus_first = 1; |
|
} |
$printed .= $curresline.':'; |
$printed .= $curresline.':'; |
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); |
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
Line 2348 sub print_resources {
|
Line 3645 sub print_resources {
|
$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$/) { |
|
my $url = &Apache::lonnet::clutter($res_url); |
|
my $rendered = &include_pdf($url); |
|
if ($remove_latex_header ne 'NO') { |
|
$rendered = &latex_header_footer_remove($rendered); |
|
} |
|
$current_output .= $rendered; |
} else { |
} else { |
my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline); |
my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline); |
if ($remove_latex_header ne 'NO') { |
if ($remove_latex_header ne 'NO') { |
Line 2363 sub print_resources {
|
Line 3666 sub print_resources {
|
} |
} |
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) { |
|
$current_output = &encapsulate_minipage("\\vskip -10mm \nNo incomplete resources\n \\vskip 100 mm { }\n"); |
|
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) { |
|
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
|
} |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
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 = |
Line 2371 sub print_resources {
|
Line 3692 sub print_resources {
|
my $header_start = ($columns_in_format == 1) ? '\lhead' |
my $header_start = ($columns_in_format == 1) ? '\lhead' |
: '\fancyhead[LO]'; |
: '\fancyhead[LO]'; |
$header_line = $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$header_line$namepostfix}\\vskip 5 mm /; |
} else { |
} else { |
Line 2390 sub print_resources {
|
Line 3710 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 ($blocked,$blocktext) = |
|
&Apache::loncommon::blocking_status('printout',$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 2421 sub handler {
|
Line 3774 sub handler {
|
|
|
&output_data($r,$helper,\%parmhash); |
&output_data($r,$helper,\%parmhash); |
return OK; |
return OK; |
} |
} |
|
|
use Apache::lonhelper; |
use Apache::lonhelper; |
|
|
Line 2446 sub init_perm {
|
Line 3799 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 2455 sub get_randomly_ordered_warning {
|
Line 3813 sub get_randomly_ordered_warning {
|
|
|
my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'}; |
my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'}; |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $res = $navmap->getResourceByUrl($map); |
if (defined($navmap)) { |
if ($res) { |
my $res = $navmap->getResourceByUrl($map); |
my $func = |
if ($res) { |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
my $func = |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
if (@matches) { |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
$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."; |
|
} |
} |
} |
} else { |
if ($message) { |
$message = "Retrieval of information about ordering of resources failed."; |
return '<message type="warning">'.$message.'</message>'; |
return '<message type="warning">'.$message.'</message>'; |
} |
} |
return; |
return; |
} |
} |
Line 2512 sub printHelper {
|
Line 3870 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 2534 sub printHelper {
|
Line 3894 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'}) { |
Line 2582 sub printHelper {
|
Line 3946 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 $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 2590 sub printHelper {
|
Line 3962 sub printHelper {
|
$subdir = substr($helper->{VARS}->{'filename'}, |
$subdir = substr($helper->{VARS}->{'filename'}, |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
} else { |
} else { |
|
# From course space: |
|
|
if ($symb ne '') { |
if ($symb ne '') { |
($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)); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
my $res = $navmap->getBySymb($symb); |
|
$res_printable = $res->resprintable() | $userCanPrint; #printability in course context |
|
($res_printstartdate, $res_printenddate) = &get_print_dates($res); |
|
($course_open, $course_close) = &course_print_dates($res); |
|
($map_open, $map_close) = &map_print_dates($res); |
|
|
} else { |
} else { |
|
# Resource space. |
|
|
$url = $helper->{VARS}->{'postdata'}; |
$url = $helper->{VARS}->{'postdata'}; |
$is_published=1; # From resource space. |
$is_published=1; # From resource space. |
} |
} |
$url = &Apache::lonnet::clutter($url); |
$url = &Apache::lonnet::clutter($url); |
|
|
if (!$resourceTitle) { # if the resource doesn't have a title, use the filename |
if (!$resourceTitle) { # if the resource doesn't have a title, use the filename |
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); |
$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 2634 sub printHelper {
|
Line 4019 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) '; |
|
|
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()'; |
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 2656 sub printHelper {
|
Line 4051 sub printHelper {
|
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<br />before selected'). |
"' variable='FINISHPAGE' />"; |
"' variable='FINISHPAGE' />". |
|
"<option text='".&mt('Extra space<br />before selected'). |
|
"' variable='EXTRASPACE' type='text' />" . |
|
"<option " . |
|
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
|
"<option text='".&mt('Space units<br />check for mm'). |
|
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
|
; |
|
|
|
|
} |
} |
|
|
if (($helper->{'VARS'}->{'construction'} ne '1' ) && |
# If not construction space user can print the components of a page: |
|
|
|
my $page_ispage; |
|
my $page_title; |
|
if (!$helper->{VARS}->{'construction'}) { |
|
my $varspostdata = $helper->{VARS}->{'postdata'}; |
|
my $varsassignment = $helper->{VARS}->{'assignment'}; |
|
my $page_navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($page_navmap)) { |
|
my @page_resources = $page_navmap->retrieveResources($url); |
|
if(defined($page_resources[0])) { |
|
$page_ispage = $page_resources[0]->is_page(); |
|
$page_title = $page_resources[0]->title(); |
|
my $resourcesymb = $page_resources[0]->symb(); |
|
my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb); |
|
if ($page_ispage) { |
|
push @{$printChoices}, |
|
[&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
|
'map_problems_in_page', |
|
'CHOOSE_PROBLEMS_PAGE']; |
|
push @{$printChoices}, |
|
[&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
|
'map_resources_in_page', |
|
'CHOOSE_RESOURCES_PAGE']; |
|
} |
|
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' toponly='1' addstatus='1' closeallpages='1'", |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
|
|
|
|
$helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', |
|
'Select Resource(s) to print', |
|
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$url, |
|
$isNotMap, '', $symbFilter, |
|
$start_new_option); |
|
|
|
|
|
|
|
|
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
|
|
|
} |
|
} |
|
} |
|
|
|
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 $printSelector = 'map_incomplete_problems_seq'; |
|
my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; |
|
my $textSuffix = ''; |
|
|
|
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); |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
if (&printable($map_open, $map_close)) { |
|
my $helperStates = &create_incomplete_folder_helper($helper, $map); # 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)) { |
|
push(@{$printChoices}, |
|
[&mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, |
|
'<b>', '</b>', |
|
'<b><i>'. $sequenceTitle . '</b></i>'), |
|
$printSelector, |
|
$nextState]); |
|
} |
# Allow problems from sequence |
# Allow problems from sequence |
push @{$printChoices}, [&mt('Selected <b>Problems</b> in folder <b><i>[_1]</i></b>',$sequenceTitle), 'map_problems', 'CHOOSE_PROBLEMS']; |
if ($userCanPrint || &printable($map_open, $map_close)) { |
# Allow all resources from sequence |
push @{$printChoices}, |
push @{$printChoices}, [&mt('Selected <b>Resources</b> in folder <b><i>[_1]</i></b>',$sequenceTitle), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; |
[&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
|
'map_problems', |
|
'CHOOSE_PROBLEMS']; |
|
# Allow all resources from sequence |
|
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
|
'map_problems_pages', |
|
'CHOOSE_PROBLEMS_HTML']; |
|
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
|
'Select Problem(s) to print', |
|
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$map, |
|
! $isProblem, '', |
|
$symbFilter, |
|
$start_new_option); |
|
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
|
'Select Resource(s) to print', |
|
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
|
'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)$/)) { |
|
|
my $helperFragment = <<HELPERFRAGMENT; |
# BZ 5209 - incomplete problems from entire course: |
<state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print"> |
|
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
|
closeallpages="1"> |
|
<nextstate>PAGESIZE</nextstate> |
|
<filterfunc>return $isProblem;</filterfunc> |
|
<mapurl>$map</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
|
|
<state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print"> |
push(@{$printChoices}, |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
[&mtn('Selected <b>Incomplete Problems</b> from <b>entire course</b> for selected people'), |
closeallpages="1"> |
'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); |
<nextstate>PAGESIZE</nextstate> |
my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. |
<filterfunc>return $isNotMap;</filterfunc> |
|
<mapurl>$map</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
HELPERFRAGMENT |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
} |
|
|
|
# If the user has pfo (print for otheres) allow them to print all |
# Selected problems/resources from entire course: |
# problems and resources in the entier course, optionally for selected students |
|
if ($perm{'pfo'} && !$is_published && |
|
($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
|
|
|
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES']; |
push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</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}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; |
&Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS); |
my $suffixXml = <<ALL_PROBLEMS; |
<state name="ALL_PROBLEMS" title="Select Problem(s) to print"> |
|
<resource variable="RESOURCES" toponly='0' multichoice="1" |
|
suppressEmptySequences='0' addstatus="1" closeallpages="1"> |
|
<nextstate>PAGESIZE</nextstate> |
|
<filterfunc>return $isProblemOrMap;</filterfunc> |
|
<choicefunc>return $isNotMap;</choicefunc> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
<state name="ALL_RESOURCES" title="Select Resource(s) to print"> |
|
<resource variable="RESOURCES" toponly='0' multichoice='1' |
|
suppressEmptySequences='0' addstatus='1' closeallpages='1'> |
|
<nextstate>PAGESIZE</nextstate> |
|
<filterfunc>return $isNotMap; </filterfunc> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
<state name="ALL_PROBLEMS_STUDENTS" title="Select Problem(s) to print"> |
|
<resource variable="RESOURCES" toponly='0' multichoice="1" |
|
suppressEmptySequences='0' addstatus="1" closeallpages="1"> |
|
<nextstate>STUDENTS1</nextstate> |
|
<filterfunc>return $isProblemOrMap;</filterfunc> |
|
<choicefunc>return $isNotMap;</choicefunc> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
<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> |
<choices variable='student_sort'> |
<choices variable='student_sort'> |
Line 2742 HELPERFRAGMENT
|
Line 4218 HELPERFRAGMENT
|
<message><br /><hr /><br /> </message> |
<message><br /><hr /><br /> </message> |
<student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/> |
<student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/> |
</state> |
</state> |
|
|
ALL_PROBLEMS |
ALL_PROBLEMS |
|
&Apache::lonxml::xmlparse($r, 'helper', |
|
&generate_resource_chooser('ALL_PROBLEMS', |
|
'SelectProblem(s) to print', |
|
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
'', |
|
$isProblemOrMap, $isNotMap, |
|
$symbFilter, |
|
$start_new_option) . |
|
&generate_resource_chooser('ALL_RESOURCES', |
|
'Select Resource(s) to print', |
|
" toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'", |
|
'RESOURCES', |
|
'PAGESIZE', |
|
'', |
|
$isNotMap,'',$symbFilter, |
|
$start_new_option) . |
|
&generate_resource_chooser('ALL_PROBLEMS_STUDENTS', |
|
'Select Problem(s) to print', |
|
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'STUDENTS1', |
|
'', |
|
$isProblemOrMap,'' , $symbFilter, |
|
$start_new_option) . |
|
$suffixXml |
|
); |
|
|
if ($helper->{VARS}->{'assignment'}) { |
if ($helper->{VARS}->{'assignment'}) { |
push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'problems_for_students', 'CHOOSE_STUDENTS']; |
|
push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1']; |
# If we were looking at a page, allow a selection of problems from the page |
|
# either for selected students or for coded assignments. |
|
|
|
if ($page_ispage) { |
|
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]', |
|
'<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'), |
|
'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE']; |
|
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]', |
|
'<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'), |
|
'problems_for_anon_page', 'CHOOSE_ANON1_PAGE']; |
|
} |
|
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]', |
|
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
|
'problems_for_students', 'CHOOSE_STUDENTS']; |
|
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]', |
|
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
|
'problems_for_anon', 'CHOOSE_ANON1']; |
} |
} |
|
|
my $randomly_ordered_warning = |
my $randomly_ordered_warning = |
&get_randomly_ordered_warning($helper,$map); |
&get_randomly_ordered_warning($helper, $map); |
|
|
# resource_selector will hold a few states that: |
# resource_selector will hold a few states that: |
# - Allow resources to be selected for printing. |
# - Allow resources to be selected for printing. |
Line 2762 ALL_PROBLEMS
|
Line 4281 ALL_PROBLEMS
|
# with one state, and use REGEXPs at inclusion time to set state names |
# with one state, and use REGEXPs at inclusion time to set state names |
# and next states for better mix and match capability |
# and next states for better mix and match capability |
# |
# |
my $resource_selector=<<RESOURCE_SELECTOR; |
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
<state name="SELECT_PROBLEMS" title="Select resources to print"> |
'Select resources to print', |
$randomly_ordered_warning |
'multichoice="1" addstatus="1" closeallpages="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'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
|
|
|
|
# Generate student choosers. |
|
|
<nextstate>PRINT_FORMATTING</nextstate> |
|
<message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message> |
|
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
|
closeallpages="1"> |
|
<filterfunc>return $isProblem;</filterfunc> |
|
<mapurl>$map</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
<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 |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS); |
|
<state name="CHOOSE_STUDENTS" title="Select Students and Resources"> |
&Apache::lonxml::xmlparse($r, 'helper', |
<message><b>Select sorting order of printout</b> </message> |
&generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', |
<choices variable='student_sort'> |
'student_sort', |
<choice computer='0'>Sort by section then student</choice> |
'STUDENTS', |
<choice computer='1'>Sort by students across sections.</choice> |
'CHOOSE_STUDENTS_PAGE')); |
</choices> |
&Apache::lonxml::xmlparse($r, 'helper', |
<message><br /><hr /><br /> </message> |
&generate_student_chooser('CHOOSE_STUDENTS', |
<student multichoice='1' variable="STUDENTS" nextstate="SELECT_PROBLEMS" coursepersonnel="1"/> |
'student_sort', |
</state> |
'STUDENTS', |
$resource_selector |
'SELECT_PROBLEMS')); |
CHOOSE_STUDENTS |
&Apache::lonxml::xmlparse($r, 'helper', $resource_selector); |
|
|
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'}; |
Line 2852 CHOOSE_STUDENTS
|
Line 4361 CHOOSE_STUDENTS
|
|
|
} |
} |
|
|
|
my @lines = &Apache::grades::get_scantronformat_file(); |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
|
my $codechoice=''; |
my $codechoice=''; |
foreach my $line (<FH>) { |
foreach my $line (@lines) { |
my ($name,$description,$code_type,$code_length)= |
my ($name,$description,$code_type,$code_length)= |
(split(/:/,$line))[0,1,2,4]; |
(split(/:/,$line))[0,1,2,4]; |
if ($code_length > 0 && |
if ($code_length > 0 && |
Line 2866 CHOOSE_STUDENTS
|
Line 4374 CHOOSE_STUDENTS
|
if ($codechoice eq '') { |
if ($codechoice eq '') { |
$codechoice='<choice computer="default">Default</choice>'; |
$codechoice='<choice computer="default">Default</choice>'; |
} |
} |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1); |
my $anon1 = &generate_code_selector($helper, |
<state name="CHOOSE_ANON1" title="Specify CODEd Assignments"> |
'CHOOSE_ANON1', |
<nextstate>SELECT_PROBLEMS</nextstate> |
'SELECT_PROBLEMS', |
<message><h4>Fill out one of the forms below</h4></message> |
$codechoice, |
<message><br /><hr /> <br /></message> |
$code_selection, |
<message><h3>Generate new CODEd Assignments</h3></message> |
$namechoice) . $resource_selector; |
<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"> |
|
<validator> |
&Apache::lonxml::xmlparse($r, 'helper',$anon1); |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
|
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
my $anon_page = &generate_code_selector($helper, |
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
'CHOOSE_ANON1_PAGE', |
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
'SELECT_PROBLEMS_PAGE', |
return "You need to specify the number of assignments to print"; |
$codechoice, |
} |
$code_selection, |
return undef; |
$namechoice) . |
</validator> |
&generate_resource_chooser('SELECT_PROBLEMS_PAGE', |
</string> |
'Select Problem(s) to print', |
<message></td></tr><tr><td></message> |
"multichoice='1' addstatus='1' closeallpages ='1'", |
<message><b>Names to save the CODEs under for later:</b></message> |
'RESOURCES', |
<message></td><td></message> |
'PRINT_FORMATTING', |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
$url, |
<message></td></tr><tr><td></message> |
$isProblem, '', $symbFilter, |
<message><b>Bubble sheet type:</b></message> |
$start_new_option); |
<message></td><td></message> |
&Apache::lonxml::xmlparse($r, 'helper', $anon_page); |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
|
$codechoice |
|
</dropdown> |
|
<message></td></tr><tr><td colspan="2"></td></tr><tr><td></message> |
|
<message></td></tr><tr><td></table></message> |
|
<message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message> |
|
<message><tr><td><b>Enter a CODE to print:</b></td><td></message> |
|
<string variable="SINGLE_CODE" size="10"> |
|
<validator> |
|
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
|
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
|
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
|
\$helper->{'VARS'}{'CODE_OPTION'}); |
|
} else { |
|
return undef; # Other forces control us. |
|
} |
|
</validator> |
|
</string> |
|
<message></td></tr><tr><td></message> |
|
$code_selection |
|
<message></td></tr></table></message> |
|
<message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message> |
|
<message><b>Select saved CODEs:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="REUSE_OLD_CODES"> |
|
$namechoice |
|
</dropdown> |
|
<message></td></tr></table></message> |
|
</state> |
|
$resource_selector |
|
CHOOSE_ANON1 |
|
|
|
|
|
if ($helper->{VARS}->{'assignment'}) { |
if ($helper->{VARS}->{'assignment'}) { |
push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'resources_for_students', 'CHOOSE_STUDENTS1']; |
|
push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'resources_for_anon', 'CHOOSE_ANON2']; |
# Assignment printing: |
|
|
|
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']; |
} |
} |
|
|
|
|
$resource_selector=<<RESOURCE_SELECTOR; |
$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" |
Line 2945 CHOOSE_ANON1
|
Line 4423 CHOOSE_ANON1
|
$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 2986 CHOOSE_STUDENTS1
|
Line 4448 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 2994 CHOOSE_STUDENTS1
|
Line 4456 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 3002 CHOOSE_STUDENTS1
|
Line 4468 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 3017 CHOOSE_STUDENTS1
|
Line 4483 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 3048 CHOOSE_ANON2
|
Line 4516 CHOOSE_ANON2
|
)) |
)) |
&& $helper->{VARS}->{'assignment'} eq "" |
&& $helper->{VARS}->{'assignment'} eq "" |
) { |
) { |
|
|
my $pretty_dir = &Apache::lonnet::hreflocation($subdir); |
my $pretty_dir = &Apache::lonnet::hreflocation($subdir); |
push @{$printChoices}, [&mt("Selected <b>Problems</b> from current subdirectory <b><i>[_1]</i></b>",$pretty_dir), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; |
my $xmlfrag = <<CHOOSE_FROM_SUBDIR; |
my $xmlfrag = <<CHOOSE_FROM_SUBDIR; |
<state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print"> |
<state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print"> |
|
|
Line 3085 CHOOSE_FROM_SUBDIR
|
Line 4552 CHOOSE_FROM_SUBDIR
|
<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 3107 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4574 CHOOSE_FROM_ANY_SEQUENCE
|
|
|
# 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) { |
|
$paramHash = Apache::lonhelper::getParamHash(); |
|
$paramHash->{MESSAGE_TEXT} = |
|
&mt('<p><b>Printing for current resource is only possible between [_1] and [_1]</b></p>', |
|
$res_printstartdate, $res_printenddate); |
|
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 3118 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4593 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("<hr width='33%' /><table><tr><td align='right'>". |
&addMessage('<br />' |
'<label for="ANSWER_TYPE_forminput">'. |
.'<h3>'.&mt('Print Options').'</h3>' |
&mt('Print'). |
.&Apache::lonhtmlcommon::start_pick_box() |
"</label>: </td><td>"); |
.&Apache::lonhtmlcommon::row_title( |
|
'<label for="ANSWER_TYPE_forminput">' |
|
.&mt('Print Answers') |
|
.'</label>' |
|
) |
|
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'ANSWER_TYPE'; |
$paramHash->{'variable'} = 'ANSWER_TYPE'; |
$helper->declareVar('ANSWER_TYPE'); |
$helper->declareVar('ANSWER_TYPE'); |
Line 3133 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4613 CHOOSE_FROM_ANY_SEQUENCE
|
['Only Answers', 'only'] |
['Only Answers', 'only'] |
]; |
]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
$startedTable = 1; |
$startedTable = 1; |
|
|
|
# |
|
# Select font size. |
|
# |
|
|
|
$helper->declareVar('fontsize'); |
|
&addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size'))); |
|
my $xmlfrag = << "FONT_SELECTION"; |
|
|
|
|
|
<dropdown variable='fontsize' multichoice='0', allowempty='0'> |
|
<defaultvalue> |
|
return 'normalsize'; |
|
</defaultvalue> |
|
<choice computer='tiny'>Tiny</choice> |
|
<choice computer='sub/superscriptsize'>Script Size</choice> |
|
<choice computer='footnotesize'>Footnote Size</choice> |
|
<choice computer='small'>Small</choice> |
|
<choice computer='normalsize'>Normal (default)</choice> |
|
<choice computer='large'>larger than normal</choice> |
|
<choice computer='Large'>Even larger than normal</choice> |
|
<choice computer='LARGE'>Still larger than normal</choice> |
|
<choice computer='huge'>huge font size</choice> |
|
<choice computer='Huge'>Largest possible size</choice> |
|
</dropdown> |
|
FONT_SELECTION |
|
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); |
|
&addMessage(&Apache::lonhtmlcommon::row_closure(1)); |
} |
} |
|
|
if ($perm{'pav'}) { |
if ($perm{'pav'}) { |
Line 3145 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4653 CHOOSE_FROM_ANY_SEQUENCE
|
"</label>: </td><td>"); |
"</label>: </td><td>"); |
$startedTable = 1; |
$startedTable = 1; |
} else { |
} else { |
addMessage("<tr><td align='right'>". |
&addMessage(&Apache::lonhtmlcommon::row_title( |
'<label for="LATEX_TYPE_forminput">'. |
'<label for="LATEX_TYPE_forminput">' |
&mt('LaTeX mode'). |
.&mt('LaTeX mode') |
"</label>: </td><td>"); |
.'</label>' |
|
) |
|
); |
} |
} |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'LATEX_TYPE'; |
$paramHash->{'variable'} = 'LATEX_TYPE'; |
Line 3164 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4674 CHOOSE_FROM_ANY_SEQUENCE
|
} |
} |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
|
|
addMessage("</td></tr><tr><td align='right'>". |
&addMessage(&Apache::lonhtmlcommon::row_closure() |
'<label for="TABLE_CONTENTS_forminput">'. |
.&Apache::lonhtmlcommon::row_title( |
&mt('Print Table of Contents'). |
'<label for="TABLE_CONTENTS_forminput">' |
"</label>: </td><td>"); |
.&mt('Print Table of Contents') |
|
.'</label>' |
|
) |
|
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'TABLE_CONTENTS'; |
$paramHash->{'variable'} = 'TABLE_CONTENTS'; |
$helper->declareVar('TABLE_CONTENTS'); |
$helper->declareVar('TABLE_CONTENTS'); |
Line 3175 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4688 CHOOSE_FROM_ANY_SEQUENCE
|
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
|
|
if (not $helper->{VARS}->{'construction'}) { |
if (not $helper->{VARS}->{'construction'}) { |
addMessage("<tr><td align='right'>". |
&addMessage(&Apache::lonhtmlcommon::row_title( |
'<label for="TABLE_INDEX_forminput">'. |
'<label for="TABLE_INDEX_forminput">' |
&mt('Print Index'). |
.&mt('Print Index') |
"</label>: </td><td>"); |
.'</label>' |
|
) |
|
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'TABLE_INDEX'; |
$paramHash->{'variable'} = 'TABLE_INDEX'; |
$helper->declareVar('TABLE_INDEX'); |
$helper->declareVar('TABLE_INDEX'); |
Line 3189 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4704 CHOOSE_FROM_ANY_SEQUENCE
|
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
addMessage("<tr><td align='right'>". |
&addMessage(&Apache::lonhtmlcommon::row_title( |
'<label for="PRINT_DISCUSSIONS_forminput">'. |
'<label for="PRINT_DISCUSSIONS_forminput">' |
&mt('Print Discussions'). |
.&mt('Print Discussions') |
"</label>: </td><td>"); |
.'</label>' |
|
) |
|
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; |
$paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; |
$helper->declareVar('PRINT_DISCUSSIONS'); |
$helper->declareVar('PRINT_DISCUSSIONS'); |
Line 3201 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4718 CHOOSE_FROM_ANY_SEQUENCE
|
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
|
|
# Prompt for printing annotations too. |
# Prompt for printing annotations too. |
|
|
addMessage("<tr><td align='right'>". |
&addMessage(&Apache::lonhtmlcommon::row_title( |
'<label for="PRINT_ANNOTATIONS_forminput">'. |
'<label for="PRINT_ANNOTATIONS_forminput">' |
&mt('Print Annotations'). |
.&mt('Print Annotations') |
"</label>:</td><td>"); |
.'</label>' |
|
) |
|
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = "PRINT_ANNOTATIONS"; |
$paramHash->{'variable'} = "PRINT_ANNOTATIONS"; |
$helper->declareVar("PRINT_ANNOTATIONS"); |
$helper->declareVar("PRINT_ANNOTATIONS"); |
Line 3216 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4735 CHOOSE_FROM_ANY_SEQUENCE
|
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes']]; |
['Yes', 'yes']]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
|
|
addMessage("<tr><td align = 'right'> </td><td>"); |
&addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils'))); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'multichoice'} = "true"; |
$paramHash->{'multichoice'} = "true"; |
$paramHash->{'allowempty'} = "true"; |
$paramHash->{'allowempty'} = "true"; |
$paramHash->{'variable'} = "showallfoils"; |
$paramHash->{'variable'} = "showallfoils"; |
$paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ]; |
$paramHash->{'CHOICES'} = [ [&mt('Show All Foils'), "1"] ]; |
Apache::lonhelper::choices->new(); |
Apache::lonhelper::choices->new(); |
addMessage("</td></tr>"); |
&addMessage(&Apache::lonhtmlcommon::row_closure(1)); |
} |
} |
|
|
if ($helper->{'VARS'}->{'construction'}) { |
if ($helper->{'VARS'}->{'construction'}) { |
Line 3234 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4753 CHOOSE_FROM_ANY_SEQUENCE
|
my $stylefiletext=&mt("Use style file"); |
my $stylefiletext=&mt("Use style file"); |
my $selectfiletext=&mt("Select style file"); |
my $selectfiletext=&mt("Select style file"); |
|
|
my $xmlfrag .= <<"RNDSEED"; |
my $xmlfrag .= '<message>' |
<message><tr><td align='right'> |
.&Apache::lonhtmlcommon::row_title('<label for="curseed_forminput">' |
<label for="curseed_forminput">$randseedtext</label>: |
.$randseedtext |
</td><td></message> |
.'</label>' |
<string variable="curseed" size="15" maxlength="15"> |
) |
<defaultvalue> |
.'</message> |
return $helper->{VARS}->{'curseed'}; |
<string variable="curseed" size="15" maxlength="15"> |
</defaultvalue> |
<defaultvalue> |
</string> |
return '.$helper->{VARS}->{'curseed'}.'; |
<message></td></tr><tr><td align="right"> |
</defaultvalue>' |
<label for="style_file">$stylefiletext</label>: |
.'</string>' |
</td><td></message> |
.'<message>' |
|
.&Apache::lonhtmlcommon::row_closure() |
|
.&Apache::lonhtmlcommon::row_title('<label for="style_file">' |
|
.$stylefiletext |
|
.'</label>' |
|
) |
|
.'</message> |
<string variable="style_file" size="40"> |
<string variable="style_file" size="40"> |
<defaultvalue> |
<defaultvalue> |
return $stylevalue; |
return '.$stylevalue.'; |
</defaultvalue> |
</defaultvalue> |
</string><message> <a href="javascript:openbrowser('helpform','style_file_forminput','sty')">$selectfiletext</a> </td></tr><tr><td></td><td align="left"></message> |
</string><message> ' |
|
.qq|<a href="javascript:openbrowser('helpform','style_file_forminput','sty')">| |
|
.$selectfiletext.'</a>' |
|
.&Apache::lonhtmlcommon::row_closure() |
|
.&Apache::lonhtmlcommon::row_title(&mt('Show All Foils')) |
|
.'</message> |
<choices allowempty="1" multichoice="true" variable="showallfoils"> |
<choices allowempty="1" multichoice="true" variable="showallfoils"> |
<choice computer="1">Show all foils</choice> |
<choice computer="1"> </choice> |
</choices> |
</choices>' |
<message></td></tr></message> |
.'<message>' |
RNDSEED |
.&Apache::lonhtmlcommon::row_closure() |
|
.'</message>'; |
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); |
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); |
|
|
|
|
addMessage("<tr><td>Problem Type:</td><td>"); |
&addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type'))); |
# |
# |
# Initial value from construction space: |
# Initial value from construction space: |
# |
# |
Line 3274 RNDSEED
|
Line 4805 RNDSEED
|
<choice computer="problem">Homework Problem</choice> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="exam">Exam Problem</choice> |
<choice computer="exam">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); |
|
&addMessage(&Apache::lonhtmlcommon::row_closure(1)); |
addMessage("</td></tr>"); |
|
|
|
} |
|
|
} |
} |
} |
|
|
|
|
|
|
|
|
if ($startedTable) { |
if ($startedTable) { |
addMessage("</table>"); |
&addMessage(&Apache::lonhtmlcommon::end_pick_box()); |
} |
} |
|
|
Apache::lonprintout::page_format_state->new("FORMAT"); |
Apache::lonprintout::page_format_state->new("FORMAT"); |
Line 3307 PROBTYPE
|
Line 4840 PROBTYPE
|
return $helper; |
return $helper; |
} |
} |
|
|
$r->print($helper->display()); |
my $footer; |
if ($helper->{STATE} eq 'START') { |
if ($helper->{STATE} eq 'START') { |
&recently_generated($r); |
my $prtspool=$r->dir_config('lonPrtDir'); |
|
$footer = &recently_generated($prtspool); |
} |
} |
|
$r->print($helper->display($footer)); |
&Apache::lonhelper::unregisterHelperTags(); |
&Apache::lonhelper::unregisterHelperTags(); |
|
|
return OK; |
return OK; |
Line 3386 sub render {
|
Line 4921 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'); |
$result .= <<STATEHTML; |
my $pdfFormLabel=&mt('PDF-Formfields'); |
|
my $with=&mt('with Formfields'); |
|
my $without=&mt('without Formfields'); |
|
|
|
|
<hr width="33%" /> |
$result.='<h3>'.&mt('Layout Options').'</h3>' |
<table cellpadding="3"> |
.&Apache::loncommon::start_data_table() |
<tr> |
.&Apache::loncommon::start_data_table_header_row() |
<td align="center"><b>$PageLayout</b></td> |
.'<th>'.$PageLayout.'</th>' |
<td align="center"><b>$NumberOfColumns</b></td> |
.'<th>'.$NumberOfColumns.'</th>' |
<td align="center"><b>$PaperType</b></td> |
.'<th>'.$PaperType.'</th>' |
</tr> |
.'<th>'.$pdfFormLabel.'</th>' |
<tr> |
.&Apache::loncommon::end_data_table_header_row() |
<td> |
.&Apache::loncommon::start_data_table_row() |
<label><input type="radio" name="${var}.layout" value="L" /> $landscape </label><br /> |
.'<td>' |
<label><input type="radio" name="${var}.layout" value="P" checked='1' /> $portrait </label> |
.'<label><input type="radio" name="'.${var}.'.layout" value="L" />'.$landscape.'</label><br />' |
</td> |
.'<label><input type="radio" name="'.${var}.'.layout" value="P" checked="checked" />'.$portrait.'</label>' |
<td align="center"> |
.'</td>'; |
<select name="${var}.cols"> |
|
STATEHTML |
$result.='<td align="center">' |
|
.'<select name="'.${var}.'.cols">'; |
|
|
my $i; |
my $i; |
for ($i = 1; $i <= $maxColumns; $i++) { |
for ($i = 1; $i <= $maxColumns; $i++) { |
if ($i == 2) { |
if ($i == 2) { |
$result .= "<option value='$i' selected>$i</option>\n"; |
$result .= '<option value="'.$i.'" selected="selected">'.$i.'</option>'."\n"; |
} else { |
} else { |
$result .= "<option value='$i'>$i</option>\n"; |
$result .= '<option value="'.$i.'">'.$i.'</option>'."\n"; |
} |
} |
} |
} |
|
|
Line 3425 STATEHTML
|
Line 4964 STATEHTML
|
$_=~/(\w+)/; |
$_=~/(\w+)/; |
my $papersize=$1; |
my $papersize=$1; |
if ($paperSize[$i]=~/$DefaultPaperSize/) { |
if ($paperSize[$i]=~/$DefaultPaperSize/) { |
$result .= "<option selected value='$papersize'>" . $paperSize[$i] . "</option>\n"; |
$result .= '<option selected="selected" value="'.$papersize.'">'.$paperSize[$i].'</option>'."\n"; |
} else { |
} else { |
$result .= "<option value='$papersize'>" . $paperSize[$i] . "</option>\n"; |
$result .= '<option value="'.$papersize.'">'.$paperSize[$i].'</option>'."\n"; |
} |
} |
$i++; |
$i++; |
} |
} |
$result .= "</select></td></tr></table>"; |
$result .= <<HTML; |
|
</select> |
|
</td> |
|
<td align='center'> |
|
<select name='${var}.pdfFormFields'> |
|
<option selected="selected" value="no">$without</option> |
|
<option value="yes">$with</option> |
|
</select> |
|
</td> |
|
HTML |
|
$result.=&Apache::loncommon::end_data_table_row() |
|
.&Apache::loncommon::end_data_table(); |
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 3442 sub postprocess {
|
Line 4993 sub postprocess {
|
my $helper = Apache::lonhelper->getHelper(); |
my $helper = Apache::lonhelper->getHelper(); |
$helper->{VARS}->{$var} = |
$helper->{VARS}->{$var} = |
$env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' . |
$env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' . |
$env{"form.$var.paper"}; |
$env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"}; |
return 1; |
return 1; |
} |
} |
|
|
Line 3520 sub render {
|
Line 5071 sub render {
|
my ($laystyle, $cols, $papersize) = split(/\|/, $format); |
my ($laystyle, $cols, $papersize) = split(/\|/, $format); |
($papersize) = split(/ /, $papersize); |
($papersize) = split(/ /, $papersize); |
|
|
|
$laystyle = &Apache::lonprintout::map_laystyle($laystyle); |
|
|
if ($laystyle eq 'L') { |
|
$laystyle = 'album'; |
|
} else { |
|
$laystyle = 'book'; |
|
} |
|
|
|
|
|
my %size; |
my %size; |
Line 3554 sub render {
|
Line 5101 sub render {
|
} else { |
} else { |
$size{'margin'} += 2.54; |
$size{'margin'} += 2.54; |
} |
} |
my %text = ('format' => 'How should each column be formatted?', |
my %lt = &Apache::lonlocal::texthash( |
'width' => 'Width:', |
'format' => 'How should each column be formatted?', |
'height' => 'Height:', |
'width' => 'Width', |
'margin' => 'Left Margin:',); |
'height' => 'Height', |
%text = &Apache::lonlocal::texthash(%text); |
'margin' => 'Left Margin' |
|
); |
$result .= <<ELEMENTHTML; |
|
|
$result .= '<p>'.$lt{'format'}.'</p>' |
<p>$text{'format'}</p> |
.&Apache::lonhtmlcommon::start_pick_box() |
|
.&Apache::lonhtmlcommon::row_title($lt{'width'}) |
<table cellpadding='3'> |
.'<input type="text" name="'.$var.'.width" value="'.$size{'width'}.'" size="4" />' |
<tr> |
.'<select name="'.$var.'.widthunit">' |
<td align='right'><b>$text{'width'}</b></td> |
.$size{'width_options'} |
<td align='left'><input type='text' name='$var.width' value="$size{'width'}" size='4' /></td> |
.'</select>' |
<td align='left'> |
.&Apache::lonhtmlcommon::row_closure() |
<select name='$var.widthunit'> |
.&Apache::lonhtmlcommon::row_title($lt{'height'}) |
$size{'width_options'} |
.'<input type="text" name="'.$var.'.height" value="'.$size{'height'}.'" size="4" />' |
</select> |
.'<select name="'.$var.'.heightunit">' |
</td> |
.$size{'height_options'} |
</tr> |
.'</select>' |
<tr> |
.&Apache::lonhtmlcommon::row_closure() |
<td align='right'><b>$text{'height'}</b></td> |
.&Apache::lonhtmlcommon::row_title($lt{'margin'}) |
<td align='left'><input type='text' name="$var.height" value="$size{'height'}" size='4' /></td> |
.'<input type="text" name="'.$var.'.lmargin" value="'.$size{'margin'}.'" size="4" />' |
<td align='left'> |
.'<select name="'.$var.'.lmarginunit">' |
<select name='$var.heightunit'> |
.$size{'margin_options'} |
$size{'height_options'} |
.'</select>' |
</select> |
.&Apache::lonhtmlcommon::row_closure(1) |
</td> |
.&Apache::lonhtmlcommon::end_pick_box(); |
</tr> |
# <p>Hint: Some instructors like to leave scratch space for the student by |
<tr> |
# making the width much smaller than the width of the page.</p> |
<td align='right'><b>$text{'margin'}</b></td> |
|
<td align='left'><input type='text' name='$var.lmargin' value="$size{'margin'}" size='4' /></td> |
|
<td align='left'> |
|
<select name='$var.lmarginunit'> |
|
$size{'margin_options'} |
|
</select> |
|
</td> |
|
</tr> |
|
</table> |
|
|
|
<!--<p>Hint: Some instructors like to leave scratch space for the student by |
|
making the width much smaller than the width of the page.</p>--> |
|
|
|
ELEMENTHTML |
|
|
|
return $result; |
return $result; |
} |
} |
Line 3620 sub preprocess {
|
Line 5153 sub preprocess {
|
($papersize) = split(/ /, $papersize); |
($papersize) = split(/ /, $papersize); |
|
|
|
|
if ($laystyle eq 'L') { |
$laystyle = &Apache::lonprintout::map_laystyle($laystyle); |
$laystyle = 'album'; |
|
} else { |
|
$laystyle = 'book'; |
|
} |
|
# Figure out some good defaults for the print out and set them: |
# Figure out some good defaults for the print out and set them: |
|
|
my %size; |
my %size; |
Line 3694 sub postprocess {
|
Line 5224 sub postprocess {
|
} |
} |
} |
} |
|
|
|
|
|
|
__END__ |
__END__ |
|
|