[LON-CAPA-cvs] cvs: loncom /xml lonxml.pm

foxr lon-capa-cvs-allow@mail.lon-capa.org
Mon, 08 Oct 2007 09:20:25 -0000


foxr		Mon Oct  8 05:20:25 2007 EDT

  Modified files:              
    /loncom/xml	lonxml.pm 
  Log:
  BZ 4074
  Add support for maintaining the counters for the number of bubble
  lines required per response in exam mode.
  
  
Index: loncom/xml/lonxml.pm
diff -u loncom/xml/lonxml.pm:1.461 loncom/xml/lonxml.pm:1.462
--- loncom/xml/lonxml.pm:1.461	Wed Sep 12 10:34:52 2007
+++ loncom/xml/lonxml.pm	Mon Oct  8 05:20:22 2007
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.461 2007/09/12 14:34:52 foxr Exp $
+# $Id: lonxml.pm,v 1.462 2007/10/08 09:20:22 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -92,8 +92,10 @@
 use Apache::lonmaxima();
 use Apache::lonlocal;
 
-#==================================================   Main subroutine: xmlparse  
+#====================================   Main subroutine: xmlparse  
+
 #debugging control, to turn on debugging modify the correct handler
+
 $Apache::lonxml::debug=0;
 
 # keeps count of the number of warnings and errors generated in a parse
@@ -135,6 +137,16 @@
 $Apache::lonxml::counter=1;
 $Apache::lonxml::counter_changed=0;
 
+# Part counter hash.   In analysis mode, the
+# problems can use this to record which parts increment the counter
+# by how much.  The counter subs will maintain this hash via
+# their optional part parameters.  Note that the assumption is that
+# analysis is done in one request and therefore it is not necessary to
+# save this information request-to-request.
+
+
+%Apache::lonxml::counters_per_part = ();
+
 #internal check on whether to look at style defs
 $Apache::lonxml::usestyle=1;
 
@@ -627,6 +639,7 @@
   $Apache::lonxml::default_homework_loaded=0;
   $Apache::lonxml::usestyle=1;
   &init_counter();
+  &clear_bubble_lines_for_part();
   @Apache::lonxml::pwd=();
   @Apache::lonxml::extlinks=();
   @script_var_displays=();
@@ -1009,8 +1022,15 @@
 	}
     }
     return $result
+
 }
 
+#########################################################################
+#                                                                       #
+#           bubble line counter management                              #
+#                                                                       #
+#########################################################################
+
 =pod
 
 For bubble grading mode and exam bubble printing mode, the tracking of
@@ -1026,16 +1046,31 @@
 
 Optional Arguments:
   $increment - amount to increment by (defaults to 1)
+               Also 1 if the value is negative or zero.
+  $part_id   - optional part id.. during analysis, this
+               indicates whic part of a problem is being
+               counted.
 
 =cut
 
 sub increment_counter {
-    my ($increment) = @_;
-    if (defined($increment) && $increment gt 0) {
-	$Apache::lonxml::counter+=$increment;
-    } else {
-	$Apache::lonxml::counter++;
+    my ($increment, $part_id) = @_;
+    if (!defined($increment) || $increment le 0) {
+	$increment = 1;
     }
+    $Apache::lonxml::counter += $increment;
+
+    # If the caller supplied the part_id parameter, 
+    # Maintain its counter.. creating if necessary.
+
+    if(defined($part_id)) {
+	if (!defined($Apache::lonxml::counters_per_part{$part_id})) {
+	    $Apache::lonxml::counters_per_part{$part_id} = 0;
+	}
+	$Apache::lonxml::counters_per_part{$part_id} += $increment;
+	my $new_value = $Apache::lonxml::counters_per_part{$part_id};
+    }
+	
     $Apache::lonxml::counter_changed=1;
 }
 
@@ -1092,6 +1127,74 @@
     }
 }
 
+=pod
+
+=item  bubble_lines_for_part(part_id)
+
+Returns the number of lines required to get a response for
+$part_id (this is just $Apache::lonxml::counters_per_part{$part_id}
+
+=cut
+
+sub bubble_lines_for_part {
+    my ($part_id) = @_;
+
+    if (!defined($Apache::lonxml::counters_per_part{$part_id})) {
+	return 0;
+    } else {
+	return $Apache::lonxml::counters_per_part{$part_id};
+    }
+
+}
+
+=pod
+
+=item clear_bubble_lines_for_part
+
+Clears the hash of bubble lines per part.  If a caller
+needs to analyze several resources this should be called between
+resources to reset the hash for each problem being analyzed.
+
+=cut
+
+sub clear_bubble_lines_for_part {
+    undef(%Apache::lonxml::counters_per_part);
+}
+
+=pod
+
+=item set_bubble_lines(part_id, value)
+
+If there is a problem part, that for whatever reason
+requires bubble lines that are not
+the same as the counter increment, it can call this sub during
+analysis to set its hash value explicitly.
+
+=cut
+
+sub set_bubble_lines {
+    my ($part_id, $value) = @_;
+
+    $Apache::lonxml::counters_per_part{$part_id} = $value;
+}
+
+=pod
+
+=item get_bubble_line_hash
+
+Returns the current bubble line hash.  This is assumed to 
+be small so we return a copy
+
+
+=cut
+
+sub get_bubble_line_hash {
+    return %Apache::lonxml::counters_per_part;
+}
+
+
+#--------------------------------------------------
+
 sub get_all_text {
     my($tag,$pars,$style)= @_;
     my $gotfullstack=1;