version 1.98, 2004/01/14 22:08:22
|
version 1.105, 2004/03/25 16:55:16
|
Line 27
|
Line 27
|
# |
# |
package Apache::optionresponse; |
package Apache::optionresponse; |
use strict; |
use strict; |
use Apache::response; |
use Apache::response(); |
|
use Apache::lonlocal; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::optionresponse',('optionresponse')); |
&Apache::lonxml::register('Apache::optionresponse',('optionresponse')); |
Line 41 sub start_optionresponse {
|
Line 42 sub start_optionresponse {
|
push (@Apache::lonxml::namespace,'optionresponse'); |
push (@Apache::lonxml::namespace,'optionresponse'); |
my $id = &Apache::response::start_response($parstack,$safeeval); |
my $id = &Apache::response::start_response($parstack,$safeeval); |
%Apache::hint::option=(); |
%Apache::hint::option=(); |
|
undef(%Apache::response::foilnames); |
if ($target eq 'edit') { |
if ($target eq 'edit') { |
$result.=&Apache::edit::start_table($token). |
$result.=&Apache::edit::start_table($token). |
"<tr><td>Multiple Option Response Question ". |
"<tr><td>Multiple Option Response Question ". |
Line 75 sub end_optionresponse {
|
Line 77 sub end_optionresponse {
|
&Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup')); |
&Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup')); |
my $result; |
my $result; |
if ($target eq 'edit') { $result=&Apache::edit::end_table(); } |
if ($target eq 'edit') { $result=&Apache::edit::end_table(); } |
|
undef(%Apache::response::foilnames); |
return $result; |
return $result; |
} |
} |
|
|
Line 289 sub displayfoils {
|
Line 292 sub displayfoils {
|
my @falselist; |
my @falselist; |
my $result; |
my $result; |
my $name; |
my $name; |
my $displayoptionintex=0; |
my $displayoptionintex=1; |
my @alphabet = ('A'..'Z'); |
my @alphabet = ('A'..'Z'); |
my @whichopt = &whichfoils($max,$randomize); |
my @whichopt = &whichfoils($max,$randomize); |
my $part=$Apache::inputtags::part; |
my $part=$Apache::inputtags::part; |
Line 303 sub displayfoils {
|
Line 306 sub displayfoils {
|
my $text=$Apache::response::foilgroup{$name.'.text'}; |
my $text=$Apache::response::foilgroup{$name.'.text'}; |
my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"}); |
my %lastresponse=&Apache::lonnet::str2hash($Apache::lonhomework::history{"resource.$part.$id.submission"}); |
my $lastopt=$lastresponse{$name}; |
my $lastopt=$lastresponse{$name}; |
if ($text!~/^\s*$/) { |
if ($text!~/^\s*$/) { $break='<br />'; } |
if ($target eq 'tex') { |
|
$break='\vskip 0 mm '; |
|
} elsif ($target eq 'web') { |
|
$break='<br />'; |
|
} |
|
} |
|
$result.=$break; |
$result.=$break; |
if ($target eq 'web') { |
if ($target eq 'web') { |
my $value=$Apache::response::foilgroup{$name.'.value'}; |
my $value=$Apache::response::foilgroup{$name.'.value'}; |
Line 323 sub displayfoils {
|
Line 320 sub displayfoils {
|
$text='•'.$text; |
$text='•'.$text; |
} |
} |
$result.=$text."\n"; |
$result.=$text."\n"; |
} elsif ($target eq 'tex') { |
|
$Apache::response::foilgroup{$name.'.text'}=~s/\\item//; |
|
if ($max>1) {$result .='\item ';} |
|
$result .=' \textit{'.$Apache::response::foilgroup{$name.'.value'}.'}'. |
|
":".$Apache::response::foilgroup{$name.'.text'}."\n"; |
|
} |
} |
if ($Apache::lonhomework::type eq 'exam') { |
if ($Apache::lonhomework::type eq 'exam') { |
if ($target ne 'tex') { |
|
$result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt); |
$result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt); |
} else { |
|
$result.=&bubbles(\@alphabet,\@opt); |
|
} |
|
} |
} |
$temp++; |
$temp++; |
} |
} |
Line 363 sub displayfoils {
|
Line 351 sub displayfoils {
|
} |
} |
if ($target ne 'tex') { |
if ($target ne 'tex') { |
if ($Apache::lonhomework::type ne 'exam') { |
if ($Apache::lonhomework::type ne 'exam') { |
$optionlist='<select name="HWVAL_'. |
$optionlist='<select name="HWVAL_'. |
$Apache::inputtags::response['-1'].':'.$temp.'">'. |
$Apache::inputtags::response['-1'].':'.$temp.'">'. |
$optionlist."</select>\n"; |
$optionlist."</select>\n"; |
|
} else { |
|
$optionlist='<u>'.(' 'x10).'</u>'; |
} |
} |
my $text=$Apache::response::foilgroup{$name.'.text'}; |
if ($text=~s|<drawoptionlist\s*/>|$optionlist|) { |
if (!($text=~s|<drawoptionlist\s*/>|$optionlist|) && $Apache::lonhomework::type ne 'exam') { |
if ($Apache::lonhomework::type ne 'exam') { |
$text=$optionlist.$text; |
$text='•'.$text; |
|
} |
} else { |
} else { |
$text='•'.$text; |
if ($Apache::lonhomework::type ne 'exam') { |
|
$text=$optionlist.$text; |
|
} |
} |
} |
$result.=$break.$text."\n"; |
$result.=$break.$text."\n"; |
if ($Apache::lonhomework::type eq 'exam') { |
if ($Apache::lonhomework::type eq 'exam') { |
$result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt); |
$result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt); |
} |
} |
$temp++; |
$temp++; |
} else { |
} else { |
my $texoptionlist = &optionlist_correction($optionlist); |
my $texoptionlist=''; |
if ($displayoptionintex == 0) { |
if ($displayoptionintex && |
if ($Apache::lonhomework::type eq 'exam') {$texoptionlist='';} #if exam we do not need to show optionlist |
$Apache::lonhomework::type ne 'exam') { |
if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) { |
$texoptionlist = &optionlist_correction(@opt); |
if ($Apache::lonhomework::type eq 'exam') { |
} |
$Apache::response::foilgroup{$name.'.text'}=~s/\\item/\\vskip 2 mm/; |
if ($text=~/<drawoptionlist\s*\/>/) { |
} |
$text=~s|<drawoptionlist\s*/>| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |; |
if ($Apache::response::foilgroup{$name.'.text'}=~/<drawoptionlist\s*\/>/) { |
} |
$Apache::response::foilgroup{$name.'.text'}=~s|<drawoptionlist\s*/>| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |; |
|
} |
if ($text=~m/\\item /) { |
$result.= $texoptionlist.$Apache::response::foilgroup{$name.'.text'}; |
|
} else { |
|
if ($Apache::lonhomework::type eq 'exam') { |
|
$result.= $texoptionlist.' '.$Apache::response::foilgroup{$name.'.text'}; |
|
} else { |
|
$result.= $texoptionlist.'\vspace*{-2 mm}\item '.$Apache::response::foilgroup{$name.'.text'}; |
|
} |
|
} |
|
if ($Apache::lonhomework::type eq 'exam') { |
if ($Apache::lonhomework::type eq 'exam') { |
$result.='\vskip -2 mm\parbox{\textwidth}{\begin{enumerate}\item[\textbf{'.$internal_counter.'}.]\parbox{\textwidth - 5 mm}{'.&bubbles(\@alphabet,\@opt).'}\end{enumerate}} \vskip -9 mm \strut '; |
$text=~s/\\item/\\vskip 2 mm/; |
$internal_counter++; |
|
} |
} |
$displayoptionintex=1; |
$result.= $texoptionlist.$text; |
} else { |
} else { |
if ($Apache::response::foilgroup{$name.'.text'}=~m/\\item /) { |
|
if ($Apache::lonhomework::type eq 'exam') { |
|
$Apache::response::foilgroup{$name.'.text'}=~s/\\item//; |
|
} |
|
if ($Apache::response::foilgroup{$name.'.text'}=~/<drawoptionlist\s*\/>/) { |
|
$Apache::response::foilgroup{$name.'.text'}=~s|<drawoptionlist\s*/>| \\makebox\[0\.3in\]\[b\]\{\\hrulefill\} |; |
|
} |
|
$result.= $Apache::response::foilgroup{$name.'.text'}; |
|
} else { |
|
if ($Apache::lonhomework::type eq 'exam') { |
|
$result.= ' '.$Apache::response::foilgroup{$name.'.text'}; |
|
} else { |
|
$result.= '\item '.$Apache::response::foilgroup{$name.'.text'}; |
|
} |
|
} |
|
if ($Apache::lonhomework::type eq 'exam') { |
if ($Apache::lonhomework::type eq 'exam') { |
$result.='\vskip -2 mm \parbox{\textwidth}{\begin{enumerate}\item[\textbf{'.$internal_counter.'}.]\parbox{\textwidth - 5 mm}{'.&bubbles(\@alphabet,\@opt).'}\end{enumerate}} \vskip -9 mm \strut '; |
$result.= $texoptionlist.' '.$text; |
$internal_counter++; |
} else { |
|
$result.= $texoptionlist.'\vspace*{-2 mm}\item '.$text; |
} |
} |
} |
} |
|
if ($Apache::lonhomework::type eq 'exam') { |
|
$result.='\vskip -1 mm\noindent\begin{enumerate}\item[\textbf{'. |
|
$internal_counter.'}.]'.&bubbles(\@alphabet,\@opt). |
|
'\end{enumerate} \vskip -8 mm \strut '; |
|
$internal_counter++; |
|
} |
|
$displayoptionintex=0; |
} |
} |
} |
} |
} |
} |
Line 435 sub displayfoils {
|
Line 412 sub displayfoils {
|
|
|
|
|
sub optionlist_correction { |
sub optionlist_correction { |
|
my @options = @_; |
my $texoptionlist = shift; |
my $texoptionlist='\\item [] Choices: '; |
if ($texoptionlist=~/<option selected/ or $texoptionlist=~/<option>[^<]+<\/option>/) { |
if (scalar(@options) > 0) { |
$texoptionlist =~ s/<option><\/option>/\\item \[\] Choices: /; |
foreach my $option (@options) { |
$texoptionlist =~ s/<option>/\{\\bf /g; |
$texoptionlist.='{\bf '. |
$texoptionlist =~ s/<option selected="on">/\{\\bf /g; |
&Apache::lonxml::latex_special_symbols($option). |
$texoptionlist =~ s/<\/option>/\},/g; |
'},'; |
$texoptionlist =~ s/,$/\./g; |
} |
$texoptionlist =~ s/>/\$>\$/g; |
chop($texoptionlist); |
$texoptionlist =~ s/</\$<\$/g; |
$texoptionlist.='.'; |
$texoptionlist =~ s/=/\$=\$/g; |
|
$texoptionlist =~ s/\^(\d+)/\$^{$1}\$/g; |
|
} else { |
} else { |
$texoptionlist =~ s/<option><\/option>/\\item \[\] \\vskip -5 mm/; |
$texoptionlist='\\item [] \\vskip -5 mm'; |
} |
} |
return $texoptionlist; |
return $texoptionlist; |
} |
} |
|
|
|
|
sub webbubbles { |
sub webbubbles { |
|
|
my ($ropt,$ralphabet,$temp,$lastopt)=@_; |
my ($ropt,$ralphabet,$temp,$lastopt)=@_; |
my @opt=@$ropt; |
my @opt=@$ropt; |
my @alphabet=@$ralphabet; |
my @alphabet=@$ralphabet; |
Line 478 sub webbubbles {
|
Line 452 sub webbubbles {
|
|
|
|
|
sub bubbles { |
sub bubbles { |
|
|
my ($ralphabit,$ropt) = @_; |
my ($ralphabit,$ropt) = @_; |
my @alphabet = @$ralphabit; |
my @alphabet = @$ralphabit; |
my @opt = @$ropt; |
my @opt = @$ropt; |
my ($result,$head,$line) =('','',''); |
my ($result,$head,$line) =('','',''); |
my $number_of_bubbles = $#opt + 1; |
my $number_of_bubbles = $#opt + 1; |
my $current_length = 0; |
my $current_length = 0; |
|
my $textwidth; |
|
if ($ENV{'form.textwidth'} ne '') { |
|
$ENV{'form.textwidth'}=~/(\d+)/; |
|
$textwidth=$1; |
|
} else { |
|
$ENV{'textwidth'}=~/(\d*)\.?(\d*)/; |
|
$textwidth=$1.'.'.$2; |
|
} |
for (my $ind=0;$ind<=$number_of_bubbles;$ind++) { |
for (my $ind=0;$ind<=$number_of_bubbles;$ind++) { |
$current_length += (length($opt[$ind])+length($alphabet[$ind])+2)*2; |
my $leftmargin; |
if ($current_length<0.9*$ENV{'form.textwidth'} and $ind!=$number_of_bubbles) { |
$opt[$ind]=&Apache::lonxml::latex_special_symbols($opt[$ind]); |
|
if ($ind==0) {$leftmargin=6;} else {$leftmargin=10;} |
|
$current_length += (length($opt[$ind])+length($alphabet[$ind])+4)*2; |
|
if ($current_length<($textwidth-$leftmargin) and $ind!=$number_of_bubbles) { |
$line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & '; |
$line.='\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & '; |
$head.='lr'; |
$head.='lr'; |
} else { |
} else { |
$line=~s/\&\s*$//; |
$line=~s/\&\s*$//; |
$result.='\vskip -5 mm\begin{tabular}{'.$head.'}\\\\'.$line.'\\\\\end{tabular}'; |
$result.='\vskip -2 mm\noindent\begin{tabular}{'.$head.'}'.$line.'\\\\\end{tabular}'; |
$line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';; |
$line = '\hskip -1 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$\hskip -1 mm & \hskip -3 mm {\small '.$opt[$ind].'} & ';; |
$head ='lr'; |
$head ='lr'; |
$current_length = (length($opt[$ind])+length($alphabet[$ind]))*2; |
$current_length = (length($opt[$ind])+length($alphabet[$ind]))*2; |
Line 546 sub start_foil {
|
Line 530 sub start_foil {
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $result=''; |
my $result=''; |
if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) { |
if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) { |
&Apache::lonxml::startredirection; |
&Apache::lonxml::startredirection; |
|
if ($target eq 'analyze') { |
|
&Apache::response::check_if_computed($token,$parstack,$safeeval,'value'); |
|
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result=&Apache::edit::tag_start($target,$token,"Foil"); |
$result=&Apache::edit::tag_start($target,$token,"Foil"); |
my $level='-2'; |
my $level='-2'; |
Line 584 sub end_foil {
|
Line 571 sub end_foil {
|
my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); |
my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); |
if ($value ne 'unused') { |
if ($value ne 'unused') { |
my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); |
my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); |
my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval); |
|
&Apache::lonxml::debug("Got a name of :$name:"); |
&Apache::lonxml::debug("Got a name of :$name:"); |
if (!$name) { $name=$Apache::lonxml::curdepth; } |
if (!$name) { $name=$Apache::lonxml::curdepth; } |
&Apache::lonxml::debug("Using a name of :$name:"); |
&Apache::lonxml::debug("Using a name of :$name:"); |
|
if (defined($Apache::response::foilnames{$name})) { |
|
&Apache::lonxml::error(&mt("Foil name <b><tt>[_1]</tt></b> appears more than once. Foil names need to be unique.",$name)); |
|
} |
|
$Apache::response::foilnames{$name}++; |
|
my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval); |
if ( $Apache::optionresponse::conceptgroup |
if ( $Apache::optionresponse::conceptgroup |
&& !&Apache::response::showallfoils() ) { |
&& !&Apache::response::showallfoils() ) { |
push @{ $Apache::response::conceptgroup{'names'} }, $name; |
push @{ $Apache::response::conceptgroup{'names'} }, $name; |