[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;