--- loncom/xml/lonxml.pm 2002/10/20 18:42:53 1.205
+++ loncom/xml/lonxml.pm 2003/09/08 19:00:09 1.274
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.205 2002/10/20 18:42:53 www Exp $
+# $Id: lonxml.pm,v 1.274 2003/09/08 19:00:09 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -41,7 +41,6 @@
# 6/1/1 Gerd Kortemeyer
# 2/21,3/13 Guy
# 3/29,5/4 Gerd Kortemeyer
-# 5/10 Scott Harrison
# 5/26 Gerd Kortemeyer
# 5/27 H. K. Ng
# 6/2,6/3,6/8,6/9 Gerd Kortemeyer
@@ -70,6 +69,8 @@ use Safe::Hole();
use Math::Cephes();
use Math::Random();
use Opcode();
+use POSIX qw(strftime);
+
sub register {
my ($space,@taglist) = @_;
@@ -96,16 +97,23 @@ use Apache::run();
use Apache::londefdef();
use Apache::scripttag();
use Apache::edit();
+use Apache::inputtags();
+use Apache::outputtags();
use Apache::lonnet();
use Apache::File();
use Apache::loncommon();
use Apache::lonfeedback();
use Apache::lonmsg();
+use Apache::loncacc();
#================================================== 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
+$warningcount=0;
+$errorcount=0;
+
#path to the directory containing the file currently being processed
@pwd=();
@@ -140,10 +148,17 @@ $Apache::lonxml::registered=0;
# a pointer the the Apache request object
$Apache::lonxml::request='';
-# a problem number counter, and check on hether it is used
-$Apache::lonxml::counter=0;
+# a problem number counter, and check on ether it is used
+$Apache::lonxml::counter=1;
$Apache::lonxml::counter_changed=0;
+#internal check on whether to look at style defs
+$Apache::lonxml::usestyle=1;
+
+#locations used to store the parameter string for style substitutions
+$Apache::lonxml::style_values='';
+$Apache::lonxml::style_end_values='';
+
sub xmlbegin {
my $output='';
if ($ENV{'browser.mathml'}) {
@@ -184,10 +199,18 @@ sub xmlend {
my $idx;
for ($idx=1;$idx<=$contrib{'version'};$idx++) {
my $hidden=($contrib{'hidden'}=~/\.$idx\./);
- unless (($hidden) && (!$seeid)) {
+ my $deleted=($contrib{'deleted'}=~/\.$idx\./);
+ unless ((($hidden) && (!$seeid)) || ($deleted)) {
my $message=$contrib{$idx.':message'};
$message=~s/\n/\ /g;
$message=&Apache::lontexconvert::msgtexconverted($message);
+ if ($contrib{$idx.':attachmenturl'}) {
+ my ($fname,$ft)
+ =($contrib{$idx.':attachmenturl'}=~/\/(\w+)\.(\w+)$/);
+ $message.='
Attachment: '.$fname.'.'.$ft.'';
+ }
if ($message) {
if ($hidden) {
$message=''.$message.'';
@@ -218,8 +241,10 @@ sub xmlend {
} else {
$sender.=' Hide';
- }
- }
+ }
+ $sender.=' Delete';
+ }
} else {
if ($screenname) {
$sender=''.$screenname.'';
@@ -238,7 +263,7 @@ sub xmlend {
}
if ($discussiononly) {
$discussion.=(<
+
ENDDISCUSS
$discussion.=&Apache::lonfeedback::generate_preview_button();
@@ -260,7 +288,7 @@ sub tokeninputfield {
my $defhost=$Apache::lonnet::perlvar{'lonHostID'};
$defhost=~tr/a-z/A-Z/;
return (<
+\n";
- }
- if ((($ENV{'request.publicaccess'}) ||
- (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) &&
- (!$forcereg)) {
- return $result.
- '';
- }
- if ($Apache::lonxml::registered && !$forcereg) { return ''; }
- $Apache::lonxml::registered=1;
- my $nothing='';
- if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; }
- my $newmail='';
- if (&Apache::lonmsg::newmail()) {
- $newmail='menu.setstatus("you have","messages");';
- }
- my $timesync='menu.syncclock(1000*'.time.');';
- if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
- my $hwkadd='';
- if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
- if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
- $hwkadd.=(<
-// BEGIN LON-CAPA Internal
-
- function LONCAPAreg() {
- menu=window.open("$nothing","LONCAPAmenu","",false);
- menu.clearTimeout(menu.menucltim);
- $timesync
- $newmail
- menu.currentURL=window.location.pathname;
- menu.reloadURL=window.location.pathname;
- menu.currentStale=0;
- menu.clearbut(3,1);
- menu.switchbutton
- (6,3,'catalog.gif','catalog','info','catalog_info()');
- menu.switchbutton
- (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)');
- menu.switchbutton
- (8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)');
- menu.switchbutton
- (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)');
- menu.switchbutton
- (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)');
- menu.switchbutton
- (2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)');
- menu.switchbutton
- (9,1,'sbkm.gif','set','bookmark','set_bookmark()');
- menu.switchbutton
- (9,2,'vbkm.gif','view','bookmark','edit_bookmarks()');
- menu.switchbutton
- (9,3,'anot.gif','anno-','tations','annotate()');
- $hwkadd
- }
-
- function LONCAPAstale() {
- menu=window.open("$nothing","LONCAPAmenu","",false);
- menu.currentStale=1;
- if (menu.reloadURL!='' && menu.reloadURL!= null) {
- menu.switchbutton
- (3,1,'reload.gif','return','location','go(reloadURL)');
- }
- menu.clearbut(7,1);
- menu.clearbut(7,2);
- menu.clearbut(7,3);
- menu.menucltim=menu.setTimeout(
- 'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
- 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3)',
- 2000);
-
- }
-
-// END LON-CAPA Internal
-
-ENDREGTHIS
-
- } else {
- $result = (<
-// BEGIN LON-CAPA Internal
-
- function LONCAPAreg() {
- menu=window.open("$nothing","LONCAPAmenu","",false);
- $timesync
- menu.currentStale=1;
- menu.clearbut(2,1);
- menu.clearbut(2,3);
- menu.clearbut(8,1);
- menu.clearbut(8,2);
- menu.clearbut(8,3);
- if (menu.currentURL) {
- menu.switchbutton
- (3,1,'reload.gif','return','location','go(currentURL)');
- } else {
- menu.clearbut(3,1);
- }
- }
-
- function LONCAPAstale() {
- }
-
-// END LON-CAPA Internal
-
-ENDDONOTREGTHIS
- }
- return $result;
-}
-
-sub loadevents() {
- return 'LONCAPAreg();';
-}
-
-sub unloadevents() {
- return 'LONCAPAstale();';
-}
-
sub printalltags {
my $temp;
foreach $temp (sort keys %Apache::lonxml::alltags) {
@@ -520,11 +409,15 @@ sub xmlparse {
my ($request,$target,$content_file_string,$safeinit,%style_for_target) = @_;
&setup_globals($request,$target);
+ &Apache::inputtags::initialize_inputtags();
+ &Apache::outputtags::initialize_outputtags();
+ &Apache::edit::initialize_edit();
+
#
# do we have a course style file?
#
- if ($ENV{'request.course.id'}) {
+ if ($ENV{'request.course.id'} && $ENV{'request.state'} ne 'construct') {
my $bodytext=
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'};
if ($bodytext) {
@@ -536,8 +429,7 @@ sub xmlparse {
}
}
}
-
- #&printalltags();
+#&printalltags();
my @pars = ();
my $pwd=$ENV{'request.filename'};
$pwd =~ s:/[^/]*$::;
@@ -556,6 +448,7 @@ sub xmlparse {
my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
$safeeval,\%style_for_target);
+
if ($ENV{'request.uri'}) {
&writeallows($ENV{'request.uri'});
}
@@ -585,19 +478,25 @@ sub htmlclean {
}
sub latex_special_symbols {
- my ($current_token,$stack,$parstack)=@_;
- $current_token=~s/\\/\\char92 /g;
- $current_token=~s/\^/\\char94 /g;
- $current_token=~s/\~/\\char126 /g;
- $current_token=~s/(&[^a-z\#])/\\$1/g;
- $current_token=~s/([^&])\#/$1\\#/g;
- $current_token=~s/(\$|_|{|})/\\$1/g;
- $current_token=~s/\\char92 /\\texttt{\\char92}/g;
- $current_token=~s/>/\$>\$/g; #more
- $current_token=~s/\$<\$/g; #less
- if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
- if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
- return $current_token;
+ my ($string,$where)=@_;
+ if ($where eq 'header') {
+ $string =~ s/(\\|_|\^)/ /g;
+ $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/_/ /g;
+ } else {
+ $string=~s/\\ /\\char92 /g;
+ $string=~s/\^/\\char94 /g;
+ $string=~s/\~/\\char126 /g;
+ $string=~s/(&[^A-Za-z\#])/\\$1/g;
+ $string=~s/([^&])\#/$1\\#/g;
+ $string=~s/(\$|_|{|})/\\$1/g;
+ $string=~s/\\char92 /\\texttt{\\char92}/g;
+ $string=~s/(>|<)/\$$1\$/g; #more or less
+ if ($string=~m/\d%/) {$string =~ s/(\d)%/$1\\%/g;} #percent after digit
+ if ($string=~m/\s%/) {$string =~ s/(\s)%/$1\\%/g;} #percent after space
+ if ($string eq '%.') {$string = '\%.';} #percent at the end of statement
+ }
+ return $string;
}
sub inner_xmlparse {
@@ -605,19 +504,25 @@ sub inner_xmlparse {
my $finaloutput = '';
my $result;
my $token;
+ my $dontpop=0;
while ( $#$pars > -1 ) {
while ($token = $$pars['-1']->get_token) {
- if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
+ if (($token->[0] eq 'T') || ($token->[0] eq 'C') ) {
if ($metamode<1) {
my $text=$token->[1];
if ($token->[0] eq 'C' && $target eq 'tex') {
- $text = '%'.$text;
- $text =~ s/[\n\r]//g;
+ $text = '';
+# $text = '%'.$text."\n";
}
$result.=$text;
}
+ } elsif (($token->[0] eq 'D')) {
+ if ($metamode<1 && $target eq 'web') {
+ my $text=$token->[1];
+ $result.=$text;
+ }
} elsif ($token->[0] eq 'PI') {
- if ($metamode<1) {
+ if ($metamode<1 && $target eq 'web') {
$result=$token->[2];
}
} elsif ($token->[0] eq 'S') {
@@ -626,61 +531,63 @@ sub inner_xmlparse {
# add parameters list to another stack
push (@$parstack,&parstring($token));
&increasedepth($token);
- if (exists $$style_for_target{$token->[1]}) {
- if ($Apache::lonxml::redirection) {
- $Apache::lonxml::outputstack['-1'] .=
- &recurse($$style_for_target{$token->[1]},$target,$safeeval,
- $style_for_target,@$parstack);
- } else {
- $finaloutput .= &recurse($$style_for_target{$token->[1]},$target,
- $safeeval,$style_for_target,@$parstack);
- }
+ if ($Apache::lonxml::usestyle &&
+ exists($$style_for_target{$token->[1]})) {
+ $Apache::lonxml::usestyle=0;
+ my $string=$$style_for_target{$token->[1]}.
+ '';
+ &Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$$parstack[-1];
+ $Apache::lonxml::style_end_values=$$parstack[-1];
} else {
$result = &callsub("start_$token->[1]", $target, $token, $stack,
$parstack, $pars, $safeeval, $style_for_target);
}
} elsif ($token->[0] eq 'E') {
- #clear out any tags that didn't end
- while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
- my $lasttag=$$stack[-1];
- if ($token->[1] =~ /^$lasttag$/i) {
- &Apache::lonxml::warning('Using tag </'.$token->[1].'> as end tag to <'.$$stack[-1].'>');
- last;
- } else {
- &Apache::lonxml::warning('Found tag </'.$token->[1].'> when looking for </'.$$stack[-1].'> in file');
- &end_tag($stack,$parstack,$token);
- }
- }
-
- if (exists($$style_for_target{'/'."$token->[1]"})) {
- if ($Apache::lonxml::redirection) {
- $Apache::lonxml::outputstack['-1'] .=
- &recurse($$style_for_target{'/'."$token->[1]"},
- $target,$safeeval,$style_for_target,@$parstack);
- } else {
- $finaloutput .= &recurse($$style_for_target{'/'."$token->[1]"},
- $target,$safeeval,$style_for_target,
- @$parstack);
- }
+ if ($Apache::lonxml::usestyle &&
+ exists($$style_for_target{'/'."$token->[1]"})) {
+ $Apache::lonxml::usestyle=0;
+ my $string=$$style_for_target{'/'.$token->[1]}.
+ '';
+ &Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$Apache::lonxml::style_end_values;
+ $Apache::lonxml::style_end_values='';
+ $dontpop=1;
} else {
- $result = &callsub("end_$token->[1]", $target, $token, $stack,
- $parstack, $pars,$safeeval, $style_for_target);
+ #clear out any tags that didn't end
+ while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
+ my $lasttag=$$stack[-1];
+ if ($token->[1] =~ /^$lasttag$/i) {
+ &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
+ last;
+ } else {
+ &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
+ &end_tag($stack,$parstack,$token);
+ }
+ }
+ $result = &callsub("end_$token->[1]", $target, $token, $stack,
+ $parstack, $pars,$safeeval, $style_for_target);
}
} else {
&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
}
#evaluate variable refs in result
if ($result ne "") {
+ my $extras;
+ if (!$Apache::lonxml::usestyle) {
+ $extras=$Apache::lonxml::style_values;
+ }
if ( $#$parstack > -1 ) {
- $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);
+ $result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]);
} else {
- $result= &Apache::run::evaluate($result,$safeeval,'');
+ $result= &Apache::run::evaluate($result,$safeeval,$extras);
}
}
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
- if ($target eq 'tex') {
- $result=&latex_special_symbols($result,$stack,$parstack);
- }
+ #Style file definitions should be correct
+ if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
+ $result=&latex_special_symbols($result);
+ }
}
# Encode any high ASCII characters
@@ -694,12 +601,15 @@ sub inner_xmlparse {
}
$result = '';
- if ($token->[0] eq 'E') {
+ if ($token->[0] eq 'E' && !$dontpop) {
&end_tag($stack,$parstack,$token);
}
+ $dontpop=0;
+ }
+ if ($#$pars > -1) {
+ pop @$pars;
+ pop @Apache::lonxml::pwd;
}
- pop @$pars;
- pop @Apache::lonxml::pwd;
}
# if ($target eq 'meta') {
@@ -709,82 +619,10 @@ sub inner_xmlparse {
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
$finaloutput=&afterburn($finaloutput);
- }
+ }
return $finaloutput;
}
-sub recurse {
- my @innerstack = ();
- my @innerparstack = ();
- my ($newarg,$target,$safeeval,$style_for_target,@parstack) = @_;
- my @pat = ();
- &newparser(\@pat,\$newarg);
- my $tokenpat;
- my $partstring = '';
- my $output='';
- my $decls='';
- &Apache::lonxml::debug("Recursing");
- while ( $#pat > -1 ) {
- while ($tokenpat = $pat[$#pat]->get_token) {
- if (($tokenpat->[0] eq 'T') || ($tokenpat->[0] eq 'C') || ($tokenpat->[0] eq 'D') ) {
- if ($metamode<1) { $partstring=$tokenpat->[1]; }
- } elsif ($tokenpat->[0] eq 'PI') {
- if ($metamode<1) { $partstring=$tokenpat->[2]; }
- } elsif ($tokenpat->[0] eq 'S') {
- push (@innerstack,$tokenpat->[1]);
- push (@innerparstack,&parstring($tokenpat));
- &increasedepth($tokenpat);
- $partstring = &callsub("start_$tokenpat->[1]", $target, $tokenpat,
- \@innerstack, \@innerparstack, \@pat,
- $safeeval, $style_for_target);
- } elsif ($tokenpat->[0] eq 'E') {
- #clear out any tags that didn't end
- while ($tokenpat->[1] ne $innerstack[$#innerstack]
- && ($#innerstack > -1)) {
- my $lasttag=$innerstack[-1];
- if ($tokenpat->[1] =~ /^$lasttag$/i) {
- &Apache::lonxml::warning('Using tag </'.$tokenpat->[1].'> as end tag to <'.$innerstack[-1].'>');
- last;
- } else {
- &Apache::lonxml::warning('Found tag </'.$tokenpat->[1].'> when looking for </'.$innerstack[-1].'> in file');
- &end_tag(\@innerstack,\@innerparstack,$tokenpat);
- }
- }
- $partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,
- \@innerstack, \@innerparstack, \@pat,
- $safeeval, $style_for_target);
- } else {
- &Apache::lonxml::error("Unknown token event :$tokenpat->[0]:$tokenpat->[1]:");
- }
- #pass both the variable to the style tag, and the tag we
- #are processing inside the
- if ( $partstring ne "" ) {
- if ( $#parstack > -1 ) {
- if ( $#innerparstack > -1 ) {
- $decls= $parstack[$#parstack].$innerparstack[$#innerparstack];
- } else {
- $decls= $parstack[$#parstack];
- }
- } else {
- if ( $#innerparstack > -1 ) {
- $decls=$innerparstack[$#innerparstack];
- } else {
- $decls='';
- }
- }
- $output .= &Apache::run::evaluate($partstring,$safeeval,$decls);
- $partstring = '';
- }
- if ($tokenpat->[0] eq 'E') { pop @innerstack;pop @innerparstack;
- &decreasedepth($tokenpat);}
- }
- pop @pat;
- pop @Apache::lonxml::pwd;
- }
- &Apache::lonxml::debug("Exiting Recursing");
- return $output;
-}
-
sub callsub {
my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $currentstring='';
@@ -793,6 +631,8 @@ sub callsub {
my $sub1;
no strict 'refs';
my $tag=$token->[1];
+# get utterly rid of extended html tags
+ if ($tag=~/^x\-/i) { return ''; }
my $space=$Apache::lonxml::alltags{$tag}[-1];
if (!$space) {
$tag=~tr/A-Z/a-z/;
@@ -809,13 +649,13 @@ sub callsub {
}
if (!$deleted) {
if ($space) {
- &Apache::lonxml::debug("Calling sub $sub in $space $metamode");
+ #&Apache::lonxml::debug("Calling sub $sub in $space $metamode");
$sub1="$space\:\:$sub";
($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
$parstack,$parser,$safeeval,
$style);
} else {
- &Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode");
+ #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode");
if ($metamode <1) {
if (defined($token->[4]) && ($metamode < 1)) {
$currentstring = $token->[4];
@@ -827,7 +667,7 @@ sub callsub {
# &Apache::lonxml::debug("nodefalt:$nodefault:");
if ($currentstring eq '' && $nodefault eq '') {
if ($target eq 'edit') {
- &Apache::lonxml::debug("doing default edit for $token->[1]");
+ #&Apache::lonxml::debug("doing default edit for $token->[1]");
if ($token->[0] eq 'S') {
$currentstring = &Apache::edit::tag_start($target,$token);
} elsif ($token->[0] eq 'E') {
@@ -837,6 +677,9 @@ sub callsub {
if ($token->[0] eq 'S') {
$currentstring = $token->[4];
$currentstring.=&Apache::edit::handle_insert();
+ } elsif ($token->[0] eq 'E') {
+ $currentstring = $token->[2];
+ $currentstring.=&Apache::edit::handle_insertafter($token->[1]);
} else {
$currentstring = $token->[2];
}
@@ -854,6 +697,8 @@ sub setup_globals {
$Apache::lonxml::registered = 0;
$errorcount=0;
$warningcount=0;
+ $Apache::lonxml::default_homework_loaded=0;
+ $Apache::lonxml::usestyle=1;
&init_counter();
@Apache::lonxml::pwd=();
@Apache::lonxml::extlinks=();
@@ -902,6 +747,7 @@ sub init_safespace {
$safeeval->permit("sort");
$safeeval->deny(":base_io");
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');
+ $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');
$safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');
@@ -923,6 +769,37 @@ sub init_safespace {
$safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1');
$safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn');
$safehole->wrap(\&Math::Cephes::yv,$safeeval,'&yv');
+
+ $safehole->wrap(\&Math::Cephes::bdtr ,$safeeval,'&bdtr' );
+ $safehole->wrap(\&Math::Cephes::bdtrc ,$safeeval,'&bdtrc' );
+ $safehole->wrap(\&Math::Cephes::bdtri ,$safeeval,'&bdtri' );
+ $safehole->wrap(\&Math::Cephes::btdtr ,$safeeval,'&btdtr' );
+ $safehole->wrap(\&Math::Cephes::chdtr ,$safeeval,'&chdtr' );
+ $safehole->wrap(\&Math::Cephes::chdtrc,$safeeval,'&chdtrc');
+ $safehole->wrap(\&Math::Cephes::chdtri,$safeeval,'&chdtri');
+ $safehole->wrap(\&Math::Cephes::fdtr ,$safeeval,'&fdtr' );
+ $safehole->wrap(\&Math::Cephes::fdtrc ,$safeeval,'&fdtrc' );
+ $safehole->wrap(\&Math::Cephes::fdtri ,$safeeval,'&fdtri' );
+ $safehole->wrap(\&Math::Cephes::gdtr ,$safeeval,'&gdtr' );
+ $safehole->wrap(\&Math::Cephes::gdtrc ,$safeeval,'&gdtrc' );
+ $safehole->wrap(\&Math::Cephes::nbdtr ,$safeeval,'&nbdtr' );
+ $safehole->wrap(\&Math::Cephes::nbdtrc,$safeeval,'&nbdtrc');
+ $safehole->wrap(\&Math::Cephes::nbdtri,$safeeval,'&nbdtri');
+ $safehole->wrap(\&Math::Cephes::ndtr ,$safeeval,'&ndtr' );
+ $safehole->wrap(\&Math::Cephes::ndtri ,$safeeval,'&ndtri' );
+ $safehole->wrap(\&Math::Cephes::pdtr ,$safeeval,'&pdtr' );
+ $safehole->wrap(\&Math::Cephes::pdtrc ,$safeeval,'&pdtrc' );
+ $safehole->wrap(\&Math::Cephes::pdtri ,$safeeval,'&pdtri' );
+ $safehole->wrap(\&Math::Cephes::stdtr ,$safeeval,'&stdtr' );
+ $safehole->wrap(\&Math::Cephes::stdtri,$safeeval,'&stdtri');
+
+# $safehole->wrap(\&Math::Cephes::new_fract,$safeeval,'&new_fract');
+# $safehole->wrap(\&Math::Cephes::radd,$safeeval,'&radd');
+# $safehole->wrap(\&Math::Cephes::rsub,$safeeval,'&rsub');
+# $safehole->wrap(\&Math::Cephes::rmul,$safeeval,'&rmul');
+# $safehole->wrap(\&Math::Cephes::rdiv,$safeeval,'&rdiv');
+# $safehole->wrap(\&Math::Cephes::euclid,$safeeval,'&euclid');
+
$safehole->wrap(\&Math::Random::random_beta,$safeeval,'&math_random_beta');
$safehole->wrap(\&Math::Random::random_chi_square,$safeeval,'&math_random_chi_square');
$safehole->wrap(\&Math::Random::random_exponential,$safeeval,'&math_random_exponential');
@@ -952,9 +829,22 @@ sub init_safespace {
my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
$rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
$safeinit .= ';$external::randomseed='.$rndseed.';';
+ &Apache::lonxml::debug("Setting rndseed to $rndseed");
&Apache::run::run($safeinit,$safeeval);
}
+sub default_homework_load {
+ my ($safeeval)=@_;
+ &Apache::lonxml::debug('Loading default_homework');
+ my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm');
+ if ($default eq -1) {
+ &Apache::lonxml::error("Unable to find default_homework.lcpm");
+ } else {
+ &Apache::run::run($default,$safeeval);
+ $Apache::lonxml::default_homework_loaded=1;
+ }
+}
+
sub startredirection {
$Apache::lonxml::redirection++;
push (@Apache::lonxml::outputstack, '');
@@ -1026,7 +916,7 @@ sub get_all_text_unbalanced {
} elsif ($token->[0] eq 'E') {
$result.=$token->[2];
}
- if ($result =~ /(.*)$tag(.*)/) {
+ if ($result =~ /(.*)\Q$tag\E(.*)/s) {
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2);
&Apache::lonxml::debug('Result is :'.$1);
$result=$1;
@@ -1039,18 +929,23 @@ sub get_all_text_unbalanced {
}
sub increment_counter {
- $Apache::lonxml::counter++;
+ my ($increment) = @_;
+ if (defined($increment) && $increment gt 0) {
+ $Apache::lonxml::counter+=$increment;
+ } else {
+ $Apache::lonxml::counter++;
+ }
$Apache::lonxml::counter_changed=1;
}
sub init_counter {
if (defined($ENV{'form.counter'})) {
$Apache::lonxml::counter=$ENV{'form.counter'};
- } elsif (not defined($Apache::lonxml::counter)) {
+ $Apache::lonxml::counter_changed=0;
+ } else {
$Apache::lonxml::counter=1;
- &store_counter();
+ $Apache::lonxml::counter_changed=1;
}
- $Apache::lonxml::counter_changed=0;
}
sub store_counter {
@@ -1059,50 +954,105 @@ sub store_counter {
}
sub get_all_text {
- my($tag,$pars)= @_;
- my $depth=0;
- my $token;
- my $result='';
- if ( $tag =~ m:^/: ) {
- my $tag=substr($tag,1);
-# &Apache::lonxml::debug("have:$tag:");
- while (($depth >=0) && ($token = $pars->get_token)) {
-# &Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]");
- if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
- $result.=$token->[1];
- } elsif ($token->[0] eq 'PI') {
- $result.=$token->[2];
- } elsif ($token->[0] eq 'S') {
- if ($token->[1] =~ /^$tag$/i) { $depth++; }
- $result.=$token->[4];
- } elsif ($token->[0] eq 'E') {
- if ( $token->[1] =~ /^$tag$/i) { $depth--; }
- #skip sending back the last end tag
- if ($depth > -1) { $result.=$token->[2]; } else {
- $pars->unget_token($token);
- }
- }
- }
- } else {
- while ($token = $pars->get_token) {
-# &Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
- if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
- $result.=$token->[1];
- } elsif ($token->[0] eq 'PI') {
- $result.=$token->[2];
- } elsif ($token->[0] eq 'S') {
- if ( $token->[1] =~ /^$tag$/i) {
- $pars->unget_token($token); last;
- } else {
- $result.=$token->[4];
- }
- } elsif ($token->[0] eq 'E') {
- $result.=$token->[2];
- }
- }
- }
-# &Apache::lonxml::debug("Exit:$result:");
- return $result
+ my($tag,$pars,$style)= @_;
+ &Apache::lonxml::debug("Got a ".ref($pars));
+ my $gotfullstack=1;
+ if (ref($pars) ne 'ARRAY') {
+ $gotfullstack=0;
+ $pars=[$pars];
+ }
+ &Apache::lonxml::debug("Got a ".ref($style));
+ if (ref($style) ne 'HASH') {
+ $style={};
+ } else {
+ &Apache::lonhomework::showhash(%$style);
+ }
+ my $depth=0;
+ my $token;
+ my $result='';
+ if ( $tag =~ m:^/: ) {
+ my $tag=substr($tag,1);
+ #&Apache::lonxml::debug("have:$tag:");
+ my $top_empty=0;
+ while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
+ while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
+ #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
+ if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
+ $result.=$token->[1];
+ } elsif ($token->[0] eq 'PI') {
+ $result.=$token->[2];
+ } elsif ($token->[0] eq 'S') {
+ if ($token->[1] =~ /^$tag$/i) { $depth++; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
+ $result.=$token->[4];
+ } elsif ($token->[0] eq 'E') {
+ if ( $token->[1] =~ /^$tag$/i) { $depth--; }
+ #skip sending back the last end tag
+ if ($depth == 0 && exists($$style{'/'.$token->[1]})) {
+ my $string=
+ ''.
+ $$style{'/'.$token->[1]}.
+ $token->[2].
+ '';
+ &Apache::lonxml::newparser($pars,\$string);
+ #&Apache::lonxml::debug("reParsing $string");
+ next;
+ }
+ if ($depth > -1) {
+ $result.=$token->[2];
+ } else {
+ $$pars[-1]->unget_token($token);
+ }
+ }
+ }
+ if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
+ if (($depth >=0) && ($#$pars > 0) ) {
+ pop(@$pars);
+ pop(@Apache::lonxml::pwd);
+ }
+ }
+ if ($top_empty && $depth >= 0) {
+ #never found the end tag ran out of text, throw error send back blank
+ &error('Never found end tag for <'.$tag.
+ '> current string
'.
+ &HTML::Entities::encode($result).
+ '
');
+ if ($gotfullstack) {
+ my $newstring=''.$tag.'>'.$result;
+ &Apache::lonxml::newparser($pars,\$newstring);
+ }
+ $result='';
+ }
+ } else {
+ while ($#$pars > -1) {
+ while ($token = $$pars[-1]->get_token) {
+ #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
+ if (($token->[0] eq 'T')||($token->[0] eq 'C')||
+ ($token->[0] eq 'D')) {
+ $result.=$token->[1];
+ } elsif ($token->[0] eq 'PI') {
+ $result.=$token->[2];
+ } elsif ($token->[0] eq 'S') {
+ if ( $token->[1] =~ /^$tag$/i) {
+ $$pars[-1]->unget_token($token); last;
+ } else {
+ $result.=$token->[4];
+ }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
+ if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
+ } elsif ($token->[0] eq 'E') {
+ $result.=$token->[2];
+ }
+ }
+ if (($#$pars > 0) ) {
+ pop(@$pars);
+ pop(@Apache::lonxml::pwd);
+ } else { last; }
+ }
+ }
+ #&Apache::lonxml::debug("Exit:$result:");
+ return $result
}
sub newparser {
@@ -1114,8 +1064,6 @@ sub newparser {
} else {
push (@Apache::lonxml::pwd, $dir);
}
-# &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");
-# &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");
}
sub parstring {
@@ -1124,9 +1072,9 @@ sub parstring {
foreach (@{$token->[3]}) {
unless ($_=~/\W/) {
my $val=$token->[2]->{$_};
- $val =~ s/([\%\@\\\"])/\\$1/g;
+ $val =~ s/([\%\@\\\"\'])/\\$1/g;
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
- $temp .= "my \$$_=\"$val\";"
+ $temp .= "my \$$_=\"$val\";";
}
}
return $temp;
@@ -1178,7 +1126,7 @@ sub afterburn {
$matchthis=~s/\_+/\\s\+/g;
$result=~s/($matchthis)/\$1\<\/a\>/s;
$result.=(<<"ENDSCRIPT");
-
ENDSCRIPT
@@ -1191,8 +1139,10 @@ sub storefile {
if (my $fh=Apache::File->new('>'.$file)) {
print $fh $contents;
$fh->close();
+ return 1;
} else {
- &warning("Unable to save file $file");
+ &warning("Unable to save file $file");
+ return 0;
}
}
@@ -1214,14 +1164,35 @@ SIMPLECONTENT
return $filecontents;
}
+sub createnewsty {
+ my $filecontents=(<
+
+
+
+
+
+SIMPLECONTENT
+ return $filecontents;
+}
+
sub inserteditinfo {
- my ($result,$filecontents)=@_;
+ my ($result,$filecontents,$filetype)=@_;
$filecontents = &HTML::Entities::encode($filecontents);
# my $editheader='Edit below';
+ my $xml_help = '';
+ if ($filetype eq 'html') {
+ $xml_help=Apache::loncommon::helpLatexCheatsheet();
+ }
+ my $cleanbut = '';
+ if ($filetype eq 'html') {
+ $cleanbut='';
+ }
+ my $titledisplay=&display_title();
my $buttons=(<
+$cleanbut
BUTTONS
@@ -1229,12 +1200,14 @@ BUTTONS
+$titledisplay
ENDFOOTER
# $result=~s/(\]*\>)/$1$editheader/is;
$result=~s/(\<\/body\>)/$editfooter/is;
@@ -1269,37 +1242,45 @@ sub get_target {
}
sub handler {
- my $request=shift;
-
- my $target=&get_target();
-
- $Apache::lonxml::debug=0;
-
- if ($ENV{'browser.mathml'}) {
- $request->content_type('text/xml');
- } else {
- $request->content_type('text/html');
- }
- &Apache::loncommon::no_cache($request);
- $request->send_http_header;
-
- return OK if $request->header_only;
+ my $request=shift;
+
+ my $target=&get_target();
+
+ $Apache::lonxml::debug=$ENV{'user.debug'};
+
+ if ($ENV{'browser.mathml'}) {
+ $request->content_type('text/xml');
+ } else {
+ $request->content_type('text/html');
+ }
+ &Apache::loncommon::no_cache($request);
+ $request->send_http_header;
+
+ return OK if $request->header_only;
- my $file=&Apache::lonnet::filelocation("",$request->uri);
+ my $file=&Apache::lonnet::filelocation("",$request->uri);
+ my $filetype;
+ if ($file =~ /\.sty$/) {
+ $filetype='sty';
+ } else {
+ $filetype='html';
+ }
#
# Edit action? Save file.
#
- unless ($ENV{'request.state'} eq 'published') {
- if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
- &storefile($file,$ENV{'form.filecont'});
- }
- }
- my %mystyle;
- my $result = '';
- my $filecontents=&Apache::lonnet::getfile($file);
- if ($filecontents == -1) {
- $result=(<print("Updated: ". strftime("%d %b %H:%M:%S",localtime())." ");
+ }
+ }
+ }
+ my %mystyle;
+ my $result = '';
+ my $filecontents=&Apache::lonnet::getfile($file);
+ if ($filecontents eq -1) {
+ $result=(<File not found
@@ -1310,40 +1291,62 @@ sub handler {
ENDNOTFOUND
$filecontents='';
- if ($ENV{'request.state'} ne 'published') {
- $filecontents=&createnewhtml();
- $ENV{'form.editmode'}='Edit'; #force edit mode
- }
- } else {
- unless ($ENV{'request.state'} eq 'published') {
- if ($ENV{'form.attemptclean'}) {
- $filecontents=&htmlclean($filecontents,1);
- }
- }
- if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
- $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
- '',%mystyle);
+ if ($ENV{'request.state'} ne 'published') {
+ if ($filetype eq 'sty') {
+ $filecontents=&createnewsty();
+ } else {
+ $filecontents=&createnewhtml();
+ }
+ $ENV{'form.editmode'}='Edit'; #force edit mode
+ }
+ } else {
+ unless ($ENV{'request.state'} eq 'published') {
+ if ($ENV{'form.attemptclean'}) {
+ $filecontents=&htmlclean($filecontents,1);
+ }
+#
+# we are in construction space, see if edit mode forced
+ &Apache::loncommon::get_unprocessed_cgi
+ ($ENV{'QUERY_STRING'},['editmode']);
+ }
+ if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
+ $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
+ '',%mystyle);
+ }
}
- }
-
+
#
# Edit action? Insert editing commands
#
- unless ($ENV{'request.state'} eq 'published') {
- if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
- my $displayfile=$request->uri;
- $displayfile=~s/^\/[^\/]*//;
- $result='