Diff for /loncom/xml/lonxml.pm between versions 1.89 and 1.99

version 1.89, 2001/06/09 12:32:42 version 1.99, 2001/07/03 20:58:27
Line 10 Line 10
 # 5/26 Gerd Kortemeyer  # 5/26 Gerd Kortemeyer
 # 5/27 H. K. Ng  # 5/27 H. K. Ng
 # 6/2,6/3,6/8,6/9 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;   package Apache::lonxml; 
 use vars   use vars 
Line 19  use HTML::TokeParser; Line 21  use HTML::TokeParser;
 use Safe;  use Safe;
 use Safe::Hole;  use Safe::Hole;
 use Math::Cephes qw(:trigs :hypers :bessels erf erfc);  use Math::Cephes qw(:trigs :hypers :bessels erf erfc);
   use Math::Random qw(:all);
 use Opcode;  use Opcode;
   
 sub register {  sub register {
Line 67  $evaluate = 1; Line 70  $evaluate = 1;
 # data structure for eidt mode, determines what tags can go into what other tags  # data structure for eidt mode, determines what tags can go into what other tags
 %insertlist=();  %insertlist=();
   
 #stores the list of active tag namespaces  # stores the list of active tag namespaces
 @namespace=();  @namespace=();
   
   # has the dynamic menu been updated to know about this resource
   $Apache::lonxml::registered=0;
   
 sub xmlbegin {  sub xmlbegin {
   my $output='';    my $output='';
   if ($ENV{'browser.mathml'}) {    if ($ENV{'browser.mathml'}) {
Line 99  sub fontsettings() { Line 105  sub fontsettings() {
 }  }
   
 sub registerurl {  sub registerurl {
       if ($Apache::lonxml::registered) { return ''; }
     if ($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) {      if ($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) {
         my $hwkadd='';          my $hwkadd='';
         if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {          if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
Line 145  ENDPARM Line 152  ENDPARM
        (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)');         (2,1,'back.gif','backward','','gopost("/adm/flip","back:"+currentURL)');
           menu.switchbutton            menu.switchbutton
      (2,3,'forw.gif','forward','','gopost("/adm/flip","forward:"+currentURL)');       (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            $hwkadd
     }      }
   
Line 153  ENDPARM Line 166  ENDPARM
           menu.currentStale=1;            menu.currentStale=1;
           menu.switchbutton            menu.switchbutton
             (3,1,'reload.gif','return','location','go(currentURL)');              (3,1,'reload.gif','return','location','go(currentURL)');
             menu.clearbut(7,1);
             menu.clearbut(7,2);
             menu.clearbut(7,3);
           menu.menucltim=menu.setTimeout(            menu.menucltim=menu.setTimeout(
  'clearbut(2,1);clearbut(2,3);clearbut(7,1);clearbut(7,2);clearbut(7,3);'.   'clearbut(2,1);clearbut(2,3);clearbut(8,1);clearbut(8,2);clearbut(8,3);'+
  'clearbut(8,1);clearbut(8,2);clearbut(8,3);',   'clearbut(9,1);clearbut(9,2);clearbut(9,3);',
   2000);    2000);
   
       }        }
Line 212  sub printalltags { Line 228  sub printalltags {
 }  }
   
 sub xmlparse {  sub xmlparse {
   
  my ($target,$content_file_string,$safeinit,%style_for_target) = @_;   my ($target,$content_file_string,$safeinit,%style_for_target) = @_;
  if ($target eq 'meta') {  
    $Apache::lonxml::redirection = 0;   &setup_globals($target);
    $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;  
  }  
  #&printalltags();   #&printalltags();
  my @pars = ();   my @pars = ();
  @Apache::lonxml::pwd=();   @Apache::lonxml::pwd=();
Line 286  sub xmlparse { Line 282  sub xmlparse {
        #clear out any tags that didn't end         #clear out any tags that didn't end
        while ($token->[1] ne $stack[$#stack] && ($#stack > -1)) {         while ($token->[1] ne $stack[$#stack] && ($#stack > -1)) {
  &Apache::lonxml::warning("Unbalanced tags in resource $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]"}) {         if (exists $style_for_target{'/'."$token->[1]"}) {
Line 323  sub xmlparse { Line 319  sub xmlparse {
        $result = '';         $result = '';
      }        } 
      if ($token->[0] eq 'E') {        if ($token->[0] eq 'E') { 
        pop @stack;pop @parstack;&decreasedepth($token);         &end_tag(\@stack,\@parstack,$token);
      }       }
    }     }
    pop @pars;     pop @pars;
Line 371  sub recurse { Line 367  sub recurse {
  while ($tokenpat->[1] ne $innerstack[$#innerstack]    while ($tokenpat->[1] ne $innerstack[$#innerstack] 
        && ($#innerstack > -1)) {         && ($#innerstack > -1)) {
   &Apache::lonxml::warning("Unbalanced tags in resource $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,   $partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,
        \@innerstack, \@innerparstack, \@pat,         \@innerstack, \@innerparstack, \@pat,
Line 414  sub callsub { Line 410  sub callsub {
   {    {
     my $sub1;      my $sub1;
     no strict 'refs';      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 $tag=$token->[1];
     my $space=$Apache::lonxml::alltags{$tag};      my $space=$Apache::lonxml::alltags{$tag};
     if (!$space) {      if (!$space) {
Line 426  sub callsub { Line 417  sub callsub {
  $sub=~tr/A-Z/a-z/;   $sub=~tr/A-Z/a-z/;
  $space=$Apache::lonxml::alltags{$tag}   $space=$Apache::lonxml::alltags{$tag}
     }      }
     if ($space) {  
       #&Apache::lonxml::debug("Calling sub $sub in $space $metamode<br />\n");      my $deleted=0;
       $sub1="$space\:\:$sub";      $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
       $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);      if (($token->[0] eq 'S') && ($target eq 'modified')) {
       ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,        $deleted=&Apache::edit::handle_delete($space,$target,$token,$tagstack,
    $parstack,$parser,$safeeval,       $parstack,$parser,$safeeval,
    $style);       $style);
     } else {      }
       #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode<br />\n");      if (!$deleted) {
       if ($metamode <1) {        if ($space) {
  if (defined($token->[4]) && ($metamode < 1)) {   #&Apache::lonxml::debug("Calling sub $sub in $space $metamode<br />\n");
   $currentstring = $token->[4];   $sub1="$space\:\:$sub";
  } else {   ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
   $currentstring = $token->[2];       $parstack,$parser,$safeeval,
        $style);
         } else {
    #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode<br />\n");
    if ($metamode <1) {
     if (defined($token->[4]) && ($metamode < 1)) {
       $currentstring = $token->[4];
     } else {
       $currentstring = $token->[2];
     }
  }   }
       }        }
     }        #    &Apache::lonxml::debug("nodefalt:$nodefault:");
 #    &Apache::lonxml::debug("nodefalt:$nodefault:");        if ($currentstring eq '' && $nodefault eq '') {
     if ($currentstring eq '' && $nodefault eq '') {   if ($target eq 'edit') {
       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') {
  if ($token->[0] eq 'S') {      $currentstring = &Apache::edit::tag_start($target,$token);
   $currentstring = &Apache::edit::tag_start($target,$token);    } elsif ($token->[0] eq 'E') {
  } elsif ($token->[0] eq 'E') {      $currentstring = &Apache::edit::tag_end($target,$token);
   $currentstring = &Apache::edit::tag_end($target,$token);    }
  }   } elsif ($target eq 'modified') {
       } elsif ($target eq 'modified') {    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();    } else {
  } else {      $currentstring = $token->[2];
   $currentstring = $token->[2];    }
  }   }
       }        }
     }      }
Line 466  sub callsub { Line 466  sub callsub {
   return $currentstring;    return $currentstring;
 }  }
   
   sub setup_globals {
     my ($target)=@_;
     $Apache::lonxml::registered = 0;
     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 {  sub init_safespace {
   my ($target,$safeeval,$safehole,$safeinit) = @_;    my ($target,$safeeval,$safehole,$safeinit) = @_;
   $safeeval->permit("entereval");    $safeeval->permit("entereval");
Line 493  sub init_safespace { Line 524  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::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  #need to inspect this class of ops
 # $safeeval->deny(":base_orig");  # $safeeval->deny(":base_orig");
   $safeinit .= ';$external::target='.$target.';';    $safeinit .= ';$external::target="'.$target.'";';
   $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';    $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
   &Apache::run::run($safeinit,$safeeval);    &Apache::run::run($safeinit,$safeeval);
 }  }
Line 515  sub endredirection { Line 567  sub endredirection {
   pop @Apache::lonxml::outputstack;    pop @Apache::lonxml::outputstack;
 }  }
   
   sub end_tag {
     my ($tagstack,$parstack,$token)=@_;
     pop(@$tagstack);
     pop(@$parstack);
     &decreasedepth($token);
   }
   
 sub initdepth {  sub initdepth {
   @Apache::lonxml::depthcounter=();    @Apache::lonxml::depthcounter=();
   $Apache::lonxml::depth=-1;    $Apache::lonxml::depth=-1;
Line 782  ENDNOTFOUND Line 841  ENDNOTFOUND
     
 sub debug {  sub debug {
   if ($Apache::lonxml::debug eq 1) {    if ($Apache::lonxml::debug eq 1) {
     print "DEBUG:".$_[0]."<br />\n";      print("DEBUG:".$_[0]."<br />\n");
   }    }
 }  }
   
Line 831  sub register_insert { Line 890  sub register_insert {
     my $line = $data[$i];      my $line = $data[$i];
     if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }      if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
     if ( $line =~ /TABLE/ ) { last; }      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.tag"} = $tag;
     $insertlist{"$tagnum.description"} = $descrip;      $insertlist{"$tagnum.description"} = $descrip;
       $insertlist{"$tagnum.color"} = $color;
     $insertlist{"$tagnum.function"} = $function;      $insertlist{"$tagnum.function"} = $function;
     $insertlist{"$tagnum.show"}= $show;      $insertlist{"$tagnum.show"}= $show;
       $insertlist{"$tag.num"}=$tagnum;
     $tagnum++;      $tagnum++;
   }    }
   $i++; #skipping TABLE line    $i++; #skipping TABLE line
Line 854  sub register_insert { Line 915  sub register_insert {
     $tagnum++;      $tagnum++;
   }    }
 }  }
   
   sub description {
     my ($token)=@_;
     return $insertlist{$insertlist{"$token->[1].num"}.'.description'};
   }
 1;  1;
 __END__  __END__
   

Removed from v.1.89  
changed lines
  Added in v.1.99


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>