Diff for /loncom/xml/lonxml.pm between versions 1.144 and 1.156

version 1.144, 2002/01/02 13:18:26 version 1.156, 2002/03/08 18:32:55
Line 54 Line 54
 # Dec Guy Albertelli  # Dec Guy Albertelli
 # YEAR=2002  # YEAR=2002
 # 1/1 Gerd Kortemeyer  # 1/1 Gerd Kortemeyer
   # 1/2 Matthew Hall
   # 1/3 Gerd Kortemeyer
 #  #
   
 package Apache::lonxml;   package Apache::lonxml; 
Line 288  sub printtokenheader { Line 290  sub printtokenheader {
   $reply{'generation'};    $reply{'generation'};
   
     if ($target eq 'web') {      if ($target eq 'web') {
           my %idhash=&Apache::lonnet::idrget($tudom,($tuname));
  return    return 
  '<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'.   '<img align="right" src="/cgi-bin/barcode.gif?encode='.$token.'" />'.
                'Checked out for '.$plainname.                 'Checked out for '.$plainname.
                '<br />User: '.$tuname.' at '.$tudom.                 '<br />User: '.$tuname.' at '.$tudom.
          '<br />ID: '.$idhash{$tuname}.
        '<br />CourseID: '.$tcrsid.         '<br />CourseID: '.$tcrsid.
          '<br />Course: '.$ENV{'course.'.$tcrsid.'.description'}.
                '<br />DocID: '.$token.                 '<br />DocID: '.$token.
                '<br />Time: '.localtime().'<hr />';                 '<br />Time: '.localtime().'<hr />';
     } else {      } else {
Line 311  sub fontsettings() { Line 316  sub fontsettings() {
   
 sub registerurl {  sub registerurl {
     my $forcereg=shift;      my $forcereg=shift;
       my $target = shift;
       my $result = '';
     if ($ENV{'request.publicaccess'}) {      if ($ENV{'request.publicaccess'}) {
  return    return 
          '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';           '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';
Line 342  ENDGRDS Line 349  ENDGRDS
 ENDPARM  ENDPARM
             }              }
  }   }
  return (<<ENDREGTHIS);   $result = (<<ENDREGTHIS);
             
 <script language="JavaScript">  <script language="JavaScript">
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
Line 394  ENDPARM Line 401  ENDPARM
 ENDREGTHIS  ENDREGTHIS
   
     } else {      } else {
         return (<<ENDDONOTREGTHIS);          $result = (<<ENDDONOTREGTHIS);
   
 <script language="JavaScript">  <script language="JavaScript">
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
Line 421  ENDREGTHIS Line 428  ENDREGTHIS
 // END LON-CAPA Internal  // END LON-CAPA Internal
 </script>  </script>
 ENDDONOTREGTHIS  ENDDONOTREGTHIS
   
     }      }
       if ($target eq 'edit') {
    # Javascript routines for construction space:
    # openbrowser and opensearcher will start the file browser
    # (lonindexer) and searcher (lonsearchcat) respectively.
    # Inputs are the name of the html form being used
    # and the name of the element the selected URL should
    # be placed in.
           $result .=<<"ENDBROWSERSCRIPT";
   <script>
       var editbrowser;
       function openbrowser(formname,elementname) {
           var url = '/res/?';
           if (editbrowser == null) {
               url += 'launch=1&';
           }
           url += 'catalogmode=interactive&';
           url += 'mode=edit&';
           url += 'form=' + formname + '&';
           url += 'element=' + elementname + '';
           var title = 'Browser';
           var options = 'scrollbars=1,resizable=1,menubar=0';
           options += ',width=700,height=600';
           editbrowser = open(url,title,options,'1');
           editbrowser.focus();
       }
       var editsearcher;
       function opensearcher(formname,elementname) {
           var url = '/adm/searchcat?';
           if (editsearcher == null) {
               url += 'launch=1&';
           }
           url += 'catalogmode=interactive&';
           url += 'mode=edit&';
           url += 'form=' + formname + '&';
           url += 'element=' + elementname + '';
           var title = 'Search';
           var options = 'scrollbars=1,resizable=1,menubar=0';
           options += ',width=700,height=600';
           editsearcher = open(url,title,options,'1');
           editsearcher.focus();
       }
   </script>
   ENDBROWSERSCRIPT
       }
       return $result;
 }  }
   
 sub loadevents() {  sub loadevents() {
Line 458  sub xmlparse { Line 509  sub xmlparse {
   
  ($target, my @tenta) = split('&&',$target);   ($target, my @tenta) = split('&&',$target);
   
  my @stack = ();    my @stack = ();
  my @parstack = ();   my @parstack = ();
  &initdepth;   &initdepth;
   
Line 528  sub inner_xmlparse { Line 579  sub inner_xmlparse {
       } elsif ($token->[0] eq 'E') {        } elsif ($token->[0] eq 'E') {
  #clear out any tags that didn't end   #clear out any tags that didn't end
  while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {   while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
   &Apache::lonxml::warning('Missing tag &lt;/'.$$stack['-1'].'&gt; in file');    my $lasttag=$$stack[-1];
   &end_tag($stack,$parstack,$token);    if ($token->[1] =~ /^$lasttag$/i) {
       &Apache::lonxml::warning('Using tag &lt;/'.$token->[1].'&gt; as end tag to &lt;'.$$stack[-1].'&gt;');
       last;
     } else {
       &Apache::lonxml::warning('Found tag &lt;/'.$token->[1].'&gt; when looking for &lt;/'.$$stack[-1].'&gt; in file');
       &end_tag($stack,$parstack,$token);
     }
  }   }
   
  if (exists($$style_for_target{'/'."$token->[1]"})) {   if (exists($$style_for_target{'/'."$token->[1]"})) {
Line 608  sub recurse { Line 665  sub recurse {
        $safeeval, $style_for_target);         $safeeval, $style_for_target);
       } elsif ($tokenpat->[0] eq 'E') {        } elsif ($tokenpat->[0] eq 'E') {
  #clear out any tags that didn't end   #clear out any tags that didn't end
  while ($tokenpat->[1] ne $innerstack[$#innerstack]    while ($tokenpat->[1] ne $innerstack[$#innerstack]
        && ($#innerstack > -1)) {         && ($#innerstack > -1)) {
   &Apache::lonxml::warning('Missing tag &lt;/'.$innerstack['-1'].'&gt; in style');    my $lasttag=$innerstack[-1];
   &end_tag(\@innerstack,\@innerparstack,$tokenpat);    if ($tokenpat->[1] =~ /^$lasttag$/i) {
       &Apache::lonxml::warning('Using tag &lt;/'.$tokenpat->[1].'&gt; as end tag to &lt;'.$innerstack[-1].'&gt;');
       last;
     } else {
       &Apache::lonxml::warning('Found tag &lt;/'.$tokenpat->[1].'&gt; when looking for &lt;/'.$innerstack[-1].'&gt; in file');
       &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 672  sub callsub { Line 735  sub callsub {
     }      }
     if (!$deleted) {      if (!$deleted) {
       if ($space) {        if ($space) {
  #&Apache::lonxml::debug("Calling sub $sub in $space $metamode<br />\n");   #&Apache::lonxml::debug("Calling sub $sub in $space $metamode");
  $sub1="$space\:\:$sub";   $sub1="$space\:\:$sub";
  ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,   ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
      $parstack,$parser,$safeeval,       $parstack,$parser,$safeeval,
      $style);       $style);
       } else {        } else {
  #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode<br />\n");   #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode");
  if ($metamode <1) {   if ($metamode <1) {
   if (defined($token->[4]) && ($metamode < 1)) {    if (defined($token->[4]) && ($metamode < 1)) {
     $currentstring = $token->[4];      $currentstring = $token->[4];
Line 880  sub get_all_text { Line 943  sub get_all_text {
      } elsif ($token->[0] eq 'PI') {       } elsif ($token->[0] eq 'PI') {
        $result.=$token->[2];         $result.=$token->[2];
      } elsif ($token->[0] eq 'S') {       } elsif ($token->[0] eq 'S') {
        if ($token->[1] eq $tag) { $depth++; }         if ($token->[1] =~ /^$tag$/i) { $depth++; }
        $result.=$token->[4];         $result.=$token->[4];
      } elsif ($token->[0] eq 'E')  {       } elsif ($token->[0] eq 'E')  {
        if ( $token->[1] eq $tag) { $depth--; }         if ( $token->[1] =~ /^$tag$/i) { $depth--; }
        #skip sending back the last end tag         #skip sending back the last end tag
        if ($depth > -1) { $result.=$token->[2]; } else {         if ($depth > -1) { $result.=$token->[2]; } else {
  $pars->unget_token($token);   $pars->unget_token($token);
Line 898  sub get_all_text { Line 961  sub get_all_text {
      } elsif ($token->[0] eq 'PI') {       } elsif ($token->[0] eq 'PI') {
        $result.=$token->[2];         $result.=$token->[2];
      } elsif ($token->[0] eq 'S') {       } elsif ($token->[0] eq 'S') {
        if ( $token->[1] eq $tag) {          if ( $token->[1] =~ /^$tag$/i) {
  $pars->unget_token($token); last;   $pars->unget_token($token); last;
        } else {         } else {
  $result.=$token->[4];   $result.=$token->[4];
Line 931  sub parstring { Line 994  sub parstring {
   foreach (@{$token->[3]}) {    foreach (@{$token->[3]}) {
     unless ($_=~/\W/) {      unless ($_=~/\W/) {
       my $val=$token->[2]->{$_};        my $val=$token->[2]->{$_};
       $val =~ s/([\%\@\\])/\\$1/g;        $val =~ s/([\%\@\\\"])/\\$1/g;
       #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }        #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
       $temp .= "my \$$_=\"$val\";"        $temp .= "my \$$_=\"$val\";"
     }      }
Line 961  sub writeallows { Line 1024  sub writeallows {
 #  #
 sub afterburn {  sub afterburn {
     my $result=shift;      my $result=shift;
     foreach (split(/&/,$ENV{'QUERY_STRING'})) {      &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
        my ($name, $value) = split(/=/,$_);      ['highlight','anchor','link']);
        $value =~ tr/+/ /;  
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  
        if (($name eq 'highlight')||($name eq 'anchor')||($name eq 'link')) {  
            unless ($ENV{'form.'.$name}) {  
               $ENV{'form.'.$name}=$value;  
    }  
        }  
     }  
     if ($ENV{'form.highlight'}) {      if ($ENV{'form.highlight'}) {
        foreach (split(/\,/,$ENV{'form.highlight'})) {         foreach (split(/\,/,$ENV{'form.highlight'})) {
            my $anchorname=$_;             my $anchorname=$_;
Line 1006  sub storefile { Line 1061  sub storefile {
     if (my $fh=Apache::File->new('>'.$file)) {      if (my $fh=Apache::File->new('>'.$file)) {
  print $fh $contents;   print $fh $contents;
         $fh->close();          $fh->close();
       } else {
         &warning("Unable to save file $file");
     }      }
 }  }
   
 sub inserteditinfo {  sub createnewhtml {
       my ($result,$filecontents)=@_;    my $filecontents=(<<SIMPLECONTENT);
       unless ($filecontents) {  
   $filecontents=(<<SIMPLECONTENT);  
 <html>  <html>
 <head>  <head>
 <title>  <title>
Line 1026  sub inserteditinfo { Line 1081  sub inserteditinfo {
 </body>  </body>
 </html>  </html>
 SIMPLECONTENT  SIMPLECONTENT
       }    return $filecontents;
       my $editheader='<a href="#editsection">Edit below</a><hr />';  }
   
   
   sub inserteditinfo {
         my ($result,$filecontents)=@_;
         $filecontents =~ s:</textarea>:&lt;/textarea&gt;:ig;
   #      my $editheader='<a href="#editsection">Edit below</a><hr />';
       my $editfooter=(<<ENDFOOTER);        my $editfooter=(<<ENDFOOTER);
 <hr />  <hr />
 <a name="editsection" />  <a name="editsection" />
 <form method="post">  <form method="post">
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>  <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
 <br />  <br />
   <input type="hidden" name="showmode" value="Edit" />
 <input type="submit" name="attemptclean"   <input type="submit" name="attemptclean" 
        value="Save and then attempt to clean HTML" />         value="Save and then attempt to clean HTML" />
 <input type="submit" name="savethisfile" value="Save this" />  <input type="submit" name="savethisfile" value="Save this" />
   <input type="submit" name="showmode" value="View" />
 </form>  </form>
 ENDFOOTER  ENDFOOTER
       $result=~s/(\<body[^\>]*\>)/$1$editheader/is;  #      $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
       $result=~s/(\<\/body\>)/$editfooter/is;        $result=~s/(\<\/body\>)/$editfooter/is;
       return $result;        return $result;
 }  }
   
   sub get_target {
     my $viewgrades=&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'});
     if ( $ENV{'request.state'} eq 'published') {
       if ( defined($ENV{'form.grade_target'})
    && ($viewgrades == 'F' )) {
         return ($ENV{'form.grade_target'});
       } elsif (defined($ENV{'form.grade_target'})) {
         if (($ENV{'form.grade_target'} eq 'web') ||
     ($ENV{'form.grade_target'} eq 'tex') ) {
    return $ENV{'form.grade_target'}
         } else {
    return 'web';
         }
       } else {
         return 'web';
       }
     } elsif ($ENV{'request.state'} eq 'construct') {
       if ( defined($ENV{'form.grade_target'})) {
         return ($ENV{'form.grade_target'});
       } else {
         return 'web';
       }
     } else {
       return 'web';
     }
   }
   
 sub handler {  sub handler {
   my $request=shift;    my $request=shift;
   
   my $target='web';    my $target=&get_target();
   
   $Apache::lonxml::debug=0;    $Apache::lonxml::debug=0;
   
Line 1072  sub handler { Line 1162  sub handler {
       }        }
   }    }
   my %mystyle;    my %mystyle;
   my $result = '';     my $result = '';
   my $filecontents=&Apache::lonnet::getfile($file);    my $filecontents=&Apache::lonnet::getfile($file);
   if ($filecontents == -1) {    if ($filecontents == -1) {
     $result=(<<ENDNOTFOUND);      $result=(<<ENDNOTFOUND);
Line 1086  sub handler { Line 1176  sub handler {
 </html>  </html>
 ENDNOTFOUND  ENDNOTFOUND
     $filecontents='';      $filecontents='';
       if ($ENV{'request.state'} ne 'published') {
         $filecontents=&createnewhtml();
         $ENV{'form.showmode'}='Edit'; #force edit mode
       }
   } else {    } else {
       unless ($ENV{'request.state'} eq 'published') {      unless ($ENV{'request.state'} eq 'published') {
          if ($ENV{'form.attemptclean'}) {        if ($ENV{'form.attemptclean'}) {
     $filecontents=&htmlclean($filecontents,1);   $filecontents=&htmlclean($filecontents,1);
          }  
       }        }
     $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);      }
       if ($ENV{'form.showmode'} ne 'Edit') {
         $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
       }
   }    }
   
 #  #
 # Edit action? Insert editing commands  # Edit action? Insert editing commands
 #  #
   unless ($ENV{'request.state'} eq 'published') {    unless ($ENV{'request.state'} eq 'published') {
       if ($ENV{'form.showmode'} eq 'Edit') {
         $result='<html><body bgcolor="#FFFFFF"></body></html>';
       $result=&inserteditinfo($result,$filecontents);        $result=&inserteditinfo($result,$filecontents);
       }
   }    }
     
   writeallows($request->uri);    writeallows($request->uri);
   
   $request->print($result);    $request->print($result);
   
   return OK;    return OK;
 }  }
    
 sub debug {  sub debug {
   if ($Apache::lonxml::debug eq 1) {    if ($Apache::lonxml::debug eq 1) {
     print("DEBUG:".$_[0]."<br />\n");      $|=1;
       print("DEBUG:".join('<br />',@_)."<br />\n");
   }    }
 }  }
   
 sub error {  sub error {
   if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {    if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {
     print "<b>ERROR:</b>".$_[0]."<br />\n";      print "<b>ERROR:</b>".join('<br />',@_)."<br />\n";
   } else {    } else {
     print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />";      print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />";
     #notify author      #notify author
     &Apache::lonmsg::author_res_msg($ENV{'request.filename'},$_[0]);      &Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_));
     #notify course      #notify course
     if ( $ENV{'request.course.id'} ) {      if ( $ENV{'request.course.id'} ) {
       my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'};        my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'};
Line 1129  sub error { Line 1229  sub error {
       foreach my $user (split /\,/, $users) {        foreach my $user (split /\,/, $users) {
  ($user,my $domain) = split /:/, $user;   ($user,my $domain) = split /:/, $user;
  &Apache::lonmsg::user_normal_msg($user,$domain,   &Apache::lonmsg::user_normal_msg($user,$domain,
         "Error [$declutter]",$_[0]);          "Error [$declutter]",join('<br />',@_));
       }        }
     }      }
   
     #FIXME probably shouldn't have me get everything forever.      #FIXME probably shouldn't have me get everything forever.
     &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",$_[0]);      &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",join('<br />',@_));
     #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);      #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);
   }    }
 }  }
   
 sub warning {  sub warning {
   if ($ENV{'request.state'} eq 'construct') {    if ($ENV{'request.state'} eq 'construct') {
     print "<b>W</b>ARNING<b>:</b>".$_[0]."<br />\n";      print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n";
   }    }
 }  }
   

Removed from v.1.144  
changed lines
  Added in v.1.156


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