version 1.440, 2006/06/06 11:02:38
|
version 1.495, 2007/01/15 11:53:50
|
Line 1
|
Line 1
|
|
# |
# The LearningOnline Network |
# The LearningOnline Network |
# Printout |
# Printout |
# |
# |
Line 22
|
Line 23
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
# |
# |
# /home/httpd/html/adm/gpl.txt |
# /home/httpd/html/adm/gpl.txt |
# |
|
# http://www.lon-capa.org/ |
# http://www.lon-capa.org/ |
# |
# |
# |
# |
Line 38 use Apache::grades;
|
Line 38 use Apache::grades;
|
use Apache::edit; |
use Apache::edit; |
use Apache::File(); |
use Apache::File(); |
use Apache::lonnavmaps; |
use Apache::lonnavmaps; |
use Apache::lonratedt; |
use LONCAPA::map(); |
use POSIX qw(strftime); |
use POSIX qw(strftime); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Carp; |
use Carp; |
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
use LONCAPA; |
|
|
my %perm; |
my %perm; |
|
my %parmhash; |
|
my $resources_printed; |
|
|
|
# |
|
# printf_style_subst item format_string repl |
|
# |
|
# Does printf style substitution for a format string that |
|
# can have %[n]item in it.. wherever, %[n]item occurs, |
|
# rep is substituted in format_string. Note that |
|
# [n] is an optional integer length. If provided, |
|
# repl is truncated to at most [n] characters prior to |
|
# substitution. |
|
# |
|
sub printf_style_subst { |
|
my ($item, $format_string, $repl) = @_; |
|
my $result = ""; |
|
while ($format_string =~ /(%)(\d*)\Q$item\E/g ) { |
|
my $fmt = $1; |
|
my $size = $2; |
|
my $subst = $repl; |
|
if ($size ne "") { |
|
$subst = substr($subst, 0, $size); |
|
|
|
# Here's a nice edge case.. supose the end of the |
|
# substring is a \. In that case may have just |
|
# chopped off a TeX escape... in that case, we append |
|
# " " for the trailing character, and let the field |
|
# spill over a bit (sigh). |
|
# We don't just chop off the last character in order to deal |
|
# with one last pathology, and that would be if substr had |
|
# trimmed us to e.g. \\\ |
|
|
|
|
|
if ($subst =~ /\\$/) { |
|
$subst .= " "; |
|
} |
|
} |
|
my $item_pos = pos($format_string); |
|
$result .= substr($format_string, 0, $item_pos - length($size) -2) . $subst; |
|
$format_string = substr($format_string, pos($format_string)); |
|
} |
|
|
|
# Put the residual format string into the result: |
|
|
|
$result .= $format_string; |
|
|
|
return $result; |
|
} |
|
|
|
|
|
# Format a header according to a format. |
|
# |
|
|
|
# Substitutions: |
|
# %a - Assignment name. |
|
# %c - Course name. |
|
# %n - Student name. |
|
# |
|
sub format_page_header { |
|
my ($width, $format, $assignment, $course, $student) = @_; |
|
|
|
$width = &recalcto_mm($width); # Get width in mm. |
|
# Default format? |
|
|
|
if ($format eq '') { |
|
# For the default format, we may need to truncate |
|
# elements.. To do this we need to get the page width. |
|
# we assume that each character is about 2mm in width. |
|
# (correct for the header text size??). We ignore |
|
# any formatting (e.g. boldfacing in this). |
|
# |
|
# - Allow the student/course to be one line. |
|
# but only truncate the course. |
|
# - Allow the assignment to be 2 lines (wrapped). |
|
# |
|
my $chars_per_line = $width/2; # Character/textline. |
|
|
|
|
|
my $firstline = "$student $course"; |
|
if (length($firstline) > $chars_per_line) { |
|
my $lastchar = $chars_per_line - length($student) - 1; |
|
if ($lastchar > 0) { |
|
$course = substr($course, 0, $lastchar); |
|
} else { # Nothing left of course: |
|
$course = ''; |
|
} |
|
} |
|
if (length($assignment) > $chars_per_line) { |
|
$assignment = substr($assignment, 0, $chars_per_line); |
|
} |
|
|
|
$format = "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}"; |
|
|
|
} 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!!! |
|
|
|
|
|
} |
|
|
|
|
|
return $format; |
|
|
|
} |
|
|
# |
# |
# Convert a numeric code to letters |
# Convert a numeric code to letters |
Line 63 sub num_to_letters {
|
Line 175 sub num_to_letters {
|
sub letters_to_num { |
sub letters_to_num { |
my ($letters) = @_; |
my ($letters) = @_; |
my @letters = split('', uc($letters)); |
my @letters = split('', uc($letters)); |
my %substitution; |
my %substitution; |
my $digit = 0; |
my $digit = 0; |
foreach my $letter ('A'..'J') { |
foreach my $letter ('A'..'J') { |
$substitution{$letter} = $digit; |
$substitution{$letter} = $digit; |
Line 378 sub character_chart {
|
Line 490 sub character_chart {
|
$result =~ s/&\#147;/\`\`/g; |
$result =~ s/&\#147;/\`\`/g; |
$result =~ s/&\#148;/\'\'/g; |
$result =~ s/&\#148;/\'\'/g; |
$result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g; |
$result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g; |
$result =~ s/&\#150;/--/g; |
$result =~ s/&(\#150|\#8211);/--/g; |
$result =~ s/&\#151;/---/g; |
$result =~ s/&\#151;/---/g; |
$result =~ s/&\#152;/\\ensuremath\{\\sim\}/g; |
$result =~ s/&\#152;/\\ensuremath\{\\sim\}/g; |
$result =~ s/&\#153;/\\texttrademark /g; |
$result =~ s/&\#153;/\\texttrademark /g; |
Line 585 sub character_chart {
|
Line 697 sub character_chart {
|
$result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g; |
$result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g; |
$result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g; |
$result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g; |
$result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g; |
$result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g; |
|
# Chemically useful 'things' contributed by Hon Kie (bug 4652). |
|
$result =~ s/&\#8636;/\\ensuremath\{\\leftharpoonup\}/g; |
|
$result =~ s/&\#8637;/\\ensuremath\{\\leftharpoondown\}/g; |
|
$result =~ s/&\#8640;/\\ensuremath\{\\rightharpoonup\}/g; |
|
$result =~ s/&\#8641;/\\ensuremath\{\\rightharpoondown\}/g; |
|
$result =~ s/&\#8652;/\\ensuremath\{\\rightleftharpoons\}/g; |
|
$result =~ s/&\#8605;/\\ensuremath\{\\leadsto\}/g; |
|
$result =~ s/&\#8617;/\\ensuremath\{\\hookleftarrow\}/g; |
|
$result =~ s/&\#8618;/\\ensuremath\{\\hookrightarrow\}/g; |
|
$result =~ s/&\#8614;/\\ensuremath\{\\mapsto\}/g; |
|
$result =~ s/&\#8599;/\\ensuremath\{\\nearrow\}/g; |
|
$result =~ s/&\#8600;/\\ensuremath\{\\searrow\}/g; |
|
$result =~ s/&\#8601;/\\ensuremath\{\\swarrow\}/g; |
|
$result =~ s/&\#8598;/\\ensuremath\{\\nwarrow\}/g; |
return $result; |
return $result; |
} |
} |
|
|
Line 593 sub character_chart {
|
Line 719 sub character_chart {
|
my %page_formats= |
my %page_formats= |
('letter' => { |
('letter' => { |
'book' => { |
'book' => { |
'1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'], |
'1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'], |
'2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'] |
'2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'] |
}, |
}, |
'album' => { |
'album' => { |
'1' => [ '8.8 in', '6.8 in','-40 pt in', '-60 pt','1 cm'], |
'1' => [ '8.8 in', '6.8 in','-0.55 in', '-0.55 in','1.0 in'], |
'2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in'] |
'2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in'] |
}, |
}, |
}, |
}, |
'legal' => { |
'legal' => { |
Line 653 my %page_formats=
|
Line 779 my %page_formats=
|
}, |
}, |
'a4' => { |
'a4' => { |
'book' => { |
'book' => { |
'1' => ['176 mm','272 mm','-40 pt in','-60 pt','-0.5 in'], |
'1' => ['17.6 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'], |
'2' => [ '91 mm','272 mm','-40 pt in','-60 pt','-0.5 in'] |
'2' => [ '9.1 cm','27.2 cm','-1.397 c,','-2.11 cm','-1.27 cm'] |
}, |
}, |
'album' => { |
'album' => { |
'1' => ['8.5 in','7.7 in','-40 pt in','-60 pt','0 in'], |
'1' => ['21.59 cm','19.558 cm','-1.27 cm','-2.11 cm','0 cm'], |
'2' => ['3.9 in','7.7 in','-40 pt in','-60 pt','0 in'] |
'2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm'] |
}, |
}, |
}, |
}, |
'a5' => { |
'a5' => { |
Line 702 sub get_name {
|
Line 828 sub get_name {
|
if (!defined($udom)) { $udom=$env{'user.domain'}; } |
if (!defined($udom)) { $udom=$env{'user.domain'}; } |
my $plainname=&Apache::loncommon::plainname($uname,$udom); |
my $plainname=&Apache::loncommon::plainname($uname,$udom); |
if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; } |
if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; } |
$plainname=&Apache::lonxml::latex_special_symbols($plainname,'header'); |
$plainname=&Apache::lonxml::latex_special_symbols($plainname,'header'); |
return $plainname; |
return $plainname; |
} |
} |
|
|
Line 717 sub get_course {
|
Line 843 sub get_course {
|
sub page_format_transformation { |
sub page_format_transformation { |
my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; |
my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; |
my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); |
my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); |
|
|
if ($selectionmade eq '4') { |
if ($selectionmade eq '4') { |
$assignment='Problems from the Whole Course'; |
$assignment='Problems from the Whole Course'; |
} else { |
} else { |
$assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); |
$assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); |
} |
} |
($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); |
($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); |
|
|
|
|
my $name = &get_name(); |
my $name = &get_name(); |
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
|
my $header_text = $parmhash{'print_header_format'}; |
|
$header_text = &format_page_header($textwidth, $header_text, $assignment, |
|
$courseidinfo, $name); |
my $topmargintoinsert = ''; |
my $topmargintoinsert = ''; |
if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} |
if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';} |
my $fancypagestatement=''; |
my $fancypagestatement=''; |
if ($numberofcolumns eq '2') { |
if ($numberofcolumns eq '2') { |
$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}"; |
$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}"; |
} else { |
} else { |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}"; |
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}"; |
} |
} |
if ($layout eq 'album') { |
if ($layout eq 'album') { |
$text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
$text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /; |
Line 775 sub details_for_menu {
|
Line 907 sub details_for_menu {
|
if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; } |
if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; } |
my $name_of_resource = &Apache::lonnet::gettitle($postdata); |
my $name_of_resource = &Apache::lonnet::gettitle($postdata); |
my $symbolic = &Apache::lonnet::symbread($postdata); |
my $symbolic = &Apache::lonnet::symbread($postdata); |
|
return if ( $symbolic eq ''); |
|
|
my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic); |
my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic); |
$map=&Apache::lonnet::clutter($map); |
$map=&Apache::lonnet::clutter($map); |
my $name_of_sequence = &Apache::lonnet::gettitle($map); |
my $name_of_sequence = &Apache::lonnet::gettitle($map); |
Line 790 sub details_for_menu {
|
Line 924 sub details_for_menu {
|
return ($name_of_resource,$name_of_sequence,$name_of_map); |
return ($name_of_resource,$name_of_sequence,$name_of_map); |
} |
} |
|
|
|
sub copyright_line { |
|
return '\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\vspace*{-2 mm}\newline\noindent{\tiny Printed from LON-CAPA\copyright MSU{\hfill} Licensed under GNU General Public License } '; |
|
} |
|
my $end_of_student = "\n".'\special{ps:ENDOFSTUDENTSTAMP}'."\n"; |
|
|
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; |
$result =~ s/\$number_of_columns/$number_of_columns/g; |
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\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $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\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License $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/(\\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 |
Line 856 sub IndexCreation {
|
Line 995 sub IndexCreation {
|
|
|
sub print_latex_header { |
sub print_latex_header { |
my $mode=shift; |
my $mode=shift; |
my $output='\documentclass[letterpaper,twoside]{article}'; |
my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom'; |
if (($mode eq 'batchmode') || (!$perm{'pav'})) { |
if (($mode eq 'batchmode') || (!$perm{'pav'})) { |
$output.='\batchmode'; |
$output.='\batchmode'; |
} |
} |
Line 1020 sub get_page_breaks {
|
Line 1159 sub get_page_breaks {
|
return %page_breaks; |
return %page_breaks; |
} |
} |
|
|
|
# Output a sequence (recursively if neeed) |
|
# from construction space. |
|
# Parameters: |
|
# url = URL of the sequence to print. |
|
# helper - Reference to the helper hash. |
|
# form - Copy of the format hash. |
|
# LaTeXWidth |
|
# Returns: |
|
# Text to add to the printout. |
|
# NOTE if the first element of the outermost sequence |
|
# is itself a sequence, the outermost caller may need to |
|
# prefix the latex with the page headers stuff. |
|
# |
|
sub print_construction_sequence { |
|
my ($currentURL, $helper, %form, $LaTeXwidth) = @_; |
|
my $result; |
|
my $rndseed=time; |
|
if ($helper->{'VARS'}->{'curseed'}) { |
|
$rndseed=$helper->{'VARS'}->{'curseed'}; |
|
} |
|
my $errtext=&LONCAPA::map::mapread($currentURL); |
|
# |
|
# These make this all support recursing for subsequences. |
|
# |
|
my @order = @LONCAPA::map::order; |
|
my @resources = @LONCAPA::map::resources; |
|
for (my $member=0;$member<=$#order;$member++) { |
|
$resources[$order[$member]]=~/^([^:]*):([^:]*):/; |
|
my $urlp=$2; |
|
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
|
my $texversion=''; |
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { |
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
|
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
$form{'rndseed'}=$rndseed; |
|
$resources_printed .=$urlp.':'; |
|
$texversion=&Apache::lonnet::ssi($urlp,%form); |
|
} |
|
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
|
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
|
($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { |
|
# Don't permanently modify %$form... |
|
my %answerform = %form; |
|
$answerform{'grade_target'}='answer'; |
|
$answerform{'answer_output_mode'}='tex'; |
|
$answerform{'rndseed'}=$rndseed; |
|
$answerform{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
if ($urlp=~/\/res\//) {$env{'request.state'}='published';} |
|
$resources_printed .= $urlp.':'; |
|
my $answer=&Apache::lonnet::ssi($urlp,%answerform); |
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
|
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
|
} else { |
|
# If necessary, encapsulate answer in minipage: |
|
|
|
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
|
my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
|
$body.=&path_to_problem($urlp,$LaTeXwidth); |
|
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
|
$body = &encapsulate_minipage($body); |
|
$texversion.=$body; |
|
} |
|
} |
|
$texversion = &latex_header_footer_remove($texversion); |
|
|
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
|
$texversion=&IndexCreation($texversion,$urlp); |
|
} |
|
if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { |
|
$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /; |
|
} |
|
$result.=$texversion; |
|
|
|
} elsif ($urlp=~/\.(sequence|page)$/) { |
|
|
|
# header: |
|
|
|
$result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; |
|
|
|
# IF sequence, recurse: |
|
|
|
if ($urlp =~ /\.sequence$/) { |
|
my $sequence_url = $urlp; |
|
my $domain = $env{'user.domain'}; # Constr. space only on local |
|
my $user = $env{'user.name'}; |
|
|
|
$sequence_url =~ s/^\/res\/$domain/\/home/; |
|
$sequence_url =~ s/^(\/home\/$user)/$1\/public_html/; |
|
# $sequence_url =~ s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
|
$result .= &print_construction_sequence($sequence_url, |
|
$helper, %form, |
|
$LaTeXwidth); |
|
} |
|
} |
|
} |
|
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
|
return $result; |
|
} |
|
|
sub output_data { |
sub output_data { |
my ($r,$helper,$rparmhash) = @_; |
my ($r,$helper,$rparmhash) = @_; |
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
my $resources_printed = ''; |
$resources_printed = ''; |
my $js = <<ENDPART; |
my $js = <<ENDPART; |
<script type="text/javascript"> |
<script type="text/javascript"> |
var editbrowser; |
var editbrowser; |
Line 1172 ENDPART
|
Line 1413 ENDPART
|
} 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\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm '; |
my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
$texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
$texversion.=&path_to_problem($cleanURL,$LaTeXwidth); |
} else { |
} else { |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; |
Line 1197 ENDPART
|
Line 1440 ENDPART
|
} elsif ($cleanURL!~m|^/adm/| |
} elsif ($cleanURL!~m|^/adm/| |
&& $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
&& $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { |
#printing content of sequence from the construction space |
#printing content of sequence from the construction space |
my $flag_latex_header_remove = 'NO'; |
|
my $rndseed=time; |
|
if ($helper->{'VARS'}->{'curseed'}) { |
|
$rndseed=$helper->{'VARS'}->{'curseed'}; |
|
} |
|
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
$currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; |
my $errtext=&Apache::lonratedt::mapread($currentURL); |
$result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
for (my $member=0;$member<=$#Apache::lonratedt::order;$member++) { |
$result .= &print_construction_sequence($currentURL, $helper, %form, |
$Apache::lonratedt::resources[$Apache::lonratedt::order[$member]]=~/^([^:]*):([^:]*):/; |
$LaTeXwidth); |
my $urlp=$2; |
$result .= '\end{document}'; |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { |
if (!($result =~ /\\begin\{document\}/)) { |
my $texversion=''; |
$result = &print_latex_header() . $result; |
if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { |
|
$form{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
$form{'suppress_tries'}=$parmhash{'suppress_tries'}; |
|
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
|
$form{'rndseed'}=$rndseed; |
|
$resources_printed .=$urlp.':'; |
|
$texversion=&Apache::lonnet::ssi($urlp,%form); |
|
} |
|
if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || |
|
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && |
|
($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { |
|
# Don't permanently modify %$form... |
|
my %answerform = %form; |
|
$answerform{'grade_target'}='answer'; |
|
$answerform{'answer_output_mode'}='tex'; |
|
$answerform{'rndseed'}=$rndseed; |
|
$answerform{'problem_split'}=$parmhash{'problem_stream_switch'}; |
|
if ($urlp=~/\/res\//) {$env{'request.state'}='published';} |
|
$resources_printed .= $urlp.':'; |
|
my $answer=&Apache::lonnet::ssi($urlp,%answerform); |
|
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { |
|
$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; |
|
} else { |
|
# If necessary, encapsulate answer in minipage: |
|
|
|
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
|
my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm '; |
|
$body.=&path_to_problem($urlp,$LaTeXwidth); |
|
$body.='\vskip 1 mm '.$answer.'\end{document}'; |
|
$body = &encapsulate_minipage($body); |
|
$texversion.=$body; |
|
} |
|
} |
|
if ($flag_latex_header_remove ne 'NO') { |
|
$texversion = &latex_header_footer_remove($texversion); |
|
} else { |
|
$texversion =~ s/\\end{document}//; |
|
} |
|
if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { |
|
$texversion=&IndexCreation($texversion,$urlp); |
|
} |
|
if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URpL'} eq 'yes') { |
|
$texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /; |
|
} |
|
$result.=$texversion; |
|
$flag_latex_header_remove = 'YES'; |
|
} elsif ($urlp=~/\.(sequence|page)$/) { |
|
$result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent '; |
|
} |
|
} |
} |
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} |
# End construction space sequence. |
$result .= '\end{document}'; |
|
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} |
Line 1348 ENDPART
|
Line 1536 ENDPART
|
} else { |
} else { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { |
if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm '; |
my $title = &Apache::lonnet::gettitle($master_seq[$i]); |
|
$title = &Apache::lonxml::latex_special_symbols($title); |
|
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .= &path_to_problem ($urlp,$LaTeXwidth); |
$body .='\vskip 1 mm '.$answer; |
$body .='\vskip 1 mm '.$answer; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body); |
Line 1371 ENDPART
|
Line 1561 ENDPART
|
my $courseidinfo = &get_course(); |
my $courseidinfo = &get_course(); |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
$prevassignment=$assignment; |
$prevassignment=$assignment; |
|
my $header_text = $parmhash{'print_header_format'}; |
|
$header_text = &format_page_header($textwidth, $header_text, |
|
$assignment, |
|
$courseidinfo, |
|
$name); |
if ($numberofcolumns eq '1') { |
if ($numberofcolumns eq '1') { |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; |
} else { |
} else { |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm '; |
$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{'.$header_text.'}} \vskip 5 mm '; |
} |
} |
} |
} |
$result .= $texversion; |
$result .= $texversion; |
Line 1561 ENDPART
|
Line 1756 ENDPART
|
} |
} |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; |
my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); |
my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); |
|
&adjust_number_to_print($helper); |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'}; |
if ($number_per_page eq '0' || $number_per_page eq 'all') { |
if ($number_per_page eq '0' || $number_per_page eq 'all') { |
$number_per_page=$num_todo; |
$number_per_page=$num_todo; |
Line 1666 ENDPART
|
Line 1862 ENDPART
|
$result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); |
$result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade); |
$result = &latex_corrections($number_of_columns,$result,$selectionmade, |
$result = &latex_corrections($number_of_columns,$result,$selectionmade, |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
for (my $i=1;$i<=$#print_array;$i++) { |
#if ($numberofcolumns == 1) { |
$print_array[$i] = |
$result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; |
&latex_corrections($number_of_columns,$print_array[$i], |
$result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; |
$selectionmade, |
$result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; |
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
$result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; |
} |
#} |
&Apache::lonnet::logthis("Resetting page e.g. height -> $helper->{'VARS'}->{'pagesize.height'}"); |
|
&Apache::lonnet::logthis("Before: $result \n--------------------------\n"); |
|
$result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; |
|
$result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; |
|
$result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; |
|
$result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; |
|
|
|
&Apache::lonnet::logthis("After: $result \n----------------------------------\n"); |
|
|
|
#-- writing .tex file in prtspool |
#-- writing .tex file in prtspool |
my $temp_file; |
my $temp_file; |
Line 1700 ENDPART
|
Line 1888 ENDPART
|
if ($i==0) { |
if ($i==0) { |
$print_array[$i]=$result; |
$print_array[$i]=$result; |
} else { |
} else { |
|
$print_array[$i].='\end{document}'; |
|
$print_array[$i] = |
|
&latex_corrections($number_of_columns,$print_array[$i], |
|
$selectionmade, |
|
$helper->{'VARS'}->{'ANSWER_TYPE'}); |
|
|
my $anobegin=index($print_array[$i],'\setcounter{page}',0); |
my $anobegin=index($print_array[$i],'\setcounter{page}',0); |
substr($print_array[$i],0,$anobegin)=''; |
substr($print_array[$i],0,$anobegin)=''; |
$print_array[$i]=$inc.$print_array[$i].'\end{document}'; |
$print_array[$i]=$inc.$print_array[$i]; |
} |
} |
my $temp_file; |
my $temp_file; |
my $newfilename=$filename; |
my $newfilename=$filename; |
Line 1799 sub print_resources {
|
Line 1993 sub print_resources {
|
my $printed = ''; |
my $printed = ''; |
my ($username,$userdomain,$usersection) = split /:/,$person; |
my ($username,$userdomain,$usersection) = split /:/,$person; |
my $fullname = &get_name($username,$userdomain); |
my $fullname = &get_name($username,$userdomain); |
my $namepostfix; |
my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace. |
if ($person =~ 'anon') { |
if ($person =~ 'anon') { |
$namepostfix="\\\\Name: "; |
$namepostfix .="Name: "; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
$fullname = "CODE - ".$moreenv->{'CODE'}; |
} |
} |
|
# Fullname may have special latex characters that need \ prefixing: |
|
# |
|
|
my $i = 0; |
my $i = 0; |
#goes through all resources, checks if they are available for |
#goes through all resources, checks if they are available for |
#current student, and produces output |
#current student, and produces output |
|
|
&Apache::lonxml::clear_problem_counter(); |
&Apache::lonxml::clear_problem_counter(); |
my %page_breaks = &get_page_breaks($helper); |
my %page_breaks = &get_page_breaks($helper); |
my @format_array = split(/\|/,$helper->{'VARS'}->{'FORMAT'}); |
my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1]; |
my $columns_in_format = $format_array[1]; |
|
# |
# |
# Bracket each student with a |
# end each student with a |
# Special that allows the post processor to even out the page |
# Special that allows the post processor to even out the page |
# counts later. Nasty problem this... it would be really |
# counts later. Nasty problem this... it would be really |
# nice to put the special in as a postscript comment |
# nice to put the special in as a postscript comment |
# e.g. \special{ps:\%STARTOFSTUDENTSTAMP} unfortunately, |
# e.g. \special{ps:\ENDOFSTUDENTSTAMP} unfortunately, |
# The special gets passed the \ and dvips puts it in the output file |
# The special gets passed the \ and dvips puts it in the output file |
# so we'll just put STARTOFSTUDENTSTAMP in the postscript and rely |
# so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the |
# on printout.pl to strip it...simlarly with ENDOFSTUDENTSTAMP. |
# postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. |
# These will go on a line by themselves. |
|
# |
# |
$current_output .= "\\special{ps:\nSTARTOFSTUDENTSTAMP\n}"; |
|
|
|
foreach my $curresline (@{$master_seq}) { |
foreach my $curresline (@{$master_seq}) { |
if (defined $page_breaks{$curresline}) { |
if (defined $page_breaks{$curresline}) { |
Line 1861 sub print_resources {
|
Line 2055 sub print_resources {
|
|
|
|
|
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); |
my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm '; |
my $title = &Apache::lonnet::gettitle($curresline); |
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$title = &Apache::lonxml::latex_special_symbols($title); |
|
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; |
|
$body .=&path_to_problem($res_url,$LaTeXwidth); |
$body .='\vskip 1 mm '.$ansrendered; |
$body .='\vskip 1 mm '.$ansrendered; |
$body = &encapsulate_minipage($body); |
$body = &encapsulate_minipage($body); |
$rendered = $header.$body; |
$rendered = $header.$body; |
Line 1903 sub print_resources {
|
Line 2099 sub print_resources {
|
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } |
if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} |
if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} |
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); |
if ($current_output=~/\\documentclass/) { |
my $header_line = |
if ($columns_in_format == 1) { |
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'}, |
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; |
$currentassignment, $courseidinfo, $fullname); |
} else { |
my $header_start = ($columns_in_format == 1) ? '\lhead' |
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fancyhead[LO]{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /; |
: '\fancyhead[LO]'; |
|
$header_line = $header_start.'{'.$header_line.'}'; |
|
|
} |
if ($current_output=~/\\documentclass/) { |
|
$current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; |
} else { |
} else { |
my $blankpages = ''; |
my $blankpages = |
for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';} |
'\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; |
if ($columns_in_format == 1) { |
|
$current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; |
$current_output = '\strut\vspace*{-6 mm}\\newline'. |
} else { |
©right_line().' \newpage '.$blankpages.$end_of_student. |
$current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output; |
'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'. |
} |
$header_line.$namepostfix.'} \vskip 5 mm '.$current_output; |
} |
} |
# |
# |
# Close the student bracketing. |
# Close the student bracketing. |
# |
# |
$current_output .= "\\special{ps:\nENDOFSTUDENTSTAMP\n}"; |
|
return ($current_output,$fullname, $printed); |
return ($current_output,$fullname, $printed); |
|
|
} |
} |
Line 1941 sub handler {
|
Line 2138 sub handler {
|
} |
} |
|
|
|
|
my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); |
%parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'}); |
|
|
|
|
|
|
Line 1976 sub init_perm {
|
Line 2173 sub init_perm {
|
$perm{'pav'}=&Apache::lonnet::allowed('pav', |
$perm{'pav'}=&Apache::lonnet::allowed('pav', |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
} |
} |
$perm{'pfo'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'}); |
$perm{'pfo'}=&Apache::lonnet::allowed('pfo',$env{'request.course.id'}); |
if (!$perm{'pfo'}) { |
if (!$perm{'pfo'}) { |
$perm{'pfo'}=&Apache::lonnet::allowed('pfo', |
$perm{'pfo'}=&Apache::lonnet::allowed('pfo', |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
$env{'request.course.id'}.'/'.$env{'request.course.sec'}); |
Line 2024 sub printHelper {
|
Line 2221 sub printHelper {
|
$helper->declareVar('FINISHPAGE'); |
$helper->declareVar('FINISHPAGE'); |
$helper->declareVar('PRINT_TYPE'); |
$helper->declareVar('PRINT_TYPE'); |
$helper->declareVar("showallfoils"); |
$helper->declareVar("showallfoils"); |
|
$helper->declareVar("STUDENTS"); |
|
|
# The page breaks can get loaded initially from the course environment: |
# The page breaks can get loaded initially from the course environment: |
# But we only do this in the initial state so that they are allowed to change. |
# But we only do this in the initial state so that they are allowed to change. |
Line 2035 sub printHelper {
|
Line 2233 sub printHelper {
|
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
'lastprinttype' => 'scalar'}); |
'lastprinttype' => 'scalar'}); |
|
|
|
# This will persistently load in the data we want from the |
|
# very first screen. |
|
|
if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { |
if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { |
if (!defined ($env{"form.CURRENT_STATE"})) { |
if (!defined ($env{"form.CURRENT_STATE"})) { |
Line 2049 sub printHelper {
|
Line 2249 sub printHelper {
|
|
|
} |
} |
|
|
|
|
# This will persistently load in the data we want from the |
|
# very first screen. |
|
# Detect whether we're coming from construction space |
# Detect whether we're coming from construction space |
if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { |
if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { |
$helper->{VARS}->{'filename'} = "~$1/$2"; |
$helper->{VARS}->{'filename'} = "~$1/$2"; |
Line 2059 sub printHelper {
|
Line 2257 sub printHelper {
|
} else { |
} else { |
if ($env{'form.postdata'}) { |
if ($env{'form.postdata'}) { |
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); |
$helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'}); |
|
if ( $helper->{VARS}->{'symb'} eq '') { |
|
$helper->{VARS}->{'postdata'} = $env{'form.postdata'}; |
|
} |
} |
} |
if ($env{'form.symb'}) { |
if ($env{'form.symb'}) { |
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
$helper->{VARS}->{'symb'} = $env{'form.symb'}; |
Line 2086 sub printHelper {
|
Line 2287 sub printHelper {
|
my $symb = $helper->{VARS}->{'symb'}; |
my $symb = $helper->{VARS}->{'symb'}; |
my ($map, $id, $url); |
my ($map, $id, $url); |
my $subdir; |
my $subdir; |
|
my $is_published=0; # True when printing from resource space. |
|
|
# Get the resource name from construction space |
# Get the resource name from construction space |
if ($helper->{VARS}->{'construction'}) { |
if ($helper->{VARS}->{'construction'}) { |
Line 2094 sub printHelper {
|
Line 2296 sub printHelper {
|
$subdir = substr($helper->{VARS}->{'filename'}, |
$subdir = substr($helper->{VARS}->{'filename'}, |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
0, rindex($helper->{VARS}->{'filename'}, '/') + 1); |
} else { |
} else { |
($map, $id, $url) = &Apache::lonnet::decode_symb($symb); |
if ($symb ne '') { |
$helper->{VARS}->{'postdata'} = |
($map, $id, $url) = &Apache::lonnet::decode_symb($symb); |
&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); |
$helper->{VARS}->{'postdata'} = |
|
&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url)); |
|
} else { |
|
$url = $helper->{VARS}->{'postdata'}; |
|
$is_published=1; # From resource space. |
|
} |
|
$url = &Apache::lonnet::clutter($url); |
|
|
if (!$resourceTitle) { # if the resource doesn't have a title, use the filename |
if (!$resourceTitle) { # if the resource doesn't have a title, use the filename |
my $postdata = $helper->{VARS}->{'postdata'}; |
my $postdata = $helper->{VARS}->{'postdata'}; |
Line 2117 sub printHelper {
|
Line 2325 sub printHelper {
|
|
|
# "Delete everything after the last slash." |
# "Delete everything after the last slash." |
$subdir =~ s|/[^/]+$||; |
$subdir =~ s|/[^/]+$||; |
if (not $helper->{VARS}->{'construction'}) { |
|
$subdir=$Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$subdir; |
|
} |
|
# "Remove all duplicate slashes." |
|
$subdir =~ s|/+|/|g; |
|
|
|
# What can be printed is a very dynamic decision based on |
# What can be printed is a very dynamic decision based on |
# lots of factors. So we need to dynamically build this list. |
# lots of factors. So we need to dynamically build this list. |
Line 2138 sub printHelper {
|
Line 2341 sub printHelper {
|
my $paramHash; |
my $paramHash; |
|
|
if ($resourceTitle) { |
if ($resourceTitle) { |
push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('what 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 2153 sub printHelper {
|
Line 2356 sub printHelper {
|
|
|
$helper->declareVar('SEQUENCE'); |
$helper->declareVar('SEQUENCE'); |
|
|
|
# If we're in a sequence... |
|
|
|
my $start_new_option; |
|
if ($perm{'pav'}) { |
|
$start_new_option = |
|
"<option text='".&mt('Start new page<br />before selected'). |
|
"' variable='FINISHPAGE' />"; |
|
} |
|
|
# If we're in a sequence... |
if (($helper->{'VARS'}->{'construction'} ne '1' ) && |
if (($helper->{'VARS'}->{'construction'} ne '1') && |
|
|
|
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'postdata'} && |
$helper->{VARS}->{'assignment'}) { |
$helper->{VARS}->{'assignment'}) { |
# Allow problems from sequence |
# Allow problems from sequence |
push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS']; |
push @{$printChoices}, [&mt('Selected <b>Problems</b> in folder <b><i>[_1]</i></b>',$sequenceTitle), 'map_problems', 'CHOOSE_PROBLEMS']; |
# Allow all resources from sequence |
# Allow all resources from sequence |
push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; |
push @{$printChoices}, [&mt('Selected <b>Resources</b> in folder <b><i>[_1]</i></b>',$sequenceTitle), 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML']; |
|
|
my $helperFragment = <<HELPERFRAGMENT; |
my $helperFragment = <<HELPERFRAGMENT; |
<state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print"> |
<state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print"> |
<message>(mark them 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"> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isProblem;</filterfunc> |
<filterfunc>return $isProblem;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
|
|
<state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print"> |
<state name="CHOOSE_PROBLEMS_HTML" title="Select Resource(s) to print"> |
<message>(mark them 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"> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isNotMap;</filterfunc> |
<filterfunc>return $isNotMap;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
HELPERFRAGMENT |
HELPERFRAGMENT |
Line 2196 HELPERFRAGMENT
|
Line 2403 HELPERFRAGMENT
|
|
|
# If the user has pfo (print for otheres) allow them to print all |
# If the user has pfo (print for otheres) allow them to print all |
# problems and resources in the entier course, optionally for selected students |
# problems and resources in the entier course, optionally for selected students |
if ($perm{'pfo'} && |
if ($perm{'pfo'} && !$is_published && |
($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { |
|
|
push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, ['Selected <b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS']; |
push @{$printChoices}, ['<b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES']; |
push @{$printChoices}, ['Selected <b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES']; |
&Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS); |
&Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS); |
<state name="ALL_PROBLEMS" title="Select Problem(s) to print"> |
<state name="ALL_PROBLEMS" title="Select Problem(s) to print"> |
<message>(mark them then click "next" button) <br /></message> |
|
<resource variable="RESOURCES" toponly='0' multichoice="1" |
<resource variable="RESOURCES" toponly='0' multichoice="1" |
suppressEmptySequences='0' addstatus="1" closeallpages="1"> |
suppressEmptySequences='0' addstatus="1" closeallpages="1"> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isProblemOrMap;</filterfunc> |
<filterfunc>return $isProblemOrMap;</filterfunc> |
<choicefunc>return $isNotMap;</choicefunc> |
<choicefunc>return $isNotMap;</choicefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
<state name="ALL_RESOURCES" title="Select Resource(s) to print"> |
<state name="ALL_RESOURCES" title="Select Resource(s) to print"> |
<message>(Mark them then click "next" button) <br /> </message> |
|
<resource variable="RESOURCES" toponly='0' multichoice='1' |
<resource variable="RESOURCES" toponly='0' multichoice='1' |
suppressEmptySequences='0' addstatus='1' closeallpages='1'> |
suppressEmptySequences='0' addstatus='1' closeallpages='1'> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isNotMap; </filterfunc> |
<filterfunc>return $isNotMap; </filterfunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='NewPage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
ALL_PROBLEMS |
ALL_PROBLEMS |
|
|
if ($helper->{VARS}->{'assignment'}) { |
if ($helper->{VARS}->{'assignment'}) { |
push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'problems_for_students', 'CHOOSE_STUDENTS']; |
push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'problems_for_students', 'CHOOSE_STUDENTS']; |
push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'problems_for_anon', 'CHOOSE_ANON1']; |
push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1']; |
} |
} |
|
|
# resource_selector will hold a few states that: |
# resource_selector will hold a few states that: |
Line 2248 ALL_PROBLEMS
|
Line 2453 ALL_PROBLEMS
|
<filterfunc>return $isProblem;</filterfunc> |
<filterfunc>return $isProblem;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='New Page' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
<state name="PRINT_FORMATTING" title="How should results be printed?"> |
<state name="PRINT_FORMATTING" title="How should results be printed?"> |
Line 2265 ALL_PROBLEMS
|
Line 2470 ALL_PROBLEMS
|
<choice computer="all">All assignments in a single PDF file</choice> |
<choice computer="all">All assignments in a single PDF file</choice> |
<choice computer="sections">Each PDF contains exactly one section</choice> |
<choice computer="sections">Each PDF contains exactly one section</choice> |
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT" relateddefault="all"> |
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
Specify Number:</choice> |
Specify the number of assignments per PDF:</choice> |
</choices> |
</choices> |
</state> |
</state> |
RESOURCE_SELECTOR |
RESOURCE_SELECTOR |
|
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS); |
<state name="CHOOSE_STUDENTS" title="Select Students and Resources"> |
<state name="CHOOSE_STUDENTS" title="Select Students and Resources"> |
<message><b>Select sort order</b> </message> |
<message><b>Select sorting order of printout</b> </message> |
<choices variable='student_sort'> |
<choices variable='student_sort'> |
<choice computer='0'>Sort by section then student</choice> |
<choice computer='0'>Sort by section then student</choice> |
<choice computer='1'>Sort by students across sections.</choice> |
<choice computer='1'>Sort by students across sections.</choice> |
Line 2304 CHOOSE_STUDENTS
|
Line 2509 CHOOSE_STUDENTS
|
} |
} |
} |
} |
|
|
my $code_selection = "<choice></choice>\n"; |
my $code_selection; |
foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { |
foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) { |
my $choice = $code; |
my $choice = $code; |
if ($code =~ /^[A-Z]+$/) { # Alpha code |
if ($code =~ /^[A-Z]+$/) { # Alpha code |
Line 2314 CHOOSE_STUDENTS
|
Line 2519 CHOOSE_STUDENTS
|
} |
} |
if (%codes_to_print) { |
if (%codes_to_print) { |
$code_selection .=' |
$code_selection .=' |
<exec> |
<message><b>Choose single CODE from list:</b></message> |
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
<message></td><td></message> |
</exec> |
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
<choice></choice> |
|
<exec> |
|
push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}}); |
|
</exec> |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
'.$/; |
'.$/; |
|
|
} |
} |
|
|
|
|
Line 2335 CHOOSE_STUDENTS
|
Line 2547 CHOOSE_STUDENTS
|
$codechoice='<choice computer="default">Default</choice>'; |
$codechoice='<choice computer="default">Default</choice>'; |
} |
} |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1); |
<state name="CHOOSE_ANON1" title="Select Students and Resources"> |
<state name="CHOOSE_ANON1" title="Specify CODEd Assignments"> |
<nextstate>SELECT_PROBLEMS</nextstate> |
<nextstate>SELECT_PROBLEMS</nextstate> |
<message><table><tr><td><b>Number of anonymous assignments to print:</b></td><td></message> |
<message><h4>Fill out one of the forms below</h4></message> |
|
<message><br /><hr /> <br /></message> |
|
<message><h3>Generate new CODEd Assignments</h3></message> |
|
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<validator> |
<validator> |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
Line 2359 CHOOSE_STUDENTS
|
Line 2574 CHOOSE_STUDENTS
|
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$codechoice |
$codechoice |
</dropdown> |
</dropdown> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message></td></tr><tr><td colspan="2"></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></table></message> |
<message><b>Enter a CODE to print:</b></td><td></message> |
<message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message> |
|
<message><tr><td><b>Enter a CODE to print:</b></td><td></message> |
<string variable="SINGLE_CODE" size="10"> |
<string variable="SINGLE_CODE" size="10"> |
<validator> |
<validator> |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
Line 2374 CHOOSE_STUDENTS
|
Line 2590 CHOOSE_STUDENTS
|
} |
} |
</validator> |
</validator> |
</string> |
</string> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Choose single code from list</b></message> |
|
<message></td><td></message> |
|
<choices variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
$code_selection |
$code_selection |
</choices> |
<message></td></tr></table></message> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message> |
<message><b>Reprint a set of saved CODEs:</b></message> |
<message><b>Select saved CODEs:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="REUSE_OLD_CODES"> |
<dropdown variable="REUSE_OLD_CODES"> |
$namechoice |
$namechoice |
</dropdown> |
</dropdown> |
<message></td></tr></table></message> |
<message></td></tr></table></message> |
<message><hr width='33%' /></message> |
|
</state> |
</state> |
$resource_selector |
$resource_selector |
CHOOSE_ANON1 |
CHOOSE_ANON1 |
|
|
|
|
if ($helper->{VARS}->{'assignment'}) { |
if ($helper->{VARS}->{'assignment'}) { |
push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'resources_for_students', 'CHOOSE_STUDENTS1']; |
push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'resources_for_students', 'CHOOSE_STUDENTS1']; |
push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'resources_for_anon', 'CHOOSE_ANON2']; |
push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'resources_for_anon', 'CHOOSE_ANON2']; |
} |
} |
|
|
|
|
Line 2408 CHOOSE_ANON1
|
Line 2620 CHOOSE_ANON1
|
<filterfunc>return $isNotMap;</filterfunc> |
<filterfunc>return $isNotMap;</filterfunc> |
<mapurl>$map</mapurl> |
<mapurl>$map</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
<state name="PRINT_FORMATTING" title="Format of the print job"> |
<state name="PRINT_FORMATTING" title="Format of the print job"> |
Line 2426 CHOOSE_ANON1
|
Line 2638 CHOOSE_ANON1
|
<choice computer="all">All assignments in a single PDF file</choice> |
<choice computer="all">All assignments in a single PDF file</choice> |
<choice computer="sections">Each PDF contains exactly one section</choice> |
<choice computer="sections">Each PDF contains exactly one section</choice> |
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
<choice computer="oneper">Each PDF contains exactly one assignment</choice> |
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT" relateddefault="all"> |
<choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT"> |
Specify Number:</choice> |
Specify the number of assignments per PDF:</choice> |
</choices> |
</choices> |
</state> |
</state> |
RESOURCE_SELECTOR |
RESOURCE_SELECTOR |
Line 2446 RESOURCE_SELECTOR
|
Line 2658 RESOURCE_SELECTOR
|
CHOOSE_STUDENTS1 |
CHOOSE_STUDENTS1 |
|
|
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2); |
&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2); |
<state name="CHOOSE_ANON2" title="Select Students and Resources"> |
<state name="CHOOSE_ANON2" title="Select CODEd Assignments"> |
<nextstate>SELECT_RESOURCES</nextstate> |
<nextstate>SELECT_RESOURCES</nextstate> |
<message><table><tr><td><b>Number of anonymous assignments to print:</b></td><td></message> |
<message><h4>Fill out one of the forms below</h4></message> |
|
<message><br /><hr /> <br /></message> |
|
<message><h3>Generate new CODEd Assignments</h3></message> |
|
<message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"> |
<validator> |
<validator> |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
Line 2470 CHOOSE_STUDENTS1
|
Line 2685 CHOOSE_STUDENTS1
|
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
<dropdown variable="CODE_OPTION" multichoice="0" allowempty="0"> |
$codechoice |
$codechoice |
</dropdown> |
</dropdown> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message></td></tr><tr><td></table></message> |
<message></td></tr><tr><td></message> |
<message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message> |
<message><b>Enter a CODE to print:</b></td><td></message> |
<message><tr><td><b>Enter a CODE to print:</b></td><td></message> |
<string variable="SINGLE_CODE" size="10"> |
<string variable="SINGLE_CODE" size="10"> |
<validator> |
<validator> |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
Line 2485 CHOOSE_STUDENTS1
|
Line 2700 CHOOSE_STUDENTS1
|
} |
} |
</validator> |
</validator> |
</string> |
</string> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
<message><b>Choose single code from list</b></message> |
|
<message></td><td></message> |
|
<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0"> |
|
$code_selection |
$code_selection |
</dropdown> |
<message></td></tr></table></message> |
<message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message> |
<message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message> |
<message><b>Reprint a set of saved CODEs:</b></message> |
<message><b>Select saved CODEs:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<dropdown variable="REUSE_OLD_CODES"> |
<dropdown variable="REUSE_OLD_CODES"> |
$namechoice |
$namechoice |
</dropdown> |
</dropdown> |
<message></td></tr></table></message> |
<message></td></tr></table></message> |
<message><hr width='33%' /></message> |
|
</state> |
</state> |
$resource_selector |
$resource_selector |
CHOOSE_ANON2 |
CHOOSE_ANON2 |
} |
} |
|
|
# FIXME: That RE should come from a library somewhere. |
# FIXME: That RE should come from a library somewhere. |
if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $perm{'pav'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') { |
if (($perm{'pav'} |
push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; |
&& $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/' |
|
&& (defined($helper->{'VARS'}->{'construction'}) |
|
|| |
|
(&Apache::lonnet::allowed('bre',$subdir) eq 'F' |
|
&& |
|
$helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/) |
|
)) |
|
&& $helper->{VARS}->{'assignment'} eq "" |
|
) { |
|
|
my $f = '$filename'; |
my $pretty_dir = &Apache::lonnet::hreflocation($subdir); |
|
push @{$printChoices}, [&mt("Selected <b>Problems</b> from current subdirectory <b><i>[_1]</i></b>",$pretty_dir), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR']; |
my $xmlfrag = <<CHOOSE_FROM_SUBDIR; |
my $xmlfrag = <<CHOOSE_FROM_SUBDIR; |
<state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$subdir</small></b> to print"> |
<state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print"> |
<message>(mark them then click "next" button) <br /></message> |
|
<files variable="FILES" multichoice='1'> |
<files variable="FILES" multichoice='1'> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filechoice>return '$subdir';</filechoice> |
<filechoice>return '$subdir';</filechoice> |
Line 2531 CHOOSE_FROM_SUBDIR
|
Line 2751 CHOOSE_FROM_SUBDIR
|
|
|
# Allow the user to select any sequence in the course, feed it to |
# Allow the user to select any sequence in the course, feed it to |
# another resource selector for that sequence |
# another resource selector for that sequence |
if (!$helper->{VARS}->{'construction'}) { |
if (!$helper->{VARS}->{'construction'} && !$is_published) { |
push @$printChoices, ["<b>Resources</b> from <b>selected sequence</b> in course", |
push @$printChoices, ["Selected <b>Resources</b> from <b>selected folder</b> in course", |
'select_sequences', 'CHOOSE_SEQUENCE']; |
'select_sequences', 'CHOOSE_SEQUENCE']; |
my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'}; |
#Escape apostrophes and backslashes for Perl |
#Escape apostrophes and backslashes for Perl |
Line 2554 CHOOSE_FROM_SUBDIR
|
Line 2774 CHOOSE_FROM_SUBDIR
|
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
<resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1" |
closeallpages="1"> |
closeallpages="1"> |
<nextstate>PAGESIZE</nextstate> |
<nextstate>PAGESIZE</nextstate> |
<filterfunc>return $isProblem</filterfunc> |
<filterfunc>return $isNotMap</filterfunc> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
<mapurl evaluate='1'>return '$escapedSequenceName';</mapurl> |
<valuefunc>return $symbFilter;</valuefunc> |
<valuefunc>return $symbFilter;</valuefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
$start_new_option |
</resource> |
</resource> |
</state> |
</state> |
CHOOSE_FROM_ANY_SEQUENCE |
CHOOSE_FROM_ANY_SEQUENCE |
Line 2883 sub new {
|
Line 3103 sub new {
|
# $helper->{VARS} to figure out whether the columns are one or two |
# $helper->{VARS} to figure out whether the columns are one or two |
$self->{'formatvar'} = shift; |
$self->{'formatvar'} = shift; |
|
|
# The state to transition to after selection, or after discovering |
|
# the cols are not set to 1 |
|
$self->{NEXTSTATE} = shift; |
$self->{NEXTSTATE} = shift; |
bless($self); |
bless($self); |
|
|
return $self; |
return $self; |
} |
} |
|
|
Line 2896 sub render {
|
Line 3116 sub render {
|
my $result = ''; |
my $result = ''; |
my $var = $self->{'variable'}; |
my $var = $self->{'variable'}; |
|
|
|
|
|
|
if (defined $self->{ERROR_MSG}) { |
if (defined $self->{ERROR_MSG}) { |
$result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br />'; |
$result .= '<br /><span class="LC_error">' . $self->{ERROR_MSG} . '</span><br />'; |
} |
} |
|
|
my $width = 18; |
|
my $format = $helper->{VARS}->{$self->{'formatvar'}}; |
my $format = $helper->{VARS}->{$self->{'formatvar'}}; |
if (substr($format, 2, 1) ne '1') { |
|
$width = 9; |
# Use format to get sensible defaults for the margins: |
|
|
|
|
|
my ($laystyle, $cols, $papersize) = split(/\|/, $format); |
|
($papersize) = split(/ /, $papersize); |
|
|
|
|
|
if ($laystyle eq 'L') { |
|
$laystyle = 'album'; |
|
} else { |
|
$laystyle = 'book'; |
} |
} |
|
|
|
|
|
my %size; |
|
($size{'width_and_units'}, |
|
$size{'height_and_units'}, |
|
$size{'margin_and_units'})= |
|
&Apache::lonprintout::page_format($papersize, $laystyle, $cols); |
|
|
|
foreach my $dimension ('width','height','margin') { |
|
($size{$dimension},$size{$dimension.'_unit'}) = |
|
split(/ +/, $size{$dimension.'_and_units'},2); |
|
|
|
foreach my $unit ('cm','in') { |
|
$size{$dimension.'_options'} .= '<option '; |
|
if ($size{$dimension.'_unit'} eq $unit) { |
|
$size{$dimension.'_options'} .= 'selected="selected" '; |
|
} |
|
$size{$dimension.'_options'} .= '>'.$unit.'</option>'; |
|
} |
|
} |
|
|
|
# Adjust margin for LaTeX margin: .. requires units == cm or in. |
|
|
|
if ($size{'margin_unit'} eq 'in') { |
|
$size{'margin'} += 1; |
|
} else { |
|
$size{'margin'} += 2.54; |
|
} |
$result .= <<ELEMENTHTML; |
$result .= <<ELEMENTHTML; |
|
|
<p>How should the column be formatted?</p> |
|
|
|
|
<p>How should each column be formatted?</p> |
|
|
<table cellpadding='3'> |
<table cellpadding='3'> |
<tr> |
<tr> |
<td align='right'><b>Width</b>:</td> |
<td align='right'><b>Width</b>:</td> |
<td align='left'><input type='text' name='$var.width' value='$width' size='4'></td> |
<td align='left'><input type='text' name='$var.width' value="$size{'width'}" size='4' /></td> |
<td align='left'> |
<td align='left'> |
<select name='$var.widthunit'> |
<select name='$var.widthunit'> |
<option>cm</option><option>in</option> |
$size{'width_options'} |
</select> |
</select> |
</td> |
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td align='right'><b>Height</b>:</td> |
<td align='right'><b>Height</b>:</td> |
<td align='left'><input type='text' name="$var.height" value="25.9" size='4'></td> |
<td align='left'><input type='text' name="$var.height" value="$size{'height'}" size='4' /></td> |
<td align='left'> |
<td align='left'> |
<select name='$var.heightunit'> |
<select name='$var.heightunit'> |
<option>cm</option><option>in</option> |
$size{'height_options'} |
</select> |
</select> |
</td> |
</td> |
</tr> |
</tr> |
<tr> |
<tr> |
<td align='right'><b>Left margin</b>:</td> |
<td align='right'><b>Left margin</b>:</td> |
<td align='left'><input type='text' name='$var.lmargin' value='-1.5' size='4'></td> |
<td align='left'><input type='text' name='$var.lmargin' value="$size{'margin'}" size='4' /></td> |
<td align='left'> |
<td align='left'> |
<select name='$var.lmarginunit'> |
<select name='$var.lmarginunit'> |
<option>cm</option><option>in</option> |
$size{'margin_options'} |
</select> |
</select> |
</td> |
</td> |
</tr> |
</tr> |
</table> |
</table> |
|
|
<p>Hint: Some instructors like to leave scratch space for the student by |
<!--<p>Hint: Some instructors like to leave scratch space for the student by |
making the width much smaller than the width of the page.</p> |
making the width much smaller than the width of the page.</p>--> |
|
|
ELEMENTHTML |
ELEMENTHTML |
|
|
return $result; |
return $result; |
} |
} |
|
|
# If the user didn't select 1 column, skip this state. |
|
sub preprocess { |
sub preprocess { |
my $self = shift; |
my $self = shift; |
my $helper = Apache::lonhelper::getHelper(); |
my $helper = Apache::lonhelper::getHelper(); |
|
|
my $format = $helper->{VARS}->{$self->{'formatvar'}}; |
my $format = $helper->{VARS}->{$self->{'formatvar'}}; |
# if (substr($format, 2, 1) ne '1') { |
|
# $helper->changeState($self->{NEXTSTATE}); |
# If the user does not have 'pav' privilege, set default widths and |
# } |
# on to the next state right away. |
|
# |
|
if (!$perm{'pav'}) { |
|
my $var = $self->{'variable'}; |
|
my $format = $helper->{VARS}->{$self->{'formatvar'}}; |
|
|
|
my ($laystyle, $cols, $papersize) = split(/\|/, $format); |
|
($papersize) = split(/ /, $papersize); |
|
|
|
|
|
if ($laystyle eq 'L') { |
|
$laystyle = 'album'; |
|
} else { |
|
$laystyle = 'book'; |
|
} |
|
# Figure out some good defaults for the print out and set them: |
|
|
|
my %size; |
|
($size{'width'}, |
|
$size{'height'}, |
|
$size{'lmargin'})= |
|
&Apache::lonprintout::page_format($papersize, $laystyle, $cols); |
|
|
|
foreach my $dim ('width', 'height', 'lmargin') { |
|
my ($value, $units) = split(/ /, $size{$dim}); |
|
|
|
$helper->{VARS}->{"$var.".$dim} = $value; |
|
$helper->{VARS}->{"$var.".$dim.'unit'} = $units; |
|
|
|
} |
|
|
|
|
|
# Transition to the next state |
|
|
|
$helper->changeState($self->{NEXTSTATE}); |
|
} |
|
|
return 1; |
return 1; |
} |
} |
Line 2978 sub postprocess {
|
Line 3273 sub postprocess {
|
# /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed |
# /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed |
# by an optional period, followed by digits, ending the string |
# by an optional period, followed by digits, ending the string |
|
|
if ($width !~ /^-?[0-9]+(\.[0-9]*)?$/) { |
if ($width !~ /^-?[0-9]*(\.[0-9]*)?$/) { |
$error .= "Invalid width; please type only a number.<br />\n"; |
$error .= "Invalid width; please type only a number.<br />\n"; |
} |
} |
if ($height !~ /^-?[0-9]+(\.[0-9]*)?$/) { |
if ($height !~ /^-?[0-9]*(\.[0-9]*)?$/) { |
$error .= "Invalid height; please type only a number.<br />\n"; |
$error .= "Invalid height; please type only a number.<br />\n"; |
} |
} |
if ($lmargin !~ /^-?[0-9]+(\.[0-9]*)?$/) { |
if ($lmargin !~ /^-?[0-9]*(\.[0-9]*)?$/) { |
$error .= "Invalid left margin; please type only a number.<br />\n"; |
$error .= "Invalid left margin; please type only a number.<br />\n"; |
|
} else { |
|
# Adjust for LaTeX 1.0 inch margin: |
|
|
|
if ($env{"form.${var}.lmarginunit"} eq "in") { |
|
$helper->{VARS}->{$var.'.lmargin'} = $lmargin - 1; |
|
} else { |
|
$helper->{VARS}->{$var.'.lmargin'} = $lmargin - 2.54; |
|
} |
} |
} |
|
|
if (!$error) { |
if (!$error) { |