[LON-CAPA-cvs] cvs: loncom /homework default_homework.lcpm

raeburn raeburn at source.lon-capa.org
Wed Jun 25 12:50:51 EDT 2014


raeburn		Wed Jun 25 16:50:51 2014 EDT

  Modified files:              
    /loncom/homework	default_homework.lcpm 
  Log:
  - Bugs 6609, 6611, 6614
    - Optional fifth arg can be provided to &submission() to clean up learner
      submitted data (e.g., in a multi-part problem) where learner data from
      submissions to a numerical respnse in an earlier part will be used as 
      variables in the script block when calculating answers for a later part.
    - "cleanupnum" arg is a ref to a hash, with one or more of the following 
      keys => values:
      exponent => 1, comma => 1, letterforzero => 1, spaces => 1, format => 'ns'
      (where n is an integer, i.e., number of significant digits).
  
  
Index: loncom/homework/default_homework.lcpm
diff -u loncom/homework/default_homework.lcpm:1.168 loncom/homework/default_homework.lcpm:1.169
--- loncom/homework/default_homework.lcpm:1.168	Wed Jun 25 15:43:04 2014
+++ loncom/homework/default_homework.lcpm	Wed Jun 25 16:50:51 2014
@@ -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.168 2014/06/25 15:43:04 raeburn Exp $
+# $Id: default_homework.lcpm,v 1.169 2014/06/25 16:50:51 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1228,7 +1228,7 @@
 }
 
 sub submission {
-   my ($partid,$responseid,$subnumber,$encode)=@_;
+   my ($partid,$responseid,$subnumber,$encode,$cleanupnum)=@_;
    my $sub='';
    if ($subnumber) { $sub=$subnumber.':'; }
    my $output =
@@ -1238,11 +1238,17 @@
        if ($encode) {
            @items = map { &encode_response($_); } @items;
        }
+       if (ref($cleanupnum) eq 'HASH') {
+           @items = map { &cleanup_numerical_response($cleanupnum,$_); } @items;
+       }
        return \@items;
    } else {
        if ($encode) {
            $output = &encode_response($output);
        }
+       if (ref($cleanupnum) eq 'HASH') {
+           $output = &cleanup_numerical_response($cleanupnum,$output);
+       }
        return $output;
    }
 }
@@ -1256,6 +1262,46 @@
     return $value;
 }
 
+sub cleanup_numerical_response {
+    my ($cleanupnum,$value) = @_;
+    if (ref($cleanupnum) eq 'HASH') {
+        if ($cleanupnum->{exponent}) {
+            if ($value =~ m{^(.*)[\*xX]\s*10\s*\^\s*(\+|\-)?\s*(\d+)(.*)$}) {
+                my $pre_exp = $1;
+                my $sign = $2;
+                my $exponent = $3;
+                my $post_exp = $4;
+                if ($pre_exp !~ /\./) {
+                    $pre_exp .= '.';
+                }
+                if ($sign eq '') {
+                    $sign = '+';
+                }
+                $value = $pre_exp.'E'.$sign.$exponent.$post_exp;
+            }
+        }
+        if ($cleanupnum->{comma}) {
+            $value =~ s{(\d+),(\d+)}{$1$2};
+        }
+        if ($cleanupnum->{letterforzero}) {
+            $value =~ s/^\s*o(\.\d+)/0$1/i;
+        }
+        if ($cleanupnum->{spaces}) {
+            $value =~ s{^\s+|\s+$}{}g;
+            if ($value =~ m{^(.*)\.\s+(\d+)(.*)$}) {
+                my $pre_pt = $1;
+                my $decimal = $2;
+                my $post_dec = $3;
+                $value = $pre_pt.'.'.$decimal.$post_dec;
+            }
+        }
+        if ($cleanupnum->{format} =~ /^\d+s$/i) {
+            $value = &format_significant_figures($value,$cleanupnum->{format});
+        }
+    }
+    return $value;
+}
+
 sub currentpart {
    return $external::part;
 }




More information about the LON-CAPA-cvs mailing list