Diff for /loncom/xml/scripttag.pm between versions 1.35 and 1.81

version 1.35, 2001/03/27 16:56:56 version 1.81, 2002/11/06 23:05:02
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # <script> definiton  # <script> definiton
   #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
 # 2/21 Guy  # 2/21 Guy
   # 8/20 Gerd Kortemeyer
   
 package Apache::scripttag;   package Apache::scripttag;
   
 use strict;  use strict;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::style;
   
 sub BEGIN {  #Globals
   &Apache::lonxml::register('Apache::scripttag',('script','scriptlib',  # this used to pass around the standard callsub arguments to a tag func
  'parserlib','import',  # so xmlparse can reenter the inner_xmlparse loop.
                                                  'window','display'));  
   @Apache::scripttag::parser_env = ();
   BEGIN {
     &Apache::lonxml::register('Apache::scripttag',
       ('script','scriptlib','parserlib','import',
        'window','display','storetc','physnet',
        'standalone','comment',
        'LONCAPA_INTERNAL_TURN_STYLE_ON'));
   }
   
   sub start_LONCAPA_INTERNAL_TURN_STYLE_ON {
       $Apache::lonxml::usestyle=1;
       return ('','no');
   }
   
   sub end_LONCAPA_INTERNAL_TURN_STYLE_ON {
       return ('','no');
 }  }
   
 sub start_script {  sub start_script {
   my ($target,$token,$parstack,$parser,$safeeval)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   my $args ='';    @Apache::scripttag::parser_env = @_;
   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }  
   my $type = &Apache::run::run("{$args;".'return $type}',$safeeval);  
   my $result='';    my $result='';
   #&Apache::lonxml::debug("found type of $type");    my $type= &Apache::lonxml::get_param('type',$parstack,$safeeval);
     &Apache::lonxml::debug("found type of $type");
   if ($type eq "loncapa/perl") {    if ($type eq "loncapa/perl") {
     my $bodytext=&Apache::lonxml::get_all_text("/script",$$parser[$#$parser]);      my $bodytext=&Apache::lonxml::get_all_text("/script",$$parser[$#$parser]);
       
     if ( $target eq "modified" ) {      if ( $target eq "modified" ) {
     } elsif ( $target eq "web" || $target eq "grade" ) {        $result=$token->[4].&Apache::edit::modifiedfield();
       &Apache::run::run($bodytext,$safeeval);      } elsif ( $target eq 'web' || $target eq 'tex' ||
         $target eq 'grade' || $target eq 'answer' ||
         $target eq 'analyze' ) {
    if (!$Apache::lonxml::default_homework_loaded) {
       &Apache::lonxml::default_homework_load($safeeval);
    }
    &Apache::run::run($bodytext,$safeeval);
    if (($target eq 'answer') && ($Apache::lonhomework::viewgrades == 'F')) {
       $Apache::lonxml::evaluate--;
       $result.="<a href=\"javascript:newWindow=open(\'\',\'new_W\',\'width=500,height=200,scrollbars=1\');newWindow.document.open(\'text/html\',\'replace\');newWindow.document.writeln(\'<html><head><title>newwindow</title></head><body bgcolor=&quot;#FFFFFF&quot;><pre>";
       my $listing= &HTML::Entities::encode(&Apache::run::dump($target,$safeeval));
   
       $result.=$listing;
       $result.= "</pre></body></html>\');newWindow.document.close();void(0);\">Script Vars</a><br />";
    }
     } elsif ($target eq "edit" ) {      } elsif ($target eq "edit" ) {
       &Apache::run::run($bodytext,$safeeval);        #&Apache::run::run($bodytext,$safeeval);
       $result="<br /> &lt;$token->[1]&gt; output: <br />$bodytext<br />Source:<br />";        #$result="<br /> &lt;$token->[1]&gt; output: <br />$bodytext<br />Source:<br />";
       $result.=&editfield($token->[1],$bodytext);        $result=&Apache::edit::tag_start($target,$token,'Script');
         $result.=&Apache::edit::editfield($token->[1],$bodytext,'',80,4);
     }      }
   } else {    } else {
     if ($target ne "meta") { $result = $token->[4]; }      if ($target ne "meta") {
         $result = $token->[4];
         my $bodytext=&Apache::lonxml::get_all_text("/script",$$parser[$#$parser]);
         $result.=$bodytext;
       }
   }    }
   return $result;    return $result;
 }  }
   
 sub end_script {  sub end_script {
   my ($target,$token,$parstack,$parser,$safeeval)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   if ( $target eq "meta" ) { return ''; }     if ( $target eq "meta" ) { return ''; } 
   my $args ='';    my $type = &Apache::lonxml::get_param('type',$parstack,$safeeval);
   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }  
   my $type = &Apache::run::run("{$args;".'return $type}',$safeeval);  
   my $result='';    my $result='';
   #other script blocks need to survive    #other script blocks need to survive
   if ($type ne "loncapa/perl") { return $token->[2]; }    if ($type ne "loncapa/perl") {
       return $token->[2];
     } elsif ($target eq 'edit' ) {
       return &Apache::edit::end_table();
     } elsif ($target eq 'answer') {
       $Apache::lonxml::evaluate++;
     }
   return '';    return '';
 }  }
   
 sub start_display {  sub start_display {
   my ($target,$token,$parstack,$parser,$safeeval)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
   my $args ='';  
   if ( $#$parstack > -1 ) {    my $result;
     $args=$$parstack[$#$parstack];  
   }  
   my $bodytext=&Apache::lonxml::get_all_text("/display",$$parser[$#$parser]);    my $bodytext=&Apache::lonxml::get_all_text("/display",$$parser[$#$parser]);
     
   if ( $target eq "modified" ) {    if ( $target eq "modified" ) {
   }      $result=$token->[4].&Apache::edit::modifiedfield();
   my $result=&Apache::run::run($bodytext,$safeeval);    } elsif ( $target eq 'web' || $target eq 'tex' ||
   if ($target eq 'grade' ) {      $target eq 'grade' || $target eq 'answer' ||
     # grade should produce no output        $target eq 'analyze') {
     $result='';        if (!$Apache::lonxml::default_homework_loaded) {
   }    &Apache::lonxml::default_homework_load($safeeval);
   if ($target eq "edit" ) {        }
     $result =         $result=&Apache::run::run($bodytext,$safeeval);
       "<br /> &lt;$token->[1]&gt; output: <br />$bodytext<br />Source:<br />";        if ($target eq 'grade' || $target eq 'answer' ||
     $result.=&editfield($token->[1],$bodytext);    $target eq 'analyze') {
     $result=''; # grade should produce no output
         }
     } elsif ($target eq "edit" ) {
       #$result = 
       #  "<br /> &lt;$token->[1]&gt; output: <br />$bodytext<br />Source:<br />";
       #$result.=&Apache::edit::editfield($token->[1],$bodytext,'',40,1);
       $result=&Apache::edit::tag_start($target,$token,'Script With Display');
       $result.=&Apache::edit::editfield($token->[1],$bodytext,'',80,1)
   }    }
   return $result;    return $result;
 }  }
   
 sub end_display {  sub end_display {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     if ($target eq 'edit' ) { return &Apache::edit::end_table(); }
     return '';
 }  }
   
 sub start_scriptlib {  sub start_scriptlib {
   my ($target,$token,$parstack,$parser,$safeeval)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $bodytext=$$parser[$#$parser]->get_text("/scriptlib");    my $bodytext;
   my $result ="";    my $result ='';
     my $error='';
   $bodytext=&Apache::run::evaluate($bodytext,$safeeval,  
    $$parstack[$#$parstack]);    if ($target eq 'web' || $target eq 'grade' || $target eq 'meta' || 
   my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],        $target eq 'edit' || $target eq 'answer' || $target eq 'analyze') {
      $bodytext);      $bodytext=$$parser[$#$parser]->get_text("/scriptlib");
   my $script=&Apache::lonnet::getfile($location);      $bodytext=&Apache::run::evaluate($bodytext,$safeeval,
   if ($script == -1) {       $$parstack[$#$parstack]);
     &Apache::lonxml::error("<b> Unable to find <i>$location</i> for scriptlib</b>");      my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],
     return "";         $bodytext);
       my $script=&Apache::lonnet::getfile($location);
       if ($script == -1) {
         if ($target eq 'edit') {
           $error='</tr><tr><td>Errors</td><td colspan="2"><b> Unable to find <i>'.$location.'</i></b></td>'."\n";
         } else {
    &Apache::lonxml::error("<b> Unable to find <i>$location</i> for scriptlib</b>");
    return "";
         }
       }
       &Apache::run::run($script,$safeeval);
       #&Apache::lonxml::debug("ran $bodytext:<br />".&Apache::lonnet::getfile($bodytext)."<br />");
   }    }
   &Apache::run::run($script,$safeeval);  
   #&Apache::lonxml::debug("ran $bodytext:<br />".&Apache::lonnet::getfile($bodytext)."<br />");  
   
   if ($target eq "edit" ) {    if ($target eq "edit" ) {
     $result.=&editfield($token->[1],$bodytext);      $result=
         &Apache::edit::tag_start($target,$token,'New Script Functions').
    &Apache::edit::editline($token->[1],$bodytext,'',40).
     $error.'</td></tr>'.
       &Apache::edit::end_table();
     }
     if ($target eq "modified" ) {
       $bodytext=$$parser[$#$parser]->get_text("/scriptlib");
       $result=$token->[4].&Apache::edit::modifiedfield($token);
       &Apache::lonxml::debug($result);
   }    }
   return $result;    return $result;
 }  }
   
 sub end_scriptlib {}  sub end_scriptlib {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my @result;
     if ($target eq "edit" ) { $result[1]='no'; }
     return @result;
   }
   
 sub start_parserlib {  sub start_parserlib {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $bodytext=$$parser[$#$parser]->get_text("/parserlib");    my $bodytext;
   my $result ="";    my $result ="";
     my $error='';
   $bodytext=&Apache::run::evaluate($bodytext,$safeeval,    if ($target eq 'web' || $target eq 'grade' || $target eq 'meta' ||
   $$parstack[$#$parstack]);        $target eq 'edit' || $target eq 'answer' || $target eq 'analyze') {
   my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],      $bodytext=$$parser[$#$parser]->get_text("/parserlib");
      $bodytext);      $bodytext=&Apache::run::evaluate($bodytext,$safeeval,
   my $styletext=&Apache::lonnet::getfile($location);       $$parstack[$#$parstack]);
   #&Apache::lonxml::debug("found :$bodytext: in :$location: with :$styletext:");      my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],
   if ($styletext == -1) {         $bodytext);
     &Apache::lonxml::error("<b> Unable to find <i>$location</i> for parserlib</b>");      my $styletext=&Apache::lonnet::getfile($location);
     return "";      #&Apache::lonxml::debug("found :$bodytext: in :$location: with :$styletext:");
       if ($styletext == -1) {
         if ($target eq 'edit') {
    $error='</tr><tr><td>Errors</td><td colspan="2"><b> Unable to find <i>'.$location.'</i></b></td>'."\n";
         } else {
    &Apache::lonxml::error("<b> Unable to find <i>$location</i> for parserlib</b>");
    return "";
         }
       }
       %$style = ( %$style , &Apache::style::styleparser($target,$styletext));
   }    }
   %$style = ( %$style , &Apache::style::styleparser($target,$styletext));  
   
   if ($target eq "edit" ) {    if ($target eq "edit" ) {
     $result=&editfield($token->[1],$bodytext);      $result=
         &Apache::edit::tag_start($target,$token,'New Tag Definitions').
    &Apache::edit::editline($token->[1],$bodytext,'',40).
     $error.'</td></tr>'.
       &Apache::edit::end_table();
     }
     if ($target eq "modified" ) {
       $bodytext=$$parser[$#$parser]->get_text("/parserlib");
       $result=$token->[4].&Apache::edit::modifiedfield($token);
       &Apache::lonxml::debug($result);
   }    }
   return $result;    return $result;
 }  }
   
 sub end_parserlib {  sub end_parserlib {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my @result;
     if ($target eq "edit" ) { $result[1]='no'; }
     return @result;
 }  }
   
 sub start_window {  sub start_window {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result = '';    my $result = '';
   if ($target eq 'web') {    if ($target eq 'web') {
     &Apache::lonxml::startredirection;      &Apache::lonxml::startredirection;
   }  elsif ($target eq 'tex') {    }  elsif ($target eq 'tex') {
        $result = '\footnote{';         $result = '\unskip\footnote{';
    }     }
   return $result;      return $result;  
 }  }
   
 sub end_window {  sub end_window {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result;    my $result;
   if ($target eq 'web') {    if ($target eq 'web') {
     my $output=&Apache::lonxml::endredirection;      my $output=&Apache::lonxml::endredirection;
Line 153  sub end_window { Line 268  sub end_window {
 }  }
   
 sub start_import {  sub start_import {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $bodytext=$$parser[$#$parser]->get_text("/import");    my $bodytext=$$parser[$#$parser]->get_text("/import");
   my $result ="";    my $result ="";
   
   $bodytext=Apache::run::evaluate($bodytext,$safeeval,$$parstack[$#$parstack]);    $bodytext=Apache::run::evaluate($bodytext,$safeeval,$$parstack[$#$parstack]);
   my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],$bodytext);  
   my $file=&Apache::lonnet::getfile($location);  
   if ($file == -1) {  
     &Apache::lonxml::error("<b> Unable to find <i>$bodytext $location</i> for import</b>");  
     return "";  
   }  
   
   my $dir=$location;    if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ||
   $dir=~s:/[^/]*$::;          $target eq 'tex' || $target eq 'analyze' ) {
 #  &Apache::lonxml::debug("directory $dir $location file $file \n<b>END</b>\n");      # FIXME this probably needs to be smart about construction vs.
   &Apache::lonxml::newparser($parser,\$file,$dir);      # non construction space.
       my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],$bodytext);
       my $file=&Apache::lonnet::getfile($location);
       if ($file == -1) {
         &Apache::lonxml::error("<b> Unable to find <i>$bodytext as $location</i> for import</b>");
         return "";
       }
   
   if ($target eq "edit" ) {      my $dir=$location;
     $result.=&editfield($token->[1],$bodytext);      $dir=~s:/[^/]*$::;
     $result.="Click<a href=\"/res/$bodytext\">here</a> to edit<br />"      #  &Apache::lonxml::debug("directory $dir $location file $file \n<b>END</b>\n");
       my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
       if (!$id) { $id=$Apache::lonxml::curdepth; }
       push(@Apache::inputtags::import,$id);
       &Apache::lonxml::newparser($parser,\$file,$dir);
     } elsif ($target eq "edit" ) {
       $result.=&Apache::edit::tag_start($target,$token);
       $result.=&Apache::edit::editline($token->[1],$bodytext,'',40);
       #FIXME this need to convert $bodytext to be a contruction space reference
       #my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],$bodytext);
       #$result.="Click<a href=\"$location\">here</a> to edit<br />"
     } elsif ($target eq 'modified') {
       $bodytext=$$parser[$#$parser]->get_text("/import");
       $result=$token->[4].&Apache::edit::modifiedfield($token);
       &Apache::lonxml::debug($result);
     } elsif ($target eq 'meta') {
       my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval);
       $result.='<import part="'.$Apache::inputtags::part;
       if ($id) {
         $result.='" id="'.$id;
       }
       $result.='">';
       $result.=$bodytext;
       $result.='</import>';
   }    }
   return '';    return $result;
 }  }
   
 sub end_import {  sub end_import {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     pop(@Apache::inputtags::import);
     my $result;
     if ($target eq 'edit' ) { $result=&Apache::edit::end_table(); }
     return $result;
 }  }
   
 sub start_meta {  sub start_storetc {
   my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $result = '';    my $result = '';
     if ($target ne 'meta') {    &Apache::lonxml::startredirection;
        $result = &Apache::lonxml::get_all_text("/meta",$$parser[$#$parser]);     return $result; 
        $result = '';  
       return $result;   
     } else {  
        return $result;   
     }  
 }  }
   
 sub end_meta {  sub end_storetc {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
       my $result;
       my $output=&Apache::lonxml::endredirection;
       $output =~ s/\"/\&quot\;/g;
       $result = '{\bf '.$output.'.}}\write\tcfile{\protect\tcpc{ '.$output.'.}{\the\value{relpage}}}';
       return $result;
 }  }
   
 sub editfield {  
   my ($tag,$data)=@_;  sub start_physnet {
         my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $count=0;      my $bodytext = '/adm/includes/physnet.sty';
   my $maxlength=-1;      my $location=&Apache::lonnet::filelocation($Apache::lonxml::pwd['-1'],$bodytext);
   map { $count++;      my $cbistyletext=&Apache::lonnet::getfile($location);
  if (length($_) > $maxlength) { $maxlength = length ($_); }  
       } split ("\n", $data);      %$style = (%$style,&Apache::style::styleparser($target,$cbistyletext));
         $$parser['-1']->unget_token($token);
   return "<br />\n&lt;$tag&gt;<br />\n&nbsp;&nbsp;&nbsp;<textarea rows=\"$count\" cols=\"$maxlength\" name=homework_edit_".$Apache::lonxml::curdepth.">$data</textarea><br />\n&lt;/$tag&gt;<br />\n";  #    if ( defined($$style{'physnet'}) ) {
   #        &Apache::lonxml::newparser($parser,\$$style{'physnet'});
   #    }
       return "";
 }  }
   
 sub getfilenothere {  sub end_physnet {
   my ($filename) = @_;    return '';
   my $a="";  }
     
   $filename=~ s/^\s*(\S+)\s*$/$1/; ## strip off leading and trailing spaces  sub start_standalone {
   $filename="/home/httpd/html/res".$filename;    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   if (! -e $filename ) {    my $result='';
     &Apache::lonnet::subscribe($filename);    if ($target eq 'web' ) {
     &Apache::lonnet::repcopy($filename);      if ( $ENV{'request.course.id'} ) {
         my $inside = &Apache::lonxml::get_all_text("/standalone",$$parser[-1]);
       } else {
         $result='<table bgcolor="#E1E1E1" border="2"><tr><td>';
       }
   }    }
   if (! -e $filename ) { return -1; };    return $result;
   my $fh=Apache::File->new($filename);  }
   while (<$fh>) {  
       $a .=$_;  sub end_standalone {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'web' ) {
       if ( $ENV{'request.course.id'} ) {
       } else {
         $result='</td></tr></table>';
       }
     }
     return $result;
   }
   
   sub start_comment {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     if ($target eq 'edit') {
       $result=&Apache::edit::tag_start($target,$token);
       my $bodytext=&Apache::lonxml::get_all_text("/comment",$$parser[$#$parser]);
       $result.=&Apache::edit::editfield($token->[1],$bodytext,'',80,4)
     } elsif ( $target eq 'modified') {
       $result=$token->[4].&Apache::edit::modifiedfield($token);
     } elsif ( $target eq 'web' || $target eq 'tex' || $target eq 'grade' ||
       $target eq 'answer' || $target eq 'meta' || $target eq 'analyze') {
       #normally throw away comments
       my $bodytext=&Apache::lonxml::get_all_text("/comment",$$parser[$#$parser]);
   }    }
   return $a    return $result;
   }
   
   sub end_comment {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     if ($target eq 'edit' ) { return &Apache::edit::end_table(); }
     return '';
   }
   
   
   sub xmlparse {
     my ($string) = @_;
     &Apache::lonxml::debug("Got $string");
     my ($target,$token,$tagstack,$parstack,$oldparser,$safeeval,$style)=
       @Apache::scripttag::parser_env;
     my @parser;
     &Apache::lonxml::newparser(\@parser,\$string);
     my $result=&Apache::lonxml::inner_xmlparse($target,$tagstack,
        $parstack,\@parser,
        $safeeval,$style);
     return $result;
 }  }
   
 1;  1;

Removed from v.1.35  
changed lines
  Added in v.1.81


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.