version 1.201, 2006/12/14 04:59:51
|
version 1.214, 2007/05/22 00:45:43
|
Line 33 use Safe::Hole;
|
Line 33 use Safe::Hole;
|
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::lonnet; |
use Apache::lonnet; |
|
use Apache::response(); |
use Storable qw(dclone); |
use Storable qw(dclone); |
|
|
BEGIN { |
BEGIN { |
Line 40 BEGIN {
|
Line 41 BEGIN {
|
} |
} |
|
|
my %answer; |
my %answer; |
|
my @answers; |
|
sub get_answer { return %answer; }; |
|
sub push_answer{ push(@answers,dclone(\%answer)); undef(%answer) } |
|
sub pop_answer { %answer = %{pop(@answers)}; }; |
|
|
my $cur_name; |
my $cur_name; |
my $tag_internal_answer_name = 'INTERNAL'; |
my $tag_internal_answer_name = 'INTERNAL'; |
|
|
Line 55 sub start_answer {
|
Line 61 sub start_answer {
|
if (!defined($type)) { $type = 'ordered' }; |
if (!defined($type)) { $type = 'ordered' }; |
$answer{$cur_name}= { 'type' => $type, |
$answer{$cur_name}= { 'type' => $type, |
'answers' => [] }; |
'answers' => [] }; |
|
if ($target eq 'edit') { |
|
$result.=&Apache::edit::tag_start($target,$token); |
|
$result.=&Apache::edit::text_arg('Name:','name',$token); |
|
$result.=&Apache::edit::select_arg('Type:','type', |
|
[['ordered', 'Ordered' ], |
|
['unordered','Unordered'],], |
|
$token); |
|
$result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
|
} elsif ($target eq 'modified') { |
|
my $constructtag = &Apache::edit::get_new_args($token,$parstack, |
|
$safeeval,'name', |
|
'type'); |
|
if ($constructtag) { |
|
$result = &Apache::edit::rebuild_tag($token); |
|
$result.= &Apache::edit::handle_insert(); |
|
} |
|
} |
return $result; |
return $result; |
} |
} |
|
|
sub end_answer { |
sub end_answer { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result; |
my $result; |
|
if ($target eq 'edit') { |
|
$result .= &Apache::edit::tag_end(); |
|
} |
|
|
undef($cur_name); |
undef($cur_name); |
return $result; |
return $result; |
} |
} |
|
|
|
sub insert_answer { |
|
return ' |
|
<answer> |
|
<value></value> |
|
</answer>'; |
|
} |
|
|
sub start_answergroup { |
sub start_answergroup { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result; |
my $result; |
|
if ($target eq 'edit') { |
|
$result.=&Apache::edit::tag_start($target,$token); |
|
$result.=&Apache::edit::select_arg('Type:','type', |
|
[['ordered', 'Ordered' ], |
|
['unordered','Unordered'],], |
|
$token); |
|
$result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
|
} elsif ($target eq 'modified') { |
|
my $constructtag = &Apache::edit::get_new_args($token,$parstack, |
|
$safeeval,'name', |
|
'type'); |
|
if ($constructtag) { |
|
$result = &Apache::edit::rebuild_tag($token); |
|
$result.= &Apache::edit::handle_insert(); |
|
} |
|
} |
return $result; |
return $result; |
} |
} |
|
|
Line 82 sub end_answergroup {
|
Line 132 sub end_answergroup {
|
$target,$token,$tagstack,$parstack,$parser, |
$target,$token,$tagstack,$parstack,$parser, |
$safeeval,-2); |
$safeeval,-2); |
} |
} |
|
} elsif ($target eq 'edit') { |
|
$result .= &Apache::edit::tag_end(); |
} |
} |
return $result; |
return $result; |
} |
} |
|
|
|
sub insert_answergroup { |
|
return ' |
|
<answergroup> |
|
<answer> |
|
<value></value> |
|
</answer> |
|
</answergroup>'; |
|
} |
|
|
sub start_value { |
sub start_value { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result; |
my $result; |
Line 98 sub start_value {
|
Line 159 sub start_value {
|
|
|
push(@{ $answer{$cur_name}{'answers'} },[$bodytext]); |
push(@{ $answer{$cur_name}{'answers'} },[$bodytext]); |
|
|
|
} elsif ($target eq 'edit') { |
|
$result.=&Apache::edit::tag_start($target,$token); |
|
my $bodytext = &Apache::lonxml::get_all_text("/value",$parser,$style); |
|
$result.=&Apache::edit::editline($token->[1],$bodytext,undef,40). |
|
&Apache::edit::end_row(); |
|
} elsif ($target eq 'modified') { |
|
$result=$token->[4].&Apache::edit::modifiedfield('/value',$parser); |
} |
} |
return $result; |
return $result; |
} |
} |
Line 105 sub start_value {
|
Line 173 sub start_value {
|
sub end_value { |
sub end_value { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result; |
my $result; |
|
if ($target eq 'edit') { |
|
$result = &Apache::edit::end_table(); |
|
} |
return $result; |
return $result; |
} |
} |
|
|
|
sub insert_value { |
|
return ' |
|
<value></value>'; |
|
} |
|
|
sub start_vector { |
sub start_vector { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result; |
my $result; |
Line 120 sub start_vector {
|
Line 196 sub start_vector {
|
@values = split(',',$values[0]); |
@values = split(',',$values[0]); |
} |
} |
push(@{ $answer{$cur_name}{'answers'} },\@values); |
push(@{ $answer{$cur_name}{'answers'} },\@values); |
|
} elsif ($target eq 'edit') { |
|
$result.=&Apache::edit::tag_start($target,$token); |
|
my $bodytext = &Apache::lonxml::get_all_text("/vector",$parser,$style); |
|
$result.=&Apache::edit::editline($token->[1],$bodytext,undef,40). |
|
&Apache::edit::end_row(); |
|
} elsif ($target eq 'modified') { |
|
$result=$token->[4].&Apache::edit::modifiedfield('/vector',$parser); |
} |
} |
return $result; |
return $result; |
} |
} |
Line 127 sub start_vector {
|
Line 210 sub start_vector {
|
sub end_vector { |
sub end_vector { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
my $result; |
my $result; |
|
if ($target eq 'edit') { |
|
$result = &Apache::edit::end_table(); |
|
} |
return $result; |
return $result; |
} |
} |
|
|
|
sub insert_vector { |
|
return ' |
|
<value></value>'; |
|
} |
|
|
sub start_array { |
sub start_array { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result; |
my $result; |
Line 167 sub start_numericalresponse {
|
Line 258 sub start_numericalresponse {
|
&Apache::lonxml::register('Apache::caparesponse', |
&Apache::lonxml::register('Apache::caparesponse', |
('answer','answergroup','value','array','unit', |
('answer','answergroup','value','array','unit', |
'vector')); |
'vector')); |
|
push(@Apache::lonxml::namespace,'caparesponse'); |
my $id = &Apache::response::start_response($parstack,$safeeval); |
my $id = &Apache::response::start_response($parstack,$safeeval); |
my $result; |
my $result; |
undef(%answer); |
undef(%answer); |
Line 231 sub set_answertext {
|
Line 323 sub set_answertext {
|
$response_level) = @_; |
$response_level) = @_; |
&add_in_tag_answer($parstack,$safeeval,$response_level); |
&add_in_tag_answer($parstack,$safeeval,$response_level); |
|
|
|
if ($name eq '' || !ref($answer{$name})) { |
|
if (ref($answer{$tag_internal_answer_name})) { |
|
$name = $tag_internal_answer_name; |
|
} else { |
|
$name = (sort(keys(%answer)))[0]; |
|
} |
|
} |
return if ($name eq '' || !ref($answer{$name})); |
return if ($name eq '' || !ref($answer{$name})); |
|
|
my (@formats)=&Apache::lonxml::get_param_var('format',$parstack, |
my (@formats)=&Apache::lonxml::get_param_var('format',$parstack, |
Line 366 sub add_in_tag_answer {
|
Line 465 sub add_in_tag_answer {
|
my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval, |
my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval, |
$response_level); |
$response_level); |
&Apache::lonxml::debug('answer is'.join(':',@answer)); |
&Apache::lonxml::debug('answer is'.join(':',@answer)); |
if (@answer && defined($answer[0])) { |
if (@answer && $answer[0] =~ /\S/) { |
$answer{$tag_internal_answer_name}= {'type' => 'ordered', |
$answer{$tag_internal_answer_name}= {'type' => 'ordered', |
'answers' => [\@answer] }; |
'answers' => [\@answer] }; |
} |
} |
} |
} |
|
|
|
sub capa_formula_fix { |
|
my ($expression)=@_; |
|
return &Apache::response::implicit_multiplication($expression); |
|
} |
|
|
sub end_numericalresponse { |
sub end_numericalresponse { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
|
&Apache::lonxml::deregister('Apache::caparesponse', |
|
('answer','answergroup','value','array','unit', |
|
'vector')); |
|
pop(@Apache::lonxml::namespace); |
|
|
my $increment=1; |
my $increment=1; |
my $result = ''; |
my $result = ''; |
if (!$Apache::lonxml::default_homework_loaded) { |
if (!$Apache::lonxml::default_homework_loaded) { |
Line 384 sub end_numericalresponse {
|
Line 494 sub end_numericalresponse {
|
my $tag; |
my $tag; |
my $safehole = new Safe::Hole; |
my $safehole = new Safe::Hole; |
$safeeval->share_from('capa',['&caparesponse_capa_check_answer']); |
$safeeval->share_from('capa',['&caparesponse_capa_check_answer']); |
$safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check'); |
|
|
|
if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } |
if (scalar(@$tagstack)) { $tag=$$tagstack[-1]; } |
if ( $target eq 'grade' && &Apache::response::submitted() ) { |
if ( $target eq 'grade' && &Apache::response::submitted() ) { |
Line 400 sub end_numericalresponse {
|
Line 509 sub end_numericalresponse {
|
&Apache::lonxml::debug($$parstack[-1] . "\n<br>"); |
&Apache::lonxml::debug($$parstack[-1] . "\n<br>"); |
|
|
if ( &Apache::response::submitted('scantron')) { |
if ( &Apache::response::submitted('scantron')) { |
|
&add_in_tag_answer($parstack,$safeeval); |
my ($values,$display)=&make_numerical_bubbles($partid,$id, |
my ($values,$display)=&make_numerical_bubbles($partid,$id, |
$target,$parstack,$safeeval); |
$target,$parstack,$safeeval); |
$response=$values->[$response]; |
$response=$values->[$response]; |
Line 491 sub end_numericalresponse {
|
Line 601 sub end_numericalresponse {
|
} |
} |
} |
} |
} |
} |
|
&Apache::response::setup_prior_tries_hash(\&format_prior_response_numerical); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.='</td></tr>'.&Apache::edit::end_table; |
$result.='</td></tr>'.&Apache::edit::end_table; |
} elsif ($target eq 'answer' || $target eq 'analyze') { |
} elsif ($target eq 'answer' || $target eq 'analyze') { |
Line 681 sub end_numericalresponse {
|
Line 792 sub end_numericalresponse {
|
return $result; |
return $result; |
} |
} |
|
|
|
sub format_prior_response_numerical { |
|
my ($mode,$answer) = @_; |
|
if (ref($answer)) { |
|
my $result = '<table class="LC_prior_numerical"><tr>'; |
|
foreach my $element (@{ $answer }) { |
|
$result.= '<td><span class="LC_prior_numerical">'. |
|
&HTML::Entities::encode($element,'"<>&').'</span></td>'; |
|
} |
|
$result.='</tr></table>'; |
|
return $result; |
|
} |
|
return '<span class="LC_prior_numerical">'. |
|
&HTML::Entities::encode($answer,'"<>&').'</span>'; |
|
|
|
} |
|
|
sub check_for_answer_errors { |
sub check_for_answer_errors { |
my ($parstack,$safeeval) = @_; |
my ($parstack,$safeeval) = @_; |
&add_in_tag_answer($parstack,$safeeval); |
&add_in_tag_answer($parstack,$safeeval); |
Line 700 sub check_for_answer_errors {
|
Line 827 sub check_for_answer_errors {
|
use Data::Dumper; |
use Data::Dumper; |
&Apache::lonxml::debug("count dump is ".&Dumper(\%counts)); |
&Apache::lonxml::debug("count dump is ".&Dumper(\%counts)); |
my $expected_number_of_inputs = (keys(%counts))[0]; |
my $expected_number_of_inputs = (keys(%counts))[0]; |
if ( $expected_number_of_inputs != scalar(@Apache::inputtags::inputlist)) { |
if ( $expected_number_of_inputs > 0 |
|
&& $expected_number_of_inputs != scalar(@Apache::inputtags::inputlist)) { |
&Apache::lonxml::error(&mt("Expected [_1] input fields, but there were only [_2] seen.", |
&Apache::lonxml::error(&mt("Expected [_1] input fields, but there were only [_2] seen.", |
$expected_number_of_inputs, |
$expected_number_of_inputs, |
scalar(@Apache::inputtags::inputlist))); |
scalar(@Apache::inputtags::inputlist))); |
Line 900 sub get_sigrange {
|
Line 1028 sub get_sigrange {
|
return ($sig_ubound,$sig_lbound); |
return ($sig_ubound,$sig_lbound); |
} |
} |
|
|
|
sub format_prior_response_string { |
|
my ($mode,$answer) =@_; |
|
return '<span class="LC_prior_string">'. |
|
&HTML::Entities::encode($answer,'"<>&').'</span>'; |
|
} |
|
|
sub start_stringresponse { |
sub start_stringresponse { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result; |
my $result; |
Line 1077 sub end_stringresponse {
|
Line 1211 sub end_stringresponse {
|
} |
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.='</td></tr>'.&Apache::edit::end_table; |
$result.='</td></tr>'.&Apache::edit::end_table; |
|
} elsif ($target eq 'web' || $target eq 'tex') { |
|
&Apache::response::setup_prior_tries_hash(\&format_prior_response_string); |
} |
} |
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || |
if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || |
$target eq 'tex' || $target eq 'analyze') { |
$target eq 'tex' || $target eq 'analyze') { |