Diff for /rat/lonratsrv.pm between versions 1.5 and 1.29

version 1.5, 2000/07/12 23:55:33 version 1.29, 2005/02/17 09:09:57
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Server for RAT Maps  # Server for RAT Maps
 #  #
 # (Edit Handler for RAT Maps  # $Id$
 # (TeX Content Handler  #
   # 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/
 #  #
 # 05/29/00,05/30 Gerd Kortemeyer)  
 # 7/1 Gerd Kortemeyer)  
 # 7/1,7/3,7/4,7/7,7/8,7/10 Gerd Kortemeyer  
   
 package Apache::lonratsrv;  package Apache::lonratsrv;
   
Line 31  sub qtescape { Line 49  sub qtescape {
   
 sub qtunescape {  sub qtunescape {
     my $str=shift;      my $str=shift;
     $str=~s/\:/\&\#58\;/g;      $str=~s/\:/\&colon\;/g;
     $str=~s/\'/\&\#39\;/g;      $str=~s/\'/\&\#39\;/g;
     $str=~s/\,/\&\#44\;/g;      $str=~s/\,/\&\#44\;/g;
     $str=~s/\"/\&\#34\;/g;      $str=~s/\"/\&\#34\;/g;
Line 41  sub qtunescape { Line 59  sub qtunescape {
 # --------------------------------------------------------- Loads map from disk  # --------------------------------------------------------- Loads map from disk
   
 sub loadmap {  sub loadmap {
     my ($fn,$errtext)=@_;      my ($fn,$errtext,$infotext)=@_;
       if ($errtext) { return('',$errtext); }
     my $outstr='';      my $outstr='';
     my @content=();  
     my @obj=();      my @obj=();
     my @links=();      my @links=();
     if (-e $fn) {      my $instr='';
       if ($fn=~/^\/*uploaded\//) {
           $instr=&Apache::lonnet::getfile($fn);
       } elsif (-e $fn) {
           my @content=();
         {          {
     my $fh=Apache::File->new($fn);      my $fh=Apache::File->new($fn);
             @content=<$fh>;              @content=<$fh>;
         }          }
         my $instr=join('',@content);          $instr=join('',@content);
       }
       if ($instr eq -2) {
           $errtext.='Map not loaded: An error occured while trying to load the map.';
       } elsif ($instr) {
         my $parser = HTML::TokeParser->new(\$instr);          my $parser = HTML::TokeParser->new(\$instr);
         my $token;          my $token;
         my $graphmode=0;          my $graphmode=0;
Line 82  sub loadmap { Line 108  sub loadmap {
                     $outstr.='<:>';                      $outstr.='<:>';
                     $outstr.=qtunescape($token->[2]->{'title'}).":";                      $outstr.=qtunescape($token->[2]->{'title'}).":";
                     $outstr.=qtunescape($token->[2]->{'src'}).":";                      $outstr.=qtunescape($token->[2]->{'src'}).":";
                     if ($token->[2]->{'src'}=~/\/\//) {                      if ($token->[2]->{'external'} eq 'true') {
                         $outstr.='true:';                          $outstr.='true:';
                     } else {                      } else {
                         $outstr.='false:';                          $outstr.='false:';
Line 120  sub loadmap { Line 146  sub loadmap {
                 } elsif ($token->[1] eq 'link') {                  } elsif ($token->[1] eq 'link') {
 # ----------------------------------------------------------------------- Links  # ----------------------------------------------------------------------- Links
                     $outstr.='<&>objlinks';                      $outstr.='<&>objlinks';
                     if ($graphmode) {  
                         if ($token->[2]->{'index'}) {                          if ($token->[2]->{'index'}) {
    if ($links[$token->[2]->{'index'}]) {     if ($links[$token->[2]->{'index'}]) {
                                $errtext.='Error: multiple use of link index '.                                 $errtext.='Error: multiple use of link index '.
Line 134  sub loadmap { Line 160  sub loadmap {
                            $outstr.='<:>'.$i;                             $outstr.='<:>'.$i;
                            $links[$i]=1;                             $links[$i]=1;
        }         }
     }      
                     $outstr.='<:>'.$token->[2]->{'from'}.                      $outstr.='<:>'.$token->[2]->{'from'}.
                              ':'.$token->[2]->{'to'};                               ':'.$token->[2]->{'to'};
                     if ($token->[2]->{'condition'}) {                      if ($token->[2]->{'condition'}) {
Line 142  sub loadmap { Line 168  sub loadmap {
                     } else {                      } else {
   $outstr.=':0';    $outstr.=':0';
                     }                      }
   # ------------------------------------------------------------------- Parameter
                   } elsif ($token->[1] eq 'param') {
                       $outstr.='<&>objparms<:>'.$token->[2]->{'to'}.'<:>'.
                               $token->[2]->{'type'}.'___'.$token->[2]->{'name'}
                                                    .'___'.$token->[2]->{'value'};
                 } elsif ($graphmode) {                  } elsif ($graphmode) {
 # --------------------------------------------- All other tags (graphical only)  # --------------------------------------------- All other tags (graphical only)
                     $outstr.='<&>'.$token->[1];                      $outstr.='<&>'.$token->[1];
Line 159  sub loadmap { Line 190  sub loadmap {
     } else {      } else {
         $errtext.='Map not loaded: The file does not exist. ';          $errtext.='Map not loaded: The file does not exist. ';
     }      }
     return($outstr,$errtext);      return($outstr,$errtext,$infotext);
 }  }
   
   
Line 167  sub loadmap { Line 198  sub loadmap {
   
 sub savemap {  sub savemap {
     my ($fn,$errtext)=@_;      my ($fn,$errtext)=@_;
     if (($fn=~/\.course$/) ||      my $infotext='';
         ($fn=~/\.sequence$/) ||      my %alltypes;
         ($fn=~/\.page$/)) {      my %allvalues;
       if (($fn=~/\.sequence(\.tmp)*$/) ||
           ($fn=~/\.page(\.tmp)*$/)) {
   
 # ------------------------------------------------------------- Deal with input  # ------------------------------------------------------------- Deal with input
         my @tags=split(/<&>/,$ENV{'form.output'});          my @tags=split(/<&>/,$ENV{'form.output'});
Line 181  sub savemap { Line 214  sub savemap {
         } else {          } else {
             $outstr="<map>\n";              $outstr="<map>\n";
         }          }
         map {          foreach (@tags) {
    my @parts=split(/<:>/,$_);     my @parts=split(/<:>/,$_);
            if ($parts[0] eq 'objcont') {             if ($parts[0] eq 'objcont') {
                my @comp=split(/:/,$parts[$#parts]);                 my @comp=split(/:/,$parts[$#parts]);
Line 193  sub savemap { Line 226  sub savemap {
        if ($comp[1]!~/^http\:\/\//) {         if ($comp[1]!~/^http\:\/\//) {
    $comp[1]='http://'.$comp[1];     $comp[1]='http://'.$comp[1];
                        }                         }
                          $comp[1].='" external="true';
                    } else {                     } else {
        if ($comp[1]=~/^http\:\/\//) {         if ($comp[1]=~/^http\:\/\//) {
    $comp[1]=~s/^http\:\/\/[^\/]*\//\//;     $comp[1]=~s/^http\:\/\/[^\/]*\//\//;
Line 226  sub savemap { Line 260  sub savemap {
                }                 }
                $outstr.=' index="'.$parts[1].'"';                 $outstr.=' index="'.$parts[1].'"';
                $outstr.="></link>\n";                 $outstr.="></link>\n";
              } elsif ($parts[0] eq 'objparms') {
                  undef %alltypes;
                  undef %allvalues;
                  foreach (split(/:/,$parts[$#parts])) {
                      my ($type,$name,$value)=split(/\_\_\_/,$_);
                      $alltypes{$name}=$type;
                      $allvalues{$name}=$value;
                  }
                  foreach (keys %allvalues) {
                     if ($allvalues{$_} ne '') {
                      $outstr.='<param to="'.$parts[1].'" type="'
                             .$alltypes{$_}.'" name="'.$_
                             .'" value="'.$allvalues{$_}.'">'
                             ."</param>\n";
             }
                  }
            } elsif (($parts[0] ne '') && ($graphdef)) {             } elsif (($parts[0] ne '') && ($graphdef)) {
 # ------------------------------------------------------------- Graphical input  # ------------------------------------------------------------- Graphical input
                $outstr.='<'.$parts[0];                 $outstr.='<'.$parts[0];
Line 235  sub savemap { Line 285  sub savemap {
                $outstr.=' value="'.qtescape($parts[$#parts]).'"></'.                 $outstr.=' value="'.qtescape($parts[$#parts]).'"></'.
                         $parts[0].">\n";                          $parts[0].">\n";
            }             }
         } @tags;          }
         $outstr.="</map>\n";          $outstr.="</map>\n";
         {   if ($fn=~/^\/*uploaded\/(\w+)\/(\w+)\/(.*)$/) {
       $ENV{'form.output'}=$outstr;
               my $home=&Apache::lonnet::homeserver($2,$1);
               my $result=&Apache::lonnet::finishuserfileupload($2,$1,$home,
    'output',$3);
       if ($result != m|^/uploaded/|) {
    $errtext.='Map not saved: A network error occured when trying to save the map. ';
       }
           } else {
           my $fh;            my $fh;
           if ($fh=Apache::File->new(">$fn")) {            if ($fh=Apache::File->new(">$fn")) {
              print $fh $outstr;               print $fh $outstr;
              $errtext.="Map saved as $fn. ";               $infotext.="Map saved as $fn. ";
   } else {    } else {
              $errtext.='Could not write file $fn. Map not saved. ';               $errtext.='Could not write file '.$fn.'.  Map not saved. ';
   }    }
         }          }
     } else {      } else {
 # -------------------------------------------- Cannot write to that file, error  # -------------------------------------------- Cannot write to that file, error
         $errtext.='Map not saved: The specified path does not exist. ';          $errtext.='Map not saved: The specified path does not exist. ';
     }      }
     return $errtext;      return ($errtext,$infotext);
 }  }
   
 # ================================================================ Main Handler  # ================================================================ Main Handler
   
 sub handler {  sub handler {
   my $r=shift;    my $r=shift;
   $r->content_type('text/html');    &Apache::loncommon::content_type($r,'text/html');
   $r->send_http_header;    $r->send_http_header;
   
   return OK if $r->header_only;    return OK if $r->header_only;
Line 269  sub handler { Line 327  sub handler {
   $url=~s/\/loadonly\/ratserver$/\/save\/ratserver/;    $url=~s/\/loadonly\/ratserver$/\/save\/ratserver/;
       
   my $fn=$r->filename;    my $fn=$r->filename;
     my $lonDocRoot=$r->dir_config('lonDocRoot');
     if ( $fn =~ /$lonDocRoot/ ) {
         #internal authentication, needs fixup.
         $fn = $url;
         $fn=~s|^/~(\w+)|/home/$1/public_html|;
         $fn=~s|/[^/]*/ratserver$||;
     }
   my $errtext='';    my $errtext='';
     my $infotext='';
   my $outtext='';    my $outtext='';
   
   if ($mode ne 'loadonly') {    if ($mode ne 'loadonly') {
      $errtext=&savemap($fn,$errtext);       ($errtext,$infotext)=&savemap($fn,$errtext);
   }    }
   ($outtext,$errtext)=&loadmap($fn,$errtext);    ($outtext,$errtext,$infotext)=&loadmap($fn,$errtext,$infotext);
   
   $r->print(<<ENDDOCUMENT);    $r->print(<<ENDDOCUMENT);
 <html>  <html>
Line 283  sub handler { Line 349  sub handler {
 <form name=storage method=post action="$url">  <form name=storage method=post action="$url">
 <input type=hidden name=output value="$outtext">  <input type=hidden name=output value="$outtext">
 </form>  </form>
   <script>
       parent.flag=1;
   </script>
 ENDDOCUMENT  ENDDOCUMENT
     if ($errtext ne '') {      if (($errtext ne '') || ($infotext ne '')) {
  $r->print(<<ENDSCRIPT);   $r->print(<<ENDSCRIPT);
 <script>  <script>
     alert("$errtext");      alert("$infotext $errtext");
 </script>  </script>
 ENDSCRIPT  ENDSCRIPT
     }      }
Line 298  ENDSCRIPT Line 367  ENDSCRIPT
   
 1;  1;
 __END__  __END__
   
   
   
   
   
   
   

Removed from v.1.5  
changed lines
  Added in v.1.29


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