Diff for /loncom/xml/lonxml.pm between versions 1.157 and 1.202

version 1.157, 2002/03/14 20:30:36 version 1.202, 2002/10/14 20:44:16
Line 60 Line 60
   
 package Apache::lonxml;   package Apache::lonxml; 
 use vars   use vars 
 qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace);  qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $prevent_entity_encode);
 use strict;  use strict;
 use HTML::TokeParser;  use HTML::LCParser();
 use HTML::TreeBuilder;  use HTML::TreeBuilder();
 use HTML::Entities;  use HTML::Entities();
 use Safe;  use Safe();
 use Safe::Hole;  use Safe::Hole();
 use Math::Cephes qw(:trigs :hypers :bessels erf erfc);  use Math::Cephes();
 use Math::Random qw(:all);  use Math::Random();
 use Opcode;  use Opcode();
   
 sub register {  sub register {
   my ($space,@taglist) = @_;    my ($space,@taglist) = @_;
Line 90  sub deregister { Line 90  sub deregister {
 }  }
   
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lontexconvert;  use Apache::lontexconvert();
 use Apache::style;  use Apache::style();
 use Apache::run;  use Apache::run();
 use Apache::londefdef;  use Apache::londefdef();
 use Apache::scripttag;  use Apache::scripttag();
 use Apache::edit;  use Apache::edit();
 use Apache::lonnet;  use Apache::lonnet();
 use Apache::File;  use Apache::File();
 use Apache::loncommon;  use Apache::loncommon();
   use Apache::lonfeedback();
   use Apache::lonmsg();
   
 #==================================================   Main subroutine: xmlparse    #==================================================   Main subroutine: xmlparse  
 #debugging control, to turn on debugging modify the correct handler  #debugging control, to turn on debugging modify the correct handler
Line 129  $evaluate = 1; Line 131  $evaluate = 1;
 # stores the list of active tag namespaces  # stores the list of active tag namespaces
 @namespace=();  @namespace=();
   
   # if 0 all high ASCII characters will be encoded into HTML Entities
   $prevent_entity_encode=0;
   
 # has the dynamic menu been updated to know about this resource  # has the dynamic menu been updated to know about this resource
 $Apache::lonxml::registered=0;  $Apache::lonxml::registered=0;
   
   # a pointer the the Apache request object
   $Apache::lonxml::request='';
   
 sub xmlbegin {  sub xmlbegin {
   my $output='';    my $output='';
   if ($ENV{'browser.mathml'}) {    if ($ENV{'browser.mathml'}) {
Line 148  sub xmlbegin { Line 156  sub xmlbegin {
 }  }
   
 sub xmlend {  sub xmlend {
       my ($discussiononly,$symb)=@_;
     my $discussion='';      my $discussion='';
     if ($ENV{'request.course.id'}) {      if ($ENV{'request.course.id'}) {
        my $crs='/'.$ENV{'request.course.id'};         my $crs='/'.$ENV{'request.course.id'};
Line 156  sub xmlend { Line 165  sub xmlend {
        }                          }                 
        $crs=~s/\_/\//g;         $crs=~s/\_/\//g;
        my $seeid=&Apache::lonnet::allowed('rin',$crs);         my $seeid=&Apache::lonnet::allowed('rin',$crs);
        my $symb=&Apache::lonnet::symbread();         unless ($symb) {
              $symb=&Apache::lonnet::symbread();
          }
        if ($symb) {         if ($symb) {
           my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},            my %contrib=&Apache::lonnet::restore($symb,$ENV{'request.course.id'},
                      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},                       $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'});       $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
           if ($contrib{'version'}) {            if ($contrib{'version'}) {
               $discussion.=                unless ($discussiononly) {
                   '<address><hr /><h2>Course Discussion of Resource</h2>';                   $discussion.=
                     '<address><hr />';
        }
               my $idx;                my $idx;
               for ($idx=1;$idx<=$contrib{'version'};$idx++) {                for ($idx=1;$idx<=$contrib{'version'};$idx++) {
  my $hidden=($contrib{'hidden'}=~/\.$idx\./);   my $hidden=($contrib{'hidden'}=~/\.$idx\./);
  unless (($hidden) && (!$seeid)) {   unless (($hidden) && (!$seeid)) {
                  my $message=$contrib{$idx.':message'};                   my $message=$contrib{$idx.':message'};
                  $message=~s/\n/\<br \/\>/g;                   $message=~s/\n/\<br \/\>/g;
    $message=&Apache::lontexconvert::msgtexconverted($message);
                  if ($message) {                   if ($message) {
                   if ($hidden) {                    if ($hidden) {
       $message='<font color="#888888">'.$message.'</font>';        $message='<font color="#888888">'.$message.'</font>';
                   }                    }
                     my $screenname=&Apache::loncommon::screenname(
                                  $contrib{$idx.':sendername'},
          $contrib{$idx.':senderdomain'});
                     my $plainname=&Apache::loncommon::nickname(
                                  $contrib{$idx.':sendername'},
          $contrib{$idx.':senderdomain'});
   
                   my $sender='Anonymous';                    my $sender='Anonymous';
                   if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {                    if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
                       $sender=$contrib{$idx.':sendername'}.' at '.                        $sender=&Apache::loncommon::aboutmewrapper(
       $contrib{$idx.':senderdomain'};                                 $plainname,
                                  $contrib{$idx.':sendername'},
                                  $contrib{$idx.':senderdomain'}).' ('.
                                 $contrib{$idx.':sendername'}.' at '.
         $contrib{$idx.':senderdomain'}.')';
                       if ($contrib{$idx.':anonymous'}) {                        if ($contrib{$idx.':anonymous'}) {
   $sender.=' (anonymous)';    $sender.=' [anonymous] '.
                                        $screenname;
                       }                        }
                       if ($seeid) {                        if ($seeid) {
   if ($hidden) {    if ($hidden) {
Line 190  sub xmlend { Line 216  sub xmlend {
  $symb.':::'.$idx.'">Hide</a>';   $symb.':::'.$idx.'">Hide</a>';
   }    }
                       }                                           }                   
                     } else {
                         if ($screenname) {
     $sender='<i>'.$screenname.'</i>';
                         }
                   }                    }
   $discussion.='<p><b>'.$sender.'</b> ('.    $discussion.='<p><b>'.$sender.'</b> ('.
                       localtime($contrib{$idx.':timestamp'}).                        localtime($contrib{$idx.':timestamp'}).
Line 198  sub xmlend { Line 228  sub xmlend {
         }          }
                }                  } 
               }                }
               $discussion.='</address>';                unless ($discussiononly) {
                    $discussion.='</address>';
         }
             }
             if ($discussiononly) {
         $discussion.=(<<ENDDISCUSS);
   <form action="/adm/feedback" method="post" name="mailform">
   <input type="submit" name="discuss" value="Post Discussion" />
   <input type="submit" name="anondiscuss" value="Post Anonymous Discussion" />
   <input type="hidden" name="symb" value="$symb" />
   <input type="hidden" name="sendit" value="true" />
   <br />
   <font size="1">Note: in anonymous discussion, your name is visible only to
   course faculty</font><br />
   <textarea name=comment cols=60 rows=10 wrap=hard></textarea>
   </form>
   ENDDISCUSS
                $discussion.=&Apache::lonfeedback::generate_preview_button();
           }            }
        }         }
     }      }
     return $discussion.'</html>';      return $discussion.($discussiononly?'':'</html>');
 }  }
   
 sub tokeninputfield {  sub tokeninputfield {
Line 319  sub registerurl { Line 366  sub registerurl {
     my $forcereg=shift;      my $forcereg=shift;
     my $target = shift;      my $target = shift;
     my $result = '';      my $result = '';
     if ($ENV{'request.publicaccess'}) {      
  return       if ($target eq 'edit') {
           $result .="<script>\n".
               "if (typeof menu != 'undefined') {menu.currentURL=null;}\n".
               &Apache::loncommon::browser_and_searcher_javascript().
                   "\n</script>\n";
       }
       if ((($ENV{'request.publicaccess'}) || 
            (!&Apache::lonnet::is_on_map($ENV{'REQUEST_URI'}))) &&
           (!$forcereg)) {
    return $result.
          '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';           '<script>function LONCAPAreg(){} function LONCAPAstale(){}</script>';
     }      }
     if ($Apache::lonxml::registered && !$forcereg) { return ''; }      if ($Apache::lonxml::registered && !$forcereg) { return ''; }
     $Apache::lonxml::registered=1;      $Apache::lonxml::registered=1;
       my $nothing='';
       if ($ENV{'browser.type'} eq 'explorer') { $nothing='javascript:void(0);'; }
       my $newmail='';
       if (&Apache::lonmsg::newmail()) { 
          $newmail='menu.setstatus("you have","messages");';
       }
       my $timesync='menu.syncclock(1000*'.time.');';
     if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {      if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
         my $hwkadd='';          my $hwkadd='';
         if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {          if ($ENV{'request.filename'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
     if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
  $hwkadd.=(<<ENDSUBM);   $hwkadd.=(<<ENDSUBM);
                      menu.switchbutton                       menu.switchbutton(7,1,'subm.gif','view sub','missions','gocmd("/adm/grades","submission")');
            (7,1,'subm.gif','view sub','missions',  
                 'gocmd("/adm/grades","submission")');  
 ENDSUBM  ENDSUBM
             }              }
     if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('mgr',$ENV{'request.course.id'})) {
  $hwkadd.=(<<ENDGRDS);   $hwkadd.=(<<ENDGRDS);
                      menu.switchbutton                       menu.switchbutton(7,2,'pgrd.gif','problem','grades','gocmd("/adm/grades","gradingmenu")');
            (7,2,'pgrd.gif','problem','grades',  
                 'gocmd("/adm/grades","viewgrades")');  
 ENDGRDS  ENDGRDS
             }              }
     if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {      if (&Apache::lonnet::allowed('opa',$ENV{'request.course.id'})) {
  $hwkadd.=(<<ENDPARM);   $hwkadd.=(<<ENDPARM);
                      menu.switchbutton                       menu.switchbutton(7,3,'pparm.gif','problem','parms','gocmd("/adm/parmset","set")');
            (7,3,'pparm.gif','problem','parms',  
                 'gocmd("/adm/parmset","set")');  
 ENDPARM  ENDPARM
             }              }
  }   }
Line 356  ENDPARM Line 413  ENDPARM
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
   
     function LONCAPAreg() {      function LONCAPAreg() {
   menu=window.open("","LONCAPAmenu");    menu=window.open("$nothing","LONCAPAmenu","",false);
           menu.clearTimeout(menu.menucltim);            menu.clearTimeout(menu.menucltim);
             $timesync
             $newmail
   menu.currentURL=window.location.pathname;    menu.currentURL=window.location.pathname;
             menu.reloadURL=window.location.pathname;
           menu.currentStale=0;            menu.currentStale=0;
           menu.clearbut(3,1);            menu.clearbut(3,1);
           menu.switchbutton            menu.switchbutton
Line 366  ENDPARM Line 426  ENDPARM
           menu.switchbutton            menu.switchbutton
        (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)');         (8,1,'eval.gif','evaluate','this','gopost("/adm/evaluate",currentURL)');
           menu.switchbutton            menu.switchbutton
     (8,2,'fdbk.gif','feedback','on this','gopost("/adm/feedback",currentURL)');      (8,2,'fdbk.gif','feedback','discuss','gopost("/adm/feedback",currentURL)');
           menu.switchbutton            menu.switchbutton
      (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)');       (8,3,'prt.gif','prepare','printout','gopost("/adm/printout",currentURL)');
           menu.switchbutton            menu.switchbutton
Line 383  ENDPARM Line 443  ENDPARM
     }      }
   
     function LONCAPAstale() {      function LONCAPAstale() {
   menu=window.open("","LONCAPAmenu");    menu=window.open("$nothing","LONCAPAmenu","",false);
           menu.currentStale=1;            menu.currentStale=1;
           menu.switchbutton            if (menu.reloadURL!='' && menu.reloadURL!= null) { 
              (3,1,'reload.gif','return','location','go(currentURL)');               menu.switchbutton
                (3,1,'reload.gif','return','location','go(reloadURL)');
     }
           menu.clearbut(7,1);            menu.clearbut(7,1);
           menu.clearbut(7,2);            menu.clearbut(7,2);
           menu.clearbut(7,3);            menu.clearbut(7,3);
Line 408  ENDREGTHIS Line 470  ENDREGTHIS
 // BEGIN LON-CAPA Internal  // BEGIN LON-CAPA Internal
   
     function LONCAPAreg() {      function LONCAPAreg() {
   menu=window.open("","LONCAPAmenu");    menu=window.open("$nothing","LONCAPAmenu","",false);
             $timesync
           menu.currentStale=1;            menu.currentStale=1;
           menu.clearbut(2,1);            menu.clearbut(2,1);
           menu.clearbut(2,3);            menu.clearbut(2,3);
Line 430  ENDREGTHIS Line 493  ENDREGTHIS
 </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;      return $result;
 }  }
   
Line 494  sub printalltags { Line 513  sub printalltags {
 }  }
   
 sub xmlparse {  sub xmlparse {
  my ($target,$content_file_string,$safeinit,%style_for_target) = @_;   my ($request,$target,$content_file_string,$safeinit,%style_for_target) = @_;
   
    &setup_globals($request,$target);
   #
   # do we have a course style file?
   #
   
    if ($ENV{'request.course.id'}) {
        my $bodytext=
    $ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'};
        if ($bodytext) {
          my $location=&Apache::lonnet::filelocation('',$bodytext);
          my $styletext=&Apache::lonnet::getfile($location);
          if ($styletext ne '-1') {
             %style_for_target = (%style_for_target,
                             &Apache::style::styleparser($target,$styletext));
          }
       }
    }
   
  &setup_globals($target);  
  #&printalltags();   #&printalltags();
  my @pars = ();   my @pars = ();
  my $pwd=$ENV{'request.filename'};   my $pwd=$ENV{'request.filename'};
Line 532  sub htmlclean { Line 568  sub htmlclean {
   
     my $output= $tree->as_HTML(undef,' ');      my $output= $tree->as_HTML(undef,' ');
   
     $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis;      $output=~s/\<(br|hr|img|meta|allow)(.*?)\>/\<$1$2 \/\>/gis;
     $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;      $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;
     unless ($full) {      unless ($full) {
        $output=~s/\<[\/]*(body|head|html)\>//gis;         $output=~s/\<[\/]*(body|head|html)\>//gis;
Line 543  sub htmlclean { Line 579  sub htmlclean {
     return $output;      return $output;
 }  }
   
   sub latex_special_symbols {
       my ($current_token,$stack,$parstack)=@_;
       $current_token=~s/\\/\\char92 /g;
       $current_token=~s/\^/\\char94 /g;
       $current_token=~s/\~/\\char126 /g;
       $current_token=~s/(&[^a-z\#])/\\$1/g;
       if ($current_token=~/ \#\w/) {
    $current_token=~s/ \#(\w)/ \\#$1/;
       } else {
    $current_token=~s/([^&])(\#)/$1\\$2/g;
       }
       $current_token=~s/(\$|_|{|})/\\$1/g;
       $current_token=~s/\\char92 /\\texttt{\\char92}/g;
       $current_token=~s/>/\$>\$/g; #more
       $current_token=~s/</\$<\$/g; #less
       if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
       if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
       return $current_token;
   }
   
 sub inner_xmlparse {  sub inner_xmlparse {
   my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;    my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
   my $finaloutput = '';    my $finaloutput = '';
Line 552  sub inner_xmlparse { Line 608  sub inner_xmlparse {
     while ($token = $$pars['-1']->get_token) {      while ($token = $$pars['-1']->get_token) {
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {        if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
  if ($metamode<1) {   if ($metamode<1) {
   $result=$token->[1];      my $text=$token->[1];
       if ($token->[0] eq 'C' && $target eq 'tex') {
    $text = '%'.$text;
    $text =~ s/[\n\r]//g;
       }
       $result.=$text;
  }   }
       } elsif ($token->[0] eq 'PI') {        } elsif ($token->[0] eq 'PI') {
  if ($metamode<1) {   if ($metamode<1) {
Line 610  sub inner_xmlparse { Line 671  sub inner_xmlparse {
       #evaluate variable refs in result        #evaluate variable refs in result
       if ($result ne "") {        if ($result ne "") {
  if ( $#$parstack > -1 ) {   if ( $#$parstack > -1 ) {
   if ($Apache::lonxml::redirection) {    $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);
     $Apache::lonxml::outputstack['-1'] .=   
       &Apache::run::evaluate($result,$safeeval,$$parstack['-1']);  
   } else {  
     $finaloutput .= &Apache::run::evaluate($result,$safeeval,  
    $$parstack['-1']);  
   }  
  } else {   } else {
   $finaloutput .= &Apache::run::evaluate($result,$safeeval,'');    $result= &Apache::run::evaluate($result,$safeeval,'');
    }
         }
         if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
    if ($target eq 'tex') {
       $result=&latex_special_symbols($result,$stack,$parstack);
  }   }
  $result = '';        }
       }   
         # Encode any high ASCII characters
         if (!$Apache::lonxml::prevent_entity_encode) {
    $result=&HTML::Entities::encode($result,"\200-\377");
         }
         if ($Apache::lonxml::redirection) {
    $Apache::lonxml::outputstack['-1'] .= $result;
         } else {
    $finaloutput.=$result;
         }
         $result = '';
   
       if ($token->[0] eq 'E') {         if ($token->[0] eq 'E') { 
  &end_tag($stack,$parstack,$token);   &end_tag($stack,$parstack,$token);
       }        }
Line 634  sub inner_xmlparse { Line 705  sub inner_xmlparse {
   #   $finaloutput.=&endredirection;    #   $finaloutput.=&endredirection;
   # }    # }
   
   
   if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {    if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
     $finaloutput=&afterburn($finaloutput);      $finaloutput=&afterburn($finaloutput);
   }    }
Line 736  sub callsub { Line 808  sub callsub {
     }      }
     if (!$deleted) {      if (!$deleted) {
       if ($space) {        if ($space) {
  #&Apache::lonxml::debug("Calling sub $sub in $space $metamode");   &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");   &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 776  sub callsub { Line 848  sub callsub {
 }  }
   
 sub setup_globals {  sub setup_globals {
   my ($target)=@_;    my ($request,$target)=@_;
     $Apache::lonxml::request=$request;
   $Apache::lonxml::registered = 0;    $Apache::lonxml::registered = 0;
   @Apache::lonxml::pwd=();    @Apache::lonxml::pwd=();
   @Apache::lonxml::extlinks=();    @Apache::lonxml::extlinks=();
Line 805  sub setup_globals { Line 878  sub setup_globals {
     $Apache::lonxml::metamode = 0;      $Apache::lonxml::metamode = 0;
     $Apache::lonxml::evaluate = 0;      $Apache::lonxml::evaluate = 0;
     $Apache::lonxml::import = 0;      $Apache::lonxml::import = 0;
     } elsif ($target eq 'analyze') {
       $Apache::lonxml::redirection = 0;
       $Apache::lonxml::metamode = 0;
       $Apache::lonxml::evaluate = 1;
       $Apache::lonxml::import = 1;
   } else {    } else {
     $Apache::lonxml::redirection = 0;      $Apache::lonxml::redirection = 0;
     $Apache::lonxml::metamode = 0;      $Apache::lonxml::metamode = 0;
Line 928  sub decreasedepth { Line 1006  sub decreasedepth {
 #print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";  #print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";
 }  }
   
 sub get_all_text {  sub get_all_text_unbalanced {
   #there is a copy of this in lonpublisher.pm
    my($tag,$pars)= @_;
    my $token;
    my $result='';
    $tag='<'.$tag.'>';
    while ($token = $$pars[-1]->get_token) {
      if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
        $result.=$token->[1];
      } elsif ($token->[0] eq 'PI') {
        $result.=$token->[2];
      } elsif ($token->[0] eq 'S') {
        $result.=$token->[4];
      } elsif ($token->[0] eq 'E')  {
        $result.=$token->[2];
      }
      if ($result =~ /(.*)$tag(.*)/) {
        &Apache::lonxml::debug('Got a winner with leftovers ::'.$2);
        &Apache::lonxml::debug('Result is :'.$1);
        $result=$1;
        my $redo=$tag.$2;
        &Apache::lonxml::newparser($pars,\$redo);
        last;
      }
    }
    return $result
   }
   
   sub get_all_text {
  my($tag,$pars)= @_;   my($tag,$pars)= @_;
  my $depth=0;   my $depth=0;
  my $token;   my $token;
Line 978  sub get_all_text { Line 1083  sub get_all_text {
   
 sub newparser {  sub newparser {
   my ($parser,$contentref,$dir) = @_;    my ($parser,$contentref,$dir) = @_;
   push (@$parser,HTML::TokeParser->new($contentref));    push (@$parser,HTML::LCParser->new($contentref));
   $$parser['-1']->xml_mode('1');    $$parser['-1']->xml_mode('1');
   if ( $dir eq '' ) {    if ( $dir eq '' ) {
     push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]);      push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]);
Line 1090  sub inserteditinfo { Line 1195  sub inserteditinfo {
       my ($result,$filecontents)=@_;        my ($result,$filecontents)=@_;
       $filecontents = &HTML::Entities::encode($filecontents);        $filecontents = &HTML::Entities::encode($filecontents);
 #      my $editheader='<a href="#editsection">Edit below</a><hr />';  #      my $editheader='<a href="#editsection">Edit below</a><hr />';
         my $buttons=(<<BUTTONS);
   <input type="submit" name="attemptclean" 
          value="Save and then attempt to clean HTML" />
   <input type="submit" name="savethisfile" value="Save this" />
   <input type="submit" name="viewmode" value="View" />
   BUTTONS
       my $editfooter=(<<ENDFOOTER);        my $editfooter=(<<ENDFOOTER);
 <hr />  <hr />
 <a name="editsection" />  <a name="editsection" />
 <form method="post">  <form method="post">
   <input type="hidden" name="editmode" value="Edit" />
   $buttons<br />
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>  <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
   <br />$buttons
 <br />  <br />
 <input type="hidden" name="showmode" value="Edit" />  
 <input type="submit" name="attemptclean"   
        value="Save and then attempt to clean HTML" />  
 <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;
Line 1179  ENDNOTFOUND Line 1288  ENDNOTFOUND
     $filecontents='';      $filecontents='';
     if ($ENV{'request.state'} ne 'published') {      if ($ENV{'request.state'} ne 'published') {
       $filecontents=&createnewhtml();        $filecontents=&createnewhtml();
       $ENV{'form.showmode'}='Edit'; #force edit mode        $ENV{'form.editmode'}='Edit'; #force edit mode
     }      }
   } else {    } else {
     unless ($ENV{'request.state'} eq 'published') {      unless ($ENV{'request.state'} eq 'published') {
Line 1187  ENDNOTFOUND Line 1296  ENDNOTFOUND
  $filecontents=&htmlclean($filecontents,1);   $filecontents=&htmlclean($filecontents,1);
       }        }
     }      }
     if ($ENV{'form.showmode'} ne 'Edit') {      if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
       $result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);        $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
     '',%mystyle);
     }      }
   }    }
   
Line 1196  ENDNOTFOUND Line 1306  ENDNOTFOUND
 # 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') {      if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
       $result='<html><body bgcolor="#FFFFFF"></body></html>';   my $displayfile=$request->uri;
           $displayfile=~s/^\/[^\/]*//;
         $result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile.
                 '</h3></body></html>';
       $result=&inserteditinfo($result,$filecontents);        $result=&inserteditinfo($result,$filecontents);
     }      }
   }    }
Line 1212  ENDNOTFOUND Line 1325  ENDNOTFOUND
 sub debug {  sub debug {
   if ($Apache::lonxml::debug eq 1) {    if ($Apache::lonxml::debug eq 1) {
     $|=1;      $|=1;
     print("DEBUG:".join('<br />',@_)."<br />\n");      print('<font size="-2"<pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\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>".join('<br />',@_)."<br />\n";      # If printing in construction space, put the error inside <pre></pre>
       print "<b>ERROR:</b>".join("\n",@_)."\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

Removed from v.1.157  
changed lines
  Added in v.1.202


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