version 1.203, 2002/10/17 14:42:07
|
version 1.218, 2002/12/06 17:56:53
|
Line 60
|
Line 60
|
|
|
package Apache::lonxml; |
package Apache::lonxml; |
use vars |
use vars |
qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $prevent_entity_encode); |
qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $prevent_entity_encode $errorcount $warningcount); |
use strict; |
use strict; |
use HTML::LCParser(); |
use HTML::LCParser(); |
use HTML::TreeBuilder(); |
use HTML::TreeBuilder(); |
Line 101 use Apache::File();
|
Line 101 use Apache::File();
|
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonfeedback(); |
use Apache::lonfeedback(); |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
|
use Apache::loncacc(); |
|
|
#================================================== Main subroutine: xmlparse |
#================================================== Main subroutine: xmlparse |
#debugging control, to turn on debugging modify the correct handler |
#debugging control, to turn on debugging modify the correct handler |
$Apache::lonxml::debug=0; |
$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 |
#path to the directory containing the file currently being processed |
@pwd=(); |
@pwd=(); |
|
|
Line 140 $Apache::lonxml::registered=0;
|
Line 145 $Apache::lonxml::registered=0;
|
# a pointer the the Apache request object |
# a pointer the the Apache request object |
$Apache::lonxml::request=''; |
$Apache::lonxml::request=''; |
|
|
|
# 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; |
|
|
sub xmlbegin { |
sub xmlbegin { |
my $output=''; |
my $output=''; |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
Line 362 sub fontsettings() {
|
Line 374 sub fontsettings() {
|
return $headerstring; |
return $headerstring; |
} |
} |
|
|
|
|
|
## |
|
## switchmenu - modeled on lonmenu::switchmenu, but better. |
|
## Helper function for registerurl |
|
## |
|
sub switchmenu { |
|
my ($row,$col,$imgsrc,$texttop,$textbot,$action,$description)=@_; |
|
return(<<ENDSMENU); |
|
menu.switchbutton($row,$col,'$imgsrc','$texttop','$textbot','$action','$description'); |
|
ENDSMENU |
|
} |
|
|
sub registerurl { |
sub registerurl { |
my $forcereg=shift; |
my $forcereg=shift; |
my $target = shift; |
my $target = shift; |
Line 393 sub registerurl {
|
Line 417 sub registerurl {
|
if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { |
if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) { |
if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDSUBM); |
$hwkadd.=(<<ENDSUBM); |
menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")'); |
menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")', |
|
'View user submissions for this assessment resource'); |
ENDSUBM |
ENDSUBM |
} |
} |
if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDGRDS); |
$hwkadd.=(<<ENDGRDS); |
menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")'); |
menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")', |
|
'Modify user grades for this assessment resource'); |
ENDGRDS |
ENDGRDS |
} |
} |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) { |
$hwkadd.=(<<ENDPARM); |
$hwkadd.=(<<ENDPARM); |
menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")'); |
menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")', |
|
'Modify deadlines, etc, for this assessment resource'); |
ENDPARM |
ENDPARM |
} |
} |
} |
} |
|
### |
|
### Determine whether or not to display the 'cstr' button for this |
|
### resource |
|
### |
|
my $editbutton = ''; |
|
if ($ENV{'user.author'}) { |
|
if ($ENV{'request.role'}=~/^(ca|au)/) { |
|
# Set defaults for authors |
|
my ($top,$bottom) = ('con-','struct'); |
|
my $action = "go('/priv/".$ENV{'user.name'}."');"; |
|
my $cadom = $ENV{'request.role.domain'}; |
|
my $caname = $ENV{'user.name'}; |
|
my $desc = "Enter my resource construction space"; |
|
# Set defaults for co-authors |
|
if ($ENV{'request.role'} =~ /^ca/) { |
|
($cadom,$caname)=($ENV{'request.role'}=~/(\w+)\/(\w+)$/); |
|
($top,$bottom) = ('co con-','struct'); |
|
$action = 'go("/priv/'.$caname.'");'; |
|
$desc = "Enter construction space as co-author"; |
|
} |
|
# Check that we are on the correct machine |
|
my $home = &Apache::lonnet::homeserver($caname,$cadom); |
|
if ($home eq $Apache::lonnet::perlvar{'lonHostID'}) { |
|
$editbutton=&switchmenu |
|
(6,1,$top,,$bottom,$action,$desc); |
|
} |
|
} |
|
## |
|
## Determine if user can edit url. |
|
## |
|
my $cfile=''; |
|
my $cfuname=''; |
|
my $cfudom=''; |
|
if ($ENV{'request.filename'}) { |
|
my $file=&Apache::lonnet::declutter($ENV{'request.filename'}); |
|
$file=~s/^(\w+)\/(\w+)/\/priv\/$2/; |
|
# Chech that the user has permission to edit this resource |
|
($cfuname,$cfudom)=&Apache::loncacc::constructaccess($file,$1); |
|
if (defined($cfudom)) { |
|
if (&Apache::lonnet::homeserver($cfuname,$cfudom) |
|
eq $Apache::lonnet::perlvar{'lonHostID'}) { |
|
$cfile=$file; |
|
} |
|
} |
|
} |
|
# Finally, turn the button on or off |
|
if ($cfile) { |
|
$editbutton=&switchmenu |
|
(6,1,'cstr.gif','edit','resource', |
|
'go("'.$cfile.'");',"Edit this resource"); |
|
} elsif ($editbutton eq '') { |
|
$editbutton = ' menu.clearbut(6,1);'; |
|
} |
|
} |
|
### |
|
### |
$result = (<<ENDREGTHIS); |
$result = (<<ENDREGTHIS); |
|
|
<script language="JavaScript"> |
<script language="JavaScript"> |
Line 419 ENDPARM
|
Line 502 ENDPARM
|
$newmail |
$newmail |
menu.currentURL=window.location.pathname; |
menu.currentURL=window.location.pathname; |
menu.reloadURL=window.location.pathname; |
menu.reloadURL=window.location.pathname; |
|
menu.currentSymb="$ENV{'request.symb'}"; |
|
menu.reloadSymb="$ENV{'request.symb'}"; |
menu.currentStale=0; |
menu.currentStale=0; |
menu.clearbut(3,1); |
menu.clearbut(3,1); |
menu.switchbutton |
menu.switchbutton |
(6,3,'catalog.gif','catalog','info','catalog_info()'); |
(6,3,'catalog.gif','catalog','info','catalog_info()'); |
menu.switchbutton |
menu.switchbutton |
(8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)'); |
(8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)','Provide my evaluation of this resource'); |
menu.switchbutton |
menu.switchbutton |
(8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)'); |
(8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)','Provide feedback messages or contribute to the course discussion about this resource'); |
menu.switchbutton |
menu.switchbutton |
(8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)'); |
(8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)','Prepare a printable document'); |
menu.switchbutton |
menu.switchbutton |
(2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)'); |
(2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)','Go to the previous resource in the course sequence'); |
menu.switchbutton |
menu.switchbutton |
(2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)'); |
(2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)','Go to the next resource in the course sequence'); |
menu.switchbutton |
menu.switchbutton |
(9,1,'sbkm.gif','set','bookmark','set_bookmark()'); |
(9,1,'sbkm.gif','set','bookmark','set_bookmark()','Set a bookmark for this resource'); |
menu.switchbutton |
menu.switchbutton |
(9,2,'vbkm.gif','view','bookmark','edit_bookmarks()'); |
(9,2,'vbkm.gif','view','bookmark','edit_bookmarks()','Use or edit my bookmark collection'); |
menu.switchbutton |
menu.switchbutton |
(9,3,'anot.gif','anno-','tations','annotate()'); |
(9,3,'anot.gif','anno-','tations','annotate()','Make notes and annotations about this resource'); |
$hwkadd |
$hwkadd |
|
$editbutton |
} |
} |
|
|
function LONCAPAstale() { |
function LONCAPAstale() { |
Line 447 ENDPARM
|
Line 533 ENDPARM
|
menu.currentStale=1; |
menu.currentStale=1; |
if (menu.reloadURL!='' && menu.reloadURL!= null) { |
if (menu.reloadURL!='' && menu.reloadURL!= null) { |
menu.switchbutton |
menu.switchbutton |
(3,1,'reload.gif','return','location','go(reloadURL)'); |
(3,1,'reload.gif','return','location','go(reloadURL)','Return to the last known location in the course sequence'); |
} |
} |
menu.clearbut(7,1); |
menu.clearbut(7,1); |
menu.clearbut(7,2); |
menu.clearbut(7,2); |
Line 520 sub xmlparse {
|
Line 606 sub xmlparse {
|
# do we have a course style file? |
# do we have a course style file? |
# |
# |
|
|
if ($ENV{'request.course.id'}) { |
if ($ENV{'request.course.id'} && $ENV{'request.state'} ne 'construct') { |
my $bodytext= |
my $bodytext= |
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; |
$ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'}; |
if ($bodytext) { |
if ($bodytext) { |
Line 555 sub xmlparse {
|
Line 641 sub xmlparse {
|
if ($ENV{'request.uri'}) { |
if ($ENV{'request.uri'}) { |
&writeallows($ENV{'request.uri'}); |
&writeallows($ENV{'request.uri'}); |
} |
} |
|
if ($Apache::lonxml::counter_changed) { &store_counter() } |
return $finaloutput; |
return $finaloutput; |
} |
} |
|
|
Line 581 sub htmlclean {
|
Line 668 sub htmlclean {
|
|
|
sub latex_special_symbols { |
sub latex_special_symbols { |
my ($current_token,$stack,$parstack)=@_; |
my ($current_token,$stack,$parstack)=@_; |
$current_token=~s/\\/\\char92 /g; |
$current_token=~s/\\ /\\char92 /g; |
$current_token=~s/\^/\\char94 /g; |
$current_token=~s/\^/\\char94 /g; |
$current_token=~s/\~/\\char126 /g; |
$current_token=~s/\~/\\char126 /g; |
$current_token=~s/(&[^a-z\#])/\\$1/g; |
$current_token=~s/(&[^a-z\#])/\\$1/g; |
Line 606 sub inner_xmlparse {
|
Line 693 sub inner_xmlparse {
|
if ($metamode<1) { |
if ($metamode<1) { |
my $text=$token->[1]; |
my $text=$token->[1]; |
if ($token->[0] eq 'C' && $target eq 'tex') { |
if ($token->[0] eq 'C' && $target eq 'tex') { |
$text = '%'.$text; |
$text = '%'.$text."\n"; |
$text =~ s/[\n\r]//g; |
|
} |
} |
$result.=$text; |
$result.=$text; |
} |
} |
Line 621 sub inner_xmlparse {
|
Line 707 sub inner_xmlparse {
|
# add parameters list to another stack |
# add parameters list to another stack |
push (@$parstack,&parstring($token)); |
push (@$parstack,&parstring($token)); |
&increasedepth($token); |
&increasedepth($token); |
if (exists $$style_for_target{$token->[1]}) { |
if ($Apache::lonxml::usestyle && |
if ($Apache::lonxml::redirection) { |
exists($$style_for_target{$token->[1]})) { |
$Apache::lonxml::outputstack['-1'] .= |
$Apache::lonxml::usestyle=0; |
&recurse($$style_for_target{$token->[1]},$target,$safeeval, |
my $string=$$style_for_target{$token->[1]}. |
$style_for_target,@$parstack); |
'<LONCAPA_INTERNAL_TURN_STYLE_ON />'; |
} else { |
&Apache::lonxml::newparser($pars,\$string); |
$finaloutput .= &recurse($$style_for_target{$token->[1]},$target, |
|
$safeeval,$style_for_target,@$parstack); |
|
} |
|
} else { |
} else { |
$result = &callsub("start_$token->[1]", $target, $token, $stack, |
$result = &callsub("start_$token->[1]", $target, $token, $stack, |
$parstack, $pars, $safeeval, $style_for_target); |
$parstack, $pars, $safeeval, $style_for_target); |
Line 647 sub inner_xmlparse {
|
Line 730 sub inner_xmlparse {
|
} |
} |
} |
} |
|
|
if (exists($$style_for_target{'/'."$token->[1]"})) { |
if ($Apache::lonxml::usestyle && |
if ($Apache::lonxml::redirection) { |
exists($$style_for_target{'/'."$token->[1]"})) { |
$Apache::lonxml::outputstack['-1'] .= |
$Apache::lonxml::usestyle=0; |
&recurse($$style_for_target{'/'."$token->[1]"}, |
my $string=$$style_for_target{'/'.$token->[1]}. |
$target,$safeeval,$style_for_target,@$parstack); |
'<LONCAPA_INTERNAL_TURN_STYLE_ON />'; |
} else { |
&Apache::lonxml::newparser($pars,\$string); |
$finaloutput .= &recurse($$style_for_target{'/'."$token->[1]"}, |
|
$target,$safeeval,$style_for_target, |
|
@$parstack); |
|
} |
|
} else { |
} else { |
$result = &callsub("end_$token->[1]", $target, $token, $stack, |
$result = &callsub("end_$token->[1]", $target, $token, $stack, |
$parstack, $pars,$safeeval, $style_for_target); |
$parstack, $pars,$safeeval, $style_for_target); |
Line 693 sub inner_xmlparse {
|
Line 772 sub inner_xmlparse {
|
&end_tag($stack,$parstack,$token); |
&end_tag($stack,$parstack,$token); |
} |
} |
} |
} |
pop @$pars; |
if ($#$pars > -1) { |
pop @Apache::lonxml::pwd; |
pop @$pars; |
|
pop @Apache::lonxml::pwd; |
|
} |
} |
} |
|
|
# if ($target eq 'meta') { |
# if ($target eq 'meta') { |
Line 704 sub inner_xmlparse {
|
Line 785 sub inner_xmlparse {
|
|
|
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
$finaloutput=&afterburn($finaloutput); |
$finaloutput=&afterburn($finaloutput); |
} |
} |
return $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 <definedtag> |
|
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 { |
sub callsub { |
my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my $currentstring=''; |
my $currentstring=''; |
Line 832 sub callsub {
|
Line 841 sub callsub {
|
if ($token->[0] eq 'S') { |
if ($token->[0] eq 'S') { |
$currentstring = $token->[4]; |
$currentstring = $token->[4]; |
$currentstring.=&Apache::edit::handle_insert(); |
$currentstring.=&Apache::edit::handle_insert(); |
|
} elsif ($token->[0] eq 'E') { |
|
$currentstring = $token->[2]; |
|
$currentstring.=&Apache::edit::handle_insertafter($token->[1]); |
} else { |
} else { |
$currentstring = $token->[2]; |
$currentstring = $token->[2]; |
} |
} |
Line 847 sub setup_globals {
|
Line 859 sub setup_globals {
|
my ($request,$target)=@_; |
my ($request,$target)=@_; |
$Apache::lonxml::request=$request; |
$Apache::lonxml::request=$request; |
$Apache::lonxml::registered = 0; |
$Apache::lonxml::registered = 0; |
if ($ENV{'form.counter'}) { |
$errorcount=0; |
$Apache::lonxml::counter=$ENV{'form.counter'} |
$warningcount=0; |
} elsif (not defined $Apache::lonxml::counter) { |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::counter=1; |
$Apache::lonxml::usestyle=1; |
my %moreenv; |
&init_counter(); |
$moreenv{'form.counter'}=$Apache::lonxml::counter; |
|
&Apache::lonnet::appenv(%moreenv); |
|
} |
|
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
if ($target eq 'meta') { |
if ($target eq 'meta') { |
Line 923 sub init_safespace {
|
Line 932 sub init_safespace {
|
$safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1'); |
$safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1'); |
$safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn'); |
$safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn'); |
$safehole->wrap(\&Math::Cephes::yv,$safeeval,'&yv'); |
$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_beta,$safeeval,'&math_random_beta'); |
$safehole->wrap(\&Math::Random::random_chi_square,$safeeval,'&math_random_chi_square'); |
$safehole->wrap(\&Math::Random::random_chi_square,$safeeval,'&math_random_chi_square'); |
$safehole->wrap(\&Math::Random::random_exponential,$safeeval,'&math_random_exponential'); |
$safehole->wrap(\&Math::Random::random_exponential,$safeeval,'&math_random_exponential'); |
Line 955 sub init_safespace {
|
Line 995 sub init_safespace {
|
&Apache::run::run($safeinit,$safeeval); |
&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 == -1) { |
|
&Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>"); |
|
} else { |
|
&Apache::run::run($default,$safeeval); |
|
$Apache::lonxml::default_homework_loaded=1; |
|
} |
|
} |
|
|
sub startredirection { |
sub startredirection { |
$Apache::lonxml::redirection++; |
$Apache::lonxml::redirection++; |
push (@Apache::lonxml::outputstack, ''); |
push (@Apache::lonxml::outputstack, ''); |
Line 1026 sub get_all_text_unbalanced {
|
Line 1078 sub get_all_text_unbalanced {
|
} elsif ($token->[0] eq 'E') { |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[2]; |
$result.=$token->[2]; |
} |
} |
if ($result =~ /(.*)$tag(.*)/) { |
if ($result =~ /(.*)\Q$tag\E(.*)/s) { |
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2); |
&Apache::lonxml::debug('Got a winner with leftovers ::'.$2); |
&Apache::lonxml::debug('Result is :'.$1); |
&Apache::lonxml::debug('Result is :'.$1); |
$result=$1; |
$result=$1; |
Line 1038 sub get_all_text_unbalanced {
|
Line 1090 sub get_all_text_unbalanced {
|
return $result |
return $result |
} |
} |
|
|
|
sub increment_counter { |
|
$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=1; |
|
&store_counter(); |
|
} |
|
$Apache::lonxml::counter_changed=0; |
|
} |
|
|
|
sub store_counter { |
|
&Apache::lonnet::appenv(('form.counter' => $Apache::lonxml::counter)); |
|
return ''; |
|
} |
|
|
sub get_all_text { |
sub get_all_text { |
my($tag,$pars)= @_; |
my($tag,$pars)= @_; |
|
&Apache::lonxml::debug("Got a ".ref($pars)); |
|
if (ref($pars) ne 'ARRAY') { |
|
$pars=[$pars]; |
|
} |
my $depth=0; |
my $depth=0; |
my $token; |
my $token; |
my $result=''; |
my $result=''; |
if ( $tag =~ m:^/: ) { |
if ( $tag =~ m:^/: ) { |
my $tag=substr($tag,1); |
my $tag=substr($tag,1); |
# &Apache::lonxml::debug("have:$tag:"); |
#&Apache::lonxml::debug("have:$tag:"); |
while (($depth >=0) && ($token = $pars->get_token)) { |
while (($depth >=0) && ($#$pars > -1)) { |
# &Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]"); |
while (($depth >=0) && ($token = $$pars[-1]->get_token)) { |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
#&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); |
$result.=$token->[1]; |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
} elsif ($token->[0] eq 'PI') { |
$result.=$token->[1]; |
$result.=$token->[2]; |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'S') { |
$result.=$token->[2]; |
if ($token->[1] =~ /^$tag$/i) { $depth++; } |
} elsif ($token->[0] eq 'S') { |
$result.=$token->[4]; |
if ($token->[1] =~ /^$tag$/i) { $depth++; } |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[4]; |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
} elsif ($token->[0] eq 'E') { |
#skip sending back the last end tag |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
if ($depth > -1) { $result.=$token->[2]; } else { |
#skip sending back the last end tag |
$pars->unget_token($token); |
if ($depth > -1) { $result.=$token->[2]; } else { |
|
$$pars[-1]->unget_token($token); |
|
} |
} |
} |
} |
} |
|
if (($depth >=0) && ($#$pars > 0) ) { |
|
pop(@$pars); |
|
pop(@Apache::lonxml::pwd); |
|
} |
} |
} |
} else { |
} else { |
while ($token = $pars->get_token) { |
while ($#$pars > -1) { |
# &Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
while ($token = $$pars[-1]->get_token) { |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
#&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
$result.=$token->[1]; |
if (($token->[0] eq 'T')||($token->[0] eq 'C')|| |
} elsif ($token->[0] eq 'PI') { |
($token->[0] eq 'D')) { |
$result.=$token->[2]; |
$result.=$token->[1]; |
} elsif ($token->[0] eq 'S') { |
} elsif ($token->[0] eq 'PI') { |
if ( $token->[1] =~ /^$tag$/i) { |
$result.=$token->[2]; |
$pars->unget_token($token); last; |
} elsif ($token->[0] eq 'S') { |
} else { |
if ( $token->[1] =~ /^$tag$/i) { |
$result.=$token->[4]; |
$$pars[-1]->unget_token($token); last; |
} |
} else { |
} elsif ($token->[0] eq 'E') { |
$result.=$token->[4]; |
$result.=$token->[2]; |
} |
|
} elsif ($token->[0] eq 'E') { |
|
$result.=$token->[2]; |
|
} |
|
} |
|
if (($#$pars > 0) ) { |
|
pop(@$pars); |
|
pop(@Apache::lonxml::pwd); |
|
} else { last; } |
} |
} |
} |
|
} |
} |
# &Apache::lonxml::debug("Exit:$result:"); |
if ($result =~ m|<LONCAPA_INTERNAL_TURN_STYLE_ON />|) { |
|
$Apache::lonxml::usestyle=1; |
|
} |
|
#&Apache::lonxml::debug("Exit:$result:"); |
return $result |
return $result |
} |
} |
|
|
Line 1334 sub debug {
|
Line 1426 sub debug {
|
} |
} |
|
|
sub error { |
sub error { |
|
$errorcount++; |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
# If printing in construction space, put the error inside <pre></pre> |
# If printing in construction space, put the error inside <pre></pre> |
print "<b>ERROR:</b>".join("\n",@_)."\n"; |
print "<b>ERROR:</b>".join("\n",@_)."\n"; |
Line 1343 sub error {
|
Line 1436 sub error {
|
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
#notify course |
#notify course |
if ( $ENV{'request.course.id'} ) { |
if ( $ENV{'request.course.id'} ) { |
my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}; |
my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1); |
my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); |
my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); |
foreach my $user (split /\,/, $users) { |
foreach (keys %users) { |
($user,my $domain) = split /:/, $user; |
my ($user,$domain) = split(/:/, $_); |
&Apache::lonmsg::user_normal_msg($user,$domain, |
&Apache::lonmsg::user_normal_msg($user,$domain, |
"Error [$declutter]",join('<br />',@_)); |
"Error [$declutter]",join('<br />',@_)); |
} |
} |
Line 1359 sub error {
|
Line 1452 sub error {
|
} |
} |
|
|
sub warning { |
sub warning { |
|
$warningcount++; |
if ($ENV{'request.state'} eq 'construct') { |
if ($ENV{'request.state'} eq 'construct') { |
print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"; |
print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"; |
} |
} |
} |
} |
|
|
sub get_param { |
sub get_param { |
my ($param,$parstack,$safeeval,$context) = @_; |
my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_; |
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( ! $args ) { return undef; } |
if ( ! $args ) { return undef; } |
if ( $args =~ /my \$$param=\"/ ) { |
if ( $case_insensitive ) { |
return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) { |
} else { |
return &Apache::run::run("{$args;".'return $'.$param.'}', |
return undef; |
$safeeval); #' |
} |
} else { |
|
return undef; |
|
} |
|
} else { |
|
if ( $args =~ /my \$\Q$param\E=\"/ ) { |
|
return &Apache::run::run("{$args;".'return $'.$param.'}', |
|
$safeeval); #' |
|
} else { |
|
return undef; |
|
} |
|
} |
} |
} |
|
|
sub get_param_var { |
sub get_param_var { |
my ($param,$parstack,$safeeval,$context) = @_; |
my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_; |
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $args !~ /my \$$param=\"/ ) { return undef; } |
if ($case_insensitive) { |
|
if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { |
|
return undef; |
|
} |
|
} elsif ( $args !~ /my \$\Q$param\E=\"/ ) { return undef; } |
my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
my $value=&Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' |
if ($value =~ /^[\$\@\%]/) { |
if ($value =~ /^[\$\@\%]/) { |
return &Apache::run::run("return $value",$safeeval,1); |
return &Apache::run::run("return $value",$safeeval,1); |