--- loncom/interface/lonprintout.pm 2005/08/15 21:51:49 1.382 +++ loncom/interface/lonprintout.pm 2005/08/15 22:39:43 1.383 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.382 2005/08/15 21:51:49 foxr Exp $ +# $Id: lonprintout.pm,v 1.383 2005/08/15 22:39:43 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -44,6 +44,62 @@ use Apache::lonlocal; my $resources_printed = ''; +# 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. +# +# Parameters: +# value - proposed code value. +# max_digits - Maximum digits allowed. +# +sub is_valid_numeric_code { + my ($value, $max_digits) = @_; + # Remove leading/trailing whitespace; + $value =~ s/^\s*//; + $value =~ s/\s*$//; + + # 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 { + return "Numeric code $value has invalid characters - must only be digits"; + } +} +# 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. +# Parameters: +# value - Proposed code value. +# max_letters - Maximum number of letters. +# Note: +# leading and trailing whitespace are ignored. +# +sub is_valid_alpha_code { + my ($value, $max_letters) = @_; + + # strip leading and trailing spaces. + + $value =~ s/^\s*//g; + $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 { + return "Invalid letter code $value must only contain A-J"; + } +} + # Determine if a code entered by the user in a helper is valid. # valid depends on the code type and the type of code selected. # The type of code selected can either be numeric or @@ -60,8 +116,26 @@ my $resources_printed = ''; # sub is_code_valid { my ($code_value, $code_option) = @_; + my ($code_type, $code_length) = ('letter', 6); # defaults. + open(FG, $Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab'); + foreach my $line () { + my ($name, $type, $length) = (split(/:/, $line))[0,2,4]; + if($name eq $code_option) { + $code_length = $length; + if($type eq 'number') { + $code_type = 'number'; + } + } + } + my $valid; + if ($code_type eq 'number') { + $valid = &is_valid_numeric_code($code_value, $code_length); + } else { + $valid = &is_valid_alpha_code($code_value, $code_length); + } + - return "Entering a single code is not supported (yet)"; + 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