--- loncom/xml/lonxml.pm 2007/09/11 23:53:13 1.459 +++ loncom/xml/lonxml.pm 2007/09/12 10:58:18 1.460 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.459 2007/09/11 23:53:13 albertel Exp $ +# $Id: lonxml.pm,v 1.460 2007/09/12 10:58:18 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -135,6 +135,13 @@ $Apache::lonxml::request=''; $Apache::lonxml::counter=1; $Apache::lonxml::counter_changed=0; +# A count of bubble lines needed for a set.. and a check on +# whether or not it is ever used too: + +$Apache::lonxml::bubble_line_counter = 1; +$Apache::lonxml::bubble_line_counter_changed = 0; + + #internal check on whether to look at style defs $Apache::lonxml::usestyle=1; @@ -358,6 +365,9 @@ sub xmlparse { } &do_registered_ssi(); if ($Apache::lonxml::counter_changed) { &store_counter() } + if ($Apache::lonxml::bubble_line_counter_changed) { + &store_bubble_counter(); + } &clean_safespace($safeeval); @@ -627,6 +637,7 @@ sub setup_globals { $Apache::lonxml::default_homework_loaded=0; $Apache::lonxml::usestyle=1; &init_counter(); + &init_bubble_counter(); @Apache::lonxml::pwd=(); @Apache::lonxml::extlinks=(); @script_var_displays=(); @@ -1011,6 +1022,115 @@ sub get_all_text_unbalanced { return $result } + +=pod + +For bubble grading mode and exam bubble printing mode, the tracking of +the current 'bubble line number' is stored in the %env element +'form.bubble_line_counter', and is modifed and handled by +the following routines. + +The value of it is stored in $Apache:lonxml::bubble_line_counter when +live and stored back to env after done. + +=item &increment_bubble_counter($increment) + +Increments the bubble line counter by the optional value +$increment (defaults to 1). + + 'bad increments' are also treated as an increment of 1. +('bad' means <=0). + +=cut + +sub increment_bubble_counter { + my ($increment) = @_; + if (!defined($increment) || $increment le 0) { + $increment = 1; + } + $Apache::lonxml::bubble_line_counter += $increment; + $Apache::lonxml::bubble_line_counter_changed = 1; +} +=pod + +=item &init_bubble_counter + +Initialize the internal counter to the env. variable +or 1 if we are inconstruction space, or if the env var +is not defined. + +=cut + +sub init_bubble_counter { + if ($env{'request.state'} eq 'construct') { + $Apache::lonxml::bubble_line_counter = 1; + $Apache::lonxml::bubble_line_counter_changed = 1; + } elsif (defined($env{'form.bubble_line_counter'})) { + $Apache::lonxml::bubble_line_counter = + $env{'form.bubble_line_counter'}; + $Aapche::lonxml::bubble_line_counter_changed = 0; + } else { + $Apache::lonxml::bubble_line_counter = 1; + $Apache::lonxml::bubble_line_counter_changed = 1; + } + +} + +=pod + +=item store_bubble_counter; + + Store the bubble line counter in its env var. The changed flag + is reset indicating the env is up to date with respect to the + local variable. +=cut + +sub store_bubble_counter { + &Apache::lonnet::appenv(('form.bubble.counter' => + $Apache::lonxml::bubble_line_counter)); + $Apache::lonnet::bubble_line_counter_changed = 0; + + return ''; +} + +=pod + +The next set of subs allow a single level of save/restore for the +bubble_line_counter. + +=cut + +{ + my $bubble_counter_state; + + sub clear_bubble_counter { + undef($bubble_counter_state); + &Apache::lonnet::delenv('form.bubble_line_counter'); + &Apache::lonxml::init_bubble_counter(); + &Apache::lonxml::store_bubble_counter(); + } + + sub remember_bubble_counter { + &Apache::lonnet::transfer_profile_to_env(undef,undef, 1); + $bubble_counter_state = $env{'form.bubble_line_counter'}; + } + + sub restore_bubble_counter { + if (defined($bubble_counter_state)) { + &Apache::lonnet::appenv(('form.bubble_line_counter' => + $bubble_counter_state)); + } + } + + sub get_bubble_counter { + if ($Apache::lonxml::bubble_line_counter_changed) { + &store_bubble_counter(); + } + &Apache::lonnet::transfer_profile_to_env(undef, undef, 1); + return $env{'form.bubble_line_counter'}; + } +} + =pod For bubble grading mode and exam bubble printing mode, the tracking of @@ -1041,7 +1161,7 @@ sub increment_counter { =pod -=item &init_counter($increment); +=item &init_counter; Initialize the internal counter environment variable @@ -1085,11 +1205,13 @@ sub store_counter { &Apache::lonnet::appenv(('form.counter' => $state)); } } + sub get_problem_counter { if ($Apache::lonxml::counter_changed) { &store_counter() } &Apache::lonnet::transfer_profile_to_env(undef,undef,1); return $env{'form.counter'}; } + } sub get_all_text {