version 1.602, 2011/11/05 21:49:25
|
version 1.627.2.24, 2018/09/04 14:35:21
|
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; |
Line 76 my $font_size = 'normalsize'; # Default
|
Line 75 my $font_size = 'normalsize'; # Default
|
|
|
#---------------------------- Helper helpers. ------------------------- |
#---------------------------- Helper helpers. ------------------------- |
|
|
|
## |
|
# Filter function to determine if a resource is a printable sequence. |
|
# |
|
# @param $res -Resource to check. |
|
# |
|
# @return 1 - printable and a resource |
|
# 0 - either notm a sequence or not printable. |
|
# |
|
sub printable_sequence { |
|
my $res = shift; |
|
|
|
# Non-sequences are not listed: |
|
|
|
if (!$res->is_sequence()) { |
|
return 0; |
|
} |
|
|
|
# Person with pav or pfo can always print: |
|
|
|
if ($perm{'pav'} || $perm{'pfo'}) { |
|
return 1; |
|
} |
|
|
|
if ($res->is_sequence()) { |
|
my $symb = $res->symb(); |
|
my $navmap = $res->{NAV_MAP}; |
|
|
|
# Find the first resource in the map: |
|
|
|
my $iterator = $navmap->getIterator($res, undef, undef, 1, 1); |
|
my $first = $iterator->next(); |
|
|
|
while (1) { |
|
if ($first == $iterator->END_ITERATOR) { last; } |
|
if (ref($first) && ! $first->is_sequence()) {last; } |
|
$first = $iterator->next(); |
|
} |
|
|
|
|
|
# Might be an empty map: |
|
|
|
if (!ref($first)) { |
|
return 0; |
|
} |
|
my $partsref = $first->parts(); |
|
my @parts = @$partsref; |
|
my ($open, $close) = $navmap->map_printdates($first, $parts[0]); |
|
return &printable($open, $close); |
|
} |
|
return 0; |
|
} |
|
|
# BZ5209: |
# BZ5209: |
# Create the states needed to run the helper for incomplete problems from |
# Create the states needed to run the helper for incomplete problems from |
# the current folder for selected students. |
# the current folder for selected students. |
Line 96 my $font_size = 'normalsize'; # Default
|
Line 147 my $font_size = 'normalsize'; # Default
|
# Return: |
# Return: |
# XML that can be parsed by the helper to drive the state machine. |
# XML that can be parsed by the helper to drive the state machine. |
# |
# |
sub create_incomplete_folder_selstud_helper($helper) |
sub create_incomplete_folder_selstud_helper { |
{ |
|
my ($helper, $map) = @_; |
my ($helper, $map) = @_; |
|
|
|
|
Line 107 sub create_incomplete_folder_selstud_hel
|
Line 157 sub create_incomplete_folder_selstud_hel
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', |
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ', |
'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', |
'CHOOSE_STUDENTS_INCOMPLETE', |
'CHOOSE_STUDENTS_INCOMPLETE', |
$map, |
$map, |
Line 156 sub create_incomplete_course_helper {
|
Line 206 sub create_incomplete_course_helper {
|
|
|
my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', |
my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES', |
'Select problem(s) to print', |
'Select problem(s) to print', |
'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"', |
'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
'INCOMPLETE_PROBLEMS_COURSE_STUDENTS', |
'', |
'', |
Line 202 sub create_incomplete_folder_helper {
|
Line 252 sub create_incomplete_folder_helper {
|
|
|
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', |
my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ', |
'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', |
$map, |
$map, |
Line 256 CHOOSE_STUDENTS
|
Line 306 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 302 CHOOSE_RESOURCES
|
Line 353 CHOOSE_RESOURCES
|
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_RESOURCES |
CHOOSE_RESOURCES |
|
|
return $result; |
return $result; |
} |
} |
# |
# |
Line 435 RESOURCE_SELECTOR
|
Line 485 RESOURCE_SELECTOR
|
|
|
#----------------------------------------------------------------------- |
#----------------------------------------------------------------------- |
|
|
|
# Computes an open and close date from a list of open/close dates for a resource's |
|
# parts. |
|
# |
|
# @param \@opens - reference to an array of open dates. |
|
# @param \@closes - reference to an array of close dates. |
|
# |
|
# @return ($open, $close) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# |
|
sub compute_open_window { |
|
my ($opensref, $closesref) = @_; |
|
|
|
my @opens = @$opensref; |
|
my @closes = @$closesref; |
|
|
|
# latest open date: |
|
my $latest_open; |
|
|
|
foreach my $open (@opens) { |
|
if (!defined($latest_open) || ($open > $latest_open)) { |
|
$latest_open = $open; |
|
} |
|
} |
|
# Earliest close: |
|
|
|
my $earliest_close; |
|
foreach my $close (@closes) { |
|
if (!defined($earliest_close) || ($close < $earliest_close)) { |
|
$earliest_close = $close; |
|
} |
|
} |
|
|
|
# If no overlap...both are -1 as promised. |
|
|
|
if (($earliest_close ne '') && ($latest_open ne '') |
|
&& ($earliest_close < $latest_open)) { |
|
$latest_open = -1; |
|
$earliest_close = -1; |
|
} |
|
|
|
return ($latest_open, $earliest_close); |
|
|
|
} |
|
|
|
## |
|
# Determines if 'now' is within the set of printable dates. |
|
# |
|
# @param $open_date - Starting date/timestamp. |
|
# @param $close_date - Ending date/timestamp. |
|
# |
|
# @return 0 - Not open. |
|
# @return 1 - open. |
|
# |
|
sub printable { |
|
my ($open_date, $close_date) = @_; |
|
|
|
|
|
my $now = time(); |
|
|
|
# Have to do a bit of fancy footwork around undefined open/close dates: |
|
|
|
if ($open_date && ($open_date > $now)) { |
|
return 0; |
|
} |
|
|
|
if ($close_date && ($close_date < $now)) { |
|
return 0; |
|
} |
|
|
|
return 1; |
|
|
|
} |
|
|
|
## |
|
# Returns the innermost print start/print end dates for a resource. |
|
# This is done by looking at the start/end dates for its parts and choosing |
|
# the intersection of those dates. |
|
# |
|
# @param res - lonnvamaps::resource object that represents the resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
# @note If open/close dates are not defined they will be returned as undef |
|
# @note It is possible for there to be no overlap in which case -1,-1 |
|
# will be returned. |
|
# @note The algorithm used is to take the latest open date and the earliest end date. |
|
# For consistency with &printable() in lonnavmaps.pm determination of start |
|
# date for printing checks printstartdate param first, then, if not set, |
|
# opendate param, then, if not set, contentopen param. |
|
|
|
|
|
sub get_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts; |
|
if (ref($partsref) eq 'ARRAY') { |
|
@parts = @{$partsref}; |
|
} |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
|
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my $partopen = $res->parmval('printstartdate', $part); |
|
my $partclose = $res->parmval('printenddate', $part); |
|
if (!$partopen) { |
|
$partopen = $res->parmval('opendate',$part); |
|
} |
|
if (!$partopen) { |
|
$partopen = $res->parmval('contentopen',$part); |
|
} |
|
if ($partopen) { |
|
push(@open_dates, $partopen); |
|
} |
|
if ($partclose) { |
|
push(@close_dates, $partclose); |
|
} |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
} |
|
|
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
|
|
return ($open_date, $close_date); |
|
} |
|
|
|
## |
|
# Get the dates for which a course says a resource can be printed. This is like |
|
# get_print_dates but namvaps::course_print_dates are gotten...and not converted |
|
# to times either. |
|
# |
|
# @param $res - Reference to a resource has from lonnvampas::resource. |
|
# |
|
# @return (opendate, closedate) |
|
# |
|
sub course_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # Slightly OO dirty. |
|
|
|
# Don't bother looping over undefined or empty parts arraY; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->course_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
## |
|
# Same as above but for the enclosing map: |
|
# |
|
sub map_print_dates { |
|
my $res = shift; |
|
my $partsref = $res->parts(); |
|
my @parts = @$partsref; |
|
my $open_date; |
|
my $close_date; |
|
my @open_dates; |
|
my @close_dates; |
|
my $navmap = $res->{NAV_MAP}; # slightly OO dirty. |
|
|
|
|
|
# Don't bother looping over undefined or empty parts arraY; |
|
|
|
if (@parts) { |
|
foreach my $part (@parts) { |
|
my ($partopen, $partclose) = $navmap->map_printdates($res, $part); |
|
push(@open_dates, $partopen); |
|
push(@close_dates, $partclose); |
|
} |
|
($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates); |
|
} |
|
return ($open_date, $close_date); |
|
} |
|
|
# Determine if a resource is incomplete given the map: |
# Determine if a resource is incomplete given the map: |
# Parameters: |
# Parameters: |
# $username - Name of user for whom we are checking. |
# $username - Name of user for whom we are checking. |
Line 460 sub incomplete {
|
Line 702 sub incomplete {
|
} |
} |
} |
} |
# |
# |
# When printing for students, the resoures and order of the |
# When printing for students, the resources and order of the |
# resources may need to be altered if there are folders with |
# resources may need to be altered if there are folders with |
# random selectiopn or random ordering (or both) enabled. |
# random selectiopn or random ordering (or both) enabled. |
# This sub computes the set of resources to print for a student |
# This sub computes the set of resources to print for a student |
# modified both by random ordering and selection and filtered |
# modified both by random ordering and selection and filtered |
# to only those that are in the original set selcted to be printed. |
# to only those that are in the original set selected to be printed. |
# |
# |
# Parameters: |
# Parameters: |
# $helper - The helper we need $helper->{'VARS'}->{'symb'} |
# $map - The URL of the folder being printed. |
# to construct the navmap and the iteration. |
# Used to determine which startResource and finishResource |
# $seq - The original set of resources to print |
# 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). |
# (really an array of resource names (array of symb's). |
# $who - Student/domain for whome the sequence will be generated. |
# $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: |
# Implicit inputs: |
# $ |
# $ |
Line 481 sub incomplete {
|
Line 729 sub incomplete {
|
# print_resources. |
# print_resources. |
# |
# |
sub master_seq_to_person_seq { |
sub master_seq_to_person_seq { |
my ($helper, $seq, $who) = @_; |
my ($map, $seq, $who, $code, $nohidemap) = @_; |
|
|
|
|
my ($username, $userdomain, $usersection) = split(/:/, $who); |
my ($username, $userdomain, $usersection) = split(/:/, $who); |
|
|
|
|
# Toss the sequence up into a hash so that we have O(1) lookup time. |
# 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. |
# on the items that come out of the user's list of resources. |
# |
# |
|
|
my %seq_hash = map {$_ => 1} @$seq; |
my %seq_hash = map {$_ => 1} @$seq; |
my @output_seq; |
my @output_seq; |
|
|
|
my $unhidden; |
|
if ($nohidemap) { |
|
$unhidden = &Apache::lonnet::clutter($map); |
|
} |
|
|
my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); |
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain, |
my $navmap = Apache::lonnavmaps::navmap->new($username, $userdomain); |
$code,$unhidden); |
my $iterator = $navmap->getIterator($navmap->firstResource(), |
my ($start,$finish); |
$navmap->finishResource(), |
|
{}, 1); |
if ($map) { |
my %nonResourceItems = ( |
my $mapres = $navmap->getResourceByUrl($map); |
$iterator->BEGIN_MAP => 1, |
if ($mapres->is_map()) { |
$iterator->BEGIN_BRANCH => 1, |
$start = $mapres->map_start(); |
$iterator->END_BRANCH => 1, |
$finish = $mapres->map_finish(); |
$iterator->END_MAP => 1, |
} |
$iterator->FORWARD => 1, |
} |
$iterator->BACKWARD => 1 |
unless ($start && $finish) { |
|
$start = $navmap->firstResource(); |
|
$finish = $navmap->finishResource(); |
|
} |
|
|
); # These items are not resources but appear in the midst of iteration. |
my $iterator = $navmap->getIterator($start,$finish,{},1); |
|
|
# Iterate on the resource..select the items that are randomly selected |
# Iterate on the resource..select the items that are randomly selected |
# and that are in the seq_has. Presumably the iterator will take care |
# and that are in the seq_has. Presumably the iterator will take care |
# of the random ordering part of the deal. |
# of the random ordering part of the deal. |
# |
|
my $curres; |
my $curres; |
while ($curres = $iterator->next()) { |
while ($curres = $iterator->next()) { |
# |
# |
# Only process resources..that are not removed by randomout... |
# Only process resources..that are not removed by randomout... |
# and are selected for printint as well. |
# and are selected for printint as well. |
# |
# |
if (! exists $nonResourceItems{$curres} && ! $curres->randomout()) { |
|
my $symb = $curres->symb(); |
if (ref($curres) && ! $curres->randomout()) { |
if (exists $seq_hash{$symb}) { |
my $currsymb = $curres->symb(); |
push(@output_seq, $symb); |
if (exists($seq_hash{$currsymb})) { |
|
push(@output_seq, $currsymb); |
} |
} |
} |
} |
} |
} |
|
|
|
|
return \@output_seq; # for now. |
return \@output_seq; # for now. |
|
|
Line 593 sub set_font_size {
|
Line 847 sub set_font_size {
|
|
|
if ($font_size ne '') { |
if ($font_size ne '') { |
|
|
$text =~ s/\\begin{document}/\\begin{document}{\\$font_size/; |
$text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/; |
} |
} |
$text =~ s/\\end{document}/}\\end{document}/; |
$text =~ s/\\end\{document}/}\\end{document}/; |
return $text; |
return $text; |
|
|
|
|
Line 634 sub include_pdf {
|
Line 888 sub include_pdf {
|
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# (unlikely). If it did exist, add the pdf to the set of files/images that |
# need tob e converted for this print job: |
# need tob e converted for this print job: |
|
|
$file =~ s|(.*)/res/|/home/httpd/html/res/|; |
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$file =~ s{(.*)/res/}{$londocroot/res/}; |
|
|
open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat"); |
print FILE ("$file\n"); |
print FILE ("$file\n"); |
close (FILE); |
close (FILE); |
|
|
Line 659 sub include_pdf {
|
Line 914 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 783 sub printf_style_subst {
|
Line 1060 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, $section) = @_; |
my ($width, $format, $assignment, $course, $student) = @_; |
|
|
|
|
|
|
$width = &recalcto_mm($width); # Get width in mm. |
$width = &recalcto_mm($width); # Get width in mm. |
my $chars_per_line = int($width/1.6); # Character/textline. |
my $chars_per_line = int($width/2); # Character/textline. |
|
|
# Default format? |
# Default format? |
|
|
Line 804 sub format_page_header {
|
Line 1081 sub format_page_header {
|
# - Allow the assignment to be 2 lines (wrapped). |
# - Allow the assignment to be 2 lines (wrapped). |
# |
# |
|
|
|
my $firstline = "$student $course"; |
|
if (length($firstline) > $chars_per_line) { |
|
my $lastchar = $chars_per_line - length($student) - 1; |
|
if ($lastchar > 0) { |
|
$course = substr($course, 0, $lastchar); |
|
} else { # Nothing left of course: |
|
$course = ''; |
|
} |
|
} |
|
if (length($assignment) > $chars_per_line) { |
|
$assignment = substr($assignment, 0, $chars_per_line); |
|
} |
|
|
my $name_length = int($chars_per_line *3 /4); |
$format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; |
my $sec_length = int($chars_per_line / 5); |
|
|
|
$format = "%$name_length".'n'; |
} 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!!! |
|
|
if ($section) { |
} |
$format .= ' - Sec: '."%$sec_length".'s'; |
|
} |
|
|
|
$format .= '\\\\%c \\\\ %a'; |
return $format; |
|
|
|
|
} |
|
# 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 |
# 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 |
# there is '\\ \\ ' in the page header. That's cause a error in LaTeX |
if($format =~ /\\\\\s\\\\\s/) { |
if($format =~ /\\\\\s\\\\\s/) { |
#TODO find sensible caption for page header |
#TODO find sensible caption for page header |
my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout '); |
my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout '); |
$format =~ s/\\\\\s\\\\\s/$testPrintout/; |
$format =~ s/\\\\\s\\\\\s/$testPrintout/; |
} |
} |
# |
# |
Line 959 sub is_code_valid {
|
Line 1240 sub is_code_valid {
|
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::grades::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 975 sub is_code_valid {
|
Line 1257 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 1036 sub compare_names {
|
Line 1334 sub compare_names {
|
|
|
sub latex_header_footer_remove { |
sub latex_header_footer_remove { |
my $text = shift; |
my $text = shift; |
$text =~ s/\\end{document}//; |
$text =~ s/\\end\{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin{document}//; |
$text =~ s/\\documentclass([^&]*)\\begin\{document}//; |
return $text; |
return $text; |
} |
} |
# |
# |
Line 1551 sub get_course {
|
Line 1849 sub get_course {
|
my $courseidinfo; |
my $courseidinfo; |
if (defined($env{'request.course.id'})) { |
if (defined($env{'request.course.id'})) { |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header'); |
my $sec = $env{'request.course.sec'}; |
|
|
|
} |
} |
return $courseidinfo; |
return $courseidinfo; |
} |
} |
Line 1575 sub page_format_transformation {
|
Line 1871 sub page_format_transformation {
|
|
|
my $name = &get_name(); |
my $name = &get_name(); |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
|
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
my $header_text = $parmhash{'print_header_format'}; |
my $header_text = $parmhash{'print_header_format'}; |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
$courseidinfo, $name); |
$courseidinfo, $name); |
Line 1587 sub page_format_transformation {
|
Line 1884 sub page_format_transformation {
|
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
} |
} |
if ($layout eq 'album') { |
if ($layout eq 'album') { |
$text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
$text =~ s/\\begin\{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
} elsif ($layout eq 'book') { |
} elsif ($layout eq 'book') { |
if ($choice ne 'All class print') { |
if ($choice ne 'All class print') { |
$text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; |
$text =~ s/\\begin\{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/; |
} else { |
} else { |
$text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; |
$text =~ s/\\pagestyle\{fancy}\\rhead\{}\\chead\{}\s*\\begin\{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1} \\vskip 5 mm\n /; |
} |
} |
if ($papersize eq 'a4') { |
if ($papersize eq 'a4') { |
my $papersize_text; |
my $papersize_text; |
Line 1601 sub page_format_transformation {
|
Line 1898 sub page_format_transformation {
|
} else { |
} else { |
$papersize_text = '\special{papersize=210mm,297mm}'; |
$papersize_text = '\special{papersize=210mm,297mm}'; |
} |
} |
$text =~ s/(\\begin{document})/$1$papersize_text/; |
$text =~ s/(\\begin\{document})/$1$papersize_text/; |
} |
} |
} |
} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} |
if ($indexlist eq 'yes') { |
if ($indexlist eq 'yes') { |
$text=~s/(\\begin{document})/\\makeindex $1/; |
$text=~s/(\\begin\{document})/\\makeindex $1/; |
$text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/; |
$text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/; |
} |
} |
return $text; |
return $text; |
} |
} |
Line 1616 sub page_format_transformation {
|
Line 1913 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 1657 my $end_of_student = "\n".'\special{ps:E
|
Line 1954 my $end_of_student = "\n".'\special{ps:E
|
|
|
sub latex_corrections { |
sub latex_corrections { |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_; |
# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g; |
# $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g; |
my $copyright = ©right_line(); |
my $copyright = ©right_line(); |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
if ($selectionmade eq '1' || $answer_mode eq 'only') { |
$result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
$result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/; |
} else { |
} else { |
$result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; |
$result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/; |
} |
} |
$result =~ s/\$number_of_columns/$number_of_columns/g; |
$result =~ s/\$number_of_columns/$number_of_columns/g; |
$result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g; |
$result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g; |
$result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g; |
$result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g; |
#-- LaTeX corrections |
#-- LaTeX corrections |
my $first_comment = index($result,'<!--',0); |
my $first_comment = index($result,'<!--',0); |
while ($first_comment != -1) { |
while ($first_comment != -1) { |
Line 1685 sub latex_corrections {
|
Line 1982 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 1783 sub unsupported {
|
Line 2080 sub unsupported {
|
my $result.= &print_latex_header($mode); |
my $result.= &print_latex_header($mode); |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
if ($currentURL=~m|^(/adm/wrapper/)?ext/|) { |
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
$currentURL=~s|^(/adm/wrapper/)?ext/|http://|; |
|
$currentURL=~s|^http://https://|https://|; |
my $title=&Apache::lonnet::gettitle($symb); |
my $title=&Apache::lonnet::gettitle($symb); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; |
$result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' '; |
Line 1862 sub print_page_in_course {
|
Line 2160 sub print_page_in_course {
|
my @page_resources = $navmap->retrieveResources($resource_src); |
my @page_resources = $navmap->retrieveResources($resource_src); |
$result .= &print_page_in_course($helper, $rparmhash, |
$result .= &print_page_in_course($helper, $rparmhash, |
$resource_src, \@page_resources); |
$resource_src, \@page_resources); |
|
} elsif ($resource->ext()) { |
|
$result .= &unsupported($currentURL,$mode,$symb); |
} |
} |
# these resources go through the XML transformer: |
# these resources go through the XML transformer: |
|
|
Line 1878 sub print_page_in_course {
|
Line 2178 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'} = $pdfFormFields; # |
$form{'pdfFormFields'} = 'no'; # |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; |
|
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
Line 1921 sub print_page_in_course {
|
Line 2221 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 1931 sub print_page_in_course {
|
Line 2231 sub print_page_in_course {
|
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
&mt("Printing from Construction Space: No Title").'}\vskip 0 mm '; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem($urlp,$LaTeXwidth); |
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
Line 1947 sub print_page_in_course {
|
Line 2247 sub print_page_in_course {
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
Line 2051 sub recently_generated {
|
Line 2351 sub recently_generated {
|
# A reference to a page break hash. |
# A reference to a page break hash. |
# |
# |
# |
# |
use Data::Dumper; |
# use Data::Dumper; |
# sub dump_helper_vars { |
# sub dump_helper_vars { |
# my ($helper) = @_; |
# my ($helper) = @_; |
# my $helpervars = Dumper($helper->{'VARS'}); |
# my $helpervars = Dumper($helper->{'VARS'}); |
Line 2200 sub set_form_extraspace {
|
Line 2500 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 2227 sub print_construction_sequence {
|
Line 2528 sub print_construction_sequence {
|
} |
} |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { |
($urlp=~/$LONCAPA::assess_page_re/)) { |
# Don't permanently modify %$form... |
# Don't permanently modify %$form... |
my %answerform = %form; |
my %answerform = %form; |
$answerform{'grade_target'}='answer'; |
$answerform{'grade_target'}='answer'; |
Line 2238 sub print_construction_sequence {
|
Line 2539 sub print_construction_sequence {
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
# If necessary, encapsulate answer in minipage: |
# If necessary, encapsulate answer in minipage: |
|
|
Line 2271 sub print_construction_sequence {
|
Line 2572 sub print_construction_sequence {
|
# IF sequence, recurse: |
# IF sequence, recurse: |
|
|
if ($urlp =~ /\.sequence$/) { |
if ($urlp =~ /\.sequence$/) { |
# |
$result .= &print_construction_sequence($urlp, |
# FIXME: this does not work for co-authors |
|
my $sequence_url = $urlp; |
|
my $domain = $env{'user.domain'}; # Constr. space only on local |
|
my $user = $env{'user.name'}; |
|
# FIXME: the substitutions below do not seem to make sense |
|
|
|
$sequence_url =~ s/^\/res\/$domain/\/home/; |
|
$sequence_url =~ s/^(\/home\/$user)/$1\/public_html/; |
|
# $sequence_url =~ s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($sequence_url, |
|
$helper, %form, |
$helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
} |
} |
Line 2301 sub print_construction_sequence {
|
Line 2592 sub print_construction_sequence {
|
$result .= $texversion; |
$result .= $texversion; |
} |
} |
} |
} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin\{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
return $result; |
return $result; |
} |
} |
|
|
Line 2337 sub print_construction_sequence {
|
Line 2628 sub print_construction_sequence {
|
# For item 100, filtering was done at the helper level. |
# 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 = ''; |
Line 2423 ENDPART
|
Line 2714 ENDPART
|
my %form; |
my %form; |
$form{'grade_target'} = 'tex'; |
$form{'grade_target'} = 'tex'; |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); |
$form{'pdfFormFields'} = $pdfFormFields; |
$form{'pdfFormFields'} = 'no'; |
|
|
# If form.showallfoils is set, then request all foils be shown: |
# If form.showallfoils is set, then request all foils be shown: |
# privilege will be enforced both by not allowing the |
# privilege will be enforced both by not allowing the |
Line 2458 ENDPART
|
Line 2749 ENDPART
|
$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 2511 ENDPART
|
Line 2802 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 2521 ENDPART
|
Line 2812 ENDPART
|
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
&mt("Printing from Construction Space: No Title").'}\vskip 0 mm '; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
|
|
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} |
} |
Line 2538 ENDPART
|
Line 2829 ENDPART
|
|
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation .= &annotate($currentURL); |
my $annotation .= &annotate($currentURL); |
$texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; |
$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/; |
} |
} |
|
|
|
|
Line 2555 ENDPART
|
Line 2846 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 |
|
|
|
# FIXME: unclear how this would work |
|
|
|
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$LaTeXwidth); |
$LaTeXwidth); |
$result .= '\end{document}'; |
$result .= '\end{document}'; |
Line 2574 ENDPART
|
Line 2860 ENDPART
|
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 2585 ENDPART
|
Line 2871 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 2616 ENDPART
|
Line 2902 ENDPART
|
($print_type eq 'select_sequences') or |
($print_type eq 'select_sequences') or |
($print_type eq 'map_incomplete_problems_seq') |
($print_type eq 'map_incomplete_problems_seq') |
) { |
) { |
|
|
|
|
#-- produce an output string |
#-- produce an output string |
if (($print_type eq 'map_problems') or |
if (($print_type eq 'map_problems') or |
Line 2652 ENDPART
|
Line 2937 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(); |
Line 2678 ENDPART
|
Line 2962 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 2686 ENDPART
|
Line 2971 ENDPART
|
(($i==0) && |
(($i==0) && |
(($urlp=~/\.page$/) || |
(($urlp=~/\.page$/) || |
($print_type eq 'map_problems_in_page') || |
($print_type eq 'map_problems_in_page') || |
($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'; |
} |
} |
} |
} |
Line 2694 ENDPART
|
Line 2979 ENDPART
|
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 2709 ENDPART
|
Line 2994 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 '; |
Line 2739 ENDPART
|
Line 3024 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 2753 ENDPART
|
Line 3038 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 2775 ENDPART
|
Line 3060 ENDPART
|
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $annotation = &annotate($urlp); |
my $annotation = &annotate($urlp); |
$texversion =~ s/(\\end{document)/$annotation$1/; |
$texversion =~ s/(\\end\{document)/$annotation$1/; |
} |
} |
|
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
$texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
$flag_latex_header_remove = 'YES'; |
$flag_latex_header_remove = 'YES'; |
Line 2812 ENDPART
|
Line 3097 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'; |
Line 2823 ENDPART
|
Line 3108 ENDPART
|
} |
} |
&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 (($print_type eq 'problems_for_students') || |
} elsif (($print_type eq 'problems_for_students') || |
Line 2860 ENDPART
|
Line 3145 ENDPART
|
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
if (($helper->{'VARS'}->{'student_sort'} eq 1) && |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) { |
@students = sort compare_names @students; |
@students = sort compare_names @students; |
|
} else { |
|
@students = sort compare_sections @students; |
} |
} |
&adjust_number_to_print($helper); |
&adjust_number_to_print($helper); |
|
|
Line 2878 ENDPART
|
Line 3165 ENDPART
|
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
|
|
|
my $map; |
|
if ($helper->{VARS}->{'symb'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}->{'symb'}); |
|
} |
|
|
#loop over students |
#loop over students |
|
|
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
Line 2892 ENDPART
|
Line 3185 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) { |
Line 2912 ENDPART
|
Line 3209 ENDPART
|
} else { |
} else { |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
$i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'}); |
} |
} |
my $actual_seq = master_seq_to_person_seq($helper, \@master_seq, $person); |
my $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, $actual_seq, |
\%moreenv, $actual_seq, |
Line 2938 ENDPART
|
Line 3236 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::grades::get_scantronformat_file(); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10); |
Line 2955 ENDPART
|
Line 3252 ENDPART
|
} |
} |
} |
} |
} |
} |
|
my ($randomorder,$randompick,$map); |
|
if ($helper->{VARS}{'symb'}) { |
|
($map, my $id, my $resource) = |
|
&Apache::lonnet::decode_symb($helper->{VARS}{'symb'}); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (defined($navmap)) { |
|
if ($map) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
$randomorder = $mapres->randomorder(); |
|
$randompick = $mapres->randompick(); |
|
} |
|
} |
|
} |
my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); |
my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); |
$moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; |
$moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; |
$moreenv{'instructor_comments'}='hide'; |
$moreenv{'instructor_comments'}='hide'; |
Line 2988 ENDPART
|
Line 3298 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 3007 ENDPART
|
Line 3319 ENDPART
|
$number_per_page=$num_todo > 0 ? $num_todo : 1; |
$number_per_page=$num_todo > 0 ? $num_todo : 1; |
} |
} |
my $flag_latex_header_remove = 'NO'; |
my $flag_latex_header_remove = 'NO'; |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75'); |
my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo); |
my $count=0; |
my $count=0; |
|
my $nohidemap; |
|
if ($perm{'pav'} && $perm{'vgr'}) { |
|
$nohidemap = 1; |
|
} |
foreach my $code (sort(@allcodes)) { |
foreach my $code (sort(@allcodes)) { |
my $file_num=int($count/$number_per_page); |
my $file_num=int($count/$number_per_page); |
if ($code_type eq 'number') { |
if ($code_type eq 'number') { |
Line 3016 ENDPART
|
Line 3332 ENDPART
|
} else { |
} else { |
$moreenv{'CODE'}=&num_to_letters($code); |
$moreenv{'CODE'}=&num_to_letters($code); |
} |
} |
|
my $actual_seq = \@master_seq; |
|
if ($randomorder || $randompick) { |
|
$env{'form.CODE'} = $moreenv{'CODE'}; |
|
$actual_seq = master_seq_to_person_seq($map, \@master_seq, |
|
undef, |
|
$moreenv{'CODE'}, $nohidemap); |
|
delete($env{'form.CODE'}); |
|
} |
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 3049 ENDPART
|
Line 3373 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 3067 ENDPART
|
Line 3387 ENDPART
|
$resources_printed .= $urlp.':'; |
$resources_printed .= $urlp.':'; |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform); |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
$texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/; |
} else { |
} else { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
if ($helper->{'VARS'}->{'construction'} ne '1') { |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.='\vskip 0 mm \noindent '; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{'. |
my $URLpath=$urlp; |
&mt("Printing from Authoring Space: No Title").'}\vskip 0 mm '; |
$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; |
$texversion.=&path_to_problem ($urlp,$LaTeXwidth); |
$texversion.=&path_to_problem ($URLpath,$LaTeXwidth); |
|
} |
} |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
$texversion.='\vskip 1 mm '.$answer.'\end{document}'; |
} |
} |
} |
} |
#this chunk is responsible for printing the path to problem |
#this chunk is responsible for printing the path to problem |
|
|
my $newurlp=$urlp; |
my $newurlp=&path_to_problem($urlp,$LaTeXwidth); |
if ($newurlp=~/~/) {$newurlp=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|;} |
$texversion =~ s/(\\begin\{minipage}\{\\textwidth})/$1 $newurlp/; |
$newurlp=&path_to_problem($newurlp,$LaTeXwidth); |
|
$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/; |
|
if ($flag_latex_header_remove ne 'NO') { |
if ($flag_latex_header_remove ne 'NO') { |
$texversion = &latex_header_footer_remove($texversion); |
$texversion = &latex_header_footer_remove($texversion); |
} else { |
} else { |
$texversion =~ s/\\end{document}//; |
$texversion =~ s/\\end\{document}//; |
} |
} |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
$texversion=&IndexCreation($texversion,$urlp); |
$texversion=&IndexCreation($texversion,$urlp); |
Line 3129 ENDPART
|
Line 3446 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; |
$url = &Apache::lonnet::clutter($url); |
$URLback=~s|^/~|/priv/|; |
if ($env{'request.enc'}) { |
} |
$url = &Apache::lonenc::encrypted($url); |
|
} |
|
if ($url ne '') { |
|
$URLback = $url.(($url =~ /\?/) ? '&':'?').'symb='.$helper->{VARS}{'symb'}; |
|
} |
} |
} |
# |
# |
# Final adjustment of the font size: |
# Final adjustment of the font size: |
Line 3148 ENDPART
|
Line 3469 ENDPART
|
|
|
$result = set_font_size($result); |
$result = set_font_size($result); |
|
|
|
# Insert any babel headers required. |
|
|
|
$result = &collect_languages($result); |
|
|
|
|
#-- writing .tex file in prtspool |
#-- writing .tex file in prtspool |
my $temp_file; |
my $temp_file; |
my $identifier = &Apache::loncommon::get_cgi_id(); |
my $identifier = &Apache::loncommon::get_cgi_id(); |
Line 3219 ENDPART
|
Line 3545 ENDPART
|
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.role' => $perm{'pav'}, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.numberoffiles' => $#print_array, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.studentnames' => $student_names, |
'cgi.'.$identifier.'.backref' => $URLback,}); |
'cgi.'.$identifier.'.backref' => &escape($URLback),}); |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
&Apache::lonnet::appenv({"cgi.$identifier.user" => $env{'user.name'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.domain" => $env{'user.domain'}, |
"cgi.$identifier.courseid" => $cnum, |
"cgi.$identifier.courseid" => $cnum, |
Line 3276 sub print_resources {
|
Line 3602 sub print_resources {
|
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. |
|
|
|
|
# |
# |
# Figure out if we need to filter the output by |
# Figure out if we need to filter the output by |
# the incomplete problems for that person |
# the incomplete problems for that person |
Line 3287 sub print_resources {
|
Line 3614 sub print_resources {
|
$print_incomplete = 1; |
$print_incomplete = 1; |
} |
} |
if ($person eq 'anonymous') { |
if ($person eq 'anonymous') { |
$namepostfix .="Name: "; |
$namepostfix .=&mt('Name:')." "; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
} |
} |
|
|
Line 3314 sub print_resources {
|
Line 3641 sub print_resources {
|
# |
# |
|
|
my $syllabus_first = 0; |
my $syllabus_first = 0; |
|
my $current_assignment = ""; |
|
my $assignment; |
|
my $courseidinfo = &get_course(); |
|
my $possprint = scalar(@{$master_seq}); |
|
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} |
|
|
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 3322 sub print_resources {
|
Line 3656 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' && |
if ( !($type eq 'problems' && |
($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) { |
($curresline!~ m/$LONCAPA::assess_page_re/)) ) { |
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); |
|
if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) { |
if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) { |
next; |
next; |
} |
} |
$actually_printed++; # we're going to print one. |
$actually_printed++; # we're going to print one. |
|
|
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if (&Apache::lonnet::allowed('bre',$res_url)) { |
if ($res_url!~m|^ext/| |
if ($res_url!~m|^ext/| |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { |
Line 3346 sub print_resources {
|
Line 3684 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 3363 sub print_resources {
|
Line 3701 sub print_resources {
|
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv); |
|
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
$rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; |
$rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/; |
} else { |
} else { |
|
|
|
|
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') { |
$header =~ s/\\begin{document}//; #<<<<< |
$header =~ s/\\begin\{document}//; #<<<<< |
} |
} |
my $title = &Apache::lonnet::gettitle($curresline); |
my $title = &Apache::lonnet::gettitle($curresline); |
$title = &Apache::lonxml::latex_special_symbols($title); |
$title = &Apache::lonxml::latex_special_symbols($title); |
Line 3383 sub print_resources {
|
Line 3721 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); |
$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)$/) { |
Line 3401 sub print_resources {
|
Line 3739 sub print_resources {
|
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { |
my $url = &Apache::lonnet::clutter($res_url); |
my $url = &Apache::lonnet::clutter($res_url); |
my $annotation = &annotate($url); |
my $annotation = &annotate($url); |
$annotation =~ s/(\\end{document})/$annotation$1/; |
$annotation =~ s/(\\end\{document})/$annotation$1/; |
} |
} |
if ($remove_latex_header eq 'YES') { |
if ($remove_latex_header eq 'YES') { |
$rendered = &latex_header_footer_remove($rendered); |
$rendered = &latex_header_footer_remove($rendered); |
} else { |
} else { |
$rendered =~ s/\\end{document}//; |
$rendered =~ s/\\end\{document}//; |
} |
} |
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; |
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut '; |
} elsif($res_url = ~/\.pdf$/) { |
} elsif($res_url = ~/\.pdf$/) { |
Line 3421 sub print_resources {
|
Line 3759 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); |
|
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 |
# If we are printing incomplete it's possible we don't have |
Line 3437 sub print_resources {
|
Line 3788 sub print_resources {
|
# |
# |
|
|
if ($actually_printed == 0) { |
if ($actually_printed == 0) { |
$current_output = &encapsulate_minipage("\\vskip -10mm \nNo incomplete resources\n \\vskip 100 mm { }\n"); |
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"); |
|
} |
if ($remove_latex_header eq "NO") { |
if ($remove_latex_header eq "NO") { |
$current_output = &print_latex_header() . $current_output; |
$current_output = &print_latex_header() . $current_output; |
} else { |
} else { |
Line 3448 sub print_resources {
|
Line 3816 sub print_resources {
|
if ($syllabus_first) { |
if ($syllabus_first) { |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
$current_output =~ s/\\\\ Last updated:/Last updated:/ |
} |
} |
my $courseidinfo = &get_course(); |
|
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $header_line = |
my $header_line = |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
$currentassignment, $courseidinfo, $fullname, $usersection); |
$currentassignment, $courseidinfo, $fullname); |
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 3474 sub print_resources {
|
Line 3841 sub print_resources {
|
|
|
} |
} |
|
|
|
sub printing_blocked { |
|
my ($r,$blocktext) = @_; |
|
my $title = &mt('Preparing Printout'); |
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
|
&Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/printout', |
|
text=> $title}); |
|
my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs($title); |
|
&Apache::loncommon::content_type($r,'text/html'); |
|
&Apache::loncommon::no_cache($r); |
|
$r->send_http_header; |
|
$r->print(&Apache::loncommon::start_page('Preparing Printout'). |
|
$breadcrumbs. |
|
$blocktext. |
|
&Apache::loncommon::end_page()); |
|
return; |
|
} |
|
|
sub handler { |
sub handler { |
|
|
my $r = shift; |
my $r = shift; |
|
|
|
if ($env{'request.course.id'}) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my ($blocked,$blocktext) = |
|
&Apache::loncommon::blocking_status('printout',$cnum,$cdom); |
|
if ($blocked) { |
|
my $checkrole = "cm./$cdom/$cnum"; |
|
if ($env{'request.course.sec'} ne '') { |
|
$checkrole .= "/$env{'request.course.sec'}"; |
|
} |
|
unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && |
|
($env{'request.role'} !~ m{^st\./$cdom/$cnum})) { |
|
&printing_blocked($r,$blocktext); |
|
return OK; |
|
} |
|
} |
|
} |
|
|
&init_perm(); |
&init_perm(); |
|
|
my $helper = printHelper($r); |
my $helper = printHelper($r); |
if (!ref($helper)) { |
if (!ref($helper)) { |
return $helper; |
return $helper; |
Line 3503 sub handler {
|
Line 3904 sub handler {
|
|
|
&output_data($r,$helper,\%parmhash); |
&output_data($r,$helper,\%parmhash); |
return OK; |
return OK; |
} |
} |
|
|
use Apache::lonhelper; |
use Apache::lonhelper; |
|
|
Line 3548 sub get_randomly_ordered_warning {
|
Line 3949 sub get_randomly_ordered_warning {
|
my $func = |
my $func = |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
sub { return ($_[0]->is_map() && $_[0]->randomorder); }; |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
my @matches = $navmap->retrieveResources($res, $func,1,1,1); |
if (@matches) { |
|
$message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order."; |
|
} |
|
} |
|
if ($message) { |
|
return '<message type="warning">'.$message.'</message>'; |
|
} |
} |
} else { |
} else { |
$message = "Retrieval of information about ordering of resources failed."; |
$message = "Retrieval of information about ordering of resources failed."; |
Line 3682 sub printHelper {
|
Line 4078 sub printHelper {
|
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_printable = 1; # By default the current resource is printable. |
my $userCanPrint = ($perm{'pav'} || $perm{'pfo'}); |
my $userCanPrint = ($perm{'pav'} || $perm{'pfo'}); |
|
my $res_printstartdate; |
|
my $res_printenddate; |
|
my $map_open = 0; |
|
my $map_close = 0xffffffff; |
|
my $course_open = 0; |
|
my $course_close = 0xffffffff; |
|
|
# Get the resource name from construction space |
# Get the resource name from construction space |
if ($helper->{VARS}->{'construction'}) { |
if ($helper->{VARS}->{'construction'}) { |
Line 3699 sub printHelper {
|
Line 4101 sub printHelper {
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $res = $navmap->getBySymb($symb); |
my $res = $navmap->getBySymb($symb); |
$res_printable = $res->resprintable() || $userCanPrint; #printability in course context |
$res_printable = $res->resprintable() || $userCanPrint; #printability in course context |
|
($res_printstartdate, $res_printenddate) = &get_print_dates($res); |
|
($course_open, $course_close) = &course_print_dates($res); |
|
($map_open, $map_close) = &map_print_dates($res); |
|
|
} else { |
} else { |
# Resource space. |
# Resource space. |
|
|
Line 3717 sub printHelper {
|
Line 4123 sub printHelper {
|
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 3747 sub printHelper {
|
Line 4154 sub printHelper {
|
|
|
if ($resourceTitle && $res_printable) { |
if ($resourceTitle && $res_printable) { |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE']; |
} |
} |
|
|
|
|
# Useful filter strings |
# Useful filter strings |
|
|
Line 3774 sub printHelper {
|
Line 4180 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' />" |
; |
; |
|
|
Line 3814 sub printHelper {
|
Line 4220 sub printHelper {
|
} |
} |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1'", |
"multichoice='1' toponly='1' addstatus='1' closeallpages='1' modallink='1'", |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
Line 3824 sub printHelper {
|
Line 4230 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"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$url, |
$url, |
Line 3853 sub printHelper {
|
Line 4259 sub printHelper {
|
my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; |
my $nextState = 'CHOOSE_INCOMPLETE_SEQ'; |
my $textSuffix = ''; |
my $textSuffix = ''; |
|
|
if ($userCanPrint) { |
if ($userCanPrint) { |
$printSelector = 'map_incomplete_problems_people_seq'; |
$printSelector = 'map_incomplete_problems_people_seq'; |
$nextState = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ'; |
$nextState = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ'; |
$textSuffix = ' for selected students'; |
$textSuffix = ' for selected students'; |
Line 3861 sub printHelper {
|
Line 4267 sub printHelper {
|
&create_incomplete_folder_selstud_helper($helper, $map); |
&create_incomplete_folder_selstud_helper($helper, $map); |
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
} else { |
} else { |
my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student. |
if (&printable($map_open, $map_close)) { |
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student. |
|
&Apache::lonxml::xmlparse($r, 'helper', $helperStates); |
|
} else { |
|
# TODO: Figure out how to break the news...this folder is not printable. |
|
} |
} |
} |
|
|
push(@{$printChoices}, |
if ($userCanPrint || &printable($map_open, $map_close)) { |
[&mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, |
push(@{$printChoices}, |
'<b>', '</b>', |
[&mt('Selected [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix, |
'<b><i>'. $sequenceTitle . '</b></i>'), |
'<b>', '</b>', |
$printSelector, |
'<b><i>'. $sequenceTitle . '</b></i>'), |
$nextState]); |
$printSelector, |
|
$nextState]); |
|
} |
# Allow problems from sequence |
# Allow problems from sequence |
push @{$printChoices}, |
if ($userCanPrint || &printable($map_open, $map_close)) { |
|
push @{$printChoices}, |
[&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
[&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
'map_problems', |
'map_problems', |
'CHOOSE_PROBLEMS']; |
'CHOOSE_PROBLEMS']; |
# Allow all resources from sequence |
# Allow all resources from sequence |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), |
'map_problems_pages', |
'map_problems_pages', |
'CHOOSE_PROBLEMS_HTML']; |
'CHOOSE_PROBLEMS_HTML']; |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS', |
'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', |
$map, |
$map, |
$isProblem, '', |
$isProblem, '', |
$symbFilter, |
$symbFilter, |
$start_new_option); |
$start_new_option); |
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
$helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML', |
'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"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
$map, |
$map, |
$isNotMap, '', |
$isNotMap, '', |
$symbFilter, |
$symbFilter, |
$start_new_option); |
$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 |
# If the user has pfo (print for others) allow them to print all |
# problems and resources in the entire course, optionally for selected students |
# problems and resources in the entire course, optionally for selected students |
my $post_data = $helper->{VARS}->{'postdata'}; |
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)$/)) { |
Line 3937 my $suffixXml = <<ALL_PROBLEMS;
|
Line 4351 my $suffixXml = <<ALL_PROBLEMS;
|
ALL_PROBLEMS |
ALL_PROBLEMS |
&Apache::lonxml::xmlparse($r, 'helper', |
&Apache::lonxml::xmlparse($r, 'helper', |
&generate_resource_chooser('ALL_PROBLEMS', |
&generate_resource_chooser('ALL_PROBLEMS', |
'SelectProblem(s) to print', |
'Select Problem(s) to print', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"', |
'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3947 ALL_PROBLEMS
|
Line 4361 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'", |
'RESOURCES', |
'RESOURCES', |
'PAGESIZE', |
'PAGESIZE', |
'', |
'', |
Line 3955 ALL_PROBLEMS
|
Line 4369 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 3999 ALL_PROBLEMS
|
Line 4413 ALL_PROBLEMS
|
# |
# |
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS', |
'Select resources to print', |
'Select resources to print', |
'multichoice="1" addstatus="1" closeallpages="1"', |
'multichoice="1" addstatus="1" closeallpages="1" modallink="1"', |
'RESOURCES', |
'RESOURCES', |
'PRINT_FORMATTING', |
'PRINT_FORMATTING', |
$map, |
$map, |
Line 4010 ALL_PROBLEMS
|
Line 4424 ALL_PROBLEMS
|
'PRINT_FORMATTING'). |
'PRINT_FORMATTING'). |
&generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
&generate_resource_chooser('CHOOSE_STUDENTS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' addstatus='1' closeallpages ='1'", |
"multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", |
'RESOURCES', |
'RESOURCES', |
'PRINT_FORMATTING', |
'PRINT_FORMATTING', |
$url, |
$url, |
Line 4108 ALL_PROBLEMS
|
Line 4522 ALL_PROBLEMS
|
$namechoice) . |
$namechoice) . |
&generate_resource_chooser('SELECT_PROBLEMS_PAGE', |
&generate_resource_chooser('SELECT_PROBLEMS_PAGE', |
'Select Problem(s) to print', |
'Select Problem(s) to print', |
"multichoice='1' addstatus='1' closeallpages ='1'", |
"multichoice='1' addstatus='1' closeallpages ='1' modallink='1'", |
'RESOURCES', |
'RESOURCES', |
'PRINT_FORMATTING', |
'PRINT_FORMATTING', |
$url, |
$url, |
Line 4132 ALL_PROBLEMS
|
Line 4546 ALL_PROBLEMS
|
<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> |
Line 4268 CHOOSE_FROM_SUBDIR
|
Line 4682 CHOOSE_FROM_SUBDIR
|
<message>Select the sequence to print resources from:</message> |
<message>Select the sequence to print resources from:</message> |
<resource variable="SEQUENCE"> |
<resource variable="SEQUENCE"> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<filterfunc>return \$res->is_sequence;</filterfunc> |
<filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc> |
<valuefunc>return $urlValue;</valuefunc> |
<valuefunc>return $urlValue;</valuefunc> |
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
</choicefunc> |
</choicefunc> |
Line 4277 CHOOSE_FROM_SUBDIR
|
Line 4691 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"> |
<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 4290 CHOOSE_FROM_ANY_SEQUENCE
|
Line 4704 CHOOSE_FROM_ANY_SEQUENCE
|
|
|
# Generate the first state, to select which resources get printed. |
# Generate the first state, to select which resources get printed. |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
Apache::lonhelper::state->new("START", "Select Printing Options:"); |
|
if (!$res_printable) { |
|
my $now = time; |
|
my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate); |
|
my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate); |
|
my $noprintmsg; |
|
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 4629 sub render {
|
Line 5073 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-Formfields'); |
|
my $with=&mt('with Formfields'); |
|
my $without=&mt('without Formfields'); |
|
|
|
|
|
$result.='<h3>'.&mt('Layout Options').'</h3>' |
$result.='<h3>'.&mt('Layout Options').'</h3>' |
Line 4640 sub render {
|
Line 5081 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 4681 sub render {
|
Line 5121 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 4932 sub postprocess {
|
Line 5366 sub postprocess {
|
} |
} |
} |
} |
|
|
|
|
|
|
__END__ |
__END__ |
|
|