--- loncom/homework/default_homework.lcpm 2004/03/16 19:47:47 1.74 +++ loncom/homework/default_homework.lcpm 2004/05/27 03:46:02 1.83 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # -# $Id: default_homework.lcpm,v 1.74 2004/03/16 19:47:47 albertel Exp $ +# $Id: default_homework.lcpm,v 1.83 2004/05/27 03:46:02 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,12 +26,7 @@ # http://www.lon-capa.org/ # # -# Guy Albertelli -# -# 05/25/2001 H. K. Ng -# 05/31/2001 H. K. Ng -# 12/21/2001 Matthew -# + #init some globals $hidden::RANDOMINIT=0; $pi=atan2(1,1)*4; @@ -68,7 +63,13 @@ sub caparesponse_check { } else { $message .="no ws in :$response:\n"; } - + if ($type eq 'cs' || $type eq 'ci' || $type eq 'mc') { + #for string answers make surec all places spaces occur, there is + #really only 1 space, in both the answer and the response + $answer=~s/ +/ /g; + $response=~s/ +/ /g; + } + if ($type eq 'float') { $response=~s/,//g; } if (length($response) > 500) { return "TOO_LONG: Answer too long"; } if ($type eq '' ) { @@ -135,10 +136,14 @@ sub caparesponse_check { elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } elsif ($result =='10') { $result='SUB_RECORDED'; } elsif ($result =='11') { $result='BAD_FORMULA'; } - elsif ($result =='12') { $result='WANTED_NUMERIC'; } + elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; } + elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; } + elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; } + elsif ($result =='143') { $result='UNIT_INVALID_STUDENT'; } + elsif ($result =='15') { $result='UNIT_IRRECONCIBLE'; } else {$result = "ERROR: Unknown Result:$result:$@:";} - return ("$result:\nRetError $reterror:\nError $error:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message",$reterror); + return ("$result:\nRetError $reterror:\nAnswer $answer:\nResponse $response:\n type-$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$unit|\n$message",$reterror); } @@ -168,7 +173,7 @@ sub caparesponse_check_list { $unit=$2; } } - $result.="Final final response :$responselist['-1']:\n"; + $result.="Final final response :$responselist['-1']:$unit:\n"; $result.=":$#list: answers\n"; $unit=~s/\s//; my $i=0; @@ -476,25 +481,81 @@ sub floor {return (($_[0]-CORE::int($_[ sub format { my ($value,$fmt)=@_; - my $dollarmode; - if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } + my ($dollarmode,$commamode,$alwaysperiod,$options); + if ($fmt =~ /^([^\d]*)(.*)/) { $options=$1; $fmt=$2; } + #if ($options =~ /\$/) { $dollamode=1; } + #if ($options =~ /,/) { $commamode=1; } + if ($options =~ /\./) { $alwaysperiod=1; } $fmt=~s/e/E/g; my $result=sprintf('%.'.$fmt,$value); + if ($alwaysperiod && $fmt eq '0f') { $result .='.'; } $result=~s/(E[+-]*)0/$1/; - if ($dollarmode) {$result=&dollarmode($result);} + #if ($dollarmode) {$result=&dollarformat($result);} + #if ($commamode) {$result=&commaformat($result);} return $result; } +sub chemparse { + my ($reaction) = @_; + my @tokens = split(/(\s\+|\->|<=>)/,$reaction); + my $formula = ''; + foreach my $token (@tokens) { + if ($token eq '->' ) { + $formula .= '\ensuremath{\rightarrow} '; + next; + } + if ($token eq '<=>') { + if ($external::target eq 'web' && + &EXT('request.browser.unicode')) { + $formula .= '⇌ '; + } else { + $formula .= &web('<=> ','\ensuremath{\rightleftharpoons} ', + '<=$gt; '); + } + next; + } + $token =~ /^\s*(\d*)(.*)/; + $formula .= $1 if ($1 > 1); # stoichiometric coefficient + + my $molecule = $2; + # subscripts + $molecule =~ s|(?<=[a-zA-Z\)\]\s])(\d+)|$1|g; + # superscripts + $molecule =~ s|\^(\d*[+\-]*)|$1|g; + # strip whitespace + $molecule =~ s/\s*//g; + # forced space + $molecule =~ s/_/ /g; + $formula .= $molecule.' '; + } + # get rid of trailing space + $formula =~ s/(\Q${nbsp}\E| )$//; + + return &xmlparse($formula); +} + sub prettyprint { my ($value,$fmt,$target)=@_; my $result; - my $dollarmode; if (!$target) { $target = $external::target; } - if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } + if ($fmt =~ /chem/i) { return(&chemparse($value)); } + my ($dollarmode,$commamode,$alwaysperiod,$options); + if ($fmt =~ /^([^\d]*)(.*)/) { $options=$1; $fmt=$2; } + if ($options =~ /\$/) { $dollamode=1; } + if ($options =~ /,/) { $commamode=1; } + if ($options =~ /\./) { $alwaysperiod=1; } if ($fmt) { $value=sprintf('%.'.$fmt,$value); } + if ($alwaysperiod && $fmt eq '0f') { + if ($target eq 'tex') { + $value .='\\ensuremath{.}'; + } else { + $value .='.'; + } + } if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/i ) { my $frac=$1; if ($dollarmode) { $frac=&dollarformat($frac); } + if ($commamode) { $frac=&commaformat($frac); } my $exponent=$2; $exponent=~s/^\+0*//; $exponent=~s/^-0*/-/; @@ -514,13 +575,13 @@ sub prettyprint { } else { $result=$value; if ($dollarmode) { $result=&dollarformat($result,$target); } + if ($commamode) { $result=&commaformat($result,$target); } } return $result; } -sub dollarformat { +sub commaformat { my ($number,$target) = @_; - if (!$target) { $target = $external::target; } if ($number =~ /\./) { while ($number =~ /([^\.,]+)([^\.,][^\.,][^\.,])([,0-9]*\.[0-9]*)$/) { $number = $1.','.$2.$3; @@ -530,6 +591,13 @@ sub dollarformat { $number = $1.','.$2.$3; } } + return $number; +} + +sub dollarformat { + my ($number,$target) = @_; + if (!$target) { $target = $external::target; } + $number=&commaformat($number,$target); if ($target eq 'tex') { $number='\$'.$number; #' stupid emacs } else {