--- loncom/interface/lonprintout.pm 2005/08/15 22:39:43 1.383
+++ loncom/interface/lonprintout.pm 2005/12/06 15:01:45 1.402
@@ -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.402 2005/12/06 15:01:45 albertel 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;
@@ -792,12 +818,13 @@ sub IndexCreation {
sub print_latex_header {
my $mode=shift;
my $output='\documentclass[letterpaper]{article}';
- if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
+ 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".
@@ -879,6 +906,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 @@ -1038,6 +1111,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') { @@ -1338,7 +1414,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 +1438,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); @@ -1566,7 +1657,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 +1676,13 @@ $r->print(<Print: | ");
$paramHash = Apache::lonhelper::getParamHash();
@@ -2287,7 +2438,7 @@ CHOOSE_FROM_ANY_SEQUENCE
$startedTable = 1;
}
- if ($env{'request.role.adv'}) {
+ if ($perm{'pav'}) {
if (!$startedTable) {
addMessage("
|