--- loncom/homework/default_homework.lcpm 2004/03/16 15:31:52 1.73 +++ loncom/homework/default_homework.lcpm 2004/03/19 22:02:03 1.75 @@ -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.73 2004/03/16 15:31:52 albertel Exp $ +# $Id: default_homework.lcpm,v 1.75 2004/03/19 22:02:03 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,16 +40,20 @@ $deg2rad=$pi/180.0; $"=' '; sub caparesponse_check { + my ($answer,$response)=@_; #not properly used yet: calc #not to be used: $ans_fmt - my ($type,$tol,$sig,$ans_fmt,$unit,$calc,$samples) = - eval $_[2]. - ';return ($__LC__type,$__LC__tol,$__LC__sig,$__LC__ans_fmt,$__LC__unit,$__LC__calc,$__LC__samples);'; + my $type=$LONCAPA::CAPAresponse_args{'type'}; + my $tol=$LONCAPA::CAPAresponse_args{'tol'}; + my $sig=$LONCAPA::CAPAresponse_args{'sig'}; + my $ans_fmt=$LONCAPA::CAPAresponse_args{'ans_fmt'}; + my $unit=$LONCAPA::CAPAresponse_args{'unit'}; + my $calc=$LONCAPA::CAPAresponse_args{'calc'}; + my $samples=$LONCAPA::CAPAresponse_args{'samples'}; my $tol_type=''; # gets it's value from whether tol has a % or not done my $sig_lbound=''; #done my $sig_ubound=''; #done - my ($answer,$response,$expr)=@_; #type's definitons come from capaParser.h @@ -68,7 +72,7 @@ sub caparesponse_check { if (length($response) > 500) { return "TOO_LONG: Answer too long"; } if ($type eq '' ) { - $message .= "Didn't find a type :$type:$expr: defaulting\n"; + $message .= "Didn't find a type :$type: defaulting\n"; if ( $answer eq ($answer *1.0)) { $type = 2; } else { $type = 3; } } else { @@ -134,20 +138,21 @@ sub caparesponse_check { elsif ($result =='12') { $result='WANTED_NUMERIC'; } 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$expr",$reterror); + 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); } sub caparesponse_check_list { - my ($response,$expr)=@_; + my $response=$LONCAPA::CAPAresponse_args{'response'}; my ($result,@list); - @list=@CAPARESPONSE_CHECK_LIST_answer; + @list=@LONCAPA::CAPAresponse_answer; my $aresult=''; my $current_answer; my $answers=join(':',@list); $result.="Got response :$answers:\n"; + &LONCAPA_INTERNAL_DEBUG("Yo! got ".join(':',%LONCAPA::CAPAresponse_args)); my @responselist; - my $type =eval $expr.';return $__LC__type;'; + my $type = $LONCAPA::CAPAresponse_args{'type'}; $result.="Got type :$type:\n"; if ($type ne '' && $#list > 0) { (@responselist)=split /,/,$response; @@ -175,12 +180,10 @@ sub caparesponse_check_list { my $thisanswer=$list[$i]; $result.="trying answer :$thisanswer:\n"; if ($unit eq '') { - ($aresult,$msg)=&caparesponse_check($thisanswer,$responselist[$i], - $expr); + ($aresult,$msg)=&caparesponse_check($thisanswer,$responselist[$i]); } else { ($aresult,$msg)=&caparesponse_check($thisanswer, - $responselist[$i]." $unit", - $expr); + $responselist[$i]." $unit"); } my ($temp)=split /:/, $aresult; $awards.="$temp,"; @@ -482,11 +485,51 @@ sub format { 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 =~ /chem/i) { return(&chemparse($value)); } if ($fmt =~ /^\$(.*)/) { $fmt=$1; $dollarmode=1; } if ($fmt) { $value=sprintf('%.'.$fmt,$value); } if ($value =~ /([0-9\.\-\+]+)E([0-9\-\+]+)/i ) {