version 1.187, 2002/08/07 13:58:38
|
version 1.215, 2002/11/13 23:21:07
|
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 99 use Apache::edit();
|
Line 99 use Apache::edit();
|
use Apache::lonnet(); |
use Apache::lonnet(); |
use Apache::File(); |
use Apache::File(); |
use Apache::loncommon(); |
use Apache::loncommon(); |
|
use Apache::lonfeedback(); |
|
use Apache::lonmsg(); |
|
|
#================================================== 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 138 $Apache::lonxml::registered=0;
|
Line 144 $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 hether it is used |
|
$Apache::lonxml::counter=0; |
|
$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 154 sub xmlbegin {
|
Line 167 sub xmlbegin {
|
} |
} |
|
|
sub xmlend { |
sub xmlend { |
|
my ($discussiononly,$symb)=@_; |
my $discussion=''; |
my $discussion=''; |
if ($ENV{'request.course.id'}) { |
if ($ENV{'request.course.id'}) { |
my $crs='/'.$ENV{'request.course.id'}; |
my $crs='/'.$ENV{'request.course.id'}; |
Line 162 sub xmlend {
|
Line 176 sub xmlend {
|
} |
} |
$crs=~s/\_/\//g; |
$crs=~s/\_/\//g; |
my $seeid=&Apache::lonnet::allowed('rin',$crs); |
my $seeid=&Apache::lonnet::allowed('rin',$crs); |
my $symb=&Apache::lonnet::symbread(); |
unless ($symb) { |
|
$symb=&Apache::lonnet::symbread(); |
|
} |
if ($symb) { |
if ($symb) { |
my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'}, |
my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}, |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'}); |
if ($contrib{'version'}) { |
if ($contrib{'version'}) { |
$discussion.= |
unless ($discussiononly) { |
'<address><hr /><h2>Course Discussion of Resource</h2>'; |
$discussion.= |
|
'<address><hr />'; |
|
} |
my $idx; |
my $idx; |
for ($idx=1;$idx<=$contrib{'version'};$idx++) { |
for ($idx=1;$idx<=$contrib{'version'};$idx++) { |
my $hidden=($contrib{'hidden'}=~/\.$idx\./); |
my $hidden=($contrib{'hidden'}=~/\.$idx\./); |
Line 181 sub xmlend {
|
Line 199 sub xmlend {
|
if ($hidden) { |
if ($hidden) { |
$message='<font color="#888888">'.$message.'</font>'; |
$message='<font color="#888888">'.$message.'</font>'; |
} |
} |
|
my $screenname=&Apache::loncommon::screenname( |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}); |
|
my $plainname=&Apache::loncommon::nickname( |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}); |
|
|
my $sender='Anonymous'; |
my $sender='Anonymous'; |
if ((!$contrib{$idx.':anonymous'}) || ($seeid)) { |
if ((!$contrib{$idx.':anonymous'}) || ($seeid)) { |
$sender=$contrib{$idx.':plainname'}.' ('. |
$sender=&Apache::loncommon::aboutmewrapper( |
|
$plainname, |
|
$contrib{$idx.':sendername'}, |
|
$contrib{$idx.':senderdomain'}).' ('. |
$contrib{$idx.':sendername'}.' at '. |
$contrib{$idx.':sendername'}.' at '. |
$contrib{$idx.':senderdomain'}.')'; |
$contrib{$idx.':senderdomain'}.')'; |
if ($contrib{$idx.':anonymous'}) { |
if ($contrib{$idx.':anonymous'}) { |
$sender.=' [anonymous] '. |
$sender.=' [anonymous] '. |
$contrib{$idx.':screenname'}; |
$screenname; |
} |
} |
if ($seeid) { |
if ($seeid) { |
if ($hidden) { |
if ($hidden) { |
Line 200 sub xmlend {
|
Line 228 sub xmlend {
|
} |
} |
} |
} |
} else { |
} else { |
if ($contrib{$idx.':screenname'}) { |
if ($screenname) { |
$sender='<i>'.$contrib{$idx.':screenname'}.'</i>'; |
$sender='<i>'.$screenname.'</i>'; |
} |
} |
} |
} |
$discussion.='<p><b>'.$sender.'</b> ('. |
$discussion.='<p><b>'.$sender.'</b> ('. |
Line 211 sub xmlend {
|
Line 239 sub xmlend {
|
} |
} |
} |
} |
} |
} |
$discussion.='</address>'; |
unless ($discussiononly) { |
|
$discussion.='</address>'; |
|
} |
|
} |
|
if ($discussiononly) { |
|
$discussion.=(<<ENDDISCUSS); |
|
<form action="/adm/feedback" method="post" name="mailform"> |
|
<input type="submit" name="discuss" value="Post Discussion" /> |
|
<input type="submit" name="anondiscuss" value="Post Anonymous Discussion" /> |
|
<input type="hidden" name="symb" value="$symb" /> |
|
<input type="hidden" name="sendit" value="true" /> |
|
<br /> |
|
<font size="1">Note: in anonymous discussion, your name is visible only to |
|
course faculty</font><br /> |
|
<textarea name=comment cols=60 rows=10 wrap=hard></textarea> |
|
</form> |
|
ENDDISCUSS |
|
$discussion.=&Apache::lonfeedback::generate_preview_button(); |
} |
} |
} |
} |
} |
} |
return $discussion.'</html>'; |
return $discussion.($discussiononly?'':'</html>'); |
} |
} |
|
|
sub tokeninputfield { |
sub tokeninputfield { |
Line 332 sub registerurl {
|
Line 377 sub registerurl {
|
my $forcereg=shift; |
my $forcereg=shift; |
my $target = shift; |
my $target = shift; |
my $result = ''; |
my $result = ''; |
|
|
if ($target eq 'edit') { |
if ($target eq 'edit') { |
$result .="<script>\n". |
$result .="<script>\n". |
"if (typeof menu != 'undefined') {menu.currentURL=null;}\n". |
"if (typeof menu != 'undefined') {menu.currentURL=null;}\n". |
Line 348 sub registerurl {
|
Line 394 sub registerurl {
|
$Apache::lonxml::registered=1; |
$Apache::lonxml::registered=1; |
my $nothing=''; |
my $nothing=''; |
if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; } |
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.');'; |
my $timesync='menu.syncclock(1000*'.time.');'; |
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { |
if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) { |
my $hwkadd=''; |
my $hwkadd=''; |
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 |
} |
} |
} |
} |
Line 377 ENDPARM
|
Line 430 ENDPARM
|
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu=window.open("$nothing","LONCAPAmenu","",false); |
menu.clearTimeout(menu.menucltim); |
menu.clearTimeout(menu.menucltim); |
$timesync |
$timesync |
|
$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 |
} |
} |
|
|
Line 407 ENDPARM
|
Line 463 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 480 sub xmlparse {
|
Line 536 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 515 sub xmlparse {
|
Line 571 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 539 sub htmlclean {
|
Line 596 sub htmlclean {
|
return $output; |
return $output; |
} |
} |
|
|
|
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; |
|
} |
|
|
sub inner_xmlparse { |
sub inner_xmlparse { |
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_; |
my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_; |
my $finaloutput = ''; |
my $finaloutput = ''; |
Line 548 sub inner_xmlparse {
|
Line 621 sub inner_xmlparse {
|
while ($token = $$pars['-1']->get_token) { |
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') || ($token->[0] eq 'D') ) { |
if ($metamode<1) { |
if ($metamode<1) { |
if ($target eq 'tex') { |
my $text=$token->[1]; |
my @temp_array = @$stack; |
if ($token->[0] eq 'C' && $target eq 'tex') { |
if ($temp_array[-1] ne 'm') { |
$text = '%'.$text; |
if ($temp_array[-1] ne 'tt') { |
$text =~ s/[\n\r]//g; |
if ($token->[1]=~m/\^/) {$token->[1]=~s/\^/\\verb|\^|/g;} |
|
} else { |
|
if ($token->[1]=~m/\^/) {$token->[1]=~s/\^/}\\verb|\^|{/g;} |
|
} |
|
if ($token->[1]=~m/>/) {$token->[1]=~s/>/\$>\$/g;} |
|
if ($token->[1]=~m/</) {$token->[1]=~s/</\$<\$/g;} |
|
} |
|
} |
} |
$result.=$token->[1]; |
$result.=$text; |
} |
} |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'PI') { |
if ($metamode<1) { |
if ($metamode<1) { |
Line 572 sub inner_xmlparse {
|
Line 638 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 598 sub inner_xmlparse {
|
Line 661 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 623 sub inner_xmlparse {
|
Line 682 sub inner_xmlparse {
|
$result= &Apache::run::evaluate($result,$safeeval,''); |
$result= &Apache::run::evaluate($result,$safeeval,''); |
} |
} |
} |
} |
|
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) { |
|
if ($target eq 'tex') { |
|
$result=&latex_special_symbols($result,$stack,$parstack); |
|
} |
|
} |
|
|
# Encode any high ASCII characters |
# Encode any high ASCII characters |
if (!$Apache::lonxml::prevent_entity_encode) { |
if (!$Apache::lonxml::prevent_entity_encode) { |
$result=&HTML::Entities::encode($result,"\200-\377"); |
$result=&HTML::Entities::encode($result,"\200-\377"); |
Line 638 sub inner_xmlparse {
|
Line 703 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 653 sub inner_xmlparse {
|
Line 720 sub inner_xmlparse {
|
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 749 sub callsub {
|
Line 744 sub callsub {
|
} |
} |
if (!$deleted) { |
if (!$deleted) { |
if ($space) { |
if ($space) { |
#&Apache::lonxml::debug("Calling sub $sub in $space $metamode"); |
&Apache::lonxml::debug("Calling sub $sub in $space $metamode"); |
$sub1="$space\:\:$sub"; |
$sub1="$space\:\:$sub"; |
($currentstring,$nodefault) = &$sub1($target,$token,$tagstack, |
($currentstring,$nodefault) = &$sub1($target,$token,$tagstack, |
$parstack,$parser,$safeeval, |
$parstack,$parser,$safeeval, |
$style); |
$style); |
} else { |
} 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 ($metamode <1) { |
if (defined($token->[4]) && ($metamode < 1)) { |
if (defined($token->[4]) && ($metamode < 1)) { |
$currentstring = $token->[4]; |
$currentstring = $token->[4]; |
Line 777 sub callsub {
|
Line 772 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 792 sub setup_globals {
|
Line 790 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; |
|
$errorcount=0; |
|
$warningcount=0; |
|
$Apache::lonxml::default_homework_loaded=0; |
|
$Apache::lonxml::usestyle=1; |
|
&init_counter(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
if ($target eq 'meta') { |
if ($target eq 'meta') { |
Line 860 sub init_safespace {
|
Line 863 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 892 sub init_safespace {
|
Line 926 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 948 sub decreasedepth {
|
Line 994 sub decreasedepth {
|
} |
} |
|
|
sub get_all_text_unbalanced { |
sub get_all_text_unbalanced { |
|
#there is a copy of this in lonpublisher.pm |
my($tag,$pars)= @_; |
my($tag,$pars)= @_; |
my $token; |
my $token; |
my $result=''; |
my $result=''; |
Line 962 sub get_all_text_unbalanced {
|
Line 1009 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 974 sub get_all_text_unbalanced {
|
Line 1021 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 1265 ENDNOTFOUND
|
Line 1352 ENDNOTFOUND
|
sub debug { |
sub debug { |
if ($Apache::lonxml::debug eq 1) { |
if ($Apache::lonxml::debug eq 1) { |
$|=1; |
$|=1; |
print("DEBUG:".&HTML::Entities::encode($_[0])."<br />\n"); |
print('<font size="-2"<pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\n"); |
} |
} |
} |
} |
|
|
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 1279 sub error {
|
Line 1367 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 1295 sub error {
|
Line 1383 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); |