version 1.583.2.2, 2010/08/26 09:30:10
|
version 1.707, 2025/01/15 23:19:30
|
Line 1
|
Line 1
|
# |
|
# The LearningOnline Network |
# The LearningOnline Network |
# Printout |
# Printout |
# |
# |
Line 41 use Apache::admannotations;
|
Line 40 use Apache::admannotations;
|
use Apache::lonenc; |
use Apache::lonenc; |
use Apache::entities; |
use Apache::entities; |
use Apache::londefdef; |
use Apache::londefdef; |
|
# use Apache::structurelags; # for language management. |
|
|
use File::Basename; |
use File::Basename; |
|
|
use HTTP::Response; |
use HTTP::Response; |
|
|
use LONCAPA::map(); |
use LONCAPA::map(); |
use POSIX qw(strftime); |
|
use Apache::lonlocal; |
use Apache::lonlocal; |
use Carp; |
use Carp; |
use LONCAPA; |
use LONCAPA; |
|
|
|
|
my %perm; |
my %perm; |
my %parmhash; |
my %parmhash; |
my $resources_printed; |
my $resources_printed; |
Line 76 my $font_size = 'normalsize'; # Default
|
Line 75 my $font_size = 'normalsize'; # Default
|
|
|
#---------------------------- Helper helpers. ------------------------- |
#---------------------------- Helper helpers. ------------------------- |
|
|
# Returns the text needd for a student chooser. |
## |
|
# Filter function to determine if a resource is a printable sequence. |
|
# |
|
# @param $res -Resource to check. |
|
# |
|
# @return 1 - printable and a resource |
|
# 0 - either notm a sequence or not printable. |
|
# |
|
sub printable_sequence { |
|
my $res = shift; |
|
|
|
# Non-sequences are not listed: |
|
|
|
if (!$res->is_sequence()) { |
|
return 0; |
|
} |
|
|
|
# Person with pav or pfo can always print: |
|
|
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
return 1; |
|
} |
|
|
|
if ($res->is_sequence()) { |
|
my $symb = $res->symb(); |
|
my $navmap = $res->{NAV_MAP}; |
|
|
|
# Find the first resource in the map: |
|
|
|
my $iterator = $navmap->getIterator($res, undef, undef, 1, 1); |
|
my $first = $iterator->next(); |
|
|
|
while (1) { |
|
if ($first == $iterator->END_ITERATOR) { last; } |
|
if (ref($first) && ! $first->is_sequence()) {last; } |
|
$first = $iterator->next(); |
|
} |
|
|
|
|
|
# Might be an empty map: |
|
|
|
if (!ref($first)) { |
|
return 0; |
|
} |
|
my $partsref = $first->parts(); |
|
my @parts = @$partsref; |
|
my ($open, $close) = $navmap->map_printdates($first, $parts[0]); |
|
return &printable($open, $close); |
|
} |
|
return 0; |
|
} |
|
|
|
# BZ5209: |
|
# Create the states needed to run the helper for incomplete problems from |
|
# the current folder for selected students. |
|
# This includes: |
|
# - A resource selector limited to problems (incompleteness must be |
|
# calculated on a student per student basis. |
|
# - A student selector. |
|
# - Tie in to the FORMAT of the print job. |
|
# |
|
# States: |
|
# CHOOSE_INCOMPLETE_PEOPLE_SEQ - Resource selection. |
|
# CHOOSE_STUDENTS_INCOMPLETE - Student selection. |
|
# CHOOSE_STUDENTS_INCOMPLETE_FORMAT - Format selection |
|
# Parameters: |
|
# helper - the helper which already contains info about the current folder we can |
|
# purloin. |
|
# map - the map for which incomplete problems are to be printed |
|
# nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps |
|
# Return: |
|
# XML that can be parsed by the helper to drive the state machine. |
|
# |
|
sub create_incomplete_folder_selstud_helper { |
|
my ($helper, $map, $nocurrloc) = @_; |
|
|
|
|
|
my $symbFilter = '$res->shown_symb()'; |
|
my $selFilter = '$res->is_problem()'; |
|
|
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', |
|
'Select problem(s) to print', |
|
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
|
'RESOURCES', |
|
'CHOOSE_STUDENTS_INCOMPLETE', |
|
$map, |
|
$selFilter, |
|
'', |
|
$symbFilter, |
|
''); |
|
|
|
my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE', |
|
'student_sort', |
|
'STUDENTS', |
|
'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); |
|
|
|
my $format_chooser = &generate_format_selector($helper, |
|
'Format of the print job', |
|
'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state. |
|
|
|
return $resource_chooser . $student_chooser . $format_chooser; |
|
} |
|
|
|
|
|
# BZ 5209 |
|
# Create the states needed to run the helper for incomplete problems from |
|
# the current folder for selected students. |
|
# This includes: |
|
# - A resource selector limited to problems. (incompleteness must be calculated |
|
# on a student per student basis. |
|
# - A student selector. |
|
# - Tie in to format for the print job. |
|
# States: |
|
# INCOMPLETE_PROBLEMS_COURSE_RESOURCES - Resource selector. |
|
# INCOMPLETE_PROBLEMS_COURSE_STUDENTS - Student selector. |
|
# INCOMPLETE_PROBLEMS_COURSE_FORMAT - Format selection. |
|
# |
|
# Parameters: |
|
# helper - Helper we are creating states for. |
|
# Returns: |
|
# Text that can be parsed by the helper. |
|
# |
|
|
|
sub create_incomplete_course_helper { |
|
my $helper = shift; |
|
|
|
my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; |
|
my $symbfilter = '$res->shown_symb()'; |
|
|
|
my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', |
|
'Select problem(s) to print', |
|
'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"', |
|
'RESOURCES', |
|
'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
|
'', |
|
$filter, |
|
'', |
|
$symbfilter, |
|
''); |
|
|
|
my $people_chooser = &generate_student_chooser('INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
|
'student_sort', |
|
'STUDENTS', |
|
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); |
|
|
|
my $format = &generate_format_selector($helper, |
|
'Format of the print job', |
|
'INCOMPLETE_PROBLEMS_COURSE_FORMAT'); # end state. |
|
|
|
return $resource_chooser . $people_chooser . $format; |
|
|
|
|
|
} |
|
|
|
# BZ5209 |
|
# Creates the states needed to run the print helper for a student |
|
# that wants to print his incomplete problems from the current folder. |
|
# Parameters: |
|
# $helper - helper we are generating states for. |
|
# $map - The map for which the student wants incomplete problems. |
|
# $nocurrloc - True if printout called from icon/link in Tools in /adm/navmaps |
|
# Returns: |
|
# XML that defines the helper states being created. |
|
# |
|
# States: |
|
# CHOOSE_INCOMPLETE_SEQ - Resource selector. |
|
# |
|
sub create_incomplete_folder_helper { |
|
my ($helper, $map, $nocurrloc) = @_; |
|
|
|
my $filter = '$res->is_problem()'; |
|
$filter .= ' && $res->resprintable() '; |
|
$filter .= ' && $res->is_incomplete() '; |
|
|
|
my $symfilter = '$res->shown_symb()'; |
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', |
|
'Select problem(s) to print', |
|
'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$map, |
|
$filter, '', |
|
$symfilter, |
|
''); |
|
|
|
return $resource_chooser; |
|
} |
|
|
|
|
|
# Returns the text neded for a student chooser. |
# that text must still be parsed by the helper xml parser. |
# that text must still be parsed by the helper xml parser. |
# Parameters: |
# Parameters: |
# this_state - State name of the chooser. |
# this_state - State name of the chooser. |
Line 86 my $font_size = 'normalsize'; # Default
|
Line 276 my $font_size = 'normalsize'; # Default
|
|
|
|
|
sub generate_student_chooser { |
sub generate_student_chooser { |
my ($this_state, |
my ($this_state, |
$sort_choice, |
$sort_choice, |
$variable, |
$variable, |
$next_state) = @_; |
$next_state) = @_; |
my $result = <<CHOOSE_STUDENTS; |
my $result = <<CHOOSE_STUDENTS; |
<state name="$this_state" title="Select Students and Resources"> |
<state name="$this_state" title="Select Students and Resources"> |
Line 100 sub generate_student_chooser {
|
Line 290 sub generate_student_chooser {
|
</choices> |
</choices> |
|
|
<message><br /><hr /><br /> </message> |
<message><br /><hr /><br /> </message> |
<student multichoice='1' |
<student multichoice='1' |
variable="$variable" |
variable="$variable" |
nextstate="$next_state" |
nextstate="$next_state" |
coursepersonnel="1" /> |
coursepersonnel="1" /> |
Line 118 CHOOSE_STUDENTS
|
Line 308 CHOOSE_STUDENTS
|
# this_state - State name of the chooser. |
# this_state - State name of the chooser. |
# prompt_text - Text to use to prompt user. |
# prompt_text - Text to use to prompt user. |
# resource_options - Resource tag options e.g. |
# resource_options - Resource tag options e.g. |
# "multichoice='1', toponly='1', addstatus='1'" |
# "multichoice='1', toponly='1', addstatus='1', |
|
# modallink='1'" |
# that control the selection and appearance of the |
# that control the selection and appearance of the |
# resource selector. |
# resource selector. |
# variable - Name of the variable to hold the choice |
# variable - Name of the variable to hold the choice |
Line 129 CHOOSE_STUDENTS
|
Line 320 CHOOSE_STUDENTS
|
# filter - How to filter the resources. |
# filter - How to filter the resources. |
# value_func - <valuefunc> function. |
# value_func - <valuefunc> function. |
# choice_func - If not empty generates a <choicefunc> with this function. |
# choice_func - If not empty generates a <choicefunc> with this function. |
# start_new_option |
# start_new_option |
# - Fragment appended after valuefunc. |
# - Fragment appended after valuefunc. |
# |
# |
# |
# |
Line 164 CHOOSE_RESOURCES
|
Line 355 CHOOSE_RESOURCES
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_RESOURCES |
CHOOSE_RESOURCES |
|
|
return $result; |
return $result; |
} |
} |
# |
# |
Line 217 sub generate_code_selector {
|
Line 407 sub generate_code_selector {
|
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Bubble sheet type:</b></message> |
<message><b>Bubblesheet type:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$bubble_types |
$bubble_types |
Line 256 CHOOSE_ANON1
|
Line 446 CHOOSE_ANON1
|
return $result; |
return $result; |
} |
} |
|
|
|
sub generate_common_choosers { |
|
my ($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option) = @_; |
|
|
|
my $randomly_ordered_warning = |
|
&get_randomly_ordered_warning($helper, $map); |
|
|
|
# code for a few states used for printout launched from both |
|
# /adm/navmaps and from a resource by a privileged user: |
|
# - To allow resources to be selected for printing. |
|
# - To determine pagination between assignments. |
|
# - To determine how many assignments should be bundled into a single PDF. |
|
|
|
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
|
'Select resources to print', |
|
'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$map, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
$resource_selector .= &generate_format_selector($helper, |
|
'How should results be printed?', |
|
'PRINT_FORMATTING'). |
|
&generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
|
|
# Generate student choosers. |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', |
|
&generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', |
|
'student_sort', |
|
'STUDENTS', |
|
'CHOOSE_STUDENTS_PAGE')); |
|
&Apache::lonxml::xmlparse($r, 'helper', |
|
&generate_student_chooser('CHOOSE_STUDENTS', |
|
'student_sort', |
|
'STUDENTS', |
|
'SELECT_PROBLEMS')); |
|
&Apache::lonxml::xmlparse($r, 'helper', $resource_selector); |
|
|
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); |
|
my $namechoice='<choice></choice>'; |
|
foreach my $name (sort {uc($a) cmp uc($b)} @names) { |
|
if ($name =~ /^error: 2 /) { next; } |
|
if ($name =~ /^type\0/) { next; } |
|
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
|
} |
|
|
|
my %code_values; |
|
my %codes_to_print; |
|
foreach my $key (@names) { |
|
%code_values = &Apache::grades::get_codes($key, $cdom, $cnum); |
|
foreach my $key (keys(%code_values)) { |
|
$codes_to_print{$key} = 1; |
|
} |
|
} |
|
|
|
my $code_selection; |
|
foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { |
|
my $choice = $code; |
|
if ($code =~ /^[A-Z]+$/) { # Alpha code |
|
$choice = &letters_to_num($code); |
|
} |
|
push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); |
|
} |
|
if (%codes_to_print) { |
|
$code_selection .=' |
|
<message><b>Choose single CODE from list:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
<choice></choice> |
|
<exec> |
|
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
|
</exec> |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
|
'.$/; |
|
} |
|
|
|
my @lines = &Apache::lonnet::get_scantronformat_file(); |
|
my $codechoice=''; |
|
foreach my $line (@lines) { |
|
next if (($line =~ /^\#/) || ($line eq '')); |
|
my ($name,$description,$code_type,$code_length)= |
|
(split(/:/,$line))[0,1,2,4]; |
|
if ($code_length > 0 && |
|
$code_type =~/^(letter|number|-1)/) { |
|
$codechoice.='<choice computer="'.$name.'">'.$description.'</choice>'; |
|
} |
|
} |
|
if ($codechoice eq '') { |
|
$codechoice='<choice computer="default">Default</choice>'; |
|
} |
|
my $anon1 = &generate_code_selector($helper, |
|
'CHOOSE_ANON1', |
|
'SELECT_PROBLEMS', |
|
$codechoice, |
|
$code_selection, |
|
$namechoice) . $resource_selector; |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper',$anon1); |
|
|
|
my $anon_page = &generate_code_selector($helper, |
|
'CHOOSE_ANON1_PAGE', |
|
'SELECT_PROBLEMS_PAGE', |
|
$codechoice, |
|
$code_selection, |
|
$namechoice) . |
|
&generate_resource_chooser('SELECT_PROBLEMS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
&Apache::lonxml::xmlparse($r, 'helper', $anon_page); |
|
return ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice); |
|
} |
|
|
|
# Returns the XML for choosing how assignments are to be formatted |
|
# that text must still be parsed by the helper xml parser. |
|
# Parameters: 3 (required) |
|
|
|
# helper - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used |
|
# to check if splitting PDFs by section can be offered. |
|
# title - Title for the current state. |
|
# this_state - State name of the chooser. |
|
|
|
sub generate_format_selector { |
|
my ($helper,$title,$this_state) = @_; |
|
my $secpdfoption; |
|
unless (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_problems_for_anon') || |
|
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences_resources_for_anon')) { |
|
$secpdfoption = '<choice computer="sections">Each PDF contains exactly one section</choice>'; |
|
} |
|
return <<RESOURCE_SELECTOR; |
|
<state name="$this_state" title="$title"> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
$secpdfoption |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
|
} |
|
|
#----------------------------------------------------------------------- |
#----------------------------------------------------------------------- |
|
|
|
# Computes an open and close date from a list of open/close dates for a resource's |
|
# parts. |
|
# |
|
# @param \@opens - reference to an array of open dates. |
|
# @param \@closes - reference to an array of close dates. |
|
# |
|
# @return ($open, $close) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# |
|
sub compute_open_window { |
|
my ($opensref, $closesref) = @_; |
|
|
|
my @opens = @$opensref; |
|
my @closes = @$closesref; |
|
|
|
# latest open date: |
|
my $latest_open; |
|
|
|
foreach my $open (@opens) { |
|
if (!defined($latest_open) || ($open > $latest_open)) { |
|
$latest_open = $open; |
|
} |
|
} |
|
# Earliest close: |
|
|
|
my $earliest_close; |
|
foreach my $close (@closes) { |
|
if (!defined($earliest_close) || ($close < $earliest_close)) { |
|
$earliest_close = $close; |
|
} |
|
} |
|
|
|
# If no overlap...both are -1 as promised. |
|
|
|
if (($earliest_close ne '') && ($latest_open ne '') |
|
&& ($earliest_close < $latest_open)) { |
|
$latest_open = -1; |
|
$earliest_close = -1; |
|
} |
|
|
|
return ($latest_open, $earliest_close); |
|
|
|
} |
|
|
|
## |
|
# Determines if 'now' is within the set of printable dates. |
|
# |
|
# @param $open_date - Starting date/timestamp. |
|
# @param $close_date - Ending date/timestamp. |
|
# |
|
# @return 0 - Not open. |
|
# @return 1 - open. |
|
# |
|
sub printable { |
|
my ($open_date, $close_date) = @_; |
|
|
|
|
|
my $now = time(); |
|
|
|
# Have to do a bit of fancy footwork around undefined open/close dates: |
|
|
|
if ($open_date && ($open_date > $now)) { |
|
return 0; |
|
} |
|
|
|
if ($close_date && ($close_date < $now)) { |
|
return 0; |
|
} |
|
|
|
return 1; |
|
|
|
} |
|
|
|
## |
|
# Returns the innermost print start/print end dates for a resource. |
|
# This is done by looking at the start/end dates for its parts and choosing |
|
# the intersection of those dates. |
|
# |
|
# @param res - lonnvamaps::resource object that represents the resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# For consistency with &printable() in lonnavmaps.pm determination of start |
|
# date for printing checks printstartdate param first, then, if not set, |
|
# opendate param, then, if not set, contentopen param. |
|
|
|
sub get_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts; |
|
if (ref($partsref) eq 'ARRAY') { |
|
@parts = @{$partsref}; |
|
} |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
|
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my $partopen = $res->parmval('printstartdate', $part); |
|
my $partclose = $res->parmval('printenddate', $part); |
|
if (!$partopen) { |
|
$partopen = $res->parmval('opendate',$part); |
|
} |
|
if (!$partopen) { |
|
$partopen = $res->parmval('contentopen',$part); |
|
} |
|
if ($partopen) { |
|
push(@open_dates, $partopen); |
|
} |
|
if ($partclose) { |
|
push(@close_dates, $partclose); |
|
} |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
} |
|
|
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
|
|
return ($open_date, $close_date); |
|
} |
|
|
|
## |
|
# Get the dates for which a course says a resource can be printed. This is like |
|
# get_print_dates but namvaps::course_print_dates are gotten...and not converted |
|
# to times either. |
|
# |
|
# @param $res - Reference to a resource hash from lonnavmaps::resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
sub course_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # Slightly OO dirty. |
|
|
|
# Don't bother looping over undefined or empty parts array; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->course_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
## |
|
# Same as above but for the enclosing map: |
|
# |
|
sub map_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # slightly OO dirty. |
|
|
|
|
|
# Don't bother looping over undefined or empty parts array; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->map_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
|
|
# Determine if a resource is incomplete given the map: |
|
# Parameters: |
|
# $username - Name of user for whom we are checking. |
|
# $domain - Domain of user we are checking. |
|
# $section - Section for user for whom we are checking. |
|
# $map - map name. |
|
# Returns: |
|
# 0 - map is not incomplete. |
|
# 1 - map is incomplete. |
|
# |
|
sub incomplete { |
|
my ($username, $domain, $section, $map) = @_; |
|
|
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $domain, $section); |
|
|
|
|
|
if (defined($navmap)) { |
|
my $res = $navmap->getResourceByUrl($map); |
|
my $result = $res->is_incomplete(); |
|
return $result; |
|
} else { |
|
return 1; |
|
} |
|
} |
|
# |
|
# When printing for students, the resources and order of the |
|
# resources may need to be altered if there are folders with |
|
# random selectiopn or random ordering (or both) enabled. |
|
# This sub computes the set of resources to print for a student |
|
# modified both by random ordering and selection and filtered |
|
# to only those that are in the original set selected to be printed. |
|
# |
|
# Parameters: |
|
# $map - The URL of the folder being printed. |
|
# Used to determine which startResource and finishResource |
|
# to use when using the navmap's getIterator method. |
|
# $seq - The original set of resources to print. |
|
# (really an array of resource names (array of symb's). |
|
# $who - Student/domain for whome the sequence will be generated. |
|
# $code - CODE being printed when printing Problems/Resources |
|
# from folder for CODEd assignments |
|
# $nohidemap - If true, parameter in map for hiddenresource will be |
|
# ignored. The user calling the routine should have |
|
# both the pav and vgr privileges if this is set to true). |
|
# |
|
# Implicit inputs: |
|
# $ |
|
# Returns: |
|
# reference to an array of resources that can be passed to |
|
# print_resources. |
|
# |
|
sub master_seq_to_person_seq { |
|
my ($map, $seq, $who, $code, $nohidemap) = @_; |
|
|
|
|
|
my ($username, $userdomain, $usersection) = split(/:/, $who); |
|
|
|
# Toss the sequence up into a hash so that we have O(1) lookup time. |
|
# on the items that come out of the user's list of resources. |
|
# |
|
|
|
my %seq_hash = map {$_ => 1} @$seq; |
|
my @output_seq; |
|
|
|
my $unhidden; |
|
if ($nohidemap) { |
|
$unhidden = &Apache::lonnet::clutter($map); |
|
} |
|
|
|
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, |
|
$usersection, $code, $unhidden); |
|
my ($start,$finish); |
|
|
|
if ($map) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
if ($mapres->is_map()) { |
|
$start = $mapres->map_start(); |
|
$finish = $mapres->map_finish(); |
|
} |
|
} |
|
unless ($start && $finish) { |
|
$start = $navmap->firstResource(); |
|
$finish = $navmap->finishResource(); |
|
} |
|
|
|
my $iterator = $navmap->getIterator($start,$finish,{},1); |
|
|
|
# Iterate on the resource..select the items that are randomly selected |
|
# and that are in the seq_hash. Presumably the iterator will take care |
|
# of the random ordering part of the deal. |
|
# |
|
my $curres; |
|
while ($curres = $iterator->next()) { |
|
# |
|
# Only process resources..that are not removed by randomout... |
|
# and are selected for printint as well. |
|
# |
|
if (ref($curres) && ! $curres->randomout()) { |
|
my $currsymb = $curres->symb(); |
|
if (exists($seq_hash{$currsymb})) { |
|
push(@output_seq, $currsymb); |
|
} |
|
} |
|
} |
|
|
|
return \@output_seq; # for now. |
|
|
|
} |
|
|
|
|
# Fetch the contents of a resource, uninterpreted. |
# Fetch the contents of a resource, uninterpreted. |
# This is used here to fetch a latex file to be included |
# This is used here to fetch a latex file to be included |
Line 278 sub fetch_raw_resource {
|
Line 938 sub fetch_raw_resource {
|
} |
} |
return $contents; |
return $contents; |
|
|
|
|
} |
} |
|
|
# Fetch the annotations associated with a URL and |
# Fetch the annotations associated with a URL and |
# put a centered 'annotations:' title. |
# put a centered 'annotations:' title. |
# This is all suppressed if the annotations are empty. |
# This is all suppressed if the annotations are empty. |
# |
# |
Line 314 sub set_font_size {
|
Line 974 sub set_font_size {
|
my ($text) = @_; |
my ($text) = @_; |
|
|
# There appear to be cases where the font directive is empty.. in which |
# There appear to be cases where the font directive is empty.. in which |
# case the first substituion would insert a spurious \ oh happy day. |
# case the first substitution would insert a spurious \ oh happy day. |
# as this has been the cause of much mystery and hair pulling _sigh_ |
# as this has been the cause of much mystery and hair pulling _sigh_ |
|
|
if ($font_size ne '') { |
if ($font_size ne '') { |
|
|
$text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; |
$text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; |
|
$text =~ s/\\end\{document}/}\\end{document}/; |
|
|
} |
} |
$text =~ s/\\end{document}/}\\end{document}/; |
|
return $text; |
return $text; |
|
|
|
|
} |
} |
|
|
# include_pdf - PDF files are included into the |
# include_pdf - PDF files are included into the |
# output as follows: |
# output as follows: |
# - The PDF, if necessary, is replicated. |
# - The PDF, if necessary, is replicated. |
# - The PDF is added to the list of files to convert to postscript (along with the images). |
# - 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 |
# - The LaTeX is added to include the final converted postscript in the file as an included |
# job. The assumption is that the includedpsheader.ps header will be included. |
# job. The assumption is that the includepsheader.ps header will be included. |
# |
# |
# Parameters: |
# Parameters: |
# pdf_uri - URI of the PDF file to include. |
# pdf_uri - URI of the PDF file to include. |
# |
# |
# Returns: |
# Returns: |
# The LaTeX to include. |
# The LaTeX to include. |
# |
# |
Line 356 sub include_pdf {
|
Line 1017 sub include_pdf {
|
$file = &Apache::lonnet::filelocation('',$pdf_uri); |
$file = &Apache::lonnet::filelocation('',$pdf_uri); |
} |
} |
|
|
# The file isn ow replicated locally.. or it did not exist in the first place |
# The file is now replicated locally ... or it did not exist in the first place |
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# need tob e converted for this print job: |
# need to be converted for this print job: |
|
|
$file =~ s|(.*)/res/|/home/httpd/html/res/|; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$file =~ s{(.*)/res/}{$londocroot/res/}; |
|
|
open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
print FILE ("$file\n"); |
print FILE ("$file\n"); |
close (FILE); |
close (FILE); |
|
|
Line 385 sub include_pdf {
|
Line 1047 sub include_pdf {
|
|
|
|
|
} |
} |
|
## |
|
# Collect the various \select_language{language_name} |
|
# latex tags to build a \usepackage[lang-list]{babel} which will |
|
# appear just prior to the \begin{document} at the front of the concatenated |
|
# set of resources: |
|
# @param doc - The string of latex to search/replace. |
|
# @return string |
|
# @retval - the modified document stringt. |
|
# |
|
sub collect_languages { |
|
my $doc = shift; |
|
my %languages; |
|
while ($doc =~ /\\selectlanguage\{(\w+)}/mg) { |
|
$languages{$1} = 1; # allows us to request each language exactly once. |
|
} |
|
my @lang_list = (keys(%languages)); # List of unique languages |
|
if (scalar @lang_list) { |
|
my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n"; |
|
$doc =~ s/\\begin\{document}/$babel_header\\begin{document}/; |
|
} |
|
return $doc; |
|
} |
|
#------------------------------------------------------------------- |
|
|
# |
# |
# ssi_with_retries- Does the server side include of a resource. |
# ssi_with_retries- Does the server side include of a resource. |
Line 393 sub include_pdf {
|
Line 1077 sub include_pdf {
|
# 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 |
# output and we set some global variables. |
# output and we set some global variables. |
# to indicate to the caller an SSI error occurred. |
# to indicate to the caller an SSI error occurred. |
# All of this is supposed to deal with the issues described |
# All of this is supposed to deal with the issues described |
# in LonCAPA BZ 5631 see: |
# in LonCAPA BZ 5631 see: |
# http://bugs.lon-capa.org/show_bug.cgi?id=5631 |
# http://bugs.lon-capa.org/show_bug.cgi?id=5631 |
Line 403 sub include_pdf {
|
Line 1087 sub include_pdf {
|
# resource - The resource to include. This is passed directly, without |
# resource - The resource to include. This is passed directly, without |
# interpretation to lonnet::ssi. |
# interpretation to lonnet::ssi. |
# form - The form hash parameters that guide the interpretation of the resource |
# form - The form hash parameters that guide the interpretation of the resource |
# |
# |
# retries - Number of retries allowed before giving up completely. |
# retries - Number of retries allowed before giving up completely. |
# Returns: |
# Returns: |
# On success, returns the rendered resource identified by the resource parameter. |
# On success, returns the rendered resource identified by the resource parameter. |
Line 432 sub ssi_with_retries {
|
Line 1116 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 448 sub get_student_view_with_retries {
|
Line 1131 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 456 sub get_student_view_with_retries {
|
Line 1138 sub get_student_view_with_retries {
|
|
|
# |
# |
# printf_style_subst item format_string repl |
# printf_style_subst item format_string repl |
# |
# |
# Does printf style substitution for a format string that |
# Does printf style substitution for a format string that |
# can have %[n]item in it.. wherever, %[n]item occurs, |
# can have %[n]item in it.. wherever, %[n]item occurs, |
# rep is substituted in format_string. Note that |
# rep is substituted in format_string. Note that |
# [n] is an optional integer length. If provided, |
# [n] is an optional integer length. If provided, |
# repl is truncated to at most [n] characters prior to |
# repl is truncated to at most [n] characters prior to |
# substitution. |
# substitution. |
# |
# |
sub printf_style_subst { |
sub printf_style_subst { |
Line 473 sub printf_style_subst {
|
Line 1155 sub printf_style_subst {
|
my $subst = $repl; |
my $subst = $repl; |
if ($size ne "") { |
if ($size ne "") { |
$subst = substr($subst, 0, $size); |
$subst = substr($subst, 0, $size); |
|
|
# Here's a nice edge case.. supose the end of the |
# Here's a nice edge case ... suppose the end of the |
# substring is a \. In that case may have just |
# substring is a \. In that case may have just |
# chopped off a TeX escape... in that case, we append |
# chopped off a TeX escape... in that case, we append |
# " " for the trailing character, and let the field |
# " " for the trailing character, and let the field |
# spill over a bit (sigh). |
# spill over a bit (sigh). |
# We don't just chop off the last character in order to deal |
# We don't just chop off the last character in order to deal |
# with one last pathology, and that would be if substr had |
# with one last pathology, and that would be if substr had |
# trimmed us to e.g. \\\ |
# trimmed us to e.g. \\\ |
|
|
|
|
if ($subst =~ /\\$/) { |
if ($subst =~ /\\$/) { |
Line 501 sub printf_style_subst {
|
Line 1183 sub printf_style_subst {
|
} |
} |
|
|
|
|
# Format a header according to a format. |
# Format a header according to a format. |
# |
# |
|
|
# Substitutions: |
# Substitutions: |
# %a - Assignment name. |
# %a - Assignment name. |
Line 511 sub printf_style_subst {
|
Line 1193 sub printf_style_subst {
|
# %s - The section if it is supplied. |
# %s - The section if it is supplied. |
# |
# |
sub format_page_header { |
sub format_page_header { |
my ($width, $format, $assignment, $course, $student) = @_; |
my ($width, $format, $assignment, $course, $student, $section) = @_; |
|
|
|
|
|
|
$width = &recalcto_mm($width); # Get width in mm. |
$width = &recalcto_mm($width); # Get width in mm. |
my $chars_per_line = int($width/2); # Character/textline. |
my $chars_per_line = int($width/1.6); # Character/textline. |
|
|
# Default format? |
# Default format? |
|
|
Line 526 sub format_page_header {
|
Line 1208 sub format_page_header {
|
# we assume that each character is about 2mm in width. |
# we assume that each character is about 2mm in width. |
# (correct for the header text size??). We ignore |
# (correct for the header text size??). We ignore |
# any formatting (e.g. boldfacing in this). |
# any formatting (e.g. boldfacing in this). |
# |
# |
# - Allow the student/course to be one line. |
# - Allow the student/course to be one line. |
# 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 $firstline = "$student $course"; |
|
if (length($firstline) > $chars_per_line) { |
|
my $lastchar = $chars_per_line - length($student) - 1; |
|
if ($lastchar > 0) { |
|
$course = substr($course, 0, $lastchar); |
|
} else { # Nothing left of course: |
|
$course = ''; |
|
} |
|
} |
|
if (length($assignment) > $chars_per_line) { |
|
$assignment = substr($assignment, 0, $chars_per_line); |
|
} |
|
|
|
$format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; |
my $name_length = int($chars_per_line *3 /4); |
|
my $sec_length = int($chars_per_line / 5); |
|
|
|
$format = "%$name_length".'n'; |
|
|
|
if ($section) { |
|
$format .= ' - Sec: '."%$sec_length".'s'; |
|
} |
|
$format .= '\\hfill\\thepage'; |
|
|
|
$format .= '\\\\%c \\\\ %a'; |
|
|
} else { |
|
# An open question is how to handle long user formatted page headers... |
|
# A possible future is to support e.g. %na so that the user can control |
|
# the truncation of the elements that can appear in the header. |
|
# |
|
$format = &printf_style_subst("a", $format, $assignment); |
|
$format = &printf_style_subst("c", $format, $course); |
|
$format = &printf_style_subst("n", $format, $student); |
|
|
|
# If the user put %'s in the format string, they must be escaped |
|
# to \% else LaTeX will think they are comments and terminate |
|
# the line.. which is bad!!! |
|
|
|
} |
} |
|
# An open question is how to handle long user formatted page headers... |
|
# A possible future is to support e.g. %na so that the user can control |
|
# the truncation of the elements that can appear in the header. |
|
# |
|
$format = &printf_style_subst("a", $format, $assignment); |
|
$format = &printf_style_subst("c", $format, $course); |
|
$format = &printf_style_subst("n", $format, $student); |
|
$format = &printf_style_subst("s", $format, $section); |
|
|
|
|
|
# If the user put %'s in the format string, they must be escaped |
|
# to \% else LaTeX will think they are comments and terminate |
|
# the line.. which is bad!!! |
|
|
|
# If the user has role author, $course and $assignment are empty so |
|
# there is '\\ \\ ' in the page header. That's cause a error in LaTeX |
|
if($format =~ /\\\\\s\\\\\s/) { |
|
#TODO find sensible caption for page header |
|
my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout '); |
|
$format =~ s/\\\\\s\\\\\s/$testPrintout/; |
|
} |
|
# |
|
# We're going to trust LaTeX to break lines appropriately, but |
|
# we'll truncate anything that's more than 3 lines worth of |
|
# text. This is also assuming (which will probably end badly) |
|
# nobody's going to embed LaTeX control sequences in the title |
|
# header or rather that those control sequences won't get broken |
|
# by the stuff below. |
|
# |
|
my $total_length = 3*$chars_per_line; |
|
if (length($format) > $total_length) { |
|
$format = substr($format, 0, $total_length); |
|
} |
|
|
|
|
return $format; |
return $format; |
|
|
} |
} |
|
|
# |
# |
Line 610 sub is_valid_numeric_code {
|
Line 1314 sub is_valid_numeric_code {
|
# Remove leading/trailing whitespace; |
# Remove leading/trailing whitespace; |
$value =~ s/^\s*//g; |
$value =~ s/^\s*//g; |
$value =~ s/\s*$//g; |
$value =~ s/\s*$//g; |
|
|
# All digits? |
# All digits? |
if ($value !~ /^[0-9]+$/) { |
if ($value !~ /^[0-9]+$/) { |
return "Numeric code $value has invalid characters - must only be digits"; |
return "Numeric code $value has invalid characters - must only be digits"; |
Line 631 sub is_valid_numeric_code {
|
Line 1335 sub is_valid_numeric_code {
|
# |
# |
sub is_valid_alpha_code { |
sub is_valid_alpha_code { |
my ($value, $num_letters) = @_; |
my ($value, $num_letters) = @_; |
|
|
# strip leading and trailing spaces. |
# strip leading and trailing spaces. |
|
|
$value =~ s/^\s*//g; |
$value =~ s/^\s*//g; |
Line 649 sub is_valid_alpha_code {
|
Line 1353 sub is_valid_alpha_code {
|
|
|
# Determine if a code entered by the user in a helper is valid. |
# Determine if a code entered by the user in a helper is valid. |
# valid depends on the code type and the type of code selected. |
# valid depends on the code type and the type of code selected. |
# The type of code selected can either be numeric or |
# The type of code selected can either be numeric or |
# Alphabetic. If alphabetic, the code, in fact is a simple |
# Alphabetic. If alphabetic, the code, in fact is a simple |
# substitution cipher for the actual numeric code: 0->A, 1->B ... |
# substitution cipher for the actual numeric code: 0->A, 1->B ... |
# We'll be nice and be case insensitive for alpha codes. |
# We'll be nice and be case insensitive for alpha codes. |
Line 664 sub is_valid_alpha_code {
|
Line 1368 sub is_valid_alpha_code {
|
sub is_code_valid { |
sub is_code_valid { |
my ($code_value, $code_option) = @_; |
my ($code_value, $code_option) = @_; |
my ($code_type, $code_length) = ('letter', 6); # defaults. |
my ($code_type, $code_length) = ('letter', 6); # defaults. |
my @lines = &Apache::grades::get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
|
next if (($line =~ /^\#/) || ($line eq '')); |
my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; |
my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; |
if($name eq $code_option) { |
if($name eq $code_option) { |
$code_length = $length; |
$code_length = $length; |
Line 682 sub is_code_valid {
|
Line 1387 sub is_code_valid {
|
} |
} |
|
|
} |
} |
|
# |
|
# Compare two students by section (Used to sort by section). |
|
# |
|
# Implicit inputs, |
|
# $a - The first one |
|
# $b - The second one. |
|
# |
|
# Returns: |
|
# a-section cmp b-section |
|
# |
|
sub compare_sections { |
|
my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a); |
|
my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b); |
|
|
|
return $s1 cmp $s2; |
|
} |
|
|
# Compare two students by name. The students are in the form |
# Compare two students by name. The students are in the form |
# returned by the helper: |
# returned by the helper: |
Line 721 sub compare_names {
|
Line 1442 sub compare_names {
|
} |
} |
|
|
# Break the tie on the first name, but there are leading (possibly trailing |
# Break the tie on the first name, but there are leading (possibly trailing |
# whitespaces to get rid of first |
# whitespaces to get rid of first) |
# |
# |
$f1 =~ s/^\s+//; # Remove leading... |
$f1 =~ s/^\s+//; # Remove leading... |
$f1 =~ s/\s+$//; # Trailing spaces from first 1... |
$f1 =~ s/\s+$//; # Trailing spaces from first 1... |
|
|
$f2 =~ s/^\s+//; |
$f2 =~ s/^\s+//; |
$f2 =~ s/\s+$//; # And the same for first 2... |
$f2 =~ s/\s+$//; # And the same for first 2... |
|
|
Line 735 sub compare_names {
|
Line 1456 sub compare_names {
|
if($f1 gt $f2) { |
if($f1 gt $f2) { |
return 1; |
return 1; |
} |
} |
|
|
# Must be the same name. |
# Must be the same name. |
|
|
return 0; |
return 0; |
Line 743 sub compare_names {
|
Line 1464 sub compare_names {
|
|
|
sub latex_header_footer_remove { |
sub latex_header_footer_remove { |
my $text = shift; |
my $text = shift; |
$text =~ s/\\end{document}//; |
$text =~ s/\\end\{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin\{document}//; |
return $text; |
return $text; |
} |
} |
# |
# |
# If necessary, encapsulate text inside |
# If necessary, encapsulate text inside |
# a minipage env. |
# a minipage env. |
# necessity is determined by the problem_split param. |
# necessity is determined by the problem_split param. |
# |
# |
sub encapsulate_minipage { |
sub encapsulate_minipage { |
my ($text) = @_; |
my ($text,$problem_split) = @_; |
if (!($env{'form.problem.split'} =~ /yes/i)) { |
if (!($problem_split =~ /yes/i)) { |
$text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; |
$text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}'; |
} |
} |
return $text; |
return $text; |
Line 772 sub adjust_number_to_print {
|
Line 1493 sub adjust_number_to_print {
|
my $helper = shift; |
my $helper = shift; |
|
|
my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'}; |
my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'}; |
|
|
if ($split_pdf eq 'all') { |
if ($split_pdf eq 'all') { |
$helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all'; |
$helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all'; |
} elsif ($split_pdf eq 'oneper') { |
} elsif ($split_pdf eq 'oneper') { |
Line 804 sub old_character_chart {
|
Line 1525 sub old_character_chart {
|
$result =~ s/&(\#0?34|quot);/\"/g; |
$result =~ s/&(\#0?34|quot);/\"/g; |
$result =~ s/&\#0?35;/\\\#/g; |
$result =~ s/&\#0?35;/\\\#/g; |
$result =~ s/&\#0?36;/\\\$/g; |
$result =~ s/&\#0?36;/\\\$/g; |
$result =~ s/&\#0?37;/\\%/g; |
$result =~ s/&\#0?37;/\\%/g; |
$result =~ s/&(\#0?38|amp);/\\&/g; |
$result =~ s/&(\#0?38|amp);/\\&/g; |
$result =~ s/&\#(0?39|146);/\'/g; |
$result =~ s/&\#(0?39|146);/\'/g; |
$result =~ s/&\#0?40;/(/g; |
$result =~ s/&\#0?40;/(/g; |
$result =~ s/&\#0?41;/)/g; |
$result =~ s/&\#0?41;/)/g; |
Line 912 sub old_character_chart {
|
Line 1633 sub old_character_chart {
|
$result =~ s/&(\#160|nbsp);/~/g; |
$result =~ s/&(\#160|nbsp);/~/g; |
$result =~ s/&(\#161|iexcl);/!\`/g; |
$result =~ s/&(\#161|iexcl);/!\`/g; |
$result =~ s/&(\#162|cent);/\\textcent /g; |
$result =~ s/&(\#162|cent);/\\textcent /g; |
$result =~ s/&(\#163|pound);/\\pounds /g; |
$result =~ s/&(\#163|pound);/\\pounds /g; |
$result =~ s/&(\#164|curren);/\\textcurrency /g; |
$result =~ s/&(\#164|curren);/\\textcurrency /g; |
$result =~ s/&(\#165|yen);/\\textyen /g; |
$result =~ s/&(\#165|yen);/\\textyen /g; |
$result =~ s/&(\#166|brvbar);/\\textbrokenbar /g; |
$result =~ s/&(\#166|brvbar);/\\textbrokenbar /g; |
Line 938 sub old_character_chart {
|
Line 1659 sub old_character_chart {
|
$result =~ s/&(\#188|frac14);/\\textonequarter /g; |
$result =~ s/&(\#188|frac14);/\\textonequarter /g; |
$result =~ s/&(\#189|frac12);/\\textonehalf /g; |
$result =~ s/&(\#189|frac12);/\\textonehalf /g; |
$result =~ s/&(\#190|frac34);/\\textthreequarters /g; |
$result =~ s/&(\#190|frac34);/\\textthreequarters /g; |
$result =~ s/&(\#191|iquest);/?\`/g; |
$result =~ s/&(\#191|iquest);/?\`/g; |
$result =~ s/&(\#192|Agrave);/\\\`{A}/g; |
$result =~ s/&(\#192|Agrave);/\\\`{A}/g; |
$result =~ s/&(\#193|Aacute);/\\\'{A}/g; |
$result =~ s/&(\#193|Aacute);/\\\'{A}/g; |
$result =~ s/&(\#194|Acirc);/\\^{A}/g; |
$result =~ s/&(\#194|Acirc);/\\^{A}/g; |
$result =~ s/&(\#195|Atilde);/\\~{A}/g; |
$result =~ s/&(\#195|Atilde);/\\~{A}/g; |
$result =~ s/&(\#196|Auml);/\\\"{A}/g; |
$result =~ s/&(\#196|Auml);/\\\"{A}/g; |
$result =~ s/&(\#197|Aring);/{\\AA}/g; |
$result =~ s/&(\#197|Aring);/{\\AA}/g; |
$result =~ s/&(\#198|AElig);/{\\AE}/g; |
$result =~ s/&(\#198|AElig);/{\\AE}/g; |
$result =~ s/&(\#199|Ccedil);/\\c{c}/g; |
$result =~ s/&(\#199|Ccedil);/\\c{c}/g; |
$result =~ s/&(\#200|Egrave);/\\\`{E}/g; |
$result =~ s/&(\#200|Egrave);/\\\`{E}/g; |
$result =~ s/&(\#201|Eacute);/\\\'{E}/g; |
$result =~ s/&(\#201|Eacute);/\\\'{E}/g; |
$result =~ s/&(\#202|Ecirc);/\\^{E}/g; |
$result =~ s/&(\#202|Ecirc);/\\^{E}/g; |
$result =~ s/&(\#203|Euml);/\\\"{E}/g; |
$result =~ s/&(\#203|Euml);/\\\"{E}/g; |
$result =~ s/&(\#204|Igrave);/\\\`{I}/g; |
$result =~ s/&(\#204|Igrave);/\\\`{I}/g; |
$result =~ s/&(\#205|Iacute);/\\\'{I}/g; |
$result =~ s/&(\#205|Iacute);/\\\'{I}/g; |
$result =~ s/&(\#206|Icirc);/\\^{I}/g; |
$result =~ s/&(\#206|Icirc);/\\^{I}/g; |
$result =~ s/&(\#207|Iuml);/\\\"{I}/g; |
$result =~ s/&(\#207|Iuml);/\\\"{I}/g; |
$result =~ s/&(\#209|Ntilde);/\\~{N}/g; |
$result =~ s/&(\#209|Ntilde);/\\~{N}/g; |
$result =~ s/&(\#210|Ograve);/\\\`{O}/g; |
$result =~ s/&(\#210|Ograve);/\\\`{O}/g; |
$result =~ s/&(\#211|Oacute);/\\\'{O}/g; |
$result =~ s/&(\#211|Oacute);/\\\'{O}/g; |
$result =~ s/&(\#212|Ocirc);/\\^{O}/g; |
$result =~ s/&(\#212|Ocirc);/\\^{O}/g; |
$result =~ s/&(\#213|Otilde);/\\~{O}/g; |
$result =~ s/&(\#213|Otilde);/\\~{O}/g; |
$result =~ s/&(\#214|Ouml);/\\\"{O}/g; |
$result =~ s/&(\#214|Ouml);/\\\"{O}/g; |
$result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g; |
$result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g; |
$result =~ s/&(\#216|Oslash);/{\\O}/g; |
$result =~ s/&(\#216|Oslash);/{\\O}/g; |
$result =~ s/&(\#217|Ugrave);/\\\`{U}/g; |
$result =~ s/&(\#217|Ugrave);/\\\`{U}/g; |
$result =~ s/&(\#218|Uacute);/\\\'{U}/g; |
$result =~ s/&(\#218|Uacute);/\\\'{U}/g; |
$result =~ s/&(\#219|Ucirc);/\\^{U}/g; |
$result =~ s/&(\#219|Ucirc);/\\^{U}/g; |
$result =~ s/&(\#220|Uuml);/\\\"{U}/g; |
$result =~ s/&(\#220|Uuml);/\\\"{U}/g; |
Line 994 sub old_character_chart {
|
Line 1715 sub old_character_chart {
|
$result =~ s/&(\#246|ouml);/\\\"{o}/g; |
$result =~ s/&(\#246|ouml);/\\\"{o}/g; |
$result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g; |
$result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g; |
$result =~ s/&(\#248|oslash);/{\\o}/g; |
$result =~ s/&(\#248|oslash);/{\\o}/g; |
$result =~ s/&(\#249|ugrave);/\\\`{u}/g; |
$result =~ s/&(\#249|ugrave);/\\\`{u}/g; |
$result =~ s/&(\#250|uacute);/\\\'{u}/g; |
$result =~ s/&(\#250|uacute);/\\\'{u}/g; |
$result =~ s/&(\#251|ucirc);/\\^{u}/g; |
$result =~ s/&(\#251|ucirc);/\\^{u}/g; |
$result =~ s/&(\#252|uuml);/\\\"{u}/g; |
$result =~ s/&(\#252|uuml);/\\\"{u}/g; |
Line 1141 sub old_character_chart {
|
Line 1862 sub old_character_chart {
|
my %page_formats= |
my %page_formats= |
('letter' => { |
('letter' => { |
'book' => { |
'book' => { |
'1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'], |
'1' => [ '7.1 in','9.7 in', '-0.57 in','-0.57 in','-0.5 in'], |
'2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'] |
'2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','-0.5 in'] |
}, |
}, |
'album' => { |
'album' => { |
'1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','0.394 in'], |
'1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','-0.5 in'], |
'2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in'] |
'2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in'] |
}, |
}, |
}, |
}, |
'legal' => { |
'legal' => { |
Line 1156 my %page_formats=
|
Line 1877 my %page_formats=
|
}, |
}, |
'album' => { |
'album' => { |
'1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], |
'1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'], |
'2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in'] |
'2' => ['5.7 in','7.1 in','-1 in','-1 in','5 in'] |
}, |
}, |
}, |
}, |
'tabloid' => { |
'tabloid' => { |
Line 1205 my %page_formats=
|
Line 1926 my %page_formats=
|
'2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'] |
'2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'] |
}, |
}, |
'album' => { |
'album' => { |
'1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'], |
'1' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'], |
'2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm'] |
'2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm'] |
}, |
}, |
}, |
}, |
'a5' => { |
'a5' => { |
Line 1238 sub page_format {
|
Line 1959 sub page_format {
|
# "A2 [420x594 mm]", "A3 [297x420 mm]", |
# "A2 [420x594 mm]", "A3 [297x420 mm]", |
# "A4 [210x297 mm]", "A5 [148x210 mm]", |
# "A4 [210x297 mm]", "A5 [148x210 mm]", |
# "A6 [105x148 mm]" |
# "A6 [105x148 mm]" |
# |
# |
my ($papersize,$layout,$numberofcolumns) = @_; |
my ($papersize,$layout,$numberofcolumns) = @_; |
return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; |
return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; |
} |
} |
|
|
Line 1258 sub get_course {
|
Line 1979 sub get_course {
|
my $courseidinfo; |
my $courseidinfo; |
if (defined($env{'request.course.id'})) { |
if (defined($env{'request.course.id'})) { |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
|
my $sec = $env{'request.course.sec'}; |
|
|
} |
} |
return $courseidinfo; |
return $courseidinfo; |
} |
} |
|
|
sub page_format_transformation { |
sub page_format_transformation { |
my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; |
my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents, |
|
$indexlist,$selectionmade,$mostrecent) = @_; |
my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); |
my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); |
|
|
if ($selectionmade eq '4') { |
if ($selectionmade eq '4') { |
Line 1277 sub page_format_transformation {
|
Line 2001 sub page_format_transformation {
|
} |
} |
($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); |
($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); |
|
|
|
my $name; |
my $name = &get_name(); |
if ($mostrecent ne '') { |
|
$name = $mostrecent; |
|
} else { |
|
$name = &get_name(); |
|
} |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
my $header_text = $parmhash{'print_header_format'}; |
my $header_text = $parmhash{'print_header_format'}; |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$courseidinfo, $name); |
$courseidinfo, $name); |
Line 1289 sub page_format_transformation {
|
Line 2016 sub page_format_transformation {
|
my $fancypagestatement=''; |
my $fancypagestatement=''; |
if ($numberofcolumns eq '2') { |
if ($numberofcolumns eq '2') { |
$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}"; |
$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}"; |
|
if ($parmhash{'print_header_format'} eq '') { |
|
$fancypagestatement .= "\\fancyhead[RE]{\\thepage \\\\[\\baselineskip]}"; |
|
} |
} else { |
} else { |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
} |
} |
|
$fancypagestatement .= "\\fancyfoot{}"; |
|
my ($paperwidth,$paperheight); |
if ($layout eq 'album') { |
if ($layout eq 'album') { |
$text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
$text =~ s/\\begin\{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
|
if ($papersize eq 'a4') { |
|
$paperwidth = '29.7cm'; |
|
$paperheight = '21.0cm'; |
|
} elsif ($numberofcolumns eq '1') { |
|
if ($papersize eq 'letter') { |
|
$paperwidth = '11.0in'; |
|
$paperheight = '8.5in'; |
|
} elsif ($papersize eq 'legal') { |
|
$paperwidth = '14.0in'; |
|
$paperheight = '8.5in'; |
|
} |
|
} |
} elsif ($layout eq 'book') { |
} elsif ($layout eq 'book') { |
if ($choice ne 'All class print') { |
if ($choice ne 'All class print') { |
$text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; |
$text =~ s/\\begin\{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; |
} else { |
} else { |
$text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; |
$text =~ s/\\pagestyle\{fancy}\\rhead\{}\\chead\{}\s*\\begin\{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; |
} |
|
if ($papersize eq 'a4') { |
|
my $papersize_text; |
|
if ($perm{'pav'}) { |
|
$papersize_text = '\\special{papersize=210mm,297mm}'; |
|
} else { |
|
$papersize_text = '\special{papersize=210mm,297mm}'; |
|
} |
|
$text =~ s/(\\begin{document})/$1$papersize_text/; |
|
} |
} |
|
if ($papersize eq 'a4') { |
|
$paperwidth = '21.0cm'; |
|
$paperheight = '29.7cm'; |
|
} elsif ($papersize eq 'letter') { |
|
$paperwidth = '8.5in'; |
|
$paperheight = '11.0in'; |
|
} elsif ($papersize eq 'legal') { |
|
$paperwidth = '8.5in'; |
|
$paperheight = '14.0in'; |
|
} |
|
} |
|
if ($paperwidth ne '' && $paperheight ne '') { |
|
my $papersize_text; |
|
if ($perm{'pav'}) { |
|
$papersize_text = '\\special{papersize='.$paperwidth.','.$paperheight.'}'; |
|
} else { |
|
$papersize_text = '\special{papersize='.$paperwidth.','.$paperheight.'}'; |
|
} |
|
$text =~ s/(\\begin\{document})/$1$papersize_text/; |
} |
} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($indexlist eq 'yes') { |
if ($indexlist eq 'yes') { |
$text=~s/(\\begin{document})/\\makeindex $1/; |
$text=~s/(\\begin\{document})/\\makeindex $1/; |
$text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/; |
$text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/; |
} |
} |
return $text; |
return $text; |
} |
} |
Line 1321 sub page_format_transformation {
|
Line 2075 sub page_format_transformation {
|
|
|
sub page_cleanup { |
sub page_cleanup { |
my $result = shift; |
my $result = shift; |
|
|
$result =~ m/\\end{document}(\d*)$/; |
$result =~ m/\\end\{document}(\d*)$/; |
my $number_of_columns = $1; |
my $number_of_columns = $1; |
my $insert = '{'; |
my $insert = '{'; |
for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } |
for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; } |
$insert .= '}'; |
$insert .= '}'; |
$result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; |
$result =~ s/(\\begin\{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g; |
$result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; |
$result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g; |
return $result,$number_of_columns; |
return $result,$number_of_columns; |
} |
} |
Line 1363 my $end_of_student = "\n".'\special{ps:E
|
Line 2117 my $end_of_student = "\n".'\special{ps:E
|
|
|
sub latex_corrections { |
sub latex_corrections { |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; |
# $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g; |
my $copyright = ©right_line(); |
my $copyright = ©right_line(); |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
$result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
$result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
} else { |
} else { |
$result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; |
$result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; |
} |
} |
$result =~ s/\$number_of_columns/$number_of_columns/g; |
$result =~ s/\$number_of_columns/$number_of_columns/g; |
$result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; |
$result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g; |
$result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g; |
$result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g; |
#-- LaTeX corrections |
#-- LaTeX corrections |
my $first_comment = index($result,'<!--',0); |
my $first_comment = index($result,'<!--',0); |
while ($first_comment != -1) { |
while ($first_comment != -1) { |
my $end_comment = index($result,'-->',$first_comment); |
my $end_comment = index($result,'-->',$first_comment); |
Line 1391 sub latex_corrections {
|
Line 2145 sub latex_corrections {
|
if ($result =~ m/&(\w+|#\d+);/) { |
if ($result =~ m/&(\w+|#\d+);/) { |
$result = &character_chart($result); |
$result = &character_chart($result); |
} |
} |
$result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g; |
$result =~ s/(\\end\{tabular})\s*\\vskip 0 mm/$1/g; |
$result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g; |
$result =~ s/(\\begin\{enumerate})\s*\\noindent/$1/g; |
return $result; |
return $result; |
} |
} |
|
|
Line 1485 sub get_textwidth {
|
Line 2239 sub get_textwidth {
|
|
|
sub unsupported { |
sub unsupported { |
my ($currentURL,$mode,$symb)=@_; |
my ($currentURL,$mode,$symb)=@_; |
|
my $cleanURL=&Apache::lonenc::check_decrypt($currentURL); |
|
my $shown = $currentURL; |
|
if (($cleanURL ne $currentURL) || ($symb =~ m{/^enc/})) { |
|
$shown = &mt('URL not shown (encrypted)'); |
|
} |
if ($mode ne '') {$mode='\\'.$mode} |
if ($mode ne '') {$mode='\\'.$mode} |
my $result.= &print_latex_header($mode); |
my $result = &print_latex_header($mode); |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) { |
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
$cleanURL=~s|^(/adm/wrapper)?/ext/|http://|; |
my $title=&Apache::lonnet::gettitle($symb); |
$cleanURL=~s|^http://https://|https://|; |
$title = &Apache::lonxml::latex_special_symbols($title); |
if ($shown eq $currentURL) { |
$result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; |
$shown = &Apache::lonxml::latex_special_symbols($cleanURL); |
|
} |
|
my $title=&Apache::lonnet::gettitle($symb); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
$result.=' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.' '; |
} else { |
} else { |
$result.=$currentURL; |
if ($shown eq $currentURL) { |
|
$result.=&Apache::lonxml::latex_special_symbols($currentURL); |
|
} else { |
|
$result.=$shown; |
|
} |
} |
} |
$result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; |
$result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}'; |
return $result; |
return $result; |
Line 1514 sub map_laystyle {
|
Line 2281 sub map_laystyle {
|
|
|
sub print_page_in_course { |
sub print_page_in_course { |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
my ($helper, $rparmhash, $currentURL, $resources) = @_; |
|
|
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
my @page_resources = @$resources; |
my @page_resources = @$resources; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; |
Line 1528 sub print_page_in_course {
|
Line 2296 sub print_page_in_course {
|
$laystyle = &map_laystyle($laystyle); |
$laystyle = &map_laystyle($laystyle); |
my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, |
my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, |
$numberofcolumns); |
$numberofcolumns); |
my $LaTeXwidth=&recalcto_mm($textwidth); |
my $LaTeXwidth=&recalcto_mm($textwidth); |
|
|
|
|
if ($mode ne '') {$mode='\\'.$mode} |
if ($mode ne '') {$mode='\\'.$mode} |
my $result = &print_latex_header($mode); |
my $result = &print_latex_header($mode); |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
|
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
my $title=&Apache::lonnet::gettitle($currentURL); |
my $title=&Apache::lonnet::gettitle($symb); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$result .= '\noindent\textit{'.$title.'}\\\\'; |
} else { |
|
my $esc_currentURL= $currentURL; |
|
$esc_currentURL =~ s/_/\\_/g; |
|
$result.=$esc_currentURL; |
|
} |
|
$result .= '\\\\'; |
|
|
|
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
&Apache::lonnet::appenv({'construct.style' => |
&Apache::lonnet::appenv({'construct.style' => |
Line 1551 sub print_page_in_course {
|
Line 2312 sub print_page_in_course {
|
&Apache::lonnet::delenv('construct.style'); |
&Apache::lonnet::delenv('construct.style'); |
} |
} |
|
|
# First is the overall page description. This is then followed by the |
# First is the overall page description. This is then followed by the |
# components of the page. Each of which must be printed independently. |
# components of the page. Each of which must be printed independently. |
my $the_page = shift(@page_resources); |
my $the_page = shift(@page_resources); |
|
|
|
|
foreach my $resource (@page_resources) { |
foreach my $resource (@page_resources) { |
my $resource_src = $resource->src(); # Essentially the URL of the resource. |
my $resource_src = $resource->src(); # Essentially the URL of the resource. |
$result .= $resource->title() . '\\\\'; |
my $current_url = $resource->link(); |
|
|
# Recurse if a .page: |
# Recurse if a .page: |
|
|
if ($resource_src =~ /.page$/i) { |
if ($resource_src =~ /.page$/i) { |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my @page_resources = $navmap->retrieveResources($resource_src); |
my @page_resources = $navmap->retrieveResources($resource_src); |
$result .= &print_page_in_course($helper, $rparmhash, |
$result .= &print_page_in_course($helper, $rparmhash, |
$resource_src, \@page_resources); |
$resource_src, \@page_resources); |
} |
} elsif ($resource->ext()) { |
# these resources go through the XML transformer: |
$result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb)); |
|
} elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
# these resources go through the XML transformer: |
|
$result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\'; |
|
|
elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
my $urlp = &Apache::lonnet::clutter($resource_src); |
my $urlp = &Apache::lonnet::clutter($resource_src); |
|
|
my %form; |
my %form; |
my %moreenv; |
my %moreenv; |
|
|
Line 1581 sub print_page_in_course {
|
Line 2345 sub print_page_in_course {
|
|
|
$form{'grade_target'} = 'tex'; |
$form{'grade_target'} = 'tex'; |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'pdfFormFields'} = 'no'; |
$form{'pdfFormFields'} = $pdfFormFields; # |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$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 1599 sub print_page_in_course {
|
Line 2363 sub print_page_in_course {
|
} |
} |
$form{'rndseed'}=$rndseed; |
$form{'rndseed'}=$rndseed; |
&Apache::lonnet::appenv(\%moreenv); |
&Apache::lonnet::appenv(\%moreenv); |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
Line 1624 sub print_page_in_course {
|
Line 2388 sub print_page_in_course {
|
my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); |
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
Line 1633 sub print_page_in_course {
|
Line 2397 sub print_page_in_course {
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
|
|
|
|
|
|
|
|
|
|
} |
} |
# Print annotations. |
# Print annotations. |
|
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$currentURL); |
$texversion=&IndexCreation($texversion,$currentURL); |
} |
} |
Line 1685 sub print_page_in_course {
|
Line 2443 sub print_page_in_course {
|
# 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); |
|
|
my @files = |
my @files = |
grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR)); |
grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR)); |
closedir(DIR); |
closedir(DIR); |
|
|
Line 1719 sub recently_generated {
|
Line 2477 sub recently_generated {
|
if ($ext eq 'zip') { $zip_result .= $result; } |
if ($ext eq 'zip') { $zip_result .= $result; } |
} |
} |
if ($zip_result || $pdf_result) { |
if ($zip_result || $pdf_result) { |
$r->print('<hr />'); |
$output ='<hr />'; |
} |
} |
if ($zip_result) { |
if ($zip_result) { |
$r->print('<h3>'.&mt('Recently generated printout zip files')."</h3>\n" |
$output .='<h3>'.&mt('Recently generated printout zip files')."</h3>\n" |
.&Apache::loncommon::start_data_table() |
.&Apache::loncommon::start_data_table() |
.&Apache::loncommon::start_data_table_header_row() |
.&Apache::loncommon::start_data_table_header_row() |
.'<th>'.&mt('Download').'</th>' |
.'<th>'.&mt('Download').'</th>' |
Line 1730 sub recently_generated {
|
Line 2488 sub recently_generated {
|
.'<th>'.&mt('File Size (Bytes)').'</th>' |
.'<th>'.&mt('File Size (Bytes)').'</th>' |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::end_data_table_header_row() |
.$zip_result |
.$zip_result |
.&Apache::loncommon::end_data_table() |
.&Apache::loncommon::end_data_table(); |
); |
|
} |
} |
if ($pdf_result) { |
if ($pdf_result) { |
$r->print('<h3>'.&mt('Recently generated printouts')."</h3>\n" |
$output .='<h3>'.&mt('Recently generated printouts')."</h3>\n" |
.&Apache::loncommon::start_data_table() |
.&Apache::loncommon::start_data_table() |
.&Apache::loncommon::start_data_table_header_row() |
.&Apache::loncommon::start_data_table_header_row() |
.'<th>'.&mt('Download').'</th>' |
.'<th>'.&mt('Download').'</th>' |
Line 1742 sub recently_generated {
|
Line 2499 sub recently_generated {
|
.'<th>'.&mt('File Size (Bytes)').'</th>' |
.'<th>'.&mt('File Size (Bytes)').'</th>' |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::end_data_table_header_row() |
.$pdf_result |
.$pdf_result |
.&Apache::loncommon::end_data_table() |
.&Apache::loncommon::end_data_table(); |
); |
|
} |
} |
|
return $output; |
} |
} |
|
|
# |
# |
Line 1772 sub get_page_breaks {
|
Line 2529 sub get_page_breaks {
|
} |
} |
return %page_breaks; |
return %page_breaks; |
} |
} |
# |
# |
# Returns text to insert for any extra vskip prior to the resource. |
# Returns text to insert for any extra vskip prior to the resource. |
# Parameters: |
# Parameters: |
# helper - Reference to the helper object driving the printout. |
# helper - Reference to the helper object driving the printout. |
Line 1783 sub get_page_breaks {
|
Line 2540 sub get_page_breaks {
|
# EXTRASPACE has the list of extra space values. |
# EXTRASPACE has the list of extra space values. |
# EXTRASPACE_UNITS is the set of resources for which the units are |
# EXTRASPACE_UNITS is the set of resources for which the units are |
# mm. All others are 'in'. |
# mm. All others are 'in'. |
# |
# |
# The resource is found in the POSSIBLE_RESOURCES to get the index |
# The resource is found in the POSSIBLE_RESOURCES to get the index |
# of the EXTRASPACE value. |
# of the EXTRASPACE value. |
# |
# |
Line 1804 sub load_skips {
|
Line 2561 sub load_skips {
|
|
|
my ($helper) = @_; |
my ($helper) = @_; |
|
|
# If this is the first time, unrap the resources and extra spaces: |
# If this is the first time, unwrap the resources and extra spaces: |
|
|
if (!$skips_loaded) { |
if (!$skips_loaded) { |
@extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); |
@extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); |
Line 1852 sub get_extra_vspaces {
|
Line 2609 sub get_extra_vspaces {
|
# The resource chooser part of the helper needs more than just |
# The resource chooser part of the helper needs more than just |
# the value of the extraspaces var to recover the value into a text |
# 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: |
# field option. This sub produces the required format for the saved var: |
# specifically |
# specifically |
# ||| separated fields of the form resourcename=value |
# ||| separated fields of the form resourcename=value |
# |
# |
# Parameters: |
# Parameters: |
Line 1886 sub set_form_extraspace {
|
Line 2643 sub set_form_extraspace {
|
$env{'form.extraspace'} = $result; |
$env{'form.extraspace'} = $result; |
$env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; |
$env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; |
return $result; |
return $result; |
|
|
} |
} |
|
|
# Output a sequence (recursively if neeed) |
# Output a sequence (recursively if neeed) |
Line 1904 sub set_form_extraspace {
|
Line 2661 sub set_form_extraspace {
|
# |
# |
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 1929 sub print_construction_sequence {
|
Line 2689 sub print_construction_sequence {
|
$texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
$texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
} |
} |
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 1941 sub print_construction_sequence {
|
Line 2701 sub print_construction_sequence {
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
# If necessary, encapsulate answer in minipage: |
# If necessary, encapsulate answer in minipage: |
|
|
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); |
my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body.=&path_to_problem($urlp,$LaTeXwidth); |
$body.=&path_to_problem($urlp,$LaTeXwidth); |
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerform{'problem_split'}); |
$texversion.=$body; |
$texversion.=$body; |
} |
} |
} |
} |
Line 1966 sub print_construction_sequence {
|
Line 2726 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 '; |
|
|
# 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 |
$helper, %form, |
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, |
|
$LaTeXwidth); |
$LaTeXwidth); |
} |
} |
} |
} |
Line 1997 sub print_construction_sequence {
|
Line 2750 sub print_construction_sequence {
|
if ($member != $#order) { |
if ($member != $#order) { |
$texversion .= '\\ \cleardoublepage'; |
$texversion .= '\\ \cleardoublepage'; |
} |
} |
|
|
$result .= $texversion; |
$result .= $texversion; |
} |
} |
} |
} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin\{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
return $result; |
return $result; |
} |
} |
|
|
|
# |
|
# Top level for generating print output. |
|
# |
|
# May call print_resources if multiple resources will be printed. |
|
# |
|
# The main driver is $selectionmade which reflects the type of print out |
|
# requested: |
|
# Value Print type: |
|
# 1 Print resource that's being looked at. |
|
# 2 Print problems in a map or in a page. |
|
# 3 Print pages in a map or resources in a page. |
|
# 4 Print all problems or all resources. |
|
# 5 Print problems for seleted students. |
|
# 6 Print selected problems from a folder. |
|
# 7 Print print selected resources from some scope. |
|
# 8 Print resources for selected students. |
|
# 9 Print for anonymous CODEs |
|
# |
|
#BZ 5209 |
|
# 2 map_incomplete_problems_seq Print incomplete problems from the current |
|
# folder in student context. |
|
# 5 map_incomplete_problems_people_seq Print incomplete problems from the |
|
# current folder in privileged context. |
|
# 5 incomplete_problems_selpeople_course Print incomplete problems for |
|
# selected people from the entire course. |
|
# |
|
# Item 101 has much the same processing as 8, |
|
# |
|
# Differences: Item 101, 102 require per-student filtering of the resource |
|
# set so that only the incomplete resources are printed. |
|
# For item 100, filtering was done at the helper level. |
|
|
sub output_data { |
sub output_data { |
|
|
my ($r,$helper,$rparmhash) = @_; |
my ($r,$helper,$rparmhash) = @_; |
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
$ssi_error = 0; # This will be set nonzero by failing ssi's. |
$ssi_error = 0; # This will be set nonzero by failing ssi's. |
$resources_printed = ''; |
$resources_printed = ''; |
$font_size = $helper->{'VARS'}->{'fontsize'}; |
$font_size = $helper->{'VARS'}->{'fontsize'}; |
|
my $print_type = $helper->{'VARS'}->{'PRINT_TYPE'}; # Allows textual simplification. |
my $do_postprocessing = 1; |
my $do_postprocessing = 1; |
my $js = <<ENDPART; |
my $js = <<ENDPART; |
<script type="text/javascript"> |
<script type="text/javascript"> |
Line 2025 sub output_data {
|
Line 2812 sub output_data {
|
url += 'form=' + formname + '&'; |
url += 'form=' + formname + '&'; |
if (only != null) { |
if (only != null) { |
url += 'only=' + only + '&'; |
url += 'only=' + only + '&'; |
} |
} |
if (omit != null) { |
if (omit != null) { |
url += 'omit=' + omit + '&'; |
url += 'omit=' + omit + '&'; |
} |
} |
Line 2060 ENDPART
|
Line 2847 ENDPART
|
|
|
$env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; |
$env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; |
&set_form_extraspace($helper); |
&set_form_extraspace($helper); |
$env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; |
$env{'form.lastprinttype'} = $print_type; |
&Apache::loncommon::store_course_settings('print', |
&Apache::loncommon::store_course_settings('print', |
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
'extraspace' => 'scalar', |
'extraspace' => 'scalar', |
Line 2077 ENDPART
|
Line 2864 ENDPART
|
$laystyle = &map_laystyle($laystyle); |
$laystyle = &map_laystyle($laystyle); |
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); |
my @print_array=(); |
my @print_array=(); |
my @student_names=(); |
my @student_names=(); |
|
my $lastprinted; |
|
|
|
# Common settings for the %form hash: |
# Common settings for the %form has: |
# In some cases these settings get overridden by specific cases, but the |
# In some cases these settings get overriddent by specific cases, but the |
|
# settings are common enough to make it worthwhile factoring them out |
# settings are common enough to make it worthwhile factoring them out |
# here. |
# here. |
# |
# |
my %form; |
my %form; |
$form{'grade_target'} = 'tex'; |
$form{'grade_target'} = 'tex'; |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'pdfFormFields'} = 'no'; |
$form{'pdfFormFields'} = $pdfFormFields; |
|
|
# If form.showallfoils is set, then request all foils be shown: |
# If form.showallfoils is set, then request all foils be shown: |
# privilege will be enforced both by not allowing the |
# privilege will be enforced both by not allowing the |
# check box selecting this option to be presnt unless it's ok, |
# check box selecting this option to be presnt unless it's ok, |
# and by lonresponse's priv. check. |
# and by lonresponse's priv. check. |
# The if is here because lonresponse.pm only cares that |
# The if is here because lonresponse.pm only cares that |
# showallfoils is defined, not what the value is. |
# showallfoils is defined, not what the value is. |
|
|
if ($helper->{'VARS'}->{'showallfoils'} eq "1") { |
if ($helper->{'VARS'}->{'showallfoils'} eq "1") { |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
} |
} |
|
|
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
if ($helper->{'VARS'}->{'style_file'}=~/\w/) { |
&Apache::lonnet::appenv({'construct.style' => |
&Apache::lonnet::appenv({'construct.style' => |
$helper->{'VARS'}->{'style_file'}}); |
$helper->{'VARS'}->{'style_file'}}); |
Line 2110 ENDPART
|
Line 2897 ENDPART
|
&Apache::lonnet::delenv('construct.style'); |
&Apache::lonnet::delenv('construct.style'); |
} |
} |
|
|
if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { |
if ($print_type eq 'current_document') { |
#-- single document - problem, page, html, xml, ... |
#-- single document - problem, page, html, xml, ... |
my ($currentURL,$cleanURL); |
my ($currentURL,$cleanURL); |
|
|
Line 2121 ENDPART
|
Line 2908 ENDPART
|
} else { |
} else { |
|
|
#prints resource from the construction space |
#prints resource from the construction space |
$currentURL='/'.$helper->{'VARS'}->{'filename'}; |
$currentURL=$helper->{'VARS'}->{'filename'}; |
if ($currentURL=~/([^?]+)/) {$currentURL=$1;} |
|
$cleanURL=$currentURL; |
$cleanURL=$currentURL; |
} |
} |
$selectionmade = 1; |
$selectionmade = 1; |
|
|
if ($cleanURL!~m|^/adm/| |
if ($cleanURL!~m|^/adm/| |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
&& $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
my $rndseed=time; |
my $rndseed=time; |
Line 2155 ENDPART
|
Line 2942 ENDPART
|
$texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form); |
$texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form); |
|
|
# Add annotations if required: |
# Add annotations if required: |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
&Apache::lonnet::delenv('request.filename'); |
&Apache::lonnet::delenv('request.filename'); |
Line 2165 ENDPART
|
Line 2952 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 2177 ENDPART
|
Line 2965 ENDPART
|
|
|
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
Line 2186 ENDPART
|
Line 2974 ENDPART
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$cleanURL; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
|
$texversion.=&path_to_problem($URLpath,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
Line 2197 ENDPART
|
Line 2985 ENDPART
|
|
|
|
|
|
|
|
|
} |
} |
# Print annotations. |
# Print annotations. |
|
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
|
|
Line 2221 ENDPART
|
Line 3009 ENDPART
|
} |
} |
} elsif ($cleanURL!~m|^/adm/| |
} elsif ($cleanURL!~m|^/adm/| |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
&& $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
#printing content of sequence from the construction space |
|
|
|
|
|
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
if (!($result =~ /\\begin\{document\}/)) { |
if (!($result =~ /\\begin\{document\}/)) { |
$result = &print_latex_header() . $result; |
$result = &print_latex_header() . $result; |
} |
} |
# End construction space sequence. |
# End construction space sequence. |
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
|
if ($currentURL=~/\/ext\.tool$/) {$currentURL=~s/^\/adm\/wrapper//;} |
$resources_printed .= $currentURL.':'; |
$resources_printed .= $currentURL.':'; |
my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($currentURL); |
my $annotation = &annotate($currentURL); |
$texversion =~ s/(\\end{document})/$annotation$1/; |
$texversion =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
} elsif ($cleanURL =~/\.tex$/) { |
} elsif ($cleanURL =~/\.tex$/) { |
Line 2250 ENDPART
|
Line 3035 ENDPART
|
$result = &fetch_raw_resource($currentURL); |
$result = &fetch_raw_resource($currentURL); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($currentURL); |
my $annotation = &annotate($currentURL); |
$result =~ s/(\\end{document})/$annotation$1/; |
$result =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
|
|
$do_postprocessing = 0; # Don't massage the result. |
$do_postprocessing = 0; # Don't massage the result. |
Line 2267 ENDPART
|
Line 3052 ENDPART
|
$result .= &print_page_in_course($helper, $rparmhash, |
$result .= &print_page_in_course($helper, $rparmhash, |
$cleanURL, \@page_resources); |
$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_in_page') or |
($print_type eq 'map_problems_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or |
($print_type eq 'map_resources_in_page') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or |
($print_type eq 'map_problems_pages') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or |
($print_type eq 'all_problems') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG |
($print_type eq 'all_resources') or # BUGBUG |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') |
($print_type eq 'select_sequences') or |
|
($print_type eq 'map_incomplete_problems_seq') |
) { |
) { |
|
|
|
|
#-- produce an output string |
#-- produce an output string |
if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or |
if (($print_type eq 'map_problems') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) { |
($print_type eq 'map_incomplete_problems_seq') or |
|
($print_type eq 'map_problems_in_page') ) { |
$selectionmade = 2; |
$selectionmade = 2; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or |
} elsif (($print_type eq 'map_problems_pages') or |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')) |
($print_type eq 'map_resources_in_page')) |
{ |
{ |
$selectionmade = 3; |
$selectionmade = 3; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') |
} elsif (($print_type eq 'all_problems') |
) { |
) { |
$selectionmade = 4; |
$selectionmade = 4; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') { #BUGBUG |
} elsif ($print_type eq 'all_resources') { #BUGBUG |
$selectionmade = 4; |
$selectionmade = 4; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') { |
} elsif ($print_type eq 'select_sequences') { |
$selectionmade = 7; |
$selectionmade = 7; |
} |
} |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
Line 2314 ENDPART
|
Line 3101 ENDPART
|
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
|
|
my $pbreakresources = keys %page_breaks; |
|
for (my $i=0;$i<=$#master_seq;$i++) { |
for (my $i=0;$i<=$#master_seq;$i++) { |
|
|
&Apache::lonenc::reset_enc(); |
&Apache::lonenc::reset_enc(); |
|
|
|
|
# Note due to document structure, not allowed to put \newpage |
# Note due to document structure, not allowed to put \newpage |
# prior to the first resource |
# prior to the first resource |
|
|
Line 2340 ENDPART
|
Line 3125 ENDPART
|
my $texversion=''; |
my $texversion=''; |
if ($urlp!~m|^/adm/| |
if ($urlp!~m|^/adm/| |
&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
|
my $extension = $1; |
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
&Apache::lonxml::remember_problem_counter(); |
&Apache::lonxml::remember_problem_counter(); |
if ($flag_latex_header_remove eq 'NO') { |
if ($flag_latex_header_remove eq 'NO') { |
Line 2347 ENDPART
|
Line 3133 ENDPART
|
unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || |
unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') || |
(($i==0) && |
(($i==0) && |
(($urlp=~/\.page$/) || |
(($urlp=~/\.page$/) || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') || |
($print_type eq 'map_problems_in_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) { |
(($print_type eq 'map_resources_in_page') && ($extension !~ /^x?html?$/))))) { |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} |
} |
} |
} |
$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); |
if ($urlp=~/\.page$/) { |
if ($urlp=~/\.page$/) { |
($texversion,my $number_of_columns_page) = &page_cleanup($texversion); |
($texversion,my $number_of_columns_page) = &page_cleanup($texversion); |
if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} |
if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} |
$texversion =~ s/\\end{document}\d*/\\end{document}/; |
$texversion =~ s/\\end\{document}\d*/\\end{document}/; |
$flag_page_in_sequence = 'YES'; |
$flag_page_in_sequence = 'YES'; |
} |
} |
|
|
Line 2371 ENDPART
|
Line 3157 ENDPART
|
&Apache::lonxml::restore_problem_counter(); |
&Apache::lonxml::restore_problem_counter(); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($urlp =~ /\.page$/) { |
if ($urlp =~ /\.page$/) { |
$answer =~ s/\\end{document}(\d*)$//; |
$answer =~ s/\\end\{document}(\d*)$//; |
} |
} |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($urlp =~ /\.page$/) { |
if ($urlp =~ /\.page$/) { |
my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion); |
my @probs = split(/\\keephidden\{ENDOFPROBLEM}/,$texversion); |
my $lastprob = pop(@probs); |
my $lastprob = pop(@probs); |
$texversion = join('\keephidden{ENDOFPROBLEM}',@probs). |
$texversion = join('\keephidden{ENDOFPROBLEM}',@probs). |
$answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; |
$answer.'\keephidden{ENDOFPROBLEM}'.$lastprob; |
} else { |
} else { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} |
} |
} else { |
} else { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) { |
if ($urlp=~/$LONCAPA::assess_page_re/) { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
# $texversion =~ s/\\begin{document}//; # FIXME |
# $texversion =~ s/\\begin\{document}//; # FIXME |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .='\vskip 1 mm '.$answer; |
$body .='\vskip 1 mm '.$answer; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerform{'problem_split'}); |
$texversion .= $body; |
$texversion .= $body; |
} else { |
} else { |
$texversion=''; |
$texversion=''; |
Line 2401 ENDPART
|
Line 3187 ENDPART
|
} |
} |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($urlp); |
my $annotation .= &annotate($urlp); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$urlp); |
$texversion=&IndexCreation($texversion,$urlp); |
Line 2415 ENDPART
|
Line 3201 ENDPART
|
if (($selectionmade == 4) and ($assignment ne $prevassignment)) { |
if (($selectionmade == 4) and ($assignment ne $prevassignment)) { |
my $name = &get_name(); |
my $name = &get_name(); |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
$prevassignment=$assignment; |
$prevassignment=$assignment; |
my $header_text = $parmhash{'print_header_format'}; |
my $header_text = $parmhash{'print_header_format'}; |
$header_text = &format_page_header($textwidth, $header_text, |
$header_text = &format_page_header($textwidth, $header_text, |
$assignment, |
$assignment, |
$courseidinfo, |
$courseidinfo, |
$name); |
$name); |
|
|
if ($numberofcolumns eq '1') { |
if ($numberofcolumns eq '1') { |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; |
} else { |
} else { |
Line 2430 ENDPART
|
Line 3214 ENDPART
|
} |
} |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} |
if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} |
|
if ($urlp=~/\/ext\.tool$/) {$urlp=~s/^\/adm\/wrapper//;} |
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($urlp); |
my $annotation = &annotate($urlp); |
$texversion =~ s/(\\end{document)/$annotation$1/; |
$texversion =~ s/(\\end\{document)/$annotation$1/; |
} |
} |
|
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
$texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} elsif ($urlp=~ /\.pdf$/i) { |
} elsif ($urlp=~ /\.pdf$/i) { |
if ($i > 0) { |
if ($i > 0) { |
$result .= '\cleardoublepage'; |
$result .= '\cleardoublepage'; |
Line 2475 ENDPART
|
Line 3260 ENDPART
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} |
} |
if (&Apache::loncommon::connection_aborted($r)) { |
if (&Apache::loncommon::connection_aborted($r)) { |
last; |
last; |
} |
} |
} |
} |
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
if ($flag_page_in_sequence eq 'YES') { |
if ($flag_page_in_sequence eq 'YES') { |
$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/; |
$result =~ s/\\usepackage\{calc}/\\usepackage{calc}\\usepackage{longtable}/; |
} |
} |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || |
} elsif (($print_type eq 'problems_for_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') || |
($print_type eq 'all_problems_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ |
($print_type eq 'resources_for_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq') || |
|
($print_type eq 'select_sequences_problems_for_students') || |
|
($print_type eq 'select_sequences_resources_for_students')) { |
|
|
|
|
#-- prints assignments for whole class or for selected students |
#-- prints assignments for whole class or for selected students |
my $type; |
my $type; |
if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || |
if (($print_type eq 'problems_for_students') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students_from_page') || |
($print_type eq 'problems_for_students_from_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems_students') ) { |
($print_type eq 'all_problems_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course') || |
|
($print_type eq 'map_incomplete_problems_people_seq') || |
|
($print_type eq 'select_sequences_problems_for_students')) { |
$selectionmade=5; |
$selectionmade=5; |
$type='problems'; |
$type='problems'; |
} elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students') { |
} elsif (($print_type eq 'resources_for_students') || |
|
($print_type eq 'select_sequences_resources_for_students')) { |
$selectionmade=8; |
$selectionmade=8; |
$type='resources'; |
$type='resources'; |
} |
} |
Line 2512 ENDPART
|
Line 3305 ENDPART
|
# to override this and output the students by name. |
# to override this and output the students by name. |
# Each element of the students array is of the form: |
# Each element of the students array is of the form: |
# username:domain:section:last, first:status |
# username:domain:section:last, first:status |
# |
# |
# Note that student sort is not compatible with printing |
# Note that student sort is not compatible with printing |
# 1 section per pdf...so that setting overrides. |
# 1 section per pdf...so that setting overrides. |
# |
# |
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
@students = sort compare_names @students; |
@students = sort compare_names @students; |
|
} else { |
|
@students = sort compare_sections @students; |
} |
} |
&adjust_number_to_print($helper); |
&adjust_number_to_print($helper); |
|
|
Line 2526 ENDPART
|
Line 3321 ENDPART
|
$helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) { |
$helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) { |
$helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; |
$helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; |
} |
} |
# If we are splitting on section boundaries, we need |
# If we are splitting on section boundaries, we need |
# to remember that in split_on_sections and |
# to remember that in split_on_sections and |
# print all of the students in the list. |
# print all of the students in the list. |
# |
# |
my $split_on_sections = 0; |
my $split_on_sections = 0; |
Line 2537 ENDPART
|
Line 3332 ENDPART
|
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
|
|
|
my $map; |
|
if ($helper->{VARS}->{'symb'}) { |
|
unless ((($print_type eq 'all_problems_students') || |
|
($print_type eq 'incomplete_problems_selpeople_course')) && |
|
$perm{'pfo'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); |
|
} |
|
} elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) { |
|
$map = $helper->{'VARS'}->{'SEQUENCE'}; |
|
} |
|
|
#loop over students |
#loop over students |
|
|
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
Line 2551 ENDPART
|
Line 3358 ENDPART
|
($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { |
($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { |
$moreenv{'problem_split'}='yes'; |
$moreenv{'problem_split'}='yes'; |
} |
} |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75'); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$#students+1); |
my $student_counter=-1; |
my $student_counter=-1; |
my $i = 0; |
my $i = 0; |
my $last_section = (split(/:/,$students[0]))[2]; |
my $last_section = (split(/:/,$students[0]))[2]; |
|
my $nohidemap; |
|
if ($perm{'pav'} && $perm{'vgr'}) { |
|
$nohidemap = 1; |
|
} |
foreach my $person (@students) { |
foreach my $person (@students) { |
|
|
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
if (-e $duefile) { |
if (-e $duefile) { |
my $temp_file = Apache::File->new('>>'.$duefile); |
my $temp_file = Apache::File->new('>>'.$duefile); |
Line 2572 ENDPART
|
Line 3382 ENDPART
|
} else { |
} else { |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
} |
} |
|
my $actual_seq = master_seq_to_person_seq($map, \@master_seq, |
|
$person, undef, $nohidemap); |
my ($output,$fullname, $printed)=&print_resources($r,$helper, |
my ($output,$fullname, $printed)=&print_resources($r,$helper, |
$person,$type, |
$person,$type, |
\%moreenv,\@master_seq, |
\%moreenv, $actual_seq, |
$flag_latex_header_remove, |
$flag_latex_header_remove, |
$LaTeXwidth); |
$LaTeXwidth); |
$resources_printed .= ":"; |
$resources_printed .= ":"; |
Line 2583 ENDPART
|
Line 3395 ENDPART
|
# &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'); |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student'); |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
|
if ($printed) { |
|
$lastprinted = $fullname; |
|
} |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
} |
} |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
$result .= $print_array[0].' \end{document}'; |
$result .= $print_array[0].' \end{document}'; |
} elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon') || |
} elsif (($print_type eq 'problems_for_anon') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon_page') || |
($print_type eq 'problems_for_anon_page') || |
($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon') ) { |
($print_type eq 'resources_for_anon') || |
|
($print_type eq 'select_sequences_problems_for_anon') || |
|
($print_type eq 'select_sequences_resources_for_anon')) { |
|
$selectionmade = 9; |
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 2597 ENDPART
|
Line 3415 ENDPART
|
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; |
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; |
my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; |
my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; |
my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; |
my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; |
|
|
my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; |
my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; |
my @lines = &Apache::grades::get_scantronformat_file(); |
my @lines = &Apache::lonnet::get_scantronformat_file(); |
my ($code_type,$code_length)=('letter',6); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
foreach my $line (@lines) { |
foreach my $line (@lines) { |
my ($name,$type,$length) = (split(/:/,$line))[0,2,4]; |
next if (($line =~ /^\#/) || ($line eq '')); |
|
my ($name,$type,$length,$bubbles_per_item) = |
|
(split(/:/,$line))[0,2,4,17]; |
if ($name eq $code_option) { |
if ($name eq $code_option) { |
$code_length=$length; |
$code_length=$length; |
if ($type eq 'number') { $code_type = 'number'; } |
if ($type eq 'number') { $code_type = 'number'; } |
|
chomp($bubbles_per_item); |
|
if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) { |
|
$bubbles_per_row = $bubbles_per_item; |
|
} |
} |
} |
} |
} |
|
my $map; |
|
if ($helper->{VARS}{'symb'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); |
|
} elsif (($helper->{'VARS'}->{'postdata'} eq '/adm/navmaps') && ($perm{'pfo'})) { |
|
$map = $helper->{'VARS'}->{'SEQUENCE'}; |
|
} |
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{'suppress_tries'} = $parmhash{'suppress_tries'}; |
$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 2640 ENDPART
|
Line 3472 ENDPART
|
$moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length, |
$moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length, |
$code_type); |
$code_type); |
} |
} |
|
$code_name =~ s/^\s+//; |
|
$code_name =~ s/\s+$//; |
if ($code_name) { |
if ($code_name) { |
&Apache::lonnet::put('CODEs', |
&Apache::lonnet::put('CODEs', |
{ |
{ |
Line 2651 ENDPART
|
Line 3485 ENDPART
|
@allcodes=keys(%allcodes); |
@allcodes=keys(%allcodes); |
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); |
my ($type) = split(/_/,$print_type); |
&adjust_number_to_print($helper); |
&adjust_number_to_print($helper); |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
if ($number_per_page eq '0' || $number_per_page eq 'all') { |
if ($number_per_page eq '0' || $number_per_page eq 'all' |
$number_per_page=$num_todo; |
|| $number_per_page eq 'section') { |
|
$number_per_page=$num_todo > 0 ? $num_todo : 1; |
} |
} |
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75'); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo); |
my $count=0; |
my $count=0; |
|
my $nohidemap; |
|
if ($perm{'pav'} && $perm{'vgr'}) { |
|
$nohidemap = 1; |
|
} |
foreach my $code (sort(@allcodes)) { |
foreach my $code (sort(@allcodes)) { |
my $file_num=int($count/$number_per_page); |
my $file_num=int($count/$number_per_page); |
if ($code_type eq 'number') { |
if ($code_type eq 'number') { |
$moreenv{'CODE'}=$code; |
$moreenv{'CODE'}=$code; |
} else { |
} else { |
$moreenv{'CODE'}=&num_to_letters($code); |
$moreenv{'CODE'}=&num_to_letters($code); |
} |
} |
|
$env{'form.CODE'} = $moreenv{'CODE'}; |
|
my $actual_seq = master_seq_to_person_seq($map, \@master_seq, |
|
undef, |
|
$moreenv{'CODE'}, $nohidemap); |
|
delete($env{'form.CODE'}); |
my ($output,$fullname, $printed)= |
my ($output,$fullname, $printed)= |
&print_resources($r,$helper,'anonymous',$type,\%moreenv, |
&print_resources($r,$helper,'anonymous',$type,\%moreenv, |
\@master_seq,$flag_latex_header_remove, |
$actual_seq,$flag_latex_header_remove, |
$LaTeXwidth); |
$LaTeXwidth); |
$resources_printed .= ":"; |
$resources_printed .= ":"; |
$print_array[$file_num].=$output; |
$print_array[$file_num].=$output; |
Line 2677 ENDPART
|
Line 3521 ENDPART
|
&mt('last assignment').' '.$fullname); |
&mt('last assignment').' '.$fullname); |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
$count++; |
$count++; |
|
if ($printed) { |
|
$lastprinted = $fullname; |
|
} |
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_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'}; |
@list_of_files=sort @list_of_files; |
@list_of_files=sort @list_of_files; |
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
my $rndseed=time; |
my $rndseed=time; |
if ($helper->{'VARS'}->{'curseed'}) { |
if ($helper->{'VARS'}->{'curseed'}) { |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
$rndseed=$helper->{'VARS'}->{'curseed'}; |
Line 2700 ENDPART
|
Line 3547 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 2718 ENDPART
|
Line 3561 ENDPART
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
} |
} |
#this chunk is responsible for printing the path to problem |
#this chunk is responsible for printing the path to problem |
|
|
my $newurlp=$urlp; |
my $newurlp=&path_to_problem($urlp,$LaTeXwidth); |
if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;} |
$texversion =~ s/(\\begin\{minipage}\{\\textwidth})/$1 $newurlp/; |
$newurlp=&path_to_problem($newurlp,$LaTeXwidth); |
|
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$urlp); |
$texversion=&IndexCreation($texversion,$urlp); |
} |
} |
if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { |
if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { |
$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /; |
$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /; |
|
|
} |
} |
$result .= $texversion; |
$result .= $texversion; |
} |
} |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
} |
} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;} |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
Line 2763 ENDPART
|
Line 3603 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); |
my $mostrecent; |
|
if ((($selectionmade == 5) || ($selectionmade == 8) || ($selectionmade == 9)) && |
|
(($numberofcolumns == 1) || ($laystyle eq 'album' && $papersize eq 'a4'))) { |
|
$mostrecent = $lastprinted; |
|
} |
|
$result = &page_format_transformation($papersize, |
|
$laystyle,$numberofcolumns, |
|
$print_type,$result, |
|
$helper->{VARS}->{'assignment'}, |
|
$helper->{'VARS'}->{'TABLE_CONTENTS'}, |
|
$helper->{'VARS'}->{'TABLE_INDEX'}, |
|
$selectionmade,$mostrecent); |
$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 2774 ENDPART
|
Line 3625 ENDPART
|
#} |
#} |
} |
} |
|
|
# Set URLback if this is a construction space print so we can provide |
# Set URLback so we can provide a link back to the resource and to change options. |
# a link to the resource being edited. |
# (Since the browser back button does not currently work with https, |
# |
# the back link is useful even when there is an easy-to-miss LON-CAPA back button.) |
|
|
my $URLback=''; #link to original document |
my $URLback=''; #link to original document |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
if ($helper->{'VARS'}->{'construction'} eq '1') { |
#prints resource from the construction space |
$URLback=$helper->{'VARS'}->{'filename'}; |
$URLback='/'.$helper->{'VARS'}->{'filename'}; |
} elsif ($helper->{VARS}{'symb'}) { |
if ($URLback=~/([^?]+)/) { |
my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); |
$URLback=$1; |
my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'}; |
$URLback=~s|^/~|/priv/|; |
my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'}; |
} |
my ($anchor,$usehttp,$plainurl); |
|
$url = &Apache::lonnet::clutter($url); |
|
$plainurl = $url; |
|
if (($ENV{'SERVER_PORT'} == 443) && ($env{'request.course.id'}) && |
|
(($url =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) || |
|
($url =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}))) { |
|
unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) { |
|
$usehttp = 1; |
|
} |
|
} |
|
if ($env{'request.enc'}) { |
|
$url = &Apache::lonenc::encrypted($url); |
|
} |
|
if ($url ne '') { |
|
my $symb = $helper->{VARS}{'symb'}; |
|
if ($url =~ m{^\Q/adm/wrapper/ext/\E}) { |
|
my $link = $url; |
|
($link,$anchor) = ($url =~ /^([^\#]+)(?:|(\#[^\#]+))$/); |
|
if ($anchor) { |
|
($symb) = ($helper->{VARS}{'symb'} =~ /^([^\#]+)/); |
|
} |
|
$url = $link; |
|
} |
|
$URLback = $url; |
|
if ($usehttp) { |
|
$URLback .= (($URLback =~ /\?/) ? '&':'?').'usehttp=1'; |
|
} |
|
unless ($plainurl =~ /\.page$/) { |
|
$URLback .= (($URLback =~ /\?/) ? '&':'?').'symb='.&escape($symb.$anchor); |
|
} |
|
} |
|
} elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && |
|
($env{'request.course.id'})) { |
|
$URLback=$helper->{VARS}->{'postdata'}; |
} |
} |
# |
# |
# Final adjustment of the font size: |
# Final adjustment of the font size: |
Line 2793 ENDPART
|
Line 3677 ENDPART
|
|
|
$result = set_font_size($result); |
$result = set_font_size($result); |
|
|
#-- writing .tex file in prtspool |
# Insert any babel headers required. |
|
|
|
$result = &collect_languages($result); |
|
|
|
|
|
#-- writing .tex file in prtspool |
my $temp_file; |
my $temp_file; |
my $identifier = &Apache::loncommon::get_cgi_id(); |
my $identifier = &Apache::loncommon::get_cgi_id(); |
my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex"; |
my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex"; |
if (!($#print_array>0)) { |
if (!($#print_array>0)) { |
unless ($temp_file = Apache::File->new('>'.$filename)) { |
unless ($temp_file = Apache::File->new('>'.$filename)) { |
$r->log_error("Couldn't open $filename for output $!"); |
$r->log_error("Couldn't open $filename for output $!"); |
return SERVER_ERROR; |
return SERVER_ERROR; |
} |
} |
print $temp_file $result; |
print $temp_file $result; |
my $begin=index($result,'\begin{document}',0); |
my $begin=index($result,'\begin{document}',0); |
my $inc=substr($result,0,$begin+16); |
my $inc=substr($result,0,$begin+16); |
} else { |
} else { |
my $begin=index($result,'\begin{document}',0); |
my $begin=index($result,'\begin{document}',0); |
my $inc=substr($result,0,$begin+16); |
my $inc=substr($result,0,$begin+16); |
Line 2813 ENDPART
|
Line 3702 ENDPART
|
$print_array[$i]=$result; |
$print_array[$i]=$result; |
} else { |
} else { |
$print_array[$i].='\end{document}'; |
$print_array[$i].='\end{document}'; |
$print_array[$i] = |
$print_array[$i] = |
&latex_corrections($number_of_columns,$print_array[$i], |
&latex_corrections($number_of_columns,$print_array[$i], |
$selectionmade, |
$selectionmade, |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
|
|
my $anobegin=index($print_array[$i],'\setcounter{page}',0); |
my $anobegin=index($print_array[$i],'\setcounter{page}',0); |
substr($print_array[$i],0,$anobegin)=''; |
substr($print_array[$i],0,$anobegin)=''; |
$print_array[$i]=$inc.$print_array[$i]; |
$print_array[$i]=$inc.$print_array[$i]; |
Line 2825 ENDPART
|
Line 3714 ENDPART
|
my $temp_file; |
my $temp_file; |
my $newfilename=$filename; |
my $newfilename=$filename; |
my $num=$i+1; |
my $num=$i+1; |
$newfilename =~s/\.tex$//; |
$newfilename =~s/\.tex$//; |
$newfilename=sprintf("%s_%03d.tex",$newfilename, $num); |
$newfilename=sprintf("%s_%03d.tex",$newfilename, $num); |
unless ($temp_file = Apache::File->new('>'.$newfilename)) { |
unless ($temp_file = Apache::File->new('>'.$newfilename)) { |
$r->log_error("Couldn't open $newfilename for output $!"); |
$r->log_error("Couldn't open $newfilename for output $!"); |
return SERVER_ERROR; |
return SERVER_ERROR; |
} |
} |
print $temp_file $print_array[$i]; |
print $temp_file $print_array[$i]; |
} |
} |
Line 2864 ENDPART
|
Line 3753 ENDPART
|
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.backref' => $URLback,}); |
'cgi.'.$identifier.'.backref' => &escape($URLback),}); |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.courseid" => $cnum, |
"cgi.$identifier.courseid" => $cnum, |
"cgi.$identifier.coursedom" => $cdom, |
"cgi.$identifier.coursedom" => $cdom, |
"cgi.$identifier.resources" => $resources_printed}); |
"cgi.$identifier.resources" => $resources_printed}); |
|
|
my $end_page = &Apache::loncommon::end_page(); |
my $end_page = &Apache::loncommon::end_page(); |
Line 2915 sub get_CODE {
|
Line 3804 sub get_CODE {
|
sub print_resources { |
sub print_resources { |
my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header, |
my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header, |
$LaTeXwidth)=@_; |
$LaTeXwidth)=@_; |
my $current_output = ''; |
my $current_output = ''; |
my $printed = ''; |
my $printed = ''; |
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; |
#goes through all resources, checks if they are available for |
my $actually_printed = 0; # Count of resources printed. |
#current student, and produces output |
#goes through all resources, checks if they are available for |
|
#current student, and produces output |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
my %page_breaks = &get_page_breaks($helper); |
my %page_breaks = &get_page_breaks($helper); |
my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1]; |
my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1]; |
# |
# |
# end each student with a |
# end each student with a |
# Special that allows the post processor to even out the page |
# Special that allows the post processor to even out the page |
# counts later. Nasty problem this... it would be really |
# counts later. Nasty problem this... it would be really |
# nice to put the special in as a postscript comment |
# nice to put the special in as a postscript comment |
# e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately, |
# e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately, |
# The special gets passed the \ and dvips puts it in the output file |
# The special gets passed the \ and dvips puts it in the output file |
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# so we will just rely on printout.pl to strip ENDOFSTUDENTSTAMP from the |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# |
# |
|
|
my $syllabus_first = 0; |
my $syllabus_first = 0; |
|
my $current_assignment = ""; |
|
my $assignment; |
|
my $courseidinfo = &get_course(); |
|
my $possprint = scalar(@{$master_seq}); |
|
|
foreach my $curresline (@{$master_seq}) { |
foreach my $curresline (@{$master_seq}) { |
if (defined $page_breaks{$curresline}) { |
if (defined $page_breaks{$curresline}) { |
if($i != 0) { |
if($i != 0) { |
Line 2953 sub print_resources {
|
Line 3862 sub print_resources {
|
} |
} |
$current_output .= &get_extra_vspaces($helper, $curresline); |
$current_output .= &get_extra_vspaces($helper, $curresline); |
$i++; |
$i++; |
|
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
|
|
|
# See if we need to emit a new header: |
|
|
|
if ( !($type eq 'problems' && |
|
($curresline!~ m/$LONCAPA::assess_page_re/)) ) { |
|
if ($print_incomplete && !&incomplete($username, $userdomain, $usersection, $res_url)) { |
|
next; |
|
} |
|
$actually_printed++; # we're going to print one. |
|
|
if ( !($type eq 'problems' && |
|
($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { |
|
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
|
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 ($res_url =~ /\.page$/) { |
Line 2973 sub print_resources {
|
Line 3889 sub print_resources {
|
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}\d*//; |
$rendered =~ s/\\end\{document}\d*//; |
} |
} |
} |
} |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
Line 2981 sub print_resources {
|
Line 3897 sub print_resources {
|
# Use a copy of the hash so we don't pervert it on future loop passes. |
# Use a copy of the hash so we don't pervert it on future loop passes. |
my %answerenv = %{$moreenv}; |
my %answerenv = %{$moreenv}; |
$answerenv{'answer_output_mode'}='tex'; |
$answerenv{'answer_output_mode'}='tex'; |
|
|
|
|
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
|
&Apache::lonxml::restore_problem_counter(); |
&Apache::lonxml::restore_problem_counter(); |
|
|
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; |
$rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/; |
} else { |
} else { |
|
|
|
|
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
$header =~ s/\\begin{document}//; #<<<<< |
$header =~ s/\\begin\{document}//; #<<<<< |
} |
} |
my $title = &Apache::lonnet::gettitle($curresline); |
my $title = &Apache::lonnet::gettitle($curresline); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$body .='\vskip 1 mm '.$ansrendered; |
$body .='\vskip 1 mm '.$ansrendered; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body,$answerenv{'problem_split'}); |
$rendered = $header.$body; |
$rendered = $header.$body; |
} |
} |
} |
} |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $annotation = &annotate($url); |
my $annotation = &annotate($url); |
$rendered =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$rendered =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
my $junk; |
my $junk; |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered; |
$current_output .= $rendered; |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard|ext\.tool)$/) { |
if ($i == 1) { |
if ($i == 1) { |
$syllabus_first = 1; |
$syllabus_first = 1; |
} |
} |
Line 3026 sub print_resources {
|
Line 3942 sub print_resources {
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $annotation = &annotate($url); |
my $annotation = &annotate($url); |
$annotation =~ s/(\\end{document})/$annotation$1/; |
$annotation =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; |
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; |
} elsif($res_url = ~/\.pdf$/) { |
} elsif($res_url =~ /\.pdf$/) { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $rendered = &include_pdf($url); |
my $rendered = &include_pdf($url); |
if ($remove_latex_header ne 'NO') { |
if ($remove_latex_header ne 'NO') { |
Line 3046 sub print_resources {
|
Line 3962 sub print_resources {
|
if ($remove_latex_header ne 'NO') { |
if ($remove_latex_header ne 'NO') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered; |
$current_output .= $rendered; |
} |
} |
} |
} |
$remove_latex_header = 'YES'; |
$remove_latex_header = 'YES'; |
} |
} |
|
$assignment = &Apache::lonxml::latex_special_symbols( |
|
&Apache::lonnet::gettitle($map), 'header'); |
|
if (($assignment ne $current_assignment) && ($assignment ne "")) { |
|
my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
|
$assignment, $courseidinfo, |
|
$fullname, $usersection); |
|
my $header_start = ($columns_in_format == 1) ? '\lhead' |
|
: '\fancyhead[LO]'; |
|
$header_line = $header_start.'{'.$header_line.'}'; |
|
$current_output = $current_output . $header_line; |
|
$current_assignment = $assignment; |
|
} |
|
|
if (&Apache::loncommon::connection_aborted($r)) { last; } |
if (&Apache::loncommon::connection_aborted($r)) { last; } |
} |
} |
|
# If we are printing incomplete it's possible we don't have |
|
# anything to print. The print subsystem is not so good at handling |
|
# that so we're going to generate a stub that says there are no |
|
# incomplete resources for the person. |
|
# |
|
|
|
if ($actually_printed == 0) { |
|
my $message = &mt('No resources to print'); |
|
if (!$possprint) { |
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
$message = &mt('There are no unhidden resources to print.')."\n\n". |
|
&mt('The most likely reason is one of the following: ')."\n". |
|
'\begin{itemize}'."\n". |
|
'\item '.&mt("The 'Resource hidden from students' parameter is set for the folder being printed.")."\n". |
|
'\item '.&mt("'Hidden' is checked in the Course Editor individually for each resource in the folder being printed.")."\n". |
|
'\end{itemize}'."\n\n". |
|
&mt("Note: to print a bubblesheet exam which you want to hide from students, ". |
|
"use the Course Editor to check the 'Hidden' checkbox for the exam folder itself.")."\n"; |
|
} |
|
} elsif ($print_incomplete) { |
|
$message = &mt('No incomplete resources'); |
|
} |
|
if ($message) { |
|
$current_output = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'}); |
|
} |
|
if ($remove_latex_header eq "NO") { |
|
$current_output = &print_latex_header() . $current_output; |
|
} else { |
|
$current_output = &latex_header_footer_remove($current_output); |
|
} |
|
} |
|
|
if ($syllabus_first) { |
if ($syllabus_first) { |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
} |
} |
my $courseidinfo = &get_course(); |
|
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} |
|
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $header_line = |
my $header_line = |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
$currentassignment, $courseidinfo, $fullname); |
$currentassignment, $courseidinfo, $fullname, $usersection); |
my $header_start = ($columns_in_format == 1) ? '\lhead' |
my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; |
: '\fancyhead[LO]'; |
my $newheader = $header_start.'{'.$header_line.'}'; |
$header_line = $header_start.'{'.$header_line.'}'; |
|
if ($current_output=~/\\documentclass/) { |
if ($current_output=~/\\documentclass/) { |
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; |
$current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /; |
|
|
} else { |
} else { |
my $blankpages = |
my $blankpages = |
'\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; |
'\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; |
|
|
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
©right_line().' \newpage '.$blankpages.$end_of_student. |
©right_line().' \newpage '.$blankpages.$end_of_student. |
'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. |
'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. |
$header_line.$namepostfix.'} \vskip 5 mm '.$current_output; |
$newheader.$namepostfix. '} \vskip 5 mm '.$current_output; |
|
|
} |
} |
# |
# |
# Close the student bracketing. |
# Close the student bracketing. |
Line 3087 sub print_resources {
|
Line 4045 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; |
|
|
&init_perm(); |
|
|
|
|
|
|
if ($env{'request.course.id'}) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $clientip = &Apache::lonnet::get_requestor_ip($r); |
|
my ($blocked,$blocktext) = |
|
&Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom); |
|
if ($blocked) { |
|
my $checkrole = "cm./$cdom/$cnum"; |
|
if ($env{'request.course.sec'} ne '') { |
|
$checkrole .= "/$env{'request.course.sec'}"; |
|
} |
|
unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && |
|
($env{'request.role'} !~ m{^st\./$cdom/$cnum})) { |
|
&printing_blocked($r,$blocktext); |
|
return OK; |
|
} |
|
} |
|
} |
|
|
|
&init_perm(); |
my $helper = printHelper($r); |
my $helper = printHelper($r); |
if (!ref($helper)) { |
if (!ref($helper)) { |
return $helper; |
return $helper; |
} |
} |
|
|
|
|
%parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); |
|
|
|
|
|
|
|
|
%parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); |
|
|
# If a figure conversion queue file exists for this user.domain |
# If a figure conversion queue file exists for this user.domain |
# we delete it since it can only be bad (if it were good, printout.pl |
# we delete it since it can only be bad (if it were good, printout.pl |
Line 3114 sub handler {
|
Line 4102 sub handler {
|
if(-e $conversion_queuefile) { |
if(-e $conversion_queuefile) { |
unlink $conversion_queuefile; |
unlink $conversion_queuefile; |
} |
} |
|
|
|
|
&output_data($r,$helper,\%parmhash); |
&output_data($r,$helper,\%parmhash); |
return OK; |
return OK; |
} |
} |
|
|
use Apache::lonhelper; |
use Apache::lonhelper; |
|
|
Line 3143 sub init_perm {
|
Line 4130 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 3155 sub get_randomly_ordered_warning {
|
Line 4147 sub get_randomly_ordered_warning {
|
if (defined($navmap)) { |
if (defined($navmap)) { |
my $res = $navmap->getResourceByUrl($map); |
my $res = $navmap->getResourceByUrl($map); |
if ($res) { |
if ($res) { |
my $func = |
my $func = |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
if (@matches) { |
|
$message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; |
|
} |
|
} |
|
if ($message) { |
|
return '<message type="warning">'.$message.'</message>'; |
|
} |
} |
} else { |
} else { |
$message = "Retrieval of information about ordering of resources failed."; |
$message = "Retrieval of information about ordering of resources failed."; |
return '<message type="warning">'.$message.'</message>'; |
return '<message type="warning">'.$message.'</message>'; |
} |
} |
return; |
return; |
Line 3199 sub printHelper {
|
Line 4186 sub printHelper {
|
# write it by hand |
# write it by hand |
|
|
Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING}); |
Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING}); |
|
|
my $helper = Apache::lonhelper::helper->new("Printing Helper"); |
my $helper = Apache::lonhelper::helper->new("Printing Helper"); |
$helper->declareVar('symb'); |
$helper->declareVar('symb'); |
$helper->declareVar('postdata'); |
$helper->declareVar('postdata'); |
$helper->declareVar('curseed'); |
$helper->declareVar('curseed'); |
$helper->declareVar('probstatus'); |
$helper->declareVar('probstatus'); |
$helper->declareVar('filename'); |
$helper->declareVar('filename'); |
$helper->declareVar('construction'); |
$helper->declareVar('construction'); |
$helper->declareVar('assignment'); |
$helper->declareVar('assignment'); |
Line 3216 sub printHelper {
|
Line 4203 sub printHelper {
|
$helper->declareVar("STUDENTS"); |
$helper->declareVar("STUDENTS"); |
$helper->declareVar("EXTRASPACE"); |
$helper->declareVar("EXTRASPACE"); |
|
|
|
|
|
|
|
|
# The page breaks and extra spaces |
# The page breaks and extra spaces |
Line 3224 sub printHelper {
|
Line 4211 sub printHelper {
|
# 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. |
# |
# |
|
|
|
|
&Apache::loncommon::restore_course_settings('print', |
&Apache::loncommon::restore_course_settings('print', |
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
'extraspace' => 'scalar', |
'extraspace' => 'scalar', |
'extraspace_units' => '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 |
# very first screen. |
# very first screen. |
|
|
if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { |
if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { |
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} = $env{'form.extraspace'}; |
$helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; |
$helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; |
Line 3249 sub printHelper {
|
Line 4236 sub printHelper {
|
|
|
} |
} |
} |
} |
|
|
} |
} |
|
|
# Detect whether we're coming from construction space |
# Detect whether we're coming from construction space |
if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { |
if ($env{'form.postdata'}=~m{^/priv}) { |
$helper->{VARS}->{'filename'} = "~$1/$2"; |
$helper->{VARS}->{'filename'} = $env{'form.postdata'}; |
$helper->{VARS}->{'construction'} = 1; |
$helper->{VARS}->{'construction'} = 1; |
} else { |
} else { |
if ($env{'form.postdata'}) { |
if ($env{'form.postdata'}) { |
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); |
unless ($env{'form.postdata'} eq '/adm/navmaps') { |
|
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); |
|
} |
if ( $helper->{VARS}->{'symb'} eq '') { |
if ( $helper->{VARS}->{'symb'} eq '') { |
$helper->{VARS}->{'postdata'} = $env{'form.postdata'}; |
$helper->{VARS}->{'postdata'} = $env{'form.postdata'}; |
} |
} |
Line 3267 sub printHelper {
|
Line 4255 sub printHelper {
|
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
} |
} |
if ($env{'form.url'}) { |
if ($env{'form.url'}) { |
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); |
unless ($env{'form.url'} eq '/adm/navmaps') { |
|
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); |
|
} |
} |
} |
|
|
} |
|
|
|
if ($env{'form.symb'}) { |
|
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
|
} |
} |
if ($env{'form.url'}) { |
|
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); |
|
|
|
|
if ($helper->{VARS}->{'symb'} ne '') { |
|
$helper->{VARS}->{'symb'}= |
|
&Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); |
|
} |
|
my ($resourceTitle,$sequenceTitle,$mapTitle,$cdom,$cnum); |
|
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
|
"uploaded/$cdom/$cnum/default.sequence") { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my @toplevelres = $navmap->retrieveResources('',sub { !(($_[0]->is_map()) || ($_[0]->src =~ /^\/adm\/navmaps/)) },0,0); |
|
if (@toplevelres) { |
|
my @printable; |
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
@printable = @toplevelres; |
|
} else { |
|
@printable = $navmap->retrieveResources(undef,sub { $_[0]->resprintable() },0,1); |
|
} |
|
if (@printable) { |
|
$sequenceTitle = 'Main Content'; |
|
$mapTitle = $sequenceTitle; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); |
} |
} |
$helper->{VARS}->{'symb'}= |
|
&Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); |
|
my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); |
|
if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} |
if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} |
|
|
|
|
# Extract map |
# Extract map |
my $symb = $helper->{VARS}->{'symb'}; |
my $symb = $helper->{VARS}->{'symb'}; |
my ($map, $id, $url); |
my ($map, $id, $url); |
my $subdir; |
my $subdir; |
my $is_published=0; # True when printing from resource space. |
my $is_published=0; # True when printing from resource space. |
|
my $res_printable = 1; # By default the current resource is printable. |
|
my $res_error; |
|
my $userCanPrint = ($perm{'pav'} || $perm{'pfo'}); |
|
my $res_printstartdate; |
|
my $res_printenddate; |
|
my $map_open = 0; |
|
my $map_close = 0xffffffff; |
|
my $course_open = 0; |
|
my $course_close = 0xffffffff; |
|
|
# Get the resource name from construction space |
# Get the resource name from construction space |
if ($helper->{VARS}->{'construction'}) { |
if ($helper->{VARS}->{'construction'}) { |
$resourceTitle = substr($helper->{VARS}->{'filename'}, |
$resourceTitle = substr($helper->{VARS}->{'filename'}, |
rindex($helper->{VARS}->{'filename'}, '/')+1); |
rindex($helper->{VARS}->{'filename'}, '/')+1); |
$subdir = substr($helper->{VARS}->{'filename'}, |
$subdir = substr($helper->{VARS}->{'filename'}, |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
Line 3302 sub printHelper {
|
Line 4319 sub printHelper {
|
|
|
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)); |
|
} elsif (($helper->{VARS}->{'postdata'} eq '/adm/navmaps') && |
|
($env{'request.course.id'} ne '')) { |
|
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
|
"uploaded/$cdom/$cnum/default.sequence") { |
|
$map = $env{'course.'.$env{'request.course.id'}.'.url'}; |
|
$url = $helper->{VARS}->{'postdata'}; |
|
} |
|
} |
|
if (($symb ne '') || ($map ne '')) { |
|
if (!$userCanPrint) { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $res; |
|
if ($symb ne '') { |
|
$res = $navmap->getBySymb($symb); |
|
} elsif ($map ne '') { |
|
$res = $navmap->getResourceByUrl($map); |
|
} |
|
if (ref($res)) { |
|
$res_printable = $res->resprintable(); #printability in course context |
|
($res_printstartdate, $res_printenddate) = &get_print_dates($res); |
|
($course_open, $course_close) = &course_print_dates($res); |
|
($map_open, $map_close) = &map_print_dates($res); |
|
} else { |
|
$res_error = 1; |
|
} |
|
} else { |
|
$res_error = 1; |
|
} |
|
} |
} else { |
} else { |
|
# Resource space. |
|
|
$url = $helper->{VARS}->{'postdata'}; |
$url = $helper->{VARS}->{'postdata'}; |
$is_published=1; # From resource space. |
$is_published=1; # From resource space. |
} |
} |
Line 3313 sub printHelper {
|
Line 4362 sub printHelper {
|
my $postdata = $helper->{VARS}->{'postdata'}; |
my $postdata = $helper->{VARS}->{'postdata'}; |
$resourceTitle = substr($postdata, rindex($postdata, '/') + 1); |
$resourceTitle = substr($postdata, rindex($postdata, '/') + 1); |
} |
} |
$subdir = &Apache::lonnet::filelocation("", $url); |
if (($url eq '/adm/navmaps') && ($map eq $env{'course.'.$env{'request.course.id'}.'.url'})) { |
|
$res_printable=0; |
|
} else { |
|
$subdir = &Apache::lonnet::filelocation("", $url); |
|
} |
|
|
|
|
} |
} |
if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { |
if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) { |
$helper->{VARS}->{'curseed'}=$env{'form.curseed'}; |
$helper->{VARS}->{'curseed'}=$env{'form.curseed'}; |
} |
} |
|
|
if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) { |
if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) { |
$helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'}; |
$helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'}; |
} |
} |
Line 3343 sub printHelper {
|
Line 4399 sub printHelper {
|
my $printChoices = []; |
my $printChoices = []; |
my $paramHash; |
my $paramHash; |
|
|
if ($resourceTitle) { |
# If there is a current resource and it is printable |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; |
# 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']); |
} |
} |
|
|
# Useful filter strings |
# Useful filter strings |
my $isProblem = '($res->is_problem()||$res->contains_problem||$res->is_practice()) '; |
|
|
my $isPrintable = ' && $res->resprintable()'; |
|
|
|
my $isProblem = '(($res->is_problem()||$res->contains_problem() ||$res->is_practice()))'; |
|
$isProblem .= $isPrintable unless $userCanPrint; |
$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; |
$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden; |
my $isProblemOrMap = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice()'; |
my $isProblemOrMap = '($res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())'; |
my $isNotMap = '!$res->is_sequence()'; |
$isProblemOrMap .= $isPrintable unless $userCanPrint; |
|
my $isNotMap = '(!$res->is_sequence())'; |
|
$isNotMap .= $isPrintable unless $userCanPrint; |
$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; |
$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; |
my $isMap = '$res->is_map()'; |
my $isMap = '$res->is_map()'; |
my $symbFilter = '$res->shown_symb()'; |
$isMap .= $isPrintable unless $userCanPrint; |
|
my $symbFilter = '$res->shown_symb() '; |
my $urlValue = '$res->link()'; |
my $urlValue = '$res->link()'; |
|
|
$helper->declareVar('SEQUENCE'); |
$helper->declareVar('SEQUENCE'); |
Line 3363 sub printHelper {
|
Line 4429 sub printHelper {
|
|
|
my $start_new_option; |
my $start_new_option; |
if ($perm{'pav'}) { |
if ($perm{'pav'}) { |
$start_new_option = |
$start_new_option = |
"<option text='".&mt('Start new page<br />before selected'). |
"<option text='".&mt('Start new page[_1]before selected','<br />'). |
"' variable='FINISHPAGE' />". |
"' variable='FINISHPAGE' />". |
"<option text='".&mt('Extra space<br />before selected'). |
"<option text='".&mt('Extra space[_1]before selected','<br />'). |
"' variable='EXTRASPACE' type='text' />" . |
"' variable='EXTRASPACE' type='text' />" . |
"<option " . |
"<option " . |
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
"' variable='POSSIBLE_RESOURCES' type='hidden' />". |
"<option text='".&mt('Space units<br />check for mm'). |
"<option text='".&mt('Space units[_1]check for mm','<br />'). |
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
"' variable='EXTRASPACE_UNITS' type='checkbox' />" |
; |
; |
|
|
|
|
} |
} |
|
|
# If not construction space user can print the components of a page: |
# If not construction space user can print the components of a page: |
Line 3393 sub printHelper {
|
Line 4457 sub printHelper {
|
my $resourcesymb = $page_resources[0]->symb(); |
my $resourcesymb = $page_resources[0]->symb(); |
my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb); |
my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb); |
if ($page_ispage) { |
if ($page_ispage) { |
push @{$printChoices}, |
push(@{$printChoices}, |
[&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
[&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
'map_problems_in_page', |
'map_problems_in_page', |
'CHOOSE_PROBLEMS_PAGE']; |
'CHOOSE_PROBLEMS_PAGE']); |
push @{$printChoices}, |
push(@{$printChoices}, |
[&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
[&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), |
'map_resources_in_page', |
'map_resources_in_page', |
'CHOOSE_RESOURCES_PAGE']; |
'CHOOSE_RESOURCES_PAGE']); |
} |
} |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1'", |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1' modallink='1'", |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
Line 3414 sub printHelper {
|
Line 4478 sub printHelper {
|
|
|
$helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', |
$helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE', |
'Select Resource(s) to print', |
'Select Resource(s) to print', |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
$isNotMap, '', $symbFilter, |
$isNotMap, '', $symbFilter, |
$start_new_option); |
$start_new_option); |
|
|
|
|
|
|
|
|
|
|
Line 3434 sub printHelper {
|
Line 4498 sub printHelper {
|
if (($helper->{'VAR'}->{'construction'} ne '1' ) && |
if (($helper->{'VAR'}->{'construction'} ne '1' ) && |
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'assignment'}) { |
$helper->{VARS}->{'assignment'}) { |
|
|
|
# BZ 5209 - Print incomplete problems from sequence: |
|
# the exact form of this depends on whether or not we are privileged or a mere |
|
# plebe of s student: |
|
|
|
my $optionText = ''; |
|
my $printSelector = 'map_incomplete_problems_seq'; |
|
my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; |
|
my $textSuffix = ''; |
|
my $nocurrloc = ''; |
|
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$nocurrloc = 1; |
|
} |
|
|
|
if ($userCanPrint) { |
|
$printSelector = 'map_incomplete_problems_people_seq'; |
|
$nextState = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ'; |
|
$textSuffix = ' for selected students'; |
|
my $helperStates = |
|
&create_incomplete_folder_selstud_helper($helper, $map, $nocurrloc); |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
if (&printable($map_open, $map_close)) { |
|
my $helperStates = &create_incomplete_folder_helper($helper, $map, $nocurrloc); # Create needed states for student. |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
# TODO: Figure out how to break the news...this folder is not printable. |
|
} |
|
} |
|
|
|
if ($userCanPrint || &printable($map_open, $map_close)) { |
|
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
|
$optionText = &mt('Selected [_1]Incomplete Problems[_2] [_3]not in a folder[_4]' . $textSuffix, |
|
'<b>','</b>','<i>','</i>'); |
|
} else { |
|
$optionText = &mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, |
|
'<b>','</b>','<b><i>'.$sequenceTitle.'</b></i>'); |
|
} |
|
push(@{$printChoices}, |
|
[$optionText, |
|
$printSelector, |
|
$nextState]); |
|
} |
# Allow problems from sequence |
# Allow problems from sequence |
push @{$printChoices}, |
if ($userCanPrint || &printable($map_open, $map_close)) { |
[&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
'map_problems', |
$optionText = &mt('Selected [_1]Problems[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>'); |
'CHOOSE_PROBLEMS']; |
} else { |
# Allow all resources from sequence |
$optionText = &mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'); |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
} |
'map_problems_pages', |
push(@{$printChoices}, |
'CHOOSE_PROBLEMS_HTML']; |
[$optionText, |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
'map_problems', |
'Select Problem(s) to print', |
'CHOOSE_PROBLEMS']); |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
# Allow all resources from sequence |
'RESOURCES', |
if ($helper->{VARS}->{'postdata'} eq '/adm/navmaps') { |
'PAGESIZE', |
$optionText = &mt('Selected [_1]Resources[_2] [_3]not in a folder[_4]','<b>','</b>','<i>','</i>'); |
$map, |
} else { |
$isProblem, '', |
$optionText = &mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'); |
$symbFilter, |
} |
$start_new_option); |
push(@{$printChoices}, [$optionText, |
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
'map_problems_pages', |
'Select Resource(s) to print', |
'CHOOSE_PROBLEMS_HTML']); |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1"', |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
'RESOURCES', |
'Select Problem(s) to print', |
'PAGESIZE', |
'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" nocurrloc="'.$nocurrloc.'"', |
$map, |
'RESOURCES', |
$isNotMap, '', |
'PAGESIZE', |
$symbFilter, |
$map, |
$start_new_option); |
$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" modallink="1" nocurrloc="'.$nocurrloc.'" suppressNavmap="1"', |
|
'RESOURCES', |
|
'PAGESIZE', |
|
$map, |
|
$isNotMap, '', |
|
$symbFilter, |
|
$start_new_option); |
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
&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 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 && |
if ($perm{'pfo'} && !$is_published && |
($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
|
|
|
# BZ 5209 - incomplete problems from entire course: |
|
|
|
push(@{$printChoices}, |
|
[&mt('Selected [_1]Incomplete Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'incomplete_problems_selpeople_course', 'INCOMPLETE_PROBLEMS_COURSE_RESOURCES']); |
|
my $helperFragment = &create_incomplete_course_helper($helper); # Create needed states. |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', $helperFragment); |
|
|
|
# Selected problems/resources from entire course: |
|
|
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS']; |
push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_problems', 'ALL_PROBLEMS']); |
push @{$printChoices}, [&mtn('Selected <b>Resources</b> from <b>entire course</b>'), 'all_resources', 'ALL_RESOURCES']; |
push(@{$printChoices}, [&mt('Selected [_1]Resources[_2] from [_3]entire course[_4]','<b>','</b>','<b>','</b>'), 'all_resources', 'ALL_RESOURCES']); |
push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b> for <b>selected people</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']; |
push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from [_3]entire course[_4] for [_5]selected people[_6]','<b>','</b>','<b>','</b>','<b>','</b>'), 'all_problems_students', 'ALL_PROBLEMS_STUDENTS']); |
my $suffixXml = <<ALL_PROBLEMS; |
my $suffixXml = <<ALL_PROBLEMS; |
<state name="STUDENTS1" title="Select People"> |
<state name="STUDENTS1" title="Select People"> |
<message><b>Select sorting order of printout</b> </message> |
<message><b>Select sorting order of printout</b> </message> |
Line 3485 my $suffixXml = <<ALL_PROBLEMS;
|
Line 4618 my $suffixXml = <<ALL_PROBLEMS;
|
<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', |
&Apache::lonxml::xmlparse($r, 'helper', |
&generate_resource_chooser('ALL_PROBLEMS', |
&generate_resource_chooser('ALL_PROBLEMS', |
'SelectProblem(s) to print', |
'Select Problem(s) to print', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3497 ALL_PROBLEMS
|
Line 4630 ALL_PROBLEMS
|
$start_new_option) . |
$start_new_option) . |
&generate_resource_chooser('ALL_RESOURCES', |
&generate_resource_chooser('ALL_RESOURCES', |
'Select Resource(s) to print', |
'Select Resource(s) to print', |
" toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'", |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3505 ALL_PROBLEMS
|
Line 4638 ALL_PROBLEMS
|
$start_new_option) . |
$start_new_option) . |
&generate_resource_chooser('ALL_PROBLEMS_STUDENTS', |
&generate_resource_chooser('ALL_PROBLEMS_STUDENTS', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'STUDENTS1', |
'STUDENTS1', |
'', |
'', |
Line 3520 ALL_PROBLEMS
|
Line 4653 ALL_PROBLEMS
|
# either for selected students or for coded assignments. |
# either for selected students or for coded assignments. |
|
|
if ($page_ispage) { |
if ($page_ispage) { |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]selected people[_5]', |
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>'), |
'<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'), |
'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE']; |
'problems_for_students_from_page', 'CHOOSE_TGT_STUDENTS_PAGE']); |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from page [_3] for [_4]CODEd assignments[_5]', |
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>'), |
'<b>', '</b>', '<b><i>'.$page_title.'</i></b>', '<b>', '</b>'), |
'problems_for_anon_page', 'CHOOSE_ANON1_PAGE']; |
'problems_for_anon_page', 'CHOOSE_ANON1_PAGE']); |
} |
} |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]', |
push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]', |
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
'problems_for_students', 'CHOOSE_STUDENTS']; |
'problems_for_students', 'CHOOSE_STUDENTS']); |
push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]', |
push(@{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]', |
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), |
'problems_for_anon', 'CHOOSE_ANON1']; |
'problems_for_anon', 'CHOOSE_ANON1']); |
} |
|
|
|
my $randomly_ordered_warning = |
|
&get_randomly_ordered_warning($helper,$map); |
|
|
|
# resource_selector will hold a few states that: |
|
# - Allow resources to be selected for printing. |
|
# - Determine pagination between assignments. |
|
# - Determine how many assignments should be bundled into a single PDF. |
|
# TODO: |
|
# Probably good to do things like separate this up into several vars, each |
|
# with one state, and use REGEXPs at inclusion time to set state names |
|
# and next states for better mix and match capability |
|
# |
|
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
|
'Select resources to print', |
|
'multichoice="1" addstatus="1" closeallpages="1"', |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$map, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
$resource_selector .= <<RESOURCE_SELECTOR; |
|
<state name="PRINT_FORMATTING" title="How should results be printed?"> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
<choice computer="sections">Each PDF contains exactly one section</choice> |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
|
$resource_selector .= &generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' addstatus='1' closeallpages ='1'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
|
|
|
|
# Generate student choosers. |
|
|
|
|
|
|
|
&Apache::lonxml::xmlparse($r, 'helper', |
|
&generate_student_chooser('CHOOSE_TGT_STUDENTS_PAGE', |
|
'student_sort', |
|
'STUDENTS', |
|
'CHOOSE_STUDENTS_PAGE')); |
|
&Apache::lonxml::xmlparse($r, 'helper', |
|
&generate_student_chooser('CHOOSE_STUDENTS', |
|
'student_sort', |
|
'STUDENTS', |
|
'SELECT_PROBLEMS')); |
|
&Apache::lonxml::xmlparse($r, 'helper', $resource_selector); |
|
|
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum); |
|
my $namechoice='<choice></choice>'; |
|
foreach my $name (sort {uc($a) cmp uc($b)} @names) { |
|
if ($name =~ /^error: 2 /) { next; } |
|
if ($name =~ /^type\0/) { next; } |
|
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
|
} |
} |
|
|
|
my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) = |
|
&generate_common_choosers($r,$helper,$map,$url,$isProblem,$symbFilter,$start_new_option); |
|
|
my %code_values; |
if ($helper->{VARS}->{'assignment'}) { |
my %codes_to_print; |
|
foreach my $key (@names) { |
|
%code_values = &Apache::grades::get_codes($key, $cdom, $cnum); |
|
foreach my $key (keys(%code_values)) { |
|
$codes_to_print{$key} = 1; |
|
} |
|
} |
|
|
|
my $code_selection; |
# Assignment printing: |
foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { |
|
my $choice = $code; |
|
if ($code =~ /^[A-Z]+$/) { # Alpha code |
|
$choice = &letters_to_num($code); |
|
} |
|
push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]); |
|
} |
|
if (%codes_to_print) { |
|
$code_selection .=' |
|
<message><b>Choose single CODE from list:</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
<choice></choice> |
|
<exec> |
|
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
|
</exec> |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
|
'.$/; |
|
|
|
|
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']); |
} |
} |
|
|
my @lines = &Apache::grades::get_scantronformat_file(); |
# resource_selector will hold a few states that: |
my $codechoice=''; |
# - Allow resources to be selected for printing. |
foreach my $line (@lines) { |
# - Determine pagination between assignments. |
my ($name,$description,$code_type,$code_length)= |
# - Determine how many assignments should be bundled into a single PDF. |
(split(/:/,$line))[0,1,2,4]; |
# TODO: |
if ($code_length > 0 && |
# Probably good to do things like separate this up into several vars, each |
$code_type =~/^(letter|number|-1)/) { |
# with one state, and use REGEXPs at inclusion time to set state names |
$codechoice.='<choice computer="'.$name.'">'.$description.'</choice>'; |
# and next states for better mix and match capability |
} |
# |
} |
|
if ($codechoice eq '') { |
|
$codechoice='<choice computer="default">Default</choice>'; |
|
} |
|
my $anon1 = &generate_code_selector($helper, |
|
'CHOOSE_ANON1', |
|
'SELECT_PROBLEMS', |
|
$codechoice, |
|
$code_selection, |
|
$namechoice) . $resource_selector; |
|
|
|
|
|
&Apache::lonxml::xmlparse($r, 'helper',$anon1); |
|
|
|
my $anon_page = &generate_code_selector($helper, |
|
'CHOOSE_ANON1_PAGE', |
|
'SELECT_PROBLEMS_PAGE', |
|
$codechoice, |
|
$code_selection, |
|
$namechoice) . |
|
&generate_resource_chooser('SELECT_PROBLEMS_PAGE', |
|
'Select Problem(s) to print', |
|
"multichoice='1' addstatus='1' closeallpages ='1'", |
|
'RESOURCES', |
|
'PRINT_FORMATTING', |
|
$url, |
|
$isProblem, '', $symbFilter, |
|
$start_new_option); |
|
&Apache::lonxml::xmlparse($r, 'helper', $anon_page); |
|
|
|
|
|
if ($helper->{VARS}->{'assignment'}) { |
|
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1']; |
|
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2']; |
|
} |
|
|
|
|
|
$resource_selector=<<RESOURCE_SELECTOR; |
my $resource_selector=<<RESOURCE_SELECTOR; |
<state name="SELECT_RESOURCES" title="Select Resources"> |
<state name="SELECT_RESOURCES" title="Select Resources"> |
$randomly_ordered_warning |
$randomly_ordered_warning |
<nextstate>PRINT_FORMATTING</nextstate> |
<nextstate>PRINT_FORMATTING</nextstate> |
<message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message> |
<message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message> |
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
closeallpages="1"> |
closeallpages="1" modallink="1"> |
<filterfunc>return $isNotMap;</filterfunc> |
<filterfunc>return $isNotMap;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
$start_new_option |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
|
|
<state name="PRINT_FORMATTING" title="Format of the print job"> |
|
<nextstate>NUMBER_PER_PDF</nextstate> |
|
<message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message> |
|
<choices variable="EMPTY_PAGES"> |
|
<choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice> |
|
<choice computer='1'>Add one empty page/column after each student\'s assignment</choice> |
|
<choice computer='2'>Add two empty pages/column after each student\'s assignment</choice> |
|
<choice computer='3'>Add three empty pages/column after each student\'s assignment</choice> |
|
</choices> |
|
<nextstate>PAGESIZE</nextstate> |
|
<message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message> |
|
<choices variable="SPLIT_PDFS"> |
|
<choice computer="all">All assignments in a single PDF file</choice> |
|
<choice computer="sections">Each PDF contains exactly one section</choice> |
|
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
|
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
|
Specify the number of assignments per PDF:</choice> |
|
</choices> |
|
</state> |
|
RESOURCE_SELECTOR |
RESOURCE_SELECTOR |
|
|
|
$resource_selector .= &generate_format_selector($helper, |
|
'Format of the print job', |
|
'PRINT_FORMATTING'); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1); |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<state name="CHOOSE_STUDENTS1" title="Select Students and Resources"> |
<choices variable='student_sort'> |
<choices variable='student_sort'> |
Line 3765 CHOOSE_STUDENTS1
|
Line 4747 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 3803 CHOOSE_ANON2
|
Line 4785 CHOOSE_ANON2
|
} |
} |
|
|
# FIXME: That RE should come from a library somewhere. |
# FIXME: That RE should come from a library somewhere. |
if (($perm{'pav'} |
if (($perm{'pav'} |
|
&& ($subdir ne '') |
&& $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' |
&& $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' |
&& (defined($helper->{'VARS'}->{'construction'}) |
&& (defined($helper->{'VARS'}->{'construction'}) |
|| |
|| |
(&Apache::lonnet::allowed('bre',$subdir) eq 'F' |
(&Apache::lonnet::allowed('bre',$subdir) eq 'F' |
&& |
&& |
$helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/) |
$helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/) |
)) |
)) |
&& $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 [_1]Problems[_2] from current subdirectory [_3]','<b>','</b>','<b><i>'.$pretty_dir.'</i></b>','<b>','</b>'), '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 3822 CHOOSE_ANON2
|
Line 4805 CHOOSE_ANON2
|
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filechoice>return '$subdir';</filechoice> |
<filechoice>return '$subdir';</filechoice> |
CHOOSE_FROM_SUBDIR |
CHOOSE_FROM_SUBDIR |
|
|
# this is broken up because I really want interpolation above, |
# this is broken up because I really want interpolation above, |
# and I really DON'T want it below |
# and I really DON'T want it below |
$xmlfrag .= <<'CHOOSE_FROM_SUBDIR'; |
$xmlfrag .= <<'CHOOSE_FROM_SUBDIR'; |
Line 3837 CHOOSE_FROM_SUBDIR
|
Line 4820 CHOOSE_FROM_SUBDIR
|
|
|
# Allow the user to select any sequence in the course, feed it to |
# Allow the user to select any sequence in the course, feed it to |
# another resource selector for that sequence |
# another resource selector for that sequence |
if (!$helper->{VARS}->{'construction'} && !$is_published) { |
if ((!$helper->{VARS}->{'construction'}) && |
push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"), |
(!$is_published || (($subdir eq '') && ($url eq '/adm/navmaps')))) { |
'select_sequences', 'CHOOSE_SEQUENCE']; |
push(@$printChoices,[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course', |
my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
'<b>','</b>','<b>','</b>'), |
#Escape apostrophes and backslashes for Perl |
'select_sequences','CHOOSE_SEQUENCE']); |
$escapedSequenceName =~ s/\\/\\\\/g; |
my $escapedSequenceName; |
$escapedSequenceName =~ s/'/\\'/g; |
if ($helper->{VARS}->{'SEQUENCE'} ne '') { |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
$escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
|
} elsif (($subdir eq '') && ($url eq '/adm/navmaps')) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if ($env{'course.'.$env{'request.course.id'}.'.url'} eq |
|
"uploaded/$cdom/$cnum/default.sequence") { |
|
$escapedSequenceName = $env{'course.'.$env{'request.course.id'}.'.url'}; |
|
} |
|
} |
|
#Escape apostrophes and backslashes for Perl |
|
$escapedSequenceName =~ s/\\/\\\\/g; |
|
$escapedSequenceName =~ s/'/\\'/g; |
|
my $nocurrloc; |
|
if (($subdir eq '') && ($url eq '/adm/navmaps')) { |
|
$nocurrloc = 'nocurrloc="1"'; |
|
if ($perm{'pfo'}) { |
|
push(@{$printChoices}, |
|
[&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_problems_for_students','CHOOSE_SEQUENCE_STUDENTS'], |
|
[&mt('Selected [_1]Problems[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_problems_for_anon','CHOOSE_SEQUENCE_ANON1'], |
|
[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]selected people[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_resources_for_students','CHOOSE_SEQUENCE_STUDENTS1'], |
|
[&mt('Selected [_1]Resources[_2] from [_3]selected folder[_4] in course for [_5]CODEd assignments[_6]', |
|
'<b>','</b>','<b>','</b>','<b>','</b>'), |
|
'select_sequences_resources_for_anon','CHOOSE_SEQUENCE_ANON2']); |
|
if ($escapedSequenceName) { |
|
my ($randomly_ordered_warning,$codechoice,$code_selection,$namechoice) = |
|
&generate_common_choosers($r,$helper,$escapedSequenceName,$escapedSequenceName, |
|
$isProblem,$symbFilter,$start_new_option); |
|
|
|
my $resource_selector = <<RESOURCE_SELECTOR; |
|
<state name="CHOOSE_STUDENTS2" title="Select Students and Resources"> |
|
<choices variable='student_sort'> |
|
<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="STUDENTS" nextstate="SELECT_RESOURCES" coursepersonnel="1" /> |
|
|
|
</state> |
|
<state name="SELECT_RESOURCES" title="Select Resources"> |
|
$randomly_ordered_warning |
|
<nextstate>PRINT_FORMATTING</nextstate> |
|
<message>(mark desired resources then click "next" button) <br /></message> |
|
<resource variable="RESOURCES" multichoice="1" addstatus="1" |
|
closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> |
|
<filterfunc>return $isNotMap;</filterfunc> |
|
<mapurl>$escapedSequenceName</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
RESOURCE_SELECTOR |
|
|
|
my $anon3 = &generate_code_selector($helper, |
|
'CHOOSE_ANON3', |
|
'SELECT_RESOURCES', |
|
$codechoice, |
|
$code_selection, |
|
$namechoice) . $resource_selector; |
|
|
|
&Apache::lonxml::xmlparse($r, 'helper',$anon3); |
|
} |
|
} |
|
} |
|
if (($subdir eq '') && ($url eq '/adm/navmaps') && ($perm{'pfo'})) { |
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
<message>Select the sequence to print resources from:</message> |
<message>Select the sequence to print resources from:</message> |
<resource variable="SEQUENCE"> |
<resource variable="SEQUENCE"> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<filterfunc>return \$res->is_sequence;</filterfunc> |
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_STUDENTS" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_STUDENTS</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_ANON1" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_ANON1</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_STUDENTS1" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_STUDENTS2</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_SEQUENCE_ANON2" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_ANON3</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
|
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
|
</resource> |
|
</state> |
|
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
|
<message>(mark desired resources then click "next" button) <br /></message> |
|
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
|
closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> |
|
<nextstate>PAGESIZE</nextstate> |
|
<filterfunc>return $isNotMap</filterfunc> |
|
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
|
<valuefunc>return $symbFilter;</valuefunc> |
|
$start_new_option |
|
</resource> |
|
</state> |
|
CHOOSE_FROM_ANY_SEQUENCE |
|
} else { |
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE); |
|
<state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From"> |
|
<message>Select the sequence to print resources from:</message> |
|
<resource variable="SEQUENCE"> |
|
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
|
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
<valuefunc>return $urlValue;</valuefunc> |
<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 3858 CHOOSE_FROM_SUBDIR
|
Line 4975 CHOOSE_FROM_SUBDIR
|
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
<state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print"> |
<message>(mark desired resources then click "next" button) <br /></message> |
<message>(mark desired resources then click "next" button) <br /></message> |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
closeallpages="1"> |
closeallpages="1" modallink="1" suppressNavmap="1" $nocurrloc> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isNotMap</filterfunc> |
<filterfunc>return $isNotMap</filterfunc> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
Line 3867 CHOOSE_FROM_SUBDIR
|
Line 4984 CHOOSE_FROM_SUBDIR
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_FROM_ANY_SEQUENCE |
CHOOSE_FROM_ANY_SEQUENCE |
} |
} |
|
} |
|
my $numchoices = 0; |
|
if (ref($printChoices) eq 'ARRAY') { |
|
$numchoices = @{$printChoices}; |
|
} |
|
# Early out if nothing to print |
|
if (!$numchoices) { |
|
$r->print(&Apache::loncommon::start_page('Printing Helper'). |
|
'<h2>'.&mt('Unable to determine print context').'</h2>'. |
|
'<p>'.&mt('Please display a resource, and then click the "Print" button/icon').'</p>'); |
|
my $prtspool=$r->dir_config('lonPrtDir'); |
|
my $footer = &recently_generated($prtspool); |
|
$r->print($footer.&Apache::loncommon::end_page()); |
|
return OK; |
|
} |
|
|
# Generate the first state, to select which resources get printed. |
# Generate the first state, to select which resources get printed. |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
|
if (!$res_printable) { |
|
my $noprintmsg; |
|
if ($res_error) { |
|
$noprintmsg = &mt('Print availability for current resource could not be determined'); |
|
} else { |
|
my $now = time; |
|
my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate); |
|
my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate); |
|
if (($res_printenddate) && ($res_printenddate < $now)) { |
|
$noprintmsg = &mt('Printing for current resource no longer available (ended: [_1])', |
|
$shownprintend); |
|
} else { |
|
if (($res_printstartdate) && ($res_printstartdate > $now)) { |
|
if (($res_printenddate) && ($res_printenddate > $now) && ($res_printenddate > $res_printstartdate)) { |
|
$noprintmsg = &mt('Printing for current resource is only possible between [_1] and [_2]', |
|
$shownprintstart,$shownprintend); |
|
} elsif (!$res_printenddate) { |
|
$noprintmsg = &mt('Printing for current resource will only be possible starting [_1]', |
|
$shownprintstart); |
|
} else { |
|
$noprintmsg = &mt('Printing for current resource is unavailable'); |
|
} |
|
} |
|
} |
|
} |
|
|
|
if ($noprintmsg) { |
|
$paramHash = Apache::lonhelper::getParamHash(); |
|
$paramHash->{MESSAGE_TEXT} = |
|
'<p class="LC_info">'.$noprintmsg.'</p>'; |
|
Apache::lonhelper::message->new(); |
|
} |
|
} |
|
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{MESSAGE_TEXT} = ""; |
$paramHash->{MESSAGE_TEXT} = ""; |
Apache::lonhelper::message->new(); |
Apache::lonhelper::message->new(); |
Line 3882 CHOOSE_FROM_ANY_SEQUENCE
|
Line 5048 CHOOSE_FROM_ANY_SEQUENCE
|
my $startedTable = 0; # have we started an HTML table yet? (need |
my $startedTable = 0; # have we started an HTML table yet? (need |
# to close it later) |
# to close it later) |
|
|
if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or |
if (($perm{'pav'} and $perm{'vgr'}) or |
($helper->{VARS}->{'construction'} eq '1')) { |
($helper->{VARS}->{'construction'} eq '1')) { |
&addMessage('<br />' |
&addMessage('<br />' |
.'<h3>'.&mt('Print Options').'</h3>' |
.'<h3>'.&mt('Print Options').'</h3>' |
Line 3894 CHOOSE_FROM_ANY_SEQUENCE
|
Line 5060 CHOOSE_FROM_ANY_SEQUENCE
|
) |
) |
); |
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'ANSWER_TYPE'; |
$paramHash->{'variable'} = 'ANSWER_TYPE'; |
$helper->declareVar('ANSWER_TYPE'); |
$helper->declareVar('ANSWER_TYPE'); |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
['Without Answers', 'yes'], |
['Without Answers', 'yes'], |
['With Answers', 'no'], |
['With Answers', 'no'], |
Line 3913 CHOOSE_FROM_ANY_SEQUENCE
|
Line 5079 CHOOSE_FROM_ANY_SEQUENCE
|
&addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size'))); |
&addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size'))); |
my $xmlfrag = << "FONT_SELECTION"; |
my $xmlfrag = << "FONT_SELECTION"; |
|
|
|
|
<dropdown variable='fontsize' multichoice='0', allowempty='0'> |
<dropdown variable='fontsize' multichoice='0' allowempty='0'> |
<defaultvalue> |
<defaultvalue> |
return 'normalsize'; |
return 'normalsize'; |
</defaultvalue> |
</defaultvalue> |
Line 3950 FONT_SELECTION
|
Line 5116 FONT_SELECTION
|
); |
); |
} |
} |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'LATEX_TYPE'; |
$paramHash->{'variable'} = 'LATEX_TYPE'; |
$helper->declareVar('LATEX_TYPE'); |
$helper->declareVar('LATEX_TYPE'); |
if ($helper->{VARS}->{'construction'} eq '1') { |
if ($helper->{VARS}->{'construction'} eq '1') { |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
['standard LaTeX mode', 'standard'], |
['standard LaTeX mode', 'standard'], |
['LaTeX batchmode', 'batchmode'], ]; |
['LaTeX batchmode', 'batchmode'], ]; |
} else { |
} else { |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
Line 3962 FONT_SELECTION
|
Line 5128 FONT_SELECTION
|
['standard LaTeX mode', 'standard'] ]; |
['standard LaTeX mode', 'standard'] ]; |
} |
} |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
|
|
&addMessage(&Apache::lonhtmlcommon::row_closure() |
&addMessage(&Apache::lonhtmlcommon::row_closure() |
.&Apache::lonhtmlcommon::row_title( |
.&Apache::lonhtmlcommon::row_title( |
'<label for="TABLE_CONTENTS_forminput">' |
'<label for="TABLE_CONTENTS_forminput">' |
Line 3971 FONT_SELECTION
|
Line 5137 FONT_SELECTION
|
) |
) |
); |
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'TABLE_CONTENTS'; |
$paramHash->{'variable'} = 'TABLE_CONTENTS'; |
$helper->declareVar('TABLE_CONTENTS'); |
$helper->declareVar('TABLE_CONTENTS'); |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Apache::lonhelper::dropdown->new(); |
Apache::lonhelper::dropdown->new(); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
&addMessage(&Apache::lonhtmlcommon::row_closure()); |
|
|
if (not $helper->{VARS}->{'construction'}) { |
if (not $helper->{VARS}->{'construction'}) { |
&addMessage(&Apache::lonhtmlcommon::row_title( |
&addMessage(&Apache::lonhtmlcommon::row_title( |
'<label for="TABLE_INDEX_forminput">' |
'<label for="TABLE_INDEX_forminput">' |
Line 3987 FONT_SELECTION
|
Line 5153 FONT_SELECTION
|
) |
) |
); |
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'TABLE_INDEX'; |
$paramHash->{'variable'} = 'TABLE_INDEX'; |
$helper->declareVar('TABLE_INDEX'); |
$helper->declareVar('TABLE_INDEX'); |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Line 4001 FONT_SELECTION
|
Line 5167 FONT_SELECTION
|
) |
) |
); |
); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash = Apache::lonhelper::getParamHash(); |
$paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; |
$paramHash->{'variable'} = 'PRINT_DISCUSSIONS'; |
$helper->declareVar('PRINT_DISCUSSIONS'); |
$helper->declareVar('PRINT_DISCUSSIONS'); |
$paramHash->{CHOICES} = [ |
$paramHash->{CHOICES} = [ |
['No', 'no'], |
['No', 'no'], |
['Yes', 'yes'] ]; |
['Yes', 'yes'] ]; |
Line 4036 FONT_SELECTION
|
Line 5202 FONT_SELECTION
|
&addMessage(&Apache::lonhtmlcommon::row_closure(1)); |
&addMessage(&Apache::lonhtmlcommon::row_closure(1)); |
} |
} |
|
|
if ($helper->{'VARS'}->{'construction'}) { |
if ($helper->{'VARS'}->{'construction'}) { |
my $stylevalue='$Apache::lonnet::env{"construct.style"}'; |
my $stylevalue='$Apache::lonnet::env{"construct.style"}'; |
my $randseedtext=&mt("Use random seed"); |
my $randseedtext=&mt("Use random seed"); |
my $stylefiletext=&mt("Use style file"); |
my $stylefiletext=&mt("Use style file"); |
Line 4092 FONT_SELECTION
|
Line 5258 FONT_SELECTION
|
return "$helper->{VARS}->{'probstatus'}"; |
return "$helper->{VARS}->{'probstatus'}"; |
</defaultvalue> |
</defaultvalue> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="problem">Homework Problem</choice> |
<choice computer="exam">Exam Problem</choice> |
<choice computer="exam">Bubblesheet Exam Problem</choice> |
<choice computer="survey">Survey question</choice> |
<choice computer="survey">Survey question</choice> |
,choice computer="anonsurvey"Anonymous survey question</choice> |
,choice computer="anonsurvey"Anonymous survey question</choice> |
</dropdown> |
</dropdown> |
Line 4127 PROBTYPE
|
Line 5293 PROBTYPE
|
# If we're in the "final" state, bailout and return to handler |
# If we're in the "final" state, bailout and return to handler |
if ($helper->{STATE} eq 'FINAL') { |
if ($helper->{STATE} eq 'FINAL') { |
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 4149 package Apache::lonprintout::page_format
|
Line 5317 package Apache::lonprintout::page_format
|
|
|
See lonhelper.pm documentation for discussion of the helper framework. |
See lonhelper.pm documentation for discussion of the helper framework. |
|
|
Apache::lonprintout::page_format_state is an element that gives the |
Apache::lonprintout::page_format_state is an element that gives the |
user an opportunity to select the page layout they wish to print |
user an opportunity to select the page layout they wish to print |
with: Number of columns, portrait/landscape, and paper size. If you |
with: Number of columns, portrait/landscape, and paper size. If you |
want to change the paper size choices, change the @paperSize array |
want to change the paper size choices, change the @paperSize array |
contents in this package. |
contents in this package. |
|
|
page_format_state is always directly invoked in lonprintout.pm, so there |
page_format_state is always directly invoked in lonprintout.pm, so there |
Line 4176 use Apache::lonnet;
|
Line 5344 use Apache::lonnet;
|
|
|
my $maxColumns = 2; |
my $maxColumns = 2; |
# it'd be nice if these all worked |
# it'd be nice if these all worked |
#my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", |
#my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", |
# "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]", |
# "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]", |
# "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", |
# "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", |
# "a5 [148x210 mm]", "a6 [105x148 mm]" ); |
# "a5 [148x210 mm]", "a6 [105x148 mm]" ); |
my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", |
my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", |
"a4 [210x297 mm]"); |
"a4 [210x297 mm]"); |
|
|
# Tentative format: Orientation (L = Landscape, P = portrait) | Colnum | |
# Tentative format: Orientation (L = Landscape, P = portrait) | Colnum | |
# Paper type |
# Paper type |
|
|
sub new { |
sub new { |
my $self = Apache::lonhelper::element->new(); |
my $self = Apache::lonhelper::element->new(); |
|
|
shift; |
shift; |
Line 4208 sub render {
|
Line 5376 sub render {
|
my $PaperType=&mt('Paper type'); |
my $PaperType=&mt('Paper type'); |
my $landscape=&mt('Landscape'); |
my $landscape=&mt('Landscape'); |
my $portrait=&mt('Portrait'); |
my $portrait=&mt('Portrait'); |
|
my $pdfFormLabel=&mt('PDF Form Fields'); |
|
my $with=&mt('with Form Fields'); |
|
my $without=&mt('without Form Fields'); |
|
|
|
|
$result.='<h3>'.&mt('Layout Options').'</h3>' |
$result.='<h3>'.&mt('Layout Options').'</h3>' |
.&Apache::loncommon::start_data_table() |
.&Apache::loncommon::start_data_table() |
Line 4216 sub render {
|
Line 5387 sub render {
|
.'<th>'.$PageLayout.'</th>' |
.'<th>'.$PageLayout.'</th>' |
.'<th>'.$NumberOfColumns.'</th>' |
.'<th>'.$NumberOfColumns.'</th>' |
.'<th>'.$PaperType.'</th>' |
.'<th>'.$PaperType.'</th>' |
|
.'<th>'.$pdfFormLabel.'</th>' |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::end_data_table_header_row() |
.&Apache::loncommon::start_data_table_row() |
.&Apache::loncommon::start_data_table_row() |
.'<td>' |
.'<td>' |
Line 4256 sub render {
|
Line 5428 sub render {
|
$result .= <<HTML; |
$result .= <<HTML; |
</select> |
</select> |
</td> |
</td> |
|
<td align='center'> |
|
<select name='${var}.pdfFormFields'> |
|
<option selected="selected" value="no">$without</option> |
|
<option value="yes">$with</option> |
|
</select> |
|
</td> |
HTML |
HTML |
$result.=&Apache::loncommon::end_data_table_row() |
$result.=&Apache::loncommon::end_data_table_row() |
.&Apache::loncommon::end_data_table(); |
.&Apache::loncommon::end_data_table(); |
Line 4268 sub postprocess {
|
Line 5446 sub postprocess {
|
|
|
my $var = $self->{'variable'}; |
my $var = $self->{'variable'}; |
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.pdfFormFields"}; |
$env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"}; |
return 1; |
return 1; |
Line 4284 package Apache::lonprintout::page_size_s
|
Line 5462 package Apache::lonprintout::page_size_s
|
|
|
See lonhelper.pm documentation for discussion of the helper framework. |
See lonhelper.pm documentation for discussion of the helper framework. |
|
|
Apache::lonprintout::page_size_state is an element that gives the |
Apache::lonprintout::page_size_state is an element that gives the |
user the opportunity to further refine the page settings if they |
user the opportunity to further refine the page settings if they |
select a single-column page. |
select a single-column page. |
|
|
Line 4307 use strict;
|
Line 5485 use strict;
|
|
|
|
|
|
|
sub new { |
sub new { |
my $self = Apache::lonhelper::element->new(); |
my $self = Apache::lonhelper::element->new(); |
|
|
shift; # disturbs me (probably prevents subclassing) but works (drops |
shift; # disturbs me (probably prevents subclassing) but works (drops |
Line 4317 sub new {
|
Line 5495 sub new {
|
my $helper = Apache::lonhelper::getHelper(); |
my $helper = Apache::lonhelper::getHelper(); |
$helper->declareVar($self->{'variable'}); |
$helper->declareVar($self->{'variable'}); |
|
|
# The variable name of the format element, so we can look into |
# The variable name of the format element, so we can look into |
# $helper->{VARS} to figure out whether the columns are one or two |
# $helper->{VARS} to figure out whether the columns are one or two |
$self->{'formatvar'} = shift; |
$self->{'formatvar'} = shift; |
|
|
Line 4357 sub render {
|
Line 5535 sub render {
|
$size{'height_and_units'}, |
$size{'height_and_units'}, |
$size{'margin_and_units'})= |
$size{'margin_and_units'})= |
&Apache::lonprintout::page_format($papersize, $laystyle, $cols); |
&Apache::lonprintout::page_format($papersize, $laystyle, $cols); |
|
|
foreach my $dimension ('width','height','margin') { |
foreach my $dimension ('width','height','margin') { |
($size{$dimension},$size{$dimension.'_unit'}) = |
($size{$dimension},$size{$dimension.'_unit'}) = |
split(/ +/, $size{$dimension.'_and_units'},2); |
split(/ +/, $size{$dimension.'_and_units'},2); |
Line 4442 sub preprocess {
|
Line 5620 sub preprocess {
|
|
|
foreach my $dim ('width', 'height', 'lmargin') { |
foreach my $dim ('width', 'height', 'lmargin') { |
my ($value, $units) = split(/ /, $size{$dim}); |
my ($value, $units) = split(/ /, $size{$dim}); |
|
|
$helper->{VARS}->{"$var.".$dim} = $value; |
$helper->{VARS}->{"$var.".$dim} = $value; |
$helper->{VARS}->{"$var.".$dim.'unit'} = $units; |
$helper->{VARS}->{"$var.".$dim.'unit'} = $units; |
|
|
} |
} |
|
|
|
|
Line 4453 sub preprocess {
|
Line 5631 sub preprocess {
|
|
|
$helper->changeState($self->{NEXTSTATE}); |
$helper->changeState($self->{NEXTSTATE}); |
} |
} |
|
|
return 1; |
return 1; |
} |
} |
|
|
Line 4462 sub postprocess {
|
Line 5640 sub postprocess {
|
|
|
my $var = $self->{'variable'}; |
my $var = $self->{'variable'}; |
my $helper = Apache::lonhelper->getHelper(); |
my $helper = Apache::lonhelper->getHelper(); |
my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; |
my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; |
my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; |
my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; |
my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; |
my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; |
$helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; |
$helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; |
$helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; |
$helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; |
$helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; |
$helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; |
|
|
my $error = ''; |
my $error = ''; |
|
|
# /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed |
# /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed |
# by an optional period, followed by digits, ending the string |
# by an optional period, followed by digits, ending the string |
|
|
if ($width !~ /^-?[0-9]*(\.[0-9]*)?$/) { |
if ($width !~ /^-?[0-9]*(\.[0-9]*)?$/) { |
Line 4501 sub postprocess {
|
Line 5679 sub postprocess {
|
} |
} |
} |
} |
|
|
|
|
|
|
__END__ |
__END__ |
|
|