--- loncom/xml/lonxml.pm 2002/11/07 19:33:52 1.213 +++ loncom/xml/lonxml.pm 2003/02/12 22:04:34 1.230 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.213 2002/11/07 19:33:52 albertel Exp $ +# $Id: lonxml.pm,v 1.230 2003/02/12 22:04:34 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 @@ -101,6 +100,7 @@ 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 @@ -144,8 +144,8 @@ $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=4; $Apache::lonxml::counter_changed=0; #internal check on whether to look at style defs @@ -191,7 +191,8 @@ 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); @@ -225,8 +226,10 @@ sub xmlend { } else { $sender.=' Hide'; - } - } + } + $sender.=' Delete'; + } } else { if ($screenname) { $sender=''.$screenname.''; @@ -267,7 +270,7 @@ sub tokeninputfield { my $defhost=$Apache::lonnet::perlvar{'lonHostID'}; $defhost=~tr/a-z/A-Z/; return (< +\n"; @@ -388,12 +403,11 @@ sub registerurl { (!&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 $reopen=&Apache::lonmenu::reopenmenu(); my $newmail=''; if (&Apache::lonmsg::newmail()) { $newmail='menu.setstatus("you have","messages");'; @@ -404,68 +418,130 @@ sub registerurl { 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=$reopen; menu.clearTimeout(menu.menucltim); $timesync $newmail menu.currentURL=window.location.pathname; menu.reloadURL=window.location.pathname; + menu.currentSymb="$ENV{'request.symb'}"; + menu.reloadSymb="$ENV{'request.symb'}"; menu.currentStale=0; menu.clearbut(3,1); menu.switchbutton - (6,3,'catalog.gif','catalog','info','catalog_info()'); + (6,3,'catalog.gif','catalog','info','catalog_info()','Show catalog information'); 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 - (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 - (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 - (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 - (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 - (9,1,'sbkm.gif','set','bookmark','set_bookmark()'); + (9,1,'sbkm.gif','set','bookmark','set_bookmark()','Set a bookmark for this resource'); 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 - (9,3,'anot.gif','anno-','tations','annotate()'); + (9,3,'anot.gif','anno-','tations','annotate()','Make notes and annotations about this resource'); $hwkadd + $editbutton } function LONCAPAstale() { - menu=window.open("$nothing","LONCAPAmenu","",false); + menu=$reopen menu.currentStale=1; if (menu.reloadURL!='' && menu.reloadURL!= null) { 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,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)', + 'clearbut(9,1);clearbut(9,2);clearbut(9,3);clearbut(6,3);clearbut(6,1)', 2000); } @@ -481,7 +557,7 @@ ENDREGTHIS // BEGIN LON-CAPA Internal function LONCAPAreg() { - menu=window.open("$nothing","LONCAPAmenu","",false); + menu=$reopen $timesync menu.currentStale=1; menu.clearbut(2,1); @@ -592,18 +668,24 @@ 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; #more + $current_token=~s/[1]; if ($token->[0] eq 'C' && $target eq 'tex') { - $text = '%'.$text; - $text =~ s/[\n\r]//g; + $text = '%'.$text."\n"; } $result.=$text; } @@ -697,7 +778,7 @@ sub inner_xmlparse { if ($token->[0] eq 'E') { &end_tag($stack,$parstack,$token); } - } + } if ($#$pars > -1) { pop @$pars; pop @Apache::lonxml::pwd; @@ -711,7 +792,7 @@ sub inner_xmlparse { if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { $finaloutput=&afterburn($finaloutput); - } + } return $finaloutput; } @@ -739,13 +820,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]; @@ -757,7 +838,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') { @@ -858,6 +939,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'); @@ -1008,7 +1120,9 @@ sub store_counter { sub get_all_text { my($tag,$pars)= @_; &Apache::lonxml::debug("Got a ".ref($pars)); + my $gotfullstack=1; if (ref($pars) ne 'ARRAY') { + $gotfullstack=0; $pars=[$pars]; } my $depth=0; @@ -1017,7 +1131,8 @@ sub get_all_text { if ( $tag =~ m:^/: ) { my $tag=substr($tag,1); #&Apache::lonxml::debug("have:$tag:"); - while (($depth >=0) && ($#$pars > -1)) { + 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')) { @@ -1035,11 +1150,21 @@ sub get_all_text { } } } + 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.'>'); + if ($gotfullstack) { + my $newstring=''.$result; + &Apache::lonxml::newparser($pars,\$newstring); + } + $result=''; + } } else { while ($#$pars > -1) { while ($token = $$pars[-1]->get_token) { @@ -1145,7 +1270,7 @@ sub afterburn { $matchthis=~s/\_+/\\s\+/g; $result=~s/($matchthis)/\$1\<\/a\>/s; $result.=(<<"ENDSCRIPT"); - ENDSCRIPT @@ -1381,14 +1506,22 @@ sub get_param_var { if ( ! $context ) { $context = -1; } my $args =''; if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } + &Apache::lonxml::debug("Args are $args param is $param"); 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); #' - if ($value =~ /^[\$\@\%]/) { - return &Apache::run::run("return $value",$safeeval,1); + &Apache::lonxml::debug("first run is $value"); + if ($value =~ /^[\$\@\%]\w+$/) { + &Apache::lonxml::debug("doing second"); + my @result=&Apache::run::run("return $value",$safeeval,1); + if (!defined($result[0])) { + return $value + } else { + if (wantarray) { return @result; } else { return $result[0]; } + } } else { return $value; }