version 1.88, 2004/10/05 20:18:29
|
version 1.96, 2005/03/29 17:57:51
|
Line 34 $rad2deg=180.0/$pi;
|
Line 34 $rad2deg=180.0/$pi;
|
$deg2rad=$pi/180.0; |
$deg2rad=$pi/180.0; |
$"=' '; |
$"=' '; |
|
|
|
sub check_commas { |
|
my ($response)=@_; |
|
#print("$response "); |
|
my @numbers=split(',',$response); |
|
#print(" numbers ".join('-',@numbers)." "); |
|
if (scalar(@numbers) > 1) { |
|
#print(" numbers[0] ".$numbers[0]." "); |
|
if (length($numbers[0]) > 3 || length($numbers[0]) == 0) { return -1; } |
|
shift(@numbers); |
|
#print(" numbers ".scalar(@numbers)." "); |
|
while (scalar(@numbers) > 1) { |
|
#print(" numbers ".join('-',@numbers)." "); |
|
if (length($numbers[0]) != 3) { return -2; } |
|
shift(@numbers); |
|
} |
|
my ($number)=split('\.',$numbers[0]); |
|
#print(" number ".$number." "); |
|
#print(" numbers[0] ".$numbers[0]." "); |
|
if (length($number) != 3) { return -3; } |
|
} else { |
|
my ($number)=split('\.',$numbers[0]); |
|
if (length($number) > 3) { return -4; } |
|
} |
|
return 1; |
|
} |
|
|
sub caparesponse_check { |
sub caparesponse_check { |
my ($answer,$response)=@_; |
my ($answer,$response)=@_; |
#not properly used yet: calc |
#not properly used yet: calc |
Line 69 sub caparesponse_check {
|
Line 95 sub caparesponse_check {
|
$answer=~s/ +/ /g; |
$answer=~s/ +/ /g; |
$response=~s/ +/ /g; |
$response=~s/ +/ /g; |
} |
} |
if ($type eq 'float') { $response=~s/,//g; } |
if ($type eq 'float' && $unit=~/\$/) { |
&LONCAPA_INTERNAL_DEBUG("fmt $ans_fmt, res is $response"); |
|
if ($type eq 'float' && $ans_fmt=~/\$/) { |
|
if ($response!~/^\$/) { return "NO_UNIT: Missing \$ "; } |
if ($response!~/^\$/) { return "NO_UNIT: Missing \$ "; } |
$response=~s/\$//g; |
$response=~s/\$//g; |
} |
} |
|
if ($type eq 'float' && $unit=~/\,/ && (&check_commas($response)<0)) { |
|
return "COMMA_FAIL:"; |
|
} |
$ans_fmt=~s/\W//g; |
$ans_fmt=~s/\W//g; |
|
$unit=~s/[\$,]//g; |
|
if ($type eq 'float') { $response=~s/,//g; } |
|
|
if (length($response) > 500) { return "TOO_LONG: Answer too long"; } |
if (length($response) > 500) { return "TOO_LONG: Answer too long"; } |
|
|
Line 134 sub caparesponse_check {
|
Line 163 sub caparesponse_check {
|
elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } |
elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } |
elsif ($result =='10') { $result='SUB_RECORDED'; } |
elsif ($result =='10') { $result='SUB_RECORDED'; } |
elsif ($result =='11') { $result='BAD_FORMULA'; } |
elsif ($result =='11') { $result='BAD_FORMULA'; } |
|
elsif ($result =='12' && !$response) { $result='MISSING_ANSWER'; } |
|
elsif ($result =='12') { $result='WANTED_NUMERIC'; } |
elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; } |
elsif ($result =='13') { $result='UNIT_INVALID_INSTRUCTOR'; } |
elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; } |
elsif ($result =='141') { $result='UNIT_INVALID_STUDENT'; } |
elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; } |
elsif ($result =='142') { $result='UNIT_INVALID_STUDENT'; } |
Line 498 sub format {
|
Line 529 sub format {
|
|
|
sub chemparse { |
sub chemparse { |
my ($reaction) = @_; |
my ($reaction) = @_; |
my @tokens = split(/(\s\+|\->|<=>)/,$reaction); |
my @tokens = split(/(\s\+|\->|<=>|<\-|\.)/,$reaction); |
my $formula = ''; |
my $formula = ''; |
foreach my $token (@tokens) { |
foreach my $token (@tokens) { |
if ($token eq '->' ) { |
if ($token eq '->' ) { |
$formula .= '<m>\ensuremath{\rightarrow}</m> '; |
$formula .= '<m>\ensuremath{\rightarrow}</m> '; |
next; |
next; |
} |
} |
|
if ($token eq '<-' ) { |
|
$formula .= '<m>\ensuremath{\leftarrow}</m> '; |
|
next; |
|
} |
if ($token eq '<=>') { |
if ($token eq '<=>') { |
if ($external::target eq 'web' && |
if ($external::target eq 'web' && |
&EXT('request.browser.unicode')) { |
&EXT('request.browser.unicode')) { |
$formula .= '⇌ '; |
$formula .= '⇌ '; |
} else { |
} else { |
$formula .= &web('<=> ','<m>\ensuremath{\rightleftharpoons}</m> ', |
$formula .= &web('<=> ','<m>\ensuremath{\rightleftharpoons}</m> ', |
'<=$gt; '); |
'<=> '); |
} |
} |
next; |
next; |
} |
} |
$token =~ /^\s*(\d*)(.*)/; |
if ($token eq '.') { |
$formula .= $1 if ($1 > 1); # stoichiometric coefficient |
$formula =~ s/(\ \;| )$//; |
|
$formula .= '·'; |
|
next; |
|
} |
|
$token =~ /^\s*([\d|\/]*(?:&frac\d\d)?)(.*)/; |
|
$formula .= $1 if ($1 ne '1'); # stoichiometric coefficient |
|
|
my $molecule = $2; |
my $molecule = $2; |
# subscripts |
# subscripts |
Line 527 sub chemparse {
|
Line 567 sub chemparse {
|
$molecule =~ s/\s*//g; |
$molecule =~ s/\s*//g; |
# forced space |
# forced space |
$molecule =~ s/_/ /g; |
$molecule =~ s/_/ /g; |
|
$molecule =~ s/-/−/g; |
$formula .= $molecule.' '; |
$formula .= $molecule.' '; |
} |
} |
# get rid of trailing space |
# get rid of trailing space |
$formula =~ s/(\ \;| )$//; |
$formula =~ s/(\ \;| )$//; |
|
|
return &xmlparse($formula); |
return &xmlparse($formula); |
} |
} |
|
|
sub prettyprint { |
sub prettyprint { |
my ($value,$fmt,$target)=@_; |
my ($value,$fmt,$target)=@_; |
&LONCAPA_INTERNAL_DEBUG("format -$fmt-"); |
|
my $result; |
my $result; |
if (!$target) { $target = $external::target; } |
if (!$target) { $target = $external::target; } |
if ($fmt =~ /chem/i) { return(&chemparse($value)); } |
if ($fmt =~ /chem/i) { return(&chemparse($value)); } |