--- loncom/xml/lonxml.pm 2007/08/03 23:29:54 1.449 +++ 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.449 2007/08/03 23:29:54 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=(); @@ -800,6 +811,7 @@ sub init_safespace { $safehole->wrap(\&Math::Random::random_set_seed_from_phrase,$safeeval,'&random_set_seed_from_phrase'); $safehole->wrap(\&Math::Random::random_get_seed,$safeeval,'&random_get_seed'); $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed'); + $safehole->wrap(\&Apache::loncommon::languages,$safeeval,'&languages'); $safehole->wrap(\&Apache::lonxml::error,$safeeval,'&LONCAPA_INTERNAL_ERROR'); $safehole->wrap(\&Apache::lonxml::debug,$safeeval,'&LONCAPA_INTERNAL_DEBUG'); $safehole->wrap(\&Apache::lonnet::logthis,$safeeval,'&LONCAPA_INTERNAL_LOGTHIS'); @@ -908,6 +920,9 @@ sub endredirection { } pop @Apache::lonxml::outputstack; } +sub in_redirection { + return ($Apache::lonxml::redirection > 0) +} sub end_tag { my ($tagstack,$parstack,$token)=@_; @@ -1007,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 @@ -1037,7 +1161,7 @@ sub increment_counter { =pod -=item &init_counter($increment); +=item &init_counter; Initialize the internal counter environment variable @@ -1081,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 { @@ -1350,17 +1476,20 @@ SIMPLECONTENT sub inserteditinfo { - my ($result,$filecontents,$filetype)=@_; + my ($filecontents,$filetype)=@_; $filecontents = &HTML::Entities::encode($filecontents,'<>&"'); # my $editheader='Edit below
'; my $xml_help = ''; my $initialize=''; - if ($filetype eq 'html') { - my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons(); - $initialize=&Apache::lonhtmlcommon::spellheader(); - if (!&Apache::lonhtmlcommon::htmlareablocked() && - &Apache::lonhtmlcommon::htmlareabrowser()) { - $initialize.=(< $addbuttons @@ -1370,21 +1499,34 @@ $addbuttons var editor=new HTMLArea("filecont",config); editor.registerPlugin(FullPage); editor.generate(); + setTimeout( + function () { + HTMLArea._addEvents(editor._doc, + ["keypress","mousedown"], unClean); + editor._iframe.id = '$textarea_id'; + resize_textarea('$textarea_id','LC_aftertextarea'); + },300); } FULLPAGE - } else { - $initialize.=(< $addbuttons function initDocument() { + resize_textarea('$textarea_id','LC_aftertextarea'); } FULLPAGE - } - $result=~s/\]*)\>/\/i; + } + + $add_to_onload = 'initDocument();'; + $add_to_onresize = "resize_textarea('$textarea_id','LC_aftertextarea');"; + + if ($filetype eq 'html') { $xml_help=&Apache::loncommon::helpLatexCheatsheet(); } + my $cleanbut = ''; my $titledisplay=&display_title(); @@ -1396,29 +1538,31 @@ FULLPAGE my $buttons=(< -
+
BUTTONS $buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); + my $textarea_events = &Apache::edit::element_change_detection(); + my $form_events = &Apache::edit::form_change_detection(); my $editfooter=(< -
+ $xml_help $buttons
- + +

$buttons
- $titledisplay +
+ ENDFOOTER -# $result=~s/(\]*\>)/$1$editheader/is; - $result=~s/(\<\/body\>)/$editfooter/is; - return $result; + return ($editfooter,$add_to_onload,$add_to_onresize);; } sub get_target { @@ -1514,38 +1658,64 @@ ENDNOTFOUND ['editmode']); } if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { + &Apache::structuretags::reset_problem_globals(); $result = &Apache::lonxml::xmlparse($request,$target,$filecontents, '',%mystyle); - undef($Apache::lonhomework::parsing_a_task); + # .html files may contain or need to clean + # up if it did + &Apache::structuretags::reset_problem_globals(); + &Apache::lonhomework::finished_parsing(); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rawmode']); if ($env{'form.rawmode'}) { $result = $filecontents; } + if ($filetype eq 'sty') { + my $controls = + ($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls() + : ''; + my %options = ('bgcolor' => '#FFFFFF'); + $result = + &Apache::loncommon::start_page(undef,undef,\%options). + $controls. + $result. + &Apache::loncommon::end_page(); + } } } - + # # Edit action? Insert editing commands # unless ($env{'request.state'} eq 'published') { if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) - { + { + my ($edit_info, $add_to_onload, $add_to_onresize)= + &inserteditinfo($filecontents,$filetype); + my $displayfile=$request->uri; $displayfile=~s/^\/[^\/]*//; - my %options = (); + my %options = + ('add_entries' => + {'onresize' => $add_to_onresize, + 'onload' => $add_to_onload, }); + if ($env{'environment.remote'} ne 'off') { $options{'bgcolor'} = '#FFFFFF'; + $options{'only_body'} = 1; } - my $start_page = &Apache::loncommon::start_page(undef,undef, + my $js = + &Apache::edit::js_change_detection(). + &Apache::loncommon::resize_textarea_js(); + my $start_page = &Apache::loncommon::start_page(undef,$js, \%options); $result=$start_page. &Apache::lonxml::message_location().'

'. $displayfile. - '

'.&Apache::loncommon::end_page(); - $result=&inserteditinfo($result,$filecontents,$filetype); + ''. + $edit_info. + &Apache::loncommon::end_page(); } } if ($filetype eq 'html') { &writeallows($request->uri); } - &Apache::lonxml::add_messages(\$result); $request->print($result); @@ -1594,12 +1764,28 @@ sub show_error_warn_msg { } sub error { + my @errors = @_; + $errorcount++; + + if (defined($Apache::inputtags::part)) { + if ( @Apache::inputtags::response ) { + push(@errors, + &mt("This error occurred while processing response [_1] in part [_2]", + $Apache::inputtags::response[-1], + $Apache::inputtags::part)); + } else { + push(@errors, + &mt("This error occurred while processing part [_1]", + $Apache::inputtags::part)); + } + } + if ( &show_error_warn_msg() ) { # If printing in construction space, put the error inside

 	push(@Apache::lonxml::error_messages,
 	     $Apache::lonxml::warnings_error_header.
-	     "ERROR:".join("
\n",@_)."
\n"); + "ERROR:".join("
\n",@errors)."
\n"); $Apache::lonxml::warnings_error_header=''; } else { my $errormsg; @@ -1609,7 +1795,10 @@ sub error { $errormsg=&mt("An error occured while processing this resource. The author has been notified."); } my $host=$Apache::lonnet::perlvar{'lonHostID'}; - my $msg = join('
',(@_,"The error occurred on host $host")); + push(@errors, "The error occurred on host $host"); + + my $msg = join('
', @errors); + #notify author &Apache::lonmsg::author_res_msg($env{'request.filename'},$msg); #notify course