--- loncom/xml/lonxml.pm 2006/04/13 19:00:40 1.406
+++ loncom/xml/lonxml.pm 2006/12/19 14:53:18 1.432
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.406 2006/04/13 19:00:40 albertel Exp $
+# $Id: lonxml.pm,v 1.432 2006/12/19 14:53:18 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,7 +40,7 @@
package Apache::lonxml;
use vars
-qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount @htmlareafields);
+qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount);
use strict;
use HTML::LCParser();
use HTML::TreeBuilder();
@@ -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
@@ -123,9 +124,6 @@ $evaluate = 1;
# stores the list of active tag namespaces
@namespace=();
-# has the dynamic menu been updated to know about this resource
-$Apache::lonxml::registered=0;
-
# a pointer the the Apache request object
$Apache::lonxml::request='';
@@ -162,28 +160,6 @@ sub disable_LaTeX_substitutions {
$Apache::lonxml::substitute_LaTeX_symbols = 0;
}
-sub xmlbegin {
- my ($style)=@_;
- my $output='';
- @htmlareafields=();
- if ($env{'browser.mathml'}) {
- $output=''
- #.''."\n"
-# .'] >'
- .''
- .'';
- } else {
- $output='';
- }
- if ($style eq 'encode') {
- $output=&HTML::Entities::encode($output,'<>&"');
- }
- return $output;
-}
-
sub xmlend {
my ($target,$parser)=@_;
my $mode='xml';
@@ -206,7 +182,7 @@ sub xmlend {
return '';
}
- return $discussion.&Apache::loncommon::end_page();
+ return $discussion;
}
sub tokeninputfield {
@@ -276,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;
}
@@ -304,18 +280,6 @@ sub printtokenheader {
}
}
-sub fontsettings {
- my $headerstring='';
- if (($env{'browser.os'} eq 'mac') && (!$env{'browser.mathml'})) {
- $headerstring.=
- '';
- } elsif (!$env{'browser.mathml'} && $env{'browser.unicode'}) {
- $headerstring.=
- '';
- }
- return $headerstring;
-}
-
sub printalltags {
my $temp;
foreach $temp (sort keys %Apache::lonxml::alltags) {
@@ -379,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'});
}
@@ -403,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;
@@ -637,8 +607,6 @@ sub callsub {
sub setup_globals {
my ($request,$target)=@_;
$Apache::lonxml::request=$request;
- $Apache::lonxml::registered = 0;
- @Apache::lonxml::htmlareafields=();
$errorcount=0;
$warningcount=0;
$Apache::lonxml::default_homework_loaded=0;
@@ -707,6 +675,11 @@ 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(\&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');
@@ -810,8 +783,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");
@@ -851,7 +827,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");
@@ -1052,7 +1028,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'};
}
@@ -1063,7 +1039,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'};
}
}
@@ -1187,19 +1163,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 {
@@ -1327,8 +1307,7 @@ sub inserteditinfo {
my $initialize='';
if ($filetype eq 'html') {
my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons();
- $initialize=&Apache::lonhtmlcommon::htmlareaheaders().
- &Apache::lonhtmlcommon::spellheader();
+ $initialize=&Apache::lonhtmlcommon::spellheader();
if (!&Apache::lonhtmlcommon::htmlareablocked() &&
&Apache::lonhtmlcommon::htmlareabrowser()) {
$initialize.=(< '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=(<
@@ -1444,14 +1426,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;
@@ -1459,7 +1437,7 @@ sub handler {
my $filecontents=&Apache::lonnet::getfile($file);
if ($filecontents eq -1) {
my $start_page=&Apache::loncommon::start_page('File Error');
- my $end_page=&Apache::loncommon::end_page('File Error');
+ my $end_page=&Apache::loncommon::end_page();
my $fnf=&mt('File not found');
$result=(<uri;
$displayfile=~s/^\/[^\/]*//;
my %options = ();
@@ -1579,7 +1559,8 @@ sub error {
#public or browsers
$errormsg=&mt("An error occured while processing this resource. The author has been notified.");
}
- my $msg = join('
',@_);
+ my $host=$Apache::lonnet::perlvar{'lonHostID'};
+ my $msg = join('
',(@_,"The error occurred on host $host"));
#notify author
&Apache::lonmsg::author_res_msg($env{'request.filename'},$msg);
#notify course
@@ -1662,14 +1643,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 {
@@ -1688,10 +1669,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*$/) {
@@ -1774,48 +1755,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__