--- loncom/interface/lonprintout.pm 2005/08/15 22:39:43 1.383 +++ loncom/interface/lonprintout.pm 2005/10/07 10:21:08 1.394 @@ -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.394 2005/10/07 10:21:08 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -42,45 +42,72 @@ use Apache::lonratedt; use POSIX qw(strftime); 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 # 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 +115,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 +153,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 @@ -484,6 +506,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; @@ -798,6 +821,7 @@ sub print_latex_header { $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". @@ -902,6 +926,7 @@ sub get_page_breaks { sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; + my $resources_printed = ''; my $html=&Apache::lonxml::xmlbegin(); my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(<{'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 +1387,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); @@ -1585,21 +1625,13 @@ $r->print(<declareVar("showallfoils"); # 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"})) || - ($env{'form.CURRENT_STATE'} == "START")) { - $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g. - } - - + $helper->{VARS}->{FINISHPAGE} = ''; &Apache::loncommon::restore_course_settings('print', {'pagebreaks' => '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'}; + } + } + } @@ -1944,7 +1982,7 @@ sub printHelper { $helper->declareVar('SEQUENCE'); # Useful for debugging: Dump the help vars -# $r->print(Dumper($helper->{VARS})); +# $r->print(Dumper($helper->{VARS})); # $r->print($map); # If we're in a sequence... @@ -2062,6 +2100,27 @@ CHOOSE_STUDENTS if ($name =~ /^type\0/) { next; } $namechoice.=''.$name.''; } + + + 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 = "\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 .= ' '.$code."\n"; + } open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); my $codechoice=''; foreach my $line () { @@ -2084,7 +2143,8 @@ CHOOSE_STUDENTS if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) && !\$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 undef; @@ -2094,10 +2154,9 @@ CHOOSE_STUDENTS Value of CODE to print? - # Not sure of exact call context so... - use Apache::lonprintout; 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'}, \$helper->{'VARS'}{'CODE_OPTION'}); } else { @@ -2106,6 +2165,12 @@ CHOOSE_STUDENTS + Choose single code from list + + + $code_selection + + Names to store the CODEs under for later: @@ -2172,13 +2237,35 @@ CHOOSE_STUDENTS1 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 undef; + Value of CODE to print? + + + 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. + } + + + + Choose single code from list + + + $code_selection + + Names to store the CODEs under for later: @@ -2241,6 +2328,8 @@ CHOOSE_FROM_SUBDIR CHOOSE_FROM_ANY_SEQUENCE return \$res->is_sequence; return $urlValue; + return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0); +