--- loncom/xml/lonxml.pm 2001/06/08 20:01:45 1.88
+++ loncom/xml/lonxml.pm 2001/06/26 21:45:28 1.97
@@ -9,7 +9,9 @@
# 5/10 Scott Harrison
# 5/26 Gerd Kortemeyer
# 5/27 H. K. Ng
-# 6/2,6/3,6/8 Gerd Kortemeyer
+# 6/2,6/3,6/8,6/9 Gerd Kortemeyer
+# 6/12,6/13 H. K. Ng
+# 6/16 Gerd Kortemeyer
package Apache::lonxml;
use vars
@@ -19,6 +21,7 @@ use HTML::TokeParser;
use Safe;
use Safe::Hole;
use Math::Cephes qw(:trigs :hypers :bessels erf erfc);
+use Math::Random qw(:all);
use Opcode;
sub register {
@@ -145,6 +148,12 @@ ENDPARM
(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
}
@@ -153,8 +162,12 @@ ENDPARM
menu.currentStale=1;
menu.switchbutton
(3,1,'reload.gif','return','location','go(currentURL)');
+ 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(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
+ 'clearbut(9,1);clearbut(9,2);clearbut(9,3);',
2000);
}
@@ -211,29 +224,9 @@ sub printalltags {
}
sub xmlparse {
-
my ($target,$content_file_string,$safeinit,%style_for_target) = @_;
- if ($target eq 'meta') {
- $Apache::lonxml::redirection = 0;
- $Apache::lonxml::metamode = 1;
- $Apache::lonxml::evaluate = 1;
- $Apache::lonxml::import = 0;
- } elsif ($target eq 'grade') {
- &startredirection;
- $Apache::lonxml::metamode = 0;
- $Apache::lonxml::evaluate = 1;
- $Apache::lonxml::import = 1;
- } elsif ($target eq 'modified') {
- $Apache::lonxml::redirection = 0;
- $Apache::lonxml::metamode = 0;
- $Apache::lonxml::evaluate = 0;
- $Apache::lonxml::import = 0;
- } else {
- $Apache::lonxml::redirection = 0;
- $Apache::lonxml::metamode = 0;
- $Apache::lonxml::evaluate = 1;
- $Apache::lonxml::import = 1;
- }
+
+ &setup_globals($target);
#&printalltags();
my @pars = ();
@Apache::lonxml::pwd=();
@@ -285,7 +278,7 @@ sub xmlparse {
#clear out any tags that didn't end
while ($token->[1] ne $stack[$#stack] && ($#stack > -1)) {
&Apache::lonxml::warning("Unbalanced tags in resource $stack['-1']");
- pop @stack;pop @parstack;&decreasedepth($token);
+ &end_tag(\@stack,\@parstack,$token);
}
if (exists $style_for_target{'/'."$token->[1]"}) {
@@ -322,7 +315,7 @@ sub xmlparse {
$result = '';
}
if ($token->[0] eq 'E') {
- pop @stack;pop @parstack;&decreasedepth($token);
+ &end_tag(\@stack,\@parstack,$token);
}
}
pop @pars;
@@ -370,7 +363,7 @@ sub recurse {
while ($tokenpat->[1] ne $innerstack[$#innerstack]
&& ($#innerstack > -1)) {
&Apache::lonxml::warning("Unbalanced tags in resource $innerstack['-1']");
- pop @innerstack;pop @innerparstack;&decreasedepth($tokenpat);
+ &end_tag(\@innerstack,\@innerparstack,$tokenpat);
}
$partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,
\@innerstack, \@innerparstack, \@pat,
@@ -413,11 +406,6 @@ sub callsub {
{
my $sub1;
no strict 'refs';
- if ($target eq 'edit' && $token->[0] eq 'S') {
- $currentstring = &Apache::edit::tag_start($target,$token,$tagstack,
- $parstack,$parser,
- $safeeval,$style);
- }
my $tag=$token->[1];
my $space=$Apache::lonxml::alltags{$tag};
if (!$space) {
@@ -425,38 +413,47 @@ sub callsub {
$sub=~tr/A-Z/a-z/;
$space=$Apache::lonxml::alltags{$tag}
}
- if ($space) {
- #&Apache::lonxml::debug("Calling sub $sub in $space $metamode
\n");
- $sub1="$space\:\:$sub";
- $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
- ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
- $parstack,$parser,$safeeval,
- $style);
- } else {
- #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode
\n");
- if ($metamode <1) {
- if (defined($token->[4]) && ($metamode < 1)) {
- $currentstring = $token->[4];
- } else {
- $currentstring = $token->[2];
+
+ my $deleted=0;
+ $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
+ if (($token->[0] eq 'S') && ($target eq 'modified')) {
+ $deleted=&Apache::edit::handle_delete($space,$target,$token,$tagstack,
+ $parstack,$parser,$safeeval,
+ $style);
+ }
+ if (!$deleted) {
+ if ($space) {
+ #&Apache::lonxml::debug("Calling sub $sub in $space $metamode
\n");
+ $sub1="$space\:\:$sub";
+ ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
+ $parstack,$parser,$safeeval,
+ $style);
+ } else {
+ #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode
\n");
+ if ($metamode <1) {
+ if (defined($token->[4]) && ($metamode < 1)) {
+ $currentstring = $token->[4];
+ } else {
+ $currentstring = $token->[2];
+ }
}
}
- }
-# &Apache::lonxml::debug("nodefalt:$nodefault:");
- if ($currentstring eq '' && $nodefault eq '') {
- if ($target eq 'edit') {
- &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') {
- $currentstring = &Apache::edit::tag_end($target,$token);
- }
- } elsif ($target eq 'modified') {
- if ($token->[0] eq 'S') {
- $currentstring = $token->[4];
- $currentstring.=&Apache::edit::handle_insert();
- } else {
- $currentstring = $token->[2];
+ # &Apache::lonxml::debug("nodefalt:$nodefault:");
+ if ($currentstring eq '' && $nodefault eq '') {
+ if ($target eq 'edit') {
+ &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') {
+ $currentstring = &Apache::edit::tag_end($target,$token);
+ }
+ } elsif ($target eq 'modified') {
+ if ($token->[0] eq 'S') {
+ $currentstring = $token->[4];
+ $currentstring.=&Apache::edit::handle_insert();
+ } else {
+ $currentstring = $token->[2];
+ }
}
}
}
@@ -465,6 +462,36 @@ sub callsub {
return $currentstring;
}
+sub setup_globals {
+ my ($target)=@_;
+ if ($target eq 'meta') {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 1;
+ $Apache::lonxml::evaluate = 1;
+ $Apache::lonxml::import = 0;
+ } elsif ($target eq 'grade') {
+ &startredirection;
+ $Apache::lonxml::metamode = 0;
+ $Apache::lonxml::evaluate = 1;
+ $Apache::lonxml::import = 1;
+ } elsif ($target eq 'modified') {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 0;
+ $Apache::lonxml::evaluate = 0;
+ $Apache::lonxml::import = 0;
+ } elsif ($target eq 'edit') {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 0;
+ $Apache::lonxml::evaluate = 0;
+ $Apache::lonxml::import = 0;
+ } else {
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::metamode = 0;
+ $Apache::lonxml::evaluate = 1;
+ $Apache::lonxml::import = 1;
+ }
+}
+
sub init_safespace {
my ($target,$safeeval,$safehole,$safeinit) = @_;
$safeeval->permit("entereval");
@@ -492,10 +519,31 @@ 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::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');
+ $safehole->wrap(\&Math::Random::random_f,$safeeval,'&math_random_f');
+ $safehole->wrap(\&Math::Random::random_gamma,$safeeval,'&math_random_gamma');
+ $safehole->wrap(\&Math::Random::random_multivariate_normal,$safeeval,'&math_random_multivariate_normal');
+ $safehole->wrap(\&Math::Random::random_multinomial,$safeeval,'&math_random_multinomial');
+ $safehole->wrap(\&Math::Random::random_noncentral_chi_square,$safeeval,'&math_random_noncentral_chi_square');
+ $safehole->wrap(\&Math::Random::random_noncentral_f,$safeeval,'&math_random_noncentral_f');
+ $safehole->wrap(\&Math::Random::random_normal,$safeeval,'&math_random_normal');
+ $safehole->wrap(\&Math::Random::random_permutation,$safeeval,'&math_random_permutation');
+ $safehole->wrap(\&Math::Random::random_permuted_index,$safeeval,'&math_random_permuted_index');
+ $safehole->wrap(\&Math::Random::random_uniform,$safeeval,'&math_random_uniform');
+ $safehole->wrap(\&Math::Random::random_poisson,$safeeval,'&math_random_poisson');
+ $safehole->wrap(\&Math::Random::random_uniform_integer,$safeeval,'&math_random_uniform_integer');
+ $safehole->wrap(\&Math::Random::random_negative_binomial,$safeeval,'&math_random_negative_binomial');
+ $safehole->wrap(\&Math::Random::random_binomial,$safeeval,'&math_random_binomial');
+ $safehole->wrap(\&Math::Random::random_seed_from_phrase,$safeeval,'&random_seed_from_phrase');
+ $safehole->wrap(\&Math::Random::random_set_seed_from_phrase,$safeeval,'&random_set_seed_from_phrase');
+ $safehole->wrap(\&Math::Random::random_get_seed,$safeeval,'&random_get_seed');
+ $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed');
+
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
- $safeinit .= ';$external::target='.$target.';';
+ $safeinit .= ';$external::target="'.$target.'";';
$safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
&Apache::run::run($safeinit,$safeeval);
}
@@ -514,6 +562,13 @@ sub endredirection {
pop @Apache::lonxml::outputstack;
}
+sub end_tag {
+ my ($tagstack,$parstack,$token)=@_;
+ pop(@$tagstack);
+ pop(@$parstack);
+ &decreasedepth($token);
+}
+
sub initdepth {
@Apache::lonxml::depthcounter=();
$Apache::lonxml::depth=-1;
@@ -781,7 +836,7 @@ ENDNOTFOUND
sub debug {
if ($Apache::lonxml::debug eq 1) {
- print "DEBUG:".$_[0]."
\n";
+ print("DEBUG:".$_[0]."
\n");
}
}
@@ -830,11 +885,13 @@ sub register_insert {
my $line = $data[$i];
if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
if ( $line =~ /TABLE/ ) { last; }
- my ($tag,$descrip,$function,$show) = split(/,/, $line);
+ my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);
$insertlist{"$tagnum.tag"} = $tag;
$insertlist{"$tagnum.description"} = $descrip;
+ $insertlist{"$tagnum.color"} = $color;
$insertlist{"$tagnum.function"} = $function;
$insertlist{"$tagnum.show"}= $show;
+ $insertlist{"$tag.num"}=$tagnum;
$tagnum++;
}
$i++; #skipping TABLE line