--- loncom/xml/lonxml.pm 2006/06/27 14:22:39 1.413 +++ loncom/xml/lonxml.pm 2006/12/24 22:13:20 1.434 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.413 2006/06/27 14:22:39 albertel Exp $ +# $Id: lonxml.pm,v 1.434 2006/12/24 22:13:20 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -88,6 +88,7 @@ use Apache::loncommon(); use Apache::lonfeedback(); use Apache::lonmsg(); use Apache::loncacc(); +use Apache::lonmaxima(); use Apache::lonlocal; #================================================== Main subroutine: xmlparse @@ -251,7 +252,7 @@ sub printtokenheader { my ($target,$token,$tsymb,$tcrsid,$tudom,$tuname)=@_; unless ($token) { return ''; } - my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); + my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser(); unless ($tsymb) { $tsymb=$symb; } @@ -342,6 +343,11 @@ sub xmlparse { my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars, $safeeval,\%style_for_target,1); + if (@stack) { + &warning("At end of file some tags were still left unclosed, ". + '<'.join('>, <',reverse(@stack)). + '>'); + } if ($env{'request.uri'}) { &writeallows($env{'request.uri'}); } @@ -366,13 +372,14 @@ sub latex_special_symbols { return $string; } if ($where eq 'header') { - $string =~ s/(\\|_|\^)/ /g; + $string =~ s/\\/\$\\backslash\$/g; # \ -> $\backslash$ per LaTex line by line pg 10. $string =~ s/(\$|%|\{|\})/\\$1/g; - $string =~ s/_/ /g; $string=&Apache::lonprintout::character_chart($string); # any & or # leftover should be safe to just escape $string=~s/([^\\])\&/$1\\\&/g; $string=~s/([^\\])\#/$1\\\#/g; + $string =~ s/_/\\_/g; # _ -> \_ + $string =~ s/\^/\\\^{}/g; # ^ -> \^{} } else { $string=~s/\\/\\ensuremath{\\backslash}/g; $string=~s/\\\%|\%/\\\%/g; @@ -668,6 +675,14 @@ sub init_safespace { '&chem_standard_order'); $safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status'); + $safehole->wrap(\&Apache::lonmaxima::maxima_eval,$safeeval,'&maxima_eval'); + $safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check'); + $safehole->wrap(\&Apache::lonmaxima::maxima_cas_formula_fix,$safeeval, + '&maxima_cas_formula_fix'); + + $safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, + '&capa_formula_fix'); + $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); $safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); $safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); @@ -771,8 +786,11 @@ sub init_safespace { $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed'); $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'); + $safehole->wrap(\&Apache::inputtags::finalizeawards,$safeeval,'&LONCAPA_INTERNAL_FINALIZEAWARDS'); $safehole->wrap(\&Apache::caparesponse::get_sigrange,$safeeval,'&LONCAPA_INTERNAL_get_sigrange'); - +# use Data::Dumper; +# $safehole->wrap(\&Data::Dumper::Dumper,$safeeval,'&LONCAPA_INTERNAL_Dumper'); #need to inspect this class of ops # $safeeval->deny(":base_orig"); $safeeval->permit("require"); @@ -812,7 +830,7 @@ sub delete_package_recurse { sub initialize_rndseed { my ($safeeval)=@_; my $rndseed; - my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser(); + my ($symb,$courseid,$domain,$name) = &Apache::lonnet::whichuser(); $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name); my $safeinit = '$external::randomseed="'.$rndseed.'";'; &Apache::lonxml::debug("Setting rndseed to $rndseed"); @@ -1013,7 +1031,7 @@ sub store_counter { } sub remember_problem_counter { - &Apache::lonnet::transfer_profile_to_env(); + &Apache::lonnet::transfer_profile_to_env(undef,undef,1); $state = $env{'form.counter'}; } @@ -1024,7 +1042,7 @@ sub store_counter { } sub get_problem_counter { if ($Apache::lonxml::counter_changed) { &store_counter() } - &Apache::lonnet::transfer_profile_to_env(); + &Apache::lonnet::transfer_profile_to_env(undef,undef,1); return $env{'form.counter'}; } } @@ -1148,19 +1166,23 @@ sub newparser { } sub parstring { - my ($token) = @_; - my $temp=''; - foreach (@{$token->[3]}) { - unless ($_=~/\W/) { - my $val=$token->[2]->{$_}; - $val =~ s/([\%\@\\\"\'])/\\$1/g; - $val =~ s/(\$[^{a-zA-Z_])/\\$1/g; - $val =~ s/(\$)$/\\$1/; - #if ($val =~ m/^[\%\@]/) { $val="\\".$val; } - $temp .= "my \$$_=\"$val\";"; - } - } - return $temp; + my ($token) = @_; + my (@vars,@values); + foreach my $attr (@{$token->[3]}) { + if ($attr!~/\W/) { + my $val=$token->[2]->{$attr}; + $val =~ s/([\%\@\\\"\'])/\\$1/g; + $val =~ s/(\$[^\{a-zA-Z_])/\\$1/g; + $val =~ s/(\$)$/\\$1/; + #if ($val =~ m/^[\%\@]/) { $val="\\".$val; } + push(@vars,"\$$attr"); + push(@values,"\"$val\""); + } + } + my $var_init = + (@vars) ? 'my ('.join(',',@vars).') = ('.join(',',@values).');' + : ''; + return $var_init; } sub extlink { @@ -1319,16 +1341,19 @@ FULLPAGE my $cleanbut = ''; my $titledisplay=&display_title(); - my %lt=&Apache::lonlocal::texthash('st' => 'Save this', - 'vi' => 'View', + my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit', + 'vi' => 'Save and View', + 'dv' => 'Discard Edits and View', + 'un' => 'undo', 'ed' => 'Edit'); my $buttons=(< +
BUTTONS $buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); - $buttons.=&Apache::lonhtmlcommon::htmlareaselectactive('filecont'); my $editfooter=(< @@ -1404,14 +1429,10 @@ sub handler { # # Edit action? Save file. # - unless ($env{'request.state'} eq 'published') { - if ($env{'form.savethisfile'}) { - if (&storefile($file,$env{'form.filecont'})) { - &Apache::lonxml::info("". - &mt('Updated').": ". - &Apache::lonlocal::locallocaltime(time). - " "); - } + if (!($env{'request.state'} eq 'published')) { + if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) { + my $html_file=&Apache::lonnet::getfile($file); + my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'}); } } my %mystyle; @@ -1445,7 +1466,8 @@ ENDNOTFOUND &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['editmode']); } - if (!$env{'form.editmode'} || $env{'form.viewmode'}) { + &Apache::lonnet::logthis("edit mode is ".$env{'form.editmode'}); + if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { $result = &Apache::lonxml::xmlparse($request,$target,$filecontents, '',%mystyle); undef($Apache::lonhomework::parsing_a_task); @@ -1459,7 +1481,8 @@ ENDNOTFOUND # Edit action? Insert editing commands # unless ($env{'request.state'} eq 'published') { - if ($env{'form.editmode'} && (!($env{'form.viewmode'}))) { + if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) + { my $displayfile=$request->uri; $displayfile=~s/^\/[^\/]*//; my %options = (); @@ -1540,7 +1563,7 @@ 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 occured on host $host")); + my $msg = join('
',(@_,"The error occurred on host $host")); #notify author &Apache::lonmsg::author_res_msg($env{'request.filename'},$msg); #notify course @@ -1559,8 +1582,11 @@ sub error { $cdom,$cnum); my $now=time; if ($now-$lastnotified{$key}>86400) { + my $title = &Apache::lonnet::gettitle($symb); + my $sentmessage; &Apache::lonmsg::user_normal_msg($user,$domain, - "Error [$declutter]",$msg); + "Error [$title]",$msg,'','','','', + \$sentmessage,$symb,$title,1); &Apache::lonnet::put('nohist_xmlerrornotifications', {$key => $now}, $cdom,$cnum); @@ -1623,14 +1649,14 @@ sub get_param { } if ( ! $args ) { return undef; } if ( $case_insensitive ) { - if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) { + if ($args =~ s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei) { return &Apache::run::run("{$args;".'return $'.$param.'}', $safeeval); #' } else { return undef; } } else { - if ( $args =~ /my \$\Q$param\E=\"/ ) { + if ( $args =~ /my .*\$\Q$param\E[,\)]/ ) { return &Apache::run::run("{$args;".'return $'.$param.'}', $safeeval); #' } else { @@ -1649,10 +1675,10 @@ sub get_param_var { } &Apache::lonxml::debug("Args are $args param is $param"); if ($case_insensitive) { - if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { + if (! ($args=~s/(my (?:.*))(\$\Q$param\E[,\)])/$1.lc($2)/ei)) { return undef; } - } elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; } + } elsif ( $args !~ /my .*\$\Q$param\E[,\)]/ ) { return undef; } my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' &Apache::lonxml::debug("first run is $value"); if ($value =~ /^[\$\@\%][a-zA-Z_]\w*$/) { @@ -1735,48 +1761,6 @@ sub helpinfo { return ($insertlist{$tagnum.'.helpfile'}, $insertlist{$tagnum.'.helpdesc'}); } -# ----------------------------------------------------------------- whichuser -# returns a list of $symb, $courseid, $domain, $name that is correct for -# calls to lonnet functions for this setup. -# - looks for form.grade_ parameters -sub whichuser { - my ($passedsymb)=@_; - my ($symb,$courseid,$domain,$name,$publicuser); - if (defined($env{'form.grade_symb'})) { - my ($tmp_courseid)= - &Apache::loncommon::get_env_multiple('form.grade_courseid'); - my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid); - if (!$allowed && - exists($env{'request.course.sec'}) && - $env{'request.course.sec'} !~ /^\s*$/) { - $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid. - '/'.$env{'request.course.sec'}); - } - if ($allowed) { - ($symb)=&Apache::loncommon::get_env_multiple('form.grade_symb'); - $courseid=$tmp_courseid; - ($domain)=&Apache::loncommon::get_env_multiple('form.grade_domain'); - ($name)=&Apache::loncommon::get_env_multiple('form.grade_username'); - return ($symb,$courseid,$domain,$name,$publicuser); - } - } - if (!$passedsymb) { - $symb=&Apache::lonnet::symbread(); - } else { - $symb=$passedsymb; - } - $courseid=$env{'request.course.id'}; - $domain=$env{'user.domain'}; - $name=$env{'user.name'}; - if ($name eq 'public' && $domain eq 'public') { - if (!defined($env{'form.username'})) { - $env{'form.username'}.=time.rand(10000000); - } - $name.=$env{'form.username'}; - } - return ($symb,$courseid,$domain,$name,$publicuser); -} - 1; __END__