--- loncom/imspackages/imsprocessor.pm 2006/04/04 17:42:28 1.36 +++ loncom/imspackages/imsprocessor.pm 2006/04/05 19:45:53 1.38 @@ -2267,6 +2267,7 @@ sub parse_webctvista4_question { my $currindex; my %varinfo = (); my $formula; + my $jumbnum = 0; my $p = HTML::Parser->new ( xml_mode => 1, @@ -2332,6 +2333,8 @@ sub parse_webctvista4_question { %{$$settings{$id}{$list}} = (); @{$$allanswers{$id}{$list}} = (); @{$$settings{$id}{$list}{correctanswer}} = (); + @{$$settings{$id}{$list}{jumbledtext}} = (); + @{$$settings{$id}{$list}{jumbledtype}} = (); @{$$settings{$id}{$list}{jumbled}} = (); $$settings{$id}{$list}{rcardinality} = $attr->{rcardinality}; } @@ -2350,12 +2353,20 @@ sub parse_webctvista4_question { $currtexttype = lc($attr->{texttype}); $$settings{$id}{$list}{$jumble_item}{texttype} = $currtexttype; } + if ("@state" eq "questestinterop item resprocessing respcondition") { # Jumbled + if ($$settings{$id}{class} eq 'jumbled') { + $jumbnum ++; + @{$$settings{$id}{$list}{jumbled}[$jumbnum]} = (); + } + } + if ("@state" eq "questestinterop item resprocessing respcondition conditionvar and varequal") { # Jumbled $currindex = $attr->{index}; } if ("@state" eq "questestinterop item presentation flow response_lid render_choice") { $$settings{$id}{$list}{randomize} = $attr->{shuffle}; } +# Multiple Choice, True/False and Combination if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label") { $answer_id = $attr->{ident}; push(@{$$allanswers{$id}{$list}},$answer_id); @@ -2414,6 +2425,7 @@ sub parse_webctvista4_question { $grp = $attr->{ident}; push(@{$$settings{$id}{grps}},$grp); %{$$settings{$id}{$grp}} = (); + @{$$allanswers{$id}{$grp}} = (); @{$$settings{$id}{$grp}{correctanswer}} = (); $$settings{$id}{$grp}{rcardinality} = $attr->{rcardinality}; } @@ -2421,7 +2433,7 @@ sub parse_webctvista4_question { $currtexttype = lc($attr->{texttype}); $$settings{$id}{$grp}{texttype} = $currtexttype; } - if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice response_label") { + if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice flow_label response_label") { $answer_id = $attr->{ident}; push(@{$$allanswers{$id}{$grp}},$answer_id); %{$$settings{$id}{$grp}{$answer_id}} = (); @@ -2535,18 +2547,22 @@ sub parse_webctvista4_question { $$settings{$id}{$str_id}{$label}{$textlabel} = $text; } } +# Matching if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label material mattext") { $$settings{$id}{$list}{$answer_id}{text} .= $text; } +# Multiple choice, True/False, Combination if ("@state" eq "questestinterop item presentation flow response_lid render_choice flow_label response_label material mat_extension webct:localizable_mattext") { $$settings{$id}{$list}{$answer_id}{text} = $text; } if ("@state" eq "questestinterop item presentation flow response_lid render_extension ims_render_object material mattext") { - $$settings{$id}{$list}{text} .= $text; + push(@{$$settings{$id}{$list}{jumbledtext}},$text); + push(@{$$settings{$id}{$list}{jumbledtype}},'No'); } if ("@state" eq "questestinterop item presentation flow response_lid render_extension ims_render_object response_label material mattext") { $$settings{$id}{$list}{$jumble_item}{text} = $text; - $$settings{$id}{$list}{text} .= $text; + push(@{$$settings{$id}{$list}{jumbledtext}},$text); + push(@{$$settings{$id}{$list}{jumbledtype}},'Yes'); } if ("@state" eq "questestinterop item presentation flow material mattext") { $$settings{$id}{text} .= $text; @@ -2559,6 +2575,17 @@ sub parse_webctvista4_question { } } } +# Matching + if ("@state" eq "questestinterop item presentation flow flow response_grp material mattext") { + $$settings{$id}{$grp}{text} = $text; + unless ($text eq '') { + push(@{$$allchoices{$id}},$grp); + } + } + if ("@state" eq "questestinterop item presentation flow flow response_grp render_choice flow_label response_label material mattext") { + $$settings{$id}{$grp}{$answer_id}{text} = $text; + } +# Numerical if ("@state" eq "questestinterop item resprocessing itemproc_extension unit_eval conditionvar varequal") { $$settings{$id}{$numid}{$unitid}{text} = $text; } @@ -2582,8 +2609,9 @@ sub parse_webctvista4_question { } } } + if ("@state" eq "questestinterop item resprocessing respcondition conditionvar and varequal") { # Jumbled - $$settings{$id}{$list}{jumbled}[$currindex] = $text; + $$settings{$id}{$list}{jumbled}[$jumbnum][$currindex] = $text; } if ("@state" eq "questestinterop item resprocessing respcondition setvar") { if ($setvar{varname} eq "SCORE") { # Multiple Choice, String or Match @@ -3749,6 +3777,62 @@ sub write_webct4_questions { $resourcedata{$symb.'hiddenparts'} = '!essay'; $resourcedata{$symb.'questiontype'} = 'essay'; } + } elsif ($$settings{$id}{class} eq 'jumbled') { + if ($context eq 'CSTR') { + my %foiloptions = (); + foreach my $list (@{$$settings{$id}{lists}}) { + @{$foiloptions{$list}} = (); + my $numalternates = @{$$settings{$id}{$list}{jumbled}} - 1; + my $loopstop = 2; #Hard coded for now, so only one permutation of answers is correct; functionality is needed to support the case where multiple permutations are correct. + for (my $i=1; $i<$loopstop; $i++) { + $foiloptions{$list}[$i] = '('; + for (my $j=@{$$settings{$id}{$list}{jumbled}[$i]}-1; $j>0; $j--) { + my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$j]; + $foiloptions{$list}[$i] .= "'".$$settings{$id}{$list}{$jumble_item}{text}."',"; + } + $foiloptions{$list}[$i] =~ s/,$//; + $foiloptions{$list}[$i] .= ')'; + my $jnum = 0; + for (my $k=0; $k<@{$$settings{$id}{$list}{jumbledtype}}; $k++) { + if ($$settings{$id}{$list}{jumbledtype}[$k] eq 'No') { + $output .= qq| + +$$settings{$id}{$list}{jumbledtext}[$k] +|; + } elsif ($$settings{$id}{$list}{jumbledtype}[$k] eq 'Yes') { + $jnum ++; + my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$jnum]; + $output .= qq| + + + + + +|; + } + } + } + if ($numalternates > 0) { # for now alternates are stored in an instructorcomment. In the future these alternates could be moved into the main response area once functionality is available. + $output .= '(Not shown to students) '."\n".'The following alternates were imported from the corresponding WebCT Vista 4 jumbled sentence question, but are not included in the LON-CAPA version, because this style of question does not currently support multiple correct solutions.'."\n"; + for (my $i=2; $i<@{$$settings{$id}{$list}{jumbled}}; $i++) { + my $altid = $i-1; + my $jnum = 0; + $output .= $altid.'. '; + for (my $k=0; $k<@{$$settings{$id}{$list}{jumbledtype}}; $k++) { + if ($$settings{$id}{$list}{jumbledtype}[$k] eq 'No') { + $output .= "$$settings{$id}{$list}{jumbledtext}[$k]" ; + } elsif ($$settings{$id}{$list}{jumbledtype}[$k] eq 'Yes') { + $jnum ++; + my $jumble_item = $$settings{$id}{$list}{jumbled}[$i][$jnum]; + $output .= '['.$$settings{$id}{$list}{$jumble_item}{text}.']'; + } + } + $output .= " \n"; + } + $output .= ''; + } + } + } } else { if ($context eq 'CSTR') { $output .= qq|

$$settings{$id}{text}

$questionimage\n|; @@ -3831,7 +3915,6 @@ 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::loncleanup::htmlclean($$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text}); - $$settings{$id}{$list}{$$allanswers{$id}{$list}[$k]}{text} =~ s#(