version 1.384, 2005/08/16 03:34:34
|
version 1.396, 2005/10/31 21:06:35
|
Line 1
|
Line 1
|
# The LearningOnline Network |
# The LearningOnline Network |
# Printout |
# Printout |
# |
# |
# $Id$ |
# $Id$ |
Line 42 use Apache::lonratedt;
|
Line 42 use Apache::lonratedt;
|
use POSIX qw(strftime); |
use POSIX qw(strftime); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
|
my $resources_printed = ''; |
# |
|
# 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 |
# Determine if a code is a valid numeric code. Valid |
# numeric codes must be comprised entirely of digits and |
# numeric codes must be comprised entirely of digits and |
Line 55 my $resources_printed = '';
|
Line 85 my $resources_printed = '';
|
sub is_valid_numeric_code { |
sub is_valid_numeric_code { |
my ($value, $num_digits) = @_; |
my ($value, $num_digits) = @_; |
# Remove leading/trailing whitespace; |
# Remove leading/trailing whitespace; |
$value =~ s/^\s*//; |
$value =~ s/^\s*//g; |
$value =~ s/\s*$//; |
$value =~ s/\s*$//g; |
|
|
# All digits? |
# All digits? |
if ($value =~ /^[0-9]+$/) { |
if ($value !~ /^[0-9]+$/) { |
return "Numeric code $value has invalid characters - must only be digits"; |
return "Numeric code $value has invalid characters - must only be digits"; |
} |
} |
if (length($value) != $num_digits) { |
if (length($value) != $num_digits) { |
return "Numeric code $value incorrect number of digits (correct = $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 |
# Determines if a code is a valid alhpa code. Alpha codes |
# are ciphers that map [A-J,a-j] -> 0..9 0..9. |
# are ciphers that map [A-J,a-j] -> 0..9 0..9. |
Line 90 sub is_valid_alpha_code {
|
Line 121 sub is_valid_alpha_code {
|
if (length($value) != $num_letters) { |
if (length($value) != $num_letters) { |
return "Letter code $value has incorrect number of letters (correct = $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. |
# Determine if a code entered by the user in a helper is valid. |
Line 121 sub is_code_valid {
|
Line 153 sub is_code_valid {
|
} |
} |
my $valid; |
my $valid; |
if ($code_type eq 'number') { |
if ($code_type eq 'number') { |
$valid = &is_valid_numeric_code($code_value, $code_length); |
return &is_valid_numeric_code($code_value, $code_length); |
} else { |
} 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 |
# Compare two students by name. The students are in the form |
Line 475 sub character_chart {
|
Line 506 sub character_chart {
|
$result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g; |
$result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g; |
$result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g; |
$result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g; |
$result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g; |
$result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g; |
|
$result =~ s/–/\\ensuremath\{-\}/g; |
$result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g; |
$result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g; |
$result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g; |
$result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g; |
$result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g; |
$result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g; |
Line 789 sub print_latex_header {
|
Line 821 sub print_latex_header {
|
$output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". |
$output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". |
'\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". |
'\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". |
'\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". |
'\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". |
|
'\usepackage{wrapfig}'. |
'\usepackage{picins}\usepackage{calc}'."\n". |
'\usepackage{picins}\usepackage{calc}'."\n". |
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". |
'\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". |
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". |
'\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". |
Line 870 sub unsupported {
|
Line 903 sub unsupported {
|
|
|
|
|
# |
# |
|
# List of recently generated print files |
|
# |
|
|
|
sub recently_generated { |
|
my $r=shift; |
|
my $prtspool=$r->dir_config('lonPrtDir'); |
|
my $result; |
|
opendir(DIR,$prtspool); |
|
while (my $filename=readdir(DIR)) { |
|
if ($filename=~/^$env{'user.name'}\_$env{'user.domain'}\_printout\_(\d+)\_.*.pdf$/) { |
|
my ($cdev,$cino,$cmode,$cnlink, |
|
$cuid,$cgid,$crdev,$csize, |
|
$catime,$cmtime,$cctime, |
|
$cblksize,$cblocks)=stat($prtspool.'/'.$filename); |
|
$result.="<a href='/prtspool/$filename'>". |
|
&mt('Generated [_1] ([_2] bytes)', |
|
&Apache::lonlocal::locallocaltime($cctime),$csize). |
|
'</a><br />'; |
|
} |
|
} |
|
closedir(DIR); |
|
if ($result) { |
|
$r->print('<h4>'.&mt('Recently generated printouts').'</h4>'."\n". |
|
$result); |
|
} |
|
} |
|
|
|
# |
# Retrieve the hash of page breaks. |
# Retrieve the hash of page breaks. |
# |
# |
# Inputs: |
# Inputs: |
Line 893 sub get_page_breaks {
|
Line 954 sub get_page_breaks {
|
sub output_data { |
sub output_data { |
my ($r,$helper,$rparmhash) = @_; |
my ($r,$helper,$rparmhash) = @_; |
my %parmhash = %$rparmhash; |
my %parmhash = %$rparmhash; |
|
my $resources_printed = ''; |
my $html=&Apache::lonxml::xmlbegin(); |
my $html=&Apache::lonxml::xmlbegin(); |
my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); |
my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); |
$r->print(<<ENDPART); |
$r->print(<<ENDPART); |
Line 1329 ENDPART
|
Line 1391 ENDPART
|
my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; |
my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'}; |
my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; |
my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'}; |
my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'}; |
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'}; |
my $code_option=$helper->{'VARS'}->{'CODE_OPTION'}; |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my ($code_type,$code_length)=('letter',6); |
my ($code_type,$code_length)=('letter',6); |
Line 1351 ENDPART
|
Line 1415 ENDPART
|
$code_type=$result{"type\0$old_name"}; |
$code_type=$result{"type\0$old_name"}; |
@allcodes=split(',',$result{$old_name}); |
@allcodes=split(',',$result{$old_name}); |
$num_todo=scalar(@allcodes); |
$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 { |
} else { |
my %allcodes; |
my %allcodes; |
srand($seed); |
srand($seed); |
Line 1576 $r->print(<<FINALEND);
|
Line 1653 $r->print(<<FINALEND);
|
FINALEND |
FINALEND |
} |
} |
|
|
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; |
|
} |
|
|
|
sub get_CODE { |
sub get_CODE { |
my ($all_codes,$num,$seed,$size,$type)=@_; |
my ($all_codes,$num,$seed,$size,$type)=@_; |
my $max='1'.'0'x$size; |
my $max='1'.'0'x$size; |
my $newcode; |
my $newcode; |
while(1) { |
while(1) { |
$newcode=sprintf("%06d",int(rand($max))); |
$newcode=sprintf("%0".$size."d",int(rand($max))); |
if (!exists($$all_codes{$newcode})) { |
if (!exists($$all_codes{$newcode})) { |
$$all_codes{$newcode}=1; |
$$all_codes{$newcode}=1; |
if ($type eq 'number' ) { |
if ($type eq 'number' ) { |
Line 1811 sub printHelper {
|
Line 1880 sub printHelper {
|
$helper->declareVar("showallfoils"); |
$helper->declareVar("showallfoils"); |
|
|
# 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. |
|
# |
|
|
if((!defined($env{"form.CURRENT_STATE"})) || |
$helper->{VARS}->{FINISHPAGE} = ''; |
($env{'form.CURRENT_STATE'} == "START")) { |
|
$helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g. |
|
} |
|
|
|
|
|
|
|
&Apache::loncommon::restore_course_settings('print', |
&Apache::loncommon::restore_course_settings('print', |
{'pagebreaks' => 'scalar', |
{'pagebreaks' => 'scalar', |
'lastprinttype' => 'scalar'}); |
'lastprinttype' => 'scalar'}); |
|
|
|
|
if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") { |
|
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) { |
|
if (!defined ($env{"form.CURRENT_STATE"})) { |
|
|
|
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
|
} else { |
|
my $state = $env{"form.CURRENT_STATE"}; |
|
if ($state eq "START") { |
|
$helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; |
|
} |
|
} |
|
|
} |
} |
|
|
|
|
Line 1935 sub printHelper {
|
Line 2010 sub printHelper {
|
$helper->declareVar('SEQUENCE'); |
$helper->declareVar('SEQUENCE'); |
|
|
# Useful for debugging: Dump the help vars |
# Useful for debugging: Dump the help vars |
# $r->print(Dumper($helper->{VARS})); |
# $r->print(Dumper($helper->{VARS})); |
# $r->print($map); |
# $r->print($map); |
|
|
# If we're in a sequence... |
# If we're in a sequence... |
Line 2053 CHOOSE_STUDENTS
|
Line 2128 CHOOSE_STUDENTS
|
if ($name =~ /^type\0/) { next; } |
if ($name =~ /^type\0/) { next; } |
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
$namechoice.='<choice computer="'.$name.'">'.$name.'</choice>'; |
} |
} |
|
|
|
|
|
my %all_codes = &Apache::lonnet::get('CODEs', |
|
\@names, $cdom,$cnum); |
|
my %code_values; |
|
my @all_code_array; |
|
foreach my $key (keys %all_codes) { |
|
%code_values = &Apache::grades::get_codes($key, $cdom, $cnum); |
|
foreach my $key (keys %code_values) { |
|
push (@all_code_array, "$key"); |
|
} |
|
} |
|
|
|
my $code_selection = "<choice></choice>\n"; |
|
foreach my $code (sort {uc($a) cmp uc($b)} @all_code_array) { |
|
my $choice = $code; |
|
if ($code =~ /^[A-Z]+$/) { # Alpha code |
|
$choice = &letters_to_num($code); |
|
} |
|
$code_selection .= ' <choice computer="'.$choice.'">'.$code."</choice>\n"; |
|
} |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); |
my $codechoice=''; |
my $codechoice=''; |
foreach my $line (<FH>) { |
foreach my $line (<FH>) { |
Line 2075 CHOOSE_STUDENTS
|
Line 2171 CHOOSE_STUDENTS
|
<validator> |
<validator> |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
!\$helper->{'VARS'}{'SINGLE_CODE'}) { |
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return "You need to specify the number of assignments to print"; |
return "You need to specify the number of assignments to print"; |
} |
} |
return undef; |
return undef; |
Line 2086 CHOOSE_STUDENTS
|
Line 2183 CHOOSE_STUDENTS
|
<string variable="SINGLE_CODE" size="10" defaultvalue="zzzz"> |
<string variable="SINGLE_CODE" size="10" defaultvalue="zzzz"> |
<validator> |
<validator> |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
\$helper->{'VARS'}{'CODE_OPTION'}); |
\$helper->{'VARS'}{'CODE_OPTION'}); |
} else { |
} else { |
Line 2095 CHOOSE_STUDENTS
|
Line 2193 CHOOSE_STUDENTS
|
</validator> |
</validator> |
</string> |
</string> |
<message></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 |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
<message><b>Names to store the CODEs under for later:</b></message> |
<message><b>Names to store the CODEs under for later:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
Line 2161 CHOOSE_STUDENTS1
|
Line 2265 CHOOSE_STUDENTS1
|
<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) && |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'}) { |
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'SINGLE_CODE'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
return "You need to specify the number of assignments to print"; |
return "You need to specify the number of assignments to print"; |
} |
} |
return undef; |
return undef; |
</validator> |
</validator> |
</string> |
</string> |
<message></td></tr><tr><td></message> |
<message></td></tr><tr><td></message> |
|
<message><b>Value of CODE to print?</b></td><td></message> |
|
<string variable="SINGLE_CODE" size="10" defaultvalue="zzzz"> |
|
<validator> |
|
if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'} && |
|
!\$helper->{'VARS'}{'REUSE_OLD_CODES'} && |
|
!\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) { |
|
return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'}, |
|
\$helper->{'VARS'}{'CODE_OPTION'}); |
|
} else { |
|
return undef; # Other forces control us. |
|
} |
|
</validator> |
|
</string> |
|
<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 |
|
</dropdown> |
|
<message></td></tr><tr><td></message> |
<message><b>Names to store the CODEs under for later:</b></message> |
<message><b>Names to store the CODEs under for later:</b></message> |
<message></td><td></message> |
<message></td><td></message> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
<string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" /> |
Line 2230 CHOOSE_FROM_SUBDIR
|
Line 2356 CHOOSE_FROM_SUBDIR
|
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate> |
<filterfunc>return \$res->is_sequence;</filterfunc> |
<filterfunc>return \$res->is_sequence;</filterfunc> |
<valuefunc>return $urlValue;</valuefunc> |
<valuefunc>return $urlValue;</valuefunc> |
|
<choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); |
|
</choicefunc> |
<option text='Newpage' variable='FINISHPAGE' /> |
<option text='Newpage' variable='FINISHPAGE' /> |
</resource> |
</resource> |
</state> |
</state> |
Line 2362 RNDSEED
|
Line 2490 RNDSEED
|
$helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'}; |
$helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'}; |
|
|
} |
} |
|
|
} |
} |
|
|
|
|
Line 2389 RNDSEED
|
Line 2516 RNDSEED
|
} |
} |
|
|
$r->print($helper->display()); |
$r->print($helper->display()); |
|
if ($helper->{STATE} eq 'START') { |
|
&recently_generated($r); |
|
} |
&Apache::lonhelper::unregisterHelperTags(); |
&Apache::lonhelper::unregisterHelperTags(); |
|
|
return OK; |
return OK; |