--- loncom/imspackages/imsprocessor.pm 2005/05/03 18:38:37 1.20 +++ loncom/imspackages/imsprocessor.pm 2005/10/14 22:28:56 1.29 @@ -24,6 +24,7 @@ package Apache::imsprocessor; use Apache::lonnet; +use Apache::loncleanup; use LWP::UserAgent; use HTTP::Request::Common; use LONCAPA::Configuration; @@ -1826,8 +1827,180 @@ sub parse_bb5_assessment { } sub parse_bb6_assessment { - my ($res,$docroot,$container,$settings,$allanswers,$allchoices,$allids) = @_; - return; + my ($res,$docroot,$container,$settings,$allanswers,$allchoices,$allids) = @_; + my $xmlfile = $docroot.'/'.$res.".dat"; + my @state = (); + my $id; # the current question ID + my $list; # the current list ID for multiple choice questions + my $response; # the current response ID + my $currtexttype; + my @curr_block = (); + my $curr_shuffle; + my $curr_class; + my $curr_matchitem; + my $curr_block_type; + my $curr_feedback_type; + my $p = HTML::Parser->new + ( + xml_mode => 1, + start_h => + [sub { + my ($tagname, $attr) = @_; + push @state, $tagname; + if ("@state" eq "questestinterop assessment") { + $$settings{title} = $attr->{title}; + } + if ("@state" eq "questestinterop assessment rubric flow_mat material mat_extension mat_formattedtext") { + $currtexttype = $attr->{type}; + } + if ("@state" eq "questestinterop section item presentation flow") { + $curr_block[0] = $attr->{class}; + if ($curr_block[0] eq 'RESPONSE_BLOCK') { + $curr_block_type = 'response'; + } elsif ($curr_block[0] eq 'RIGHT_MATCH_BLOCK') { + $curr_block_type = 'rightmatch'; + } + } + if ("@state" eq "questestinterop section item presentation flow flow") { + $curr_block[1] = $attr->{class}; + if ($curr_block[1] eq 'QUESTION_BLOCK') { + $curr_block_type = 'question'; + } + } + if ("@state" eq "questestinterop section item presentation flow flow flow") { + $curr_block[2] = $attr->{class}; + } + if ("@state" eq "questestinterop section item presentation flow flow flow material mat_extension mat_formatted_text") { + $$settings{$id}{$curr_block_type}{texttype} = $attr->{texttype}; + $currtexttype = $attr->{texttype}; + } + if ("@state" eq "questestinterop section item presentation flow flow flow material matapplication") { + $$settings{$id}{$curr_block_type}{image} = $attr->{uri}; + $$settings{$id}{$curr_block_type}{style} = $attr->{embedded}; + $$settings{$id}{$curr_block_type}{label} = $attr->{label}; + } + if ("@state" eq "questestinterop section item presentation flow flow flow material mattext") { + $$settings{$id}{$curr_block_type}{link} = $attr->{uri}; + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice") { + $curr_shuffle = $attr->{shuffle}; + } + if ("@state" eq "questestinterop section item presentation flow response_lid") { $response = $attr->{ident}; + if ($curr_class eq 'Matching') { + %{$$settings{$id}{$response}} = (); + foreach my $key (keys(%{$$settings{$id}{$curr_block_type}})) { + $$settings{$id}{$response}{$key} = $$settings{$id}{$curr_block_type}{$key}; + } + %{$$settings{$id}{$curr_block_type}} = (); + } + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow response_label") { + if (($curr_class eq 'Multiple Choice') || ($curr_class eq 'Multiple Answer') || ($curr_class eq 'Order')) { + $list = $attr->{ident}; + push(@{$$settings{$id}{lists}},$list); + $$settings{$id}{$list}{randomize} = $curr_shuffle; + %{$$settings{$id}{$list}} = (); + @{$$allanswers{$id}{$list}} = (); + @{$$settings{$id}{$list}{correctanswer}} = (); + } elsif ($curr_class eq 'Matching') { + push(@{$$settings{$id}{$response}{items}},$list); + } + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow response_label flow_mat material matapplication") { + $$settings{$id}{$list}{filetype} = $attr->{embedded}; + $$settings{$id}{$list}{label} = $attr->{label}; + $$settings{$id}{$list}{uri} = $attr->{uri}; + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow response_label flow_mat material mattext") { + $$settings{$id}{$list}{link} = $attr->{uri}; + } + if ("@state" eq "questestinterop section item resprocessing respcondition conditionvar varequal") { + if ($curr_class eq 'Matching') { + $curr_matchitem = $attr->{respident}; + } + } + if ("@state" eq "questestinterop section item itemfeedback") { + $curr_feedback_type = $attr->{ident}; + } + if ("@state" eq "questestinterop section item itemfeedback flow_mat flow_mat material matapplication") { + $$settings{$id}{$curr_feedback_type.'feedback'}{filetype} = $attr->{'embedded'}; + $$settings{$id}{$curr_feedback_type.'feedback'}{label} = $attr->{label}; + $$settings{$id}{$curr_feedback_type.'feedback'}{uri} = $attr->{uri}; + } + if ("@state" eq "questestinterop section item itemfeedback flow_mat flow_mat material mattext") { + $$settings{$id}{$curr_feedback_type.'feedback'}{link} = $attr->{uri}; + } + }, "tagname, attr"], + text_h => + [sub { + my ($text) = @_; + $text =~ s/^\s+//g; + $text =~ s/\s+$//g; + if ("@state" eq "questestinterop assessment rubric flow_mat material mat_extension mat_formattedtext") { + $$settings{description} = $text; + } elsif ("@state" eq "questestinterop assessment presentation_material flow_mat material mat_extension mat_formattedtext") { + $$settings{instructions}{text} = $text; + } + if ("@state" eq "questestinterop assessment section item itemmetadata bbmd_asi_object_id") { + $id = $text; + push @{$allids}, $id; + %{$$settings{$id}} = (); + @{$$settings{$id}{lists}} = (); + %{$$settings{$id}{question}} = (); + %{$$settings{$id}{correctfeedback}} = (); + %{$$settings{$id}{incorrectfeedback}} = (); + %{$$settings{$id}{solutionfeedback}} = (); + %{$$settings{$id}{question}} = (); + %{$$settings{$id}{response}} = (); + } + if ("@state" eq "questestinterop assessment section item itemmetadata bbmd_questiontype") { + $$settings{$id}{class} = $text; + $curr_class = $text; + } + if ("@state" eq "questestinterop assessment section item presentation flow flow flow material mat_extension mat_formatted_text") { + $$settings{$id}{$curr_block_type}{text} = $text; + } + if ("@state" eq "questestinterop section item presentation flow flow flow material mattext") { + $$settings{$id}{$curr_block_type}{linktext} = $text; + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow response_label flow_mat material mat_extension mat_formatted_text") { + $$settings{$id}{$list}{text} = $text; + } + if ("@state" eq "questestinterop section item presentation flow response_lid render_choice flow response_label flow_mat material mattext") { + $$settings{$id}{$list}{linktext} = $text; + } + if ("@state" eq "questestinterop section item resprocessing respcondition conditionvar varequal") { + if ($curr_class eq 'Multiple Choice') { + $$settings{$id}{$list}{correctanswer}[0] = $text; + } elsif ($curr_class eq 'True/False') { + $$settings{$id}{correctanswer} = $text; + } elsif ($curr_class eq 'Matching') { + $$settings{$id}{$curr_matchitem}{correctanswer} = $text; + } elsif ($curr_class eq 'Fill in the Blank') { + push(@{$$settings{$id}{$list}{correctanswer}},$text); + } + } + if ("@state" eq "questestinterop section item resprocessing respcondition conditionvar and varequal") { + push(@{$$settings{$id}{$list}{correctanswer}},$text); + } + if ("@state" eq "questestinterop section item itemfeedback flow_mat flow_mat material mat_extension mat_formattedtext") { + $$settings{$id}{$curr_feedback_type.'feedback'}{text} = $text; + } + if ("@state" eq "questestinterop section item itemfeedback flow_mat flow_mat material mattext") { + $$settings{$id}{$curr_feedback_type.'feedback'}{linkname} = $text; + } + }, "dtext"], + end_h => + [sub { + my ($tagname) = @_; + pop @state; + }, "tagname"], + ); + $p->unbroken_text(1); + $p->marked_sections(1); + $p->parse_file($xmlfile); + $p->eof; + return; } sub parse_webct4_assessment { @@ -2094,7 +2267,7 @@ sub parse_webct4_questionDB { $$settings{$id}{$numid}{toltype} = $attr->{type}; } if ("@state" eq "questestinterop section item resprocessing itemproc_extension webct:x_webct_v01_autocalculate webct:x_webct_v01_unit") { - my $unitid = $attr->{ident}; + $unitid = $attr->{ident}; %{$$settings{$id}{$numid}{$unitid}} = (); push(@{$$settings{$id}{$numid}{units}},$unitid); $$settings{$id}{$numid}{$unitid}{value} = $attr->{value}; @@ -2863,13 +3036,10 @@ sub write_webct4_questions { $allfeedback .= $feedback; } if ($$settings{$id}{texttype} eq 'text/html') { - $$settings{$id}{text} = &HTML::Entities::decode($$settings{$id}{text}); - $$settings{$id}{text} = &Apache::lonxml::htmlclean($$settings{$id}{text}); - $$settings{$id}{text} =~ s#(]+)(/?>)#$1../../resfiles/$2 />#gi; + $$settings{$id}{text} =~ s/(\&)(nbsp|gt|lt)(?!;)/$1$2;$3/gi; + $$settings{$id}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{text}); + $$settings{$id}{text} =~ s#(]+?)(/?>)#$1../../resfiles/$2 />#gi; $$settings{$id}{text} =~ s#<([bh])r>#<$1r />#g; -# $$settings{$id}{text} =~ s#

#

#g; -# $$settings{$id}{text} =~ s#

#

#; -# $$settings{$id}{text} =~ s#

##g; $$settings{$id}{text} =~ s#

#

#g; $$settings{$id}{text} =~ s#

##g; } @@ -2892,8 +3062,10 @@ sub write_webct4_questions { $resourcedata{$symb.'randomize'} = 'yes'; $resourcedata{$symb.'maxfoils'} = 10; if ($context eq 'CSTR') { - $output = qq| + unless ($$settings{$id}{class} eq 'numerical') { + $output = qq| |; + } } $$total{prob} ++; if (exists($$settings{$id}{uri})) { @@ -2954,7 +3126,7 @@ sub write_webct4_questions { } if ($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{texttype} eq 'text/html') { $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &HTML::Entities::decode($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text}); - $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &Apache::lonxml::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text}); + $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text}); $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~ s#(]+)>#$1../../resfiles/$2 />#gi; $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~ s###g; @@ -3028,7 +3200,7 @@ sub write_webct4_questions { $$settings{$id}{$grp}{$answer_id}{text} = &HTML::Entities::decode($$settings{$id}{$grp}{$answer_id}{text}); $test_for_html = &test_for_html($$settings{$id}{$grp}{$answer_id}{text}); - $$settings{$id}{$grp}{$answer_id}{text} = &Apache::lonxml::chtmlclean($$settings{$id}{$grp}{$answer_id}{text}); + $$settings{$id}{$grp}{$answer_id}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$grp}{$answer_id}{text}); $$settings{$id}{$grp}{$answer_id}{text} =~ s#( - + |; } } else { @@ -3091,7 +3263,7 @@ sub write_webct4_questions { for (my $k=0; $k<@{$$allchoices{$id}}; $k++) { if ($$settings{$id}{$$allchoices{$id}[$k]}{texttype} eq 'text/html') { $$settings{$id}{$$allchoices{$id}[$k]}{text} = &HTML::Entities::decode($$settings{$id}{$$allchoices{$id}[$k]}{text}); - $$settings{$id}{$$allchoices{$id}[$k]}{text} = &Apache::lonxml::htmlclean($$settings{$id}{$$allchoices{$id}[$k]}{text}); + $$settings{$id}{$$allchoices{$id}[$k]}{text} = &Apache::loncleanup::htmlclean($$settings{$id}{$$allchoices{$id}[$k]}{text}); $$settings{$id}{$$allchoices{$id}[$k]}{text} =~ s#( |; foreach my $numid (@{$$settings{$id}{numids}}) { my $formula = $$settings{$id}{$numid}{formula}; + my $pattern = join('|',(sort (keys (%mathfns)))); + $formula =~ s/($pattern)/\&$mathfns{$1}/g; foreach my $var (keys %{$$settings{$id}{$numid}{vars}}) { my $decnum = $$settings{$id}{$numid}{vars}{$var}{dec}; my $increment = '0.'; @@ -3266,9 +3461,7 @@ sub write_webct4_questions { } $increment .= '1'; } - $formula =~ s/{($var)}/\$$1/g; - $formula =~ s/ln\(?([^\)])\)?/ &log($1) /g; - $formula =~ s/sqrt/\&sqrt/g; + $formula =~ s/{($var)}/(\$$1)/g; $scriptblock .= qq| \$$var=&random($$settings{$id}{$numid}{vars}{$var}{min},$$settings{$id}{$numid}{vars}{$var}{max},$increment); |; @@ -3278,7 +3471,7 @@ sub write_webct4_questions { |; if ($context eq 'CSTR') { - $output = $scriptblock.$output; + $output = "\n".$scriptblock.$output; my $ansformat = ''; my $sigfig = '0,15'; if ($$settings{$id}{$numid}{format} eq 'sig') { @@ -3299,7 +3492,7 @@ sub write_webct4_questions { } my $unitentry = ''; if ($unit ne '') { - $unitentry = 'unit='.$unit; + $unitentry = 'unit="'.$unit.'"'; } $output .= qq|