--- loncom/interface/lonprintout.pm 2005/08/15 22:39:43 1.383
+++ loncom/interface/lonprintout.pm 2005/12/19 22:30:01 1.409
@@ -1,7 +1,7 @@
-# The LearningOnline Network
+# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.383 2005/08/15 22:39:43 foxr Exp $
+# $Id: lonprintout.pm,v 1.409 2005/12/19 22:30:01 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,45 +42,74 @@ use Apache::lonratedt;
use POSIX qw(strftime);
use Apache::lonlocal;
-my $resources_printed = '';
+my %perm;
+
+#
+# Convert a numeric code to letters
+#
+sub num_to_letters {
+ my ($num) = @_;
+ my @nums= split('',$num);
+ my @num_to_let=('A'..'Z');
+ my $word;
+ foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
+ return $word;
+}
+# Convert a letter code to numeric.
+#
+sub letters_to_num {
+ my ($letters) = @_;
+ my @letters = split('', uc($letters));
+ my %substitution;
+ my $digit = 0;
+ foreach my $letter ('A'..'J') {
+ $substitution{$letter} = $digit;
+ $digit++;
+ }
+ # The substitution is done as below to preserve leading
+ # zeroes which are needed to keep the code size exact
+ #
+ my $result ="";
+ foreach my $letter (@letters) {
+ $result.=$substitution{$letter};
+ }
+ return $result;
+}
# Determine if a code is a valid numeric code. Valid
# numeric codes must be comprised entirely of digits and
-# have a maximum number of allowable digits.
+# have a correct number of digits.
#
# Parameters:
# value - proposed code value.
-# max_digits - Maximum digits allowed.
+# num_digits - Number of digits required.
#
sub is_valid_numeric_code {
- my ($value, $max_digits) = @_;
+ my ($value, $num_digits) = @_;
# Remove leading/trailing whitespace;
- $value =~ s/^\s*//;
- $value =~ s/\s*$//;
+ $value =~ s/^\s*//g;
+ $value =~ s/\s*$//g;
# All digits?
-
- if ($value =~ /^[0-9]+$/) {
- if (length($value) <= $max_digits) {
- return undef;
- } else {
- return "Numeric code $value has too many digits (max = $max_digits)";
- }
- } else {
+ if ($value !~ /^[0-9]+$/) {
return "Numeric code $value has invalid characters - must only be digits";
}
+ if (length($value) != $num_digits) {
+ return "Numeric code $value incorrect number of digits (correct = $num_digits)";
+ }
+ return undef;
}
# Determines if a code is a valid alhpa code. Alpha codes
# are ciphers that map [A-J,a-j] -> 0..9 0..9.
-# They also have a maximum digit count.
+# They also have a correct digit count.
# Parameters:
# value - Proposed code value.
-# max_letters - Maximum number of letters.
+# num_letters - correct number of letters.
# Note:
# leading and trailing whitespace are ignored.
#
sub is_valid_alpha_code {
- my ($value, $max_letters) = @_;
+ my ($value, $num_letters) = @_;
# strip leading and trailing spaces.
@@ -88,16 +117,13 @@ sub is_valid_alpha_code {
$value =~ s/\s*$//g;
# All alphas in the right range?
-
- if ($value =~ /^[A-J,a-j]+$/) {
- if (length($value) <= $max_letters) {
- return undef;
- } else {
- return "Letter code $value has too many letters (max = $max_letters)";
- }
- } else {
+ if ($value !~ /^[A-J,a-j]+$/) {
return "Invalid letter code $value must only contain A-J";
}
+ if (length($value) != $num_letters) {
+ return "Letter code $value has incorrect number of letters (correct = $num_letters)";
+ }
+ return undef;
}
# Determine if a code entered by the user in a helper is valid.
@@ -129,13 +155,11 @@ sub is_code_valid {
}
my $valid;
if ($code_type eq 'number') {
- $valid = &is_valid_numeric_code($code_value, $code_length);
+ return &is_valid_numeric_code($code_value, $code_length);
} else {
- $valid = &is_valid_alpha_code($code_value, $code_length);
+ return &is_valid_alpha_code($code_value, $code_length);
}
-
- return "Entering a single code is not supported (yet): $code_type $code_length $valid";
}
# Compare two students by name. The students are in the form
@@ -409,6 +433,7 @@ sub character_chart {
$result =~ s/&(\#252|uuml);/\\\"{u}/g;
$result =~ s/&(\#253|yacute);/\\\'{y}/g;
$result =~ s/&(\#255|yuml);/\\\"{y}/g;
+ $result =~ s/&\#295;/\\ensuremath\{\\hbar\}/g;
$result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;
#Greek Alphabet
$result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;
@@ -484,6 +509,7 @@ sub character_chart {
$result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
$result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
$result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
+ $result =~ s/–/\\ensuremath\{-\}/g;
$result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
$result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
$result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
@@ -724,15 +750,14 @@ sub details_for_menu {
sub latex_corrections {
-
- my ($number_of_columns,$result,$selectionmade) = @_;
+ my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
# $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
$result =~ s/\$number_of_columns/$number_of_columns/g;
- if ($selectionmade ne '1') {
- $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/;
+ 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/;
} else {
- $result =~ s/(\\end{document})/\\strut\\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\\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{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
$result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;
@@ -791,13 +816,14 @@ sub IndexCreation {
sub print_latex_header {
my $mode=shift;
- my $output='\documentclass[letterpaper]{article}';
- if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
+ my $output='\documentclass[letterpaper,twoside]{article}';
+ if (($mode eq 'batchmode') || (!$perm{'pav'})) {
$output.='\batchmode';
}
$output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
'\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
'\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
+ '\usepackage{wrapfig}'.
'\usepackage{picins}\usepackage{calc}'."\n".
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
@@ -817,16 +843,19 @@ sub print_latex_header {
sub path_to_problem {
my ($urlp,$colwidth)=@_;
+ $urlp=&Apache::lonnet::clutter($urlp);
+
my $newurlp = '';
$colwidth=~s/\s*mm\s*$//;
#characters average about 2 mm in width
if (length($urlp)*2 > $colwidth) {
- my @elements = split '/',$urlp;
+ my @elements = split('/',$urlp);
my $curlength=0;
foreach my $element (@elements) {
+ if ($element eq '') { next; }
if ($curlength+(length($element)*2) > $colwidth) {
- $newurlp .= '|\vskip -1 mm \noindent \verb|';
- $curlength=0;
+ $newurlp .= '|\vskip -1 mm \verb|';
+ $curlength=length($element)*2;
} else {
$curlength+=length($element)*2;
}
@@ -879,6 +908,49 @@ sub unsupported {
#
+# List of recently generated print files
+#
+sub recently_generated {
+ my $r=shift;
+ my $prtspool=$r->dir_config('lonPrtDir');
+ my $zip_result;
+ my $pdf_result;
+ opendir(DIR,$prtspool);
+
+ my @files =
+ grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
+ closedir(DIR);
+
+ @files = sort {
+ my ($actime) = (stat($prtspool.'/'.$a))[10];
+ my ($bctime) = (stat($prtspool.'/'.$b))[10];
+ return $bctime <=> $actime;
+ } (@files);
+
+ foreach my $filename (@files) {
+ my ($ext) = ($filename =~ m/(pdf|zip)$/);
+ my ($cdev,$cino,$cmode,$cnlink,
+ $cuid,$cgid,$crdev,$csize,
+ $catime,$cmtime,$cctime,
+ $cblksize,$cblocks)=stat($prtspool.'/'.$filename);
+ my $result="".
+ &mt('Generated [_1] ([_2] bytes)',
+ &Apache::lonlocal::locallocaltime($cctime),$csize).
+ '
';
+ if ($ext eq 'pdf') { $pdf_result .= $result; }
+ if ($ext eq 'zip') { $zip_result .= $result; }
+ }
+ if ($zip_result) {
+ $r->print('
Please stand by while processing your print request, this may take some time ... +
ENDPART @@ -1027,6 +1102,7 @@ ENDPART &Apache::lonnet::appenv(%moreenv); &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + &Apache::lonxml::store_counter(); $resources_printed .= $currentURL.':'; $texversion.=&Apache::lonnet::ssi($currentURL,%form); &Apache::lonnet::delenv('form.counter'); @@ -1038,6 +1114,9 @@ ENDPART $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') { + $form{'problemtype'}='exam'; + } $resources_printed .= $currentURL.':'; my $answer=&Apache::lonnet::ssi($currentURL,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1106,7 +1185,7 @@ ENDPART } else { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm '; - $texversion.=&path_to_problem ($currentURL,$LaTeXwidth); + $texversion.=&path_to_problem($urlp,$LaTeXwidth); $texversion.='\vskip 1 mm '.$answer.'\end{document}'; } } @@ -1166,6 +1245,7 @@ ENDPART my $prevassignment=''; &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); + &Apache::lonxml::store_counter(); for (my $i=0;$i<=$#master_seq;$i++) { # Note due to document structure, not allowed to put \newpage @@ -1176,16 +1256,17 @@ ENDPART $result.="\\newpage\n"; } } - my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); + my ($sequence,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; - my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]); - my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem + + my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} if ($i==0) {$prevassignment=$assignment;} my $texversion=''; if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $resources_printed .= $urlp.':'; + my $pre_counter=$env{'form.counter'}; $texversion.=&Apache::lonnet::ssi($urlp,%form); if ($urlp=~/\.page$/) { ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); @@ -1193,11 +1274,9 @@ ENDPART $texversion =~ s/\\end{document}\d*/\\end{document}/; $flag_page_in_sequence = 'YES'; } - my $lonidsdir=$r->dir_config('lonIDsDir'); - my $envfile=$env{'user.environment'}; - $envfile=~/\/([^\/]+)\.id$/; - $envfile=$1; - &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my ($envfile) = ($env{'user.environment'} =~m|/([^/]+)\.id$| ); + &Apache::lonnet::transfer_profile_to_env($r->dir_config('lonIDsDir'), + $envfile); my $current_counter=$env{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { @@ -1206,6 +1285,7 @@ ENDPART $answerform{'grade_target'}='answer'; $answerform{'answer_output_mode'}='tex'; $resources_printed .= $urlp.':'; + &Apache::lonnet::appenv(('form.counter' => $pre_counter)); my $answer=&Apache::lonnet::ssi($urlp,%answerform); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -1213,7 +1293,7 @@ ENDPART } else { if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm '; + $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm '; $texversion.=&path_to_problem ($urlp,$LaTeXwidth); $texversion.='\vskip 1 mm '.$answer; } else { @@ -1321,7 +1401,8 @@ ENDPART $person,$type, \%moreenv,\@master_seq, $flag_latex_header_remove, - $LaTeXwidth); + $LaTeXwidth, + $number_of_columns); $resources_printed .= ":"; $print_array[$i].=$output; $student_names[$i].=$person.':'.$fullname.'_END_'; @@ -1338,7 +1419,9 @@ ENDPART my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; - + my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'}; + my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'}; + my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); my ($code_type,$code_length)=('letter',6); @@ -1360,6 +1443,19 @@ ENDPART $code_type=$result{"type\0$old_name"}; @allcodes=split(',',$result{$old_name}); $num_todo=scalar(@allcodes); + } elsif ($selected_code) { # Selection value is always numeric. + $num_todo = 1; + @allcodes = ($selected_code); + } elsif ($single_code) { + + $num_todo = 1; # Unconditionally one code to do. + # If an alpha code have to convert to numbers so it can be + # converted back to letters again :-) + # + if ($code_type ne 'number') { + $single_code = &letters_to_num($single_code); + } + @allcodes = ($single_code); } else { my %allcodes; srand($seed); @@ -1482,8 +1578,14 @@ ENDPART } #-------------------------------------------------------- corrections for the different page formats $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); - for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);} + $result = &latex_corrections($number_of_columns,$result,$selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + for (my $i=1;$i<=$#print_array;$i++) { + $print_array[$i] = + &latex_corrections($number_of_columns,$print_array[$i], + $selectionmade, + $helper->{'VARS'}->{'ANSWER_TYPE'}); + } #changes page's parameters for the one column output if ($numberofcolumns == 1) { $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; @@ -1566,7 +1668,7 @@ ENDPART 'cgi.'.$identifier.'.selection' => $selectionmade, 'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, 'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, - 'cgi.'.$identifier.'.role' => $env{'request.role.adv'}, + 'cgi.'.$identifier.'.role' => $perm{'pav'}, 'cgi.'.$identifier.'.numberoffiles' => $#print_array, 'cgi.'.$identifier.'.studentnames' => $student_names, 'cgi.'.$identifier.'.backref' => $URLback,); @@ -1585,21 +1687,13 @@ $r->print(<Print: | ");
$paramHash = Apache::lonhelper::getParamHash();
@@ -2287,7 +2448,7 @@ CHOOSE_FROM_ANY_SEQUENCE
$startedTable = 1;
}
- if ($env{'request.role.adv'}) {
+ if ($perm{'pav'}) {
if (!$startedTable) {
addMessage("
|