--- loncom/homework/inputtags.pm 2000/10/11 21:01:25 1.6
+++ loncom/homework/inputtags.pm 2001/01/05 01:14:49 1.21
@@ -5,38 +5,65 @@ package Apache::inputtags;
use strict;
sub BEGIN {
- &Apache::lonxml::register('Apache::inputtags',('textarea','textline','answergroup','datasubmission'));
+ &Apache::lonxml::register('Apache::inputtags',('textarea','textline','datasubmission'));
}
+
sub initialize_inputtags {
- $Apache::inputtags::curvalue=0;
+ @Apache::inputtags::input=();
+ @Apache::inputtags::inputlist=();
+ @Apache::inputtags::response=();
+ @Apache::inputtags::responselist=();
+ @Apache::inputtags::answergroup=();
+ $Apache::inputtags::part='';
+ @Apache::inputtags::status=();
+ %Apache::inputtags::params=();
+}
+
+sub start_input {
+ my ($parstack,$safeeval)=@_;
+ my $args ='';
+ if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
+ my $id = &Apache::run::run("{$args;".'return $id}',$safeeval);
+ push (@Apache::inputtags::input,$id);
+ push (@Apache::inputtags::inputlist,$id);
+ return $id;
+}
+
+sub end_input {
+ pop @Apache::inputtags::input;
+ return '';
}
sub start_textarea {
my ($target,$token,$parstack,$parser,$safeeval)=@_;
my $result = "";
- $Apache::inputtags::curvalue++;
+ my $id = &start_input($parstack,$safeeval);
if ($target eq 'web') {
- $result= '";
+ }
+ &end_input;
+ return '';
}
sub start_textline {
my ($target,$token,$parstack,$parser,$safeeval)=@_;
my $result = "";
- $Apache::inputtags::curvalue++;
- my $args ='';
- if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
- my $size = &Apache::run::run("{$args;".'return $size}',$safeeval);
- if ($size eq '') { $size=20; }
if ($target eq 'web') {
- $result= '';
+ my $args ='';
+ if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
+ my $size = &Apache::run::run("{$args;".'return $size}',$safeeval);
+ if ($size eq '') { $size=20; }
+ my $oldresponse = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.$Apache::inputtags::response['-1'].submission"};
+ $result= '';
}
return $result;
}
@@ -46,27 +73,211 @@ sub end_textline {
return "";
}
-sub start_answergroup {
+#answergroup is deprecated
+#sub start_answergroup {
+# my ($target,$token,$parstack,$parser,$safeeval)=@_;
+# my $args ='';
+# if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
+# my $id = &Apache::run::run("{$args;".'return $id}',$safeeval);
+# push (@Apache::inputtags::answergroup,$id);
+# if ($target == 'web') {
+#
+# }
+# return '';
+#}
+#
+#sub end_answergroup {
+# my ($target,$token,$parstack,$parser,$safeeval)=@_;
+# return ''; # has ben deprecated
+# my $args ='';
+# if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
+# my $id = &Apache::run::run("{$args;".'return $id}',$safeeval);
+# push (@Apache::inputtags::answergroup,$id);
+# my $result='';
+# my $button='';
+# my $showbutton='1';
+# my $usedtry='1';
+# my $response='';
+# if ( $target == 'web' ) {
+# if ( defined $ENV{'form.submit'}) {
+# }
+# if ($showbutton > 0) { $result.=$button }
+# }
+# pop @Apache::inputtags::answergroup;
+# return $result;
+#}
+
+
+sub start_datasubmission {
}
-sub end_answergroup {
+sub end_datasubmission {
my ($target,$token,$parstack,$parser,$safeeval)=@_;
if ( $target == 'web' ) {
- return '';
+ return '';
+ }
+ return '';
+}
+
+sub finalizeawards {
+ my $result='';
+ my $award;
+ if ($#_ == '-1') { $result = "NO_RESPONSE"; }
+ if ($result eq '' ) {
+ foreach $award (@_) { if ($award eq '') {$result='MISSING_ANSWER'; last;}}
+ }
+ if ($result eq '' ) {
+ foreach $award (@_) { if ($award eq 'ERROR') {$result='ERROR'; last;}}
+ }
+
+ if ($result eq '' ) {
+ foreach $award (@_) {
+ if ($award eq 'UNIT_FAIL' ||
+ $award eq 'NO_UNIT' ||
+ $award eq 'UNIT_NOTNEEDED') {
+ $result=$award; last;
+ }
+ }
+ }
+ if ($result eq '' ) {
+ foreach $award (@_) {
+ if ($award eq 'WANTED_NUMERIC' ||
+ $award eq 'BAD_FORMULA') {$result=$award; last;}
+ }
+ }
+ if ($result eq '' ) {
+ foreach $award (@_) { if ($award eq 'SIG_FAIL') {$result=$award; last;} }
+ }
+ if ($result eq '' ) {
+ foreach $award (@_) { if ($award eq 'INCORRECT') {$result=$award; last;} }
+ }
+ if ($result eq '' ) {
+ foreach $award (@_) { if ($award eq 'APPROX_ANS') {$result=$award; last;} }
}
+ if ($result eq '' ) { $result='EXACT_ANS'; }
+ return $result
}
+sub decideoutput {
+ my ($award)=@_;
+ my $message='';
+ my $button=0;
+ if ($award eq 'EXACT_ANS' || $award eq 'APPROX_ANS' ) {
+ $message = "You are correct. You receipt is ".&Apache::lonnet::receipt;
+ $button=0;
+ } elsif ($award eq 'NO_RESPONSE') {
+ $message = '';
+ $button=1;
+ } elsif ($award eq 'MISSING_ANSWER') {
+ $message = 'Some parts were not submitted';
+ $button = 1;
+ } elsif ($award eq 'WANTED_NUMERIC') {
+ $message = "This question expects a numeric answer";
+ $button=1;
+ } elsif ($award eq 'SIG_FAIL') {
+ $message = "Please adjust significant figures.";# you provided %s significant figures";
+ $button=1;
+ } elsif ($award eq 'UNIT_FAIL') {
+ $message = "Units incorrect."; #Computer reads units as %s";
+ $button=1;
+ } elsif ($award eq 'UNIT_NOTNEEDED') {
+ $message = "Only a number required.";# Computer reads units of %s";
+ $button=1;
+ } elsif ($award eq 'NO_UNIT') {
+ $message = "Units required";
+ $button=1;
+ } elsif ($award eq 'BAD_FORMULA') {
+ $message = "Unable to understand formula";
+ $button=1;
+ } elsif ($award eq 'INCORRECT') {
+ $message = "Incorrect";
+ $button=1;
+ } else {
+ $message = "Unknown message: $award";
+ $button=1;
+ }
+ return ($button,$message);
+}
-sub start_datasubmission {
+sub setgradedata {
+ my ($award,$id) = @_;
+ if ( $award eq 'APPROX_ANS' || $award eq 'EXACT_ANS' ) {
+ $Apache::lonhomework::results{"resource.$id.tries"} =
+ $Apache::lonhomework::history{"resource.$id.tries"} + 1;
+ $Apache::lonhomework::results{"resource.$id.solved"} =
+ 'correct_by_student';
+ $Apache::lonhomework::results{"resource.$id.awarded"} = '1';
+ } elsif ( $award eq 'INCORRECT' ) {
+ $Apache::lonhomework::results{"resource.$id.tries"} =
+ $Apache::lonhomework::history{"resource.$id.tries"} + 1;
+ $Apache::lonhomework::results{"resource.$id.solved"} =
+ 'incorrect_attempted';
+ } else {
+ $Apache::lonhomework::results{"resource.$id.solved"} =
+ 'incorrect_attempted';
+ }
+ $Apache::lonhomework::results{"resource.$id.award"} = $award;
}
-sub end_datasubmission {
- my ($target,$token,$parstack,$parser,$safeeval)=@_;
+sub grade {
+ my ($target) = @_;
+ my $id = $Apache::inputtags::part;
+# my $result='';
+ my $response='';
if ( $target == 'web' ) {
- return '';
+ if ( defined $ENV{'form.submit'}) {
+ my @awards = ();
+ &Apache::lonxml::debug("$#Apache::inputtags::responselist");
+ foreach $response (@Apache::inputtags::responselist) {
+ &Apache::lonxml::debug("looking for response.$id.$response.awarddetail");
+ my $value=$Apache::lonhomework::results{"resource.$id.$response.awarddetail"};
+ if ( $value ne '' ) {
+ &Apache::lonxml::debug("keep ing $value from $response for $id");
+ push (@awards,$value);
+ } else {
+ &Apache::lonxml::debug("skipping $value from $response for $id");
+ }
+ }
+ my $finalaward = &finalizeawards(@awards);
+ &Apache::lonxml::debug("final award $finalaward");
+ &setgradedata($finalaward,$id);
+ }
}
+ return '';
}
+sub gradestatus {
+ my ($id) = @_;
+ my $showbutton = 1;
+ my $message = '';
+ my $trystr='';
+ my $button='';
+
+ my $status = $Apache::inputtags::status['-1'];
+ &Apache::lonxml::debug("gradestatus has :$status:");
+ if ( $status eq 'CAN_ANSWER' || $status eq 'SHOW_ANSWER' ) {
+ my $award = $Apache::lonhomework::history{"resource.$id.award"};
+ &Apache::lonxml::debug("Found Award |$award|");
+ if ( $award ne '' ) {
+ &Apache::lonxml::debug('Getting message');
+ ($showbutton,$message) = &decideoutput($award);
+ }
+ my $tries = $Apache::lonhomework::history{"resource.$id.tries"};
+ my $maxtries = &Apache::lonnet::EXT("resource.$id.maxtries");
+ &Apache::lonxml::debug("got maxtries of :$maxtries:");
+ if ( $tries eq '' ) { $tries = '0'; }
+ if ( $maxtries eq '' ) { $maxtries = '2'; }
+ if ( $showbutton ) {
+ $trystr = "
Tries $tries/$maxtries";
+ }
+ if ( $tries >= $maxtries ) { $showbutton = 0; }
+ if ( $status eq 'SHOW_ANSWER' ) { $showbutton = 0; }
+ if ( $showbutton ) {
+ $button = '
';
+ }
+ }
+ return $button.$message.$trystr;
+}
1;
__END__