Diff for /rat/lonpage.pm between versions 1.111.2.13.2.5 and 1.134

version 1.111.2.13.2.5, 2023/01/19 17:23:33 version 1.134, 2020/03/03 01:16:31
Line 44  use Apache::lonhomework; Line 44  use Apache::lonhomework;
 use Apache::lonparmset;  use Apache::lonparmset;
 use Apache::lonenc();  use Apache::lonenc();
 use HTML::TokeParser;  use HTML::TokeParser;
 use HTML::Entities();  
 use GDBM_File;  use GDBM_File;
 use Apache::lonsequence;  use Apache::lonsequence;
 use lib '/home/httpd/lib/perl/';  use lib '/home/httpd/lib/perl/';
Line 102  sub tracetable { Line 101  sub tracetable {
             } else {              } else {
                 $sofar++;                  $sofar++;
                 if ($hash{'src_'.$rid}) {                  if ($hash{'src_'.$rid}) {
                     my ($mapid,$resid)=split(/\./,$rid);                      my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid});
                     my $symb = &Apache::lonnet::encode_symb($hash{'map_id_'.$mapid},$resid,$hash{'src_'.$rid});  
                     my $brepriv=&Apache::lonnet::allowed('bre',$hash{'src_'.$rid},$symb);  
                     if (($brepriv eq '2') || ($brepriv eq 'F')) {                      if (($brepriv eq '2') || ($brepriv eq 'F')) {
                         if (defined($rows[$sofar])) {                          if (defined($rows[$sofar])) {
                             $rows[$sofar].='&'.$rid;                              $rows[$sofar].='&'.$rid;
Line 190  sub handler { Line 187  sub handler {
       if (-e "$fn.db") {        if (-e "$fn.db") {
           my %buttonshide;            my %buttonshide;
           my $hostname = $r->hostname();            my $hostname = $r->hostname();
           my $lonhost = $r->dir_config('lonHostID');  
           my $ip = &Apache::lonnet::get_host_ip($lonhost);  
           if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640)) {            if (tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640)) {
 # ------------------------------------------------------------------- Hash tied  # ------------------------------------------------------------------- Hash tied
               my $firstres=$hash{'map_start_'.$requrl};                my $firstres=$hash{'map_start_'.$requrl};
Line 278  sub handler { Line 273  sub handler {
                   my %ssilink=();                    my %ssilink=();
                   my %ssivlink=();                    my %ssivlink=();
                   my %ssialink=();                    my %ssialink=();
                   my %cssrefs=();  
                   my %httpref=();  
             
                   my %cellemb=();                    my %cellemb=();
                   my %cellexternal=();                    my %cellexternal=();
Line 311  sub handler { Line 304  sub handler {
                       foreach (@colcont) {                        foreach (@colcont) {
                           my $src=$hash{'src_'.$_};                            my $src=$hash{'src_'.$_};
                           my $plainsrc = $src;                            my $plainsrc = $src;
                           my $anchor;  
                           if ($hash{'ext_'.$_} eq 'true:') {                            if ($hash{'ext_'.$_} eq 'true:') {
                               $cellexternal{$_}=($hash{'ext_'.$_} eq 'true:');                                $cellexternal{$_}=($hash{'ext_'.$_} eq 'true:');
                               $src =~ s{^/ext/}{http://};                                $src =~ s{^/ext/}{http://};
                               $src =~ s{http://https://}{https://};                                $src =~ s{http://https://}{https://};
                               if ($src =~ /(\#[^#]+)$/) {  
                                   $anchor = $1;  
                                   $src =~ s/\#[^#]+$//;  
                               }  
                           }                            }
                           my $unencsrc = $src;  
                           my ($extension)=($src=~/\.(\w+)$/);                            my ($extension)=($src=~/\.(\w+)$/);
   if ($hash{'encrypted_'.$_}) {    if ($hash{'encrypted_'.$_}) {
       $src=&Apache::lonenc::encrypted($src);        $src=&Apache::lonenc::encrypted($src);
Line 335  sub handler { Line 322  sub handler {
       &Apache::loncommon::fileembstyle($extension);        &Apache::loncommon::fileembstyle($extension);
                           if ($cellexternal{$_}) {                            if ($cellexternal{$_}) {
                               if (($target eq 'tex') || ($target eq 'tex_answer')) {                                if (($target eq 'tex') || ($target eq 'tex_answer')) {
                                   my $shown = $src.$anchor;                                    my $shown = $src;
                                   if (($hash{'encrypted_'.$_}) && (!$env{'request.role.adv'})) {                                    if ($hash{'encrypted_'.$_}) {
                                       $shown = &mt('URL not shown (encrypted)');                                        $shown = &mt('URL not shown (encrypted)');
                                   }                                    }
                                   my $title=&Apache::lonnet::gettitle($symb);                                    my $title=&Apache::lonnet::gettitle($symb);
                                   $title = &Apache::lonxml::latex_special_symbols($title);                                    $title = &Apache::lonxml::latex_special_symbols($title);
                                   $shown = &Apache::lonxml::latex_special_symbols($shown);  
                                   $ssibody{$_} = ' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.'\\\\';                                    $ssibody{$_} = ' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.'\\\\';
                               } else {                                } else {
                                   my $showsrc = $src;                                    my $showsrc = $src;
                                   my ($is_pdf,$title,$linktext);  
                                   if ($unencsrc =~ /\.pdf$/i) {  
                                       $is_pdf = 1;  
                                   }  
                                   if (($hash{'encrypted_'.$_}) && ($symb)) {                                    if (($hash{'encrypted_'.$_}) && ($symb)) {
                                       $title=&Apache::lonnet::gettitle(&Apache::lonenc::encrypted($symb));                                        $showsrc .= '?symb='.&Apache::lonenc::encrypted($symb);
                                   } else {  
                                       $title=&Apache::lonnet::gettitle($symb);  
                                   }                                    }
                                   if ($env{'browser.mobile'}) {                                    $ssibody{$_} = <<ENDEXT;
                                       if ($is_pdf) {  <iframe src="$showsrc" width="100%">No iframe support!</iframe>
                                           $linktext = &mt('Link to PDF (for mobile devices)');  
                                           $ssibody{$_} = &create_extlink($unencsrc,$anchor,$title,$linktext);  
                                       } else {  
                                           $linktext = &mt('Link to resource');  
                                           $ssibody{$_} = &create_extlink($unencsrc,$anchor,$title,$linktext);  
                                       }  
                                   } else {  
                                       my $absolute = $env{'request.use_absolute'};  
                                       my $uselink = &Apache::loncommon::is_nonframeable($unencsrc,$absolute,$hostname,$ip);  
                                       if (($uselink) || (($ENV{'SERVER_PORT'} == 443) && ($unencsrc =~ m{^http://}))) {  
                                           $linktext = &mt('Link to resource');  
                                           $ssibody{$_} =  &create_extlink($unencsrc,$anchor,$title,$linktext);  
                                       } else {  
                                           if (($hash{'encrypted_'.$_}) && ($symb) && (!$env{'request.role.adv'})) {  
                                               $showsrc .= '?symb='.&Apache::lonenc::encrypted($symb);  
                                           } elsif ($anchor) {  
                                               $showsrc .= $anchor;  
                                           }  
                                           $ssibody{$_} = <<ENDEXT;  
 <iframe src="$showsrc" width="100%" height="300px">No iframe support!</iframe>  
 ENDEXT  ENDEXT
                                       }  
                                   }  
                               }                                }
                           } elsif ($cellemb{$_} eq 'ssi') {                            } elsif ($cellemb{$_} eq 'ssi') {
 # --------------------------------------------------------- This is an SSI cell  # --------------------------------------------------------- This is an SSI cell
       my $prefix='p_'.$_.'_';        my $prefix='p_'.$_.'_';
                               my $idprefix='p_'.join('_',($mapid,$resid,''));                                my $idprefix= 'p_'.join('_',($mapid,$resid,''));
                               my %posthash=('request.prefix' => $prefix,                                my %posthash=('request.prefix' => $prefix,
     'LONCAPA_INTERNAL_no_discussion' => 'true',      'LONCAPA_INTERNAL_no_discussion' => 'true',
     'symb' => $symb);      'symb' => $symb);
Line 421  ENDEXT Line 379  ENDEXT
       } elsif ($env{'form.'.$prefix.'markaccess'} eq 'yes') {        } elsif ($env{'form.'.$prefix.'markaccess'} eq 'yes') {
                   $posthash{'markaccess'} = $env{'form.'.$prefix.'markaccess'};                    $posthash{'markaccess'} = $env{'form.'.$prefix.'markaccess'};
               }                }
                               if ($env{'environment.remote'} eq 'on') {  
                                   $posthash{'inhibitmenu'} = 'yes';  
                               }  
                               my $output=Apache::lonnet::ssi($src,%posthash);                                my $output=Apache::lonnet::ssi($src,%posthash);
       $output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs;        $output=~s|//(\s*<!--)? BEGIN LON-CAPA Internal.+?// END LON-CAPA Internal\s*(-->)?\s||gs;
                               if (($target eq 'tex') || ($target eq 'tex_answer')) {                                if (($target eq 'tex') || ($target eq 'tex_answer')) {
Line 445  ENDEXT Line 400  ENDEXT
                               my $bodydef=0;                                my $bodydef=0;
                               my $thisxml=0;                                my $thisxml=0;
                               my @rlinks=();                                my @rlinks=();
                               my @css_hrefs=();  
                               if ($output=~/\?xml/) {                                if ($output=~/\?xml/) {
                                  $isxml=1;                                   $isxml=1;
                                  $thisxml=1;                                   $thisxml=1;
Line 488  ENDEXT Line 442  ENDEXT
                                            ($bodydef==0)) {                                             ($bodydef==0)) {
       $allscript.="\n\n"        $allscript.="\n\n"
                                                 .$parser->get_text('/script');                                                  .$parser->get_text('/script');
                                   } elsif (($token->[1] eq 'link') &&  
                                            ($bodydef==0)) {  
                                       if (($token->[2]->{'href'} !~ m{^/adm/}) &&  
                                           ($token->[2]->{'rel'} eq 'stylesheet')) {  
                                               $css_hrefs[$#css_hrefs+1]=  
                                                   $token->[2]->{'href'};  
   
                                       }  
                                   }                                    }
         }          }
       }        }
Line 658  ENDEXT Line 604  ENDEXT
                      $output=~s/(\"|\'|\=\s*)$_(\"|\'|\s|\>)/$1$newlocation$2/;                       $output=~s/(\"|\'|\=\s*)$_(\"|\'|\s|\>)/$1$newlocation$2/;
   }    }
       }        }
                               foreach my $css_href (@css_hrefs) {  
                                   next if ($css_href eq '');  
                                   unless ($css_href =~ m{https?://}) {  
                                       my $proburl = &Apache::lonnet::clutter($plainsrc);  
                                       unless ($css_href =~ m{^/}) {  
                                           my $probdir = $proburl;  
                                           $probdir=~s/\/[^\/]*$//;  
                                           $css_href = &Apache::lonnet::hreflocation($probdir,$css_href);  
                                       }  
                                       if ($css_href =~ m{^/(res|uploaded)/}) {  
                                           unless (($env{'httpref.'.$css_href}) ||  
                                                   ($httpref{'httpref.'.$css_href}) ||  
                                                   (&Apache::lonnet::is_on_map($css_href))) {  
                                               if ($env{'httpref.'.$proburl}) {  
                                                   $proburl = $env{'httpref.'.$proburl};  
                                               }  
                                               $httpref{'httpref.'.$css_href} = $proburl;  
                                           }  
                                       }  
                                   }  
                                   $cssrefs{$css_href} = 1;  
                               }  
 # -------------------------------------------------- Deal with Applet codebases  # -------------------------------------------------- Deal with Applet codebases
   $output=~s/(\<applet[^\>]+)(codebase\=[^\S\>]+)*([^\>]*)\>/$1.($2?$2:' codebase="'.$thisdir.'"').$3.'>'/gei;    $output=~s/(\<applet[^\>]+)(codebase\=[^\S\>]+)*([^\>]*)\>/$1.($2?$2:' codebase="'.$thisdir.'"').$3.'>'/gei;
       $ssibody{$_}=$output;        $ssibody{$_}=$output;
 # ---------------------------------------------------------------- End SSI cell  # ---------------------------------------------------------------- End SSI cell
                           }                            }
                       }                        }
                      }                       } 
                   }                    }
                   unless ($contents) {                    unless ($contents) {
                       &Apache::loncommon::content_type($r,'text/html');                        &Apache::loncommon::content_type($r,'text/html');
                       $r->send_http_header;                        $r->send_http_header;
                       $r->print(&Apache::loncommon::start_page(undef,undef,                        $r->print(&Apache::loncommon::start_page(undef,undef,
        {'force_register' => 1}));         {'force_register' => 1,}));
                       $r->print(&mt('This page is either empty or it only contains resources that are currently hidden').'. ');                        $r->print(&mt('This page is either empty or it only contains resources that are currently hidden').'. ');
                       $r->print('<br /><br />'.&mt('Please use the LON-CAPA navigation arrows to move to another item in the course').                        $r->print('<br /><br />'.&mt('Please use the LON-CAPA navigation arrows to move to another item in the course').
  &Apache::loncommon::end_page());   &Apache::loncommon::end_page());
Line 745  ENDEXT Line 669  ENDEXT
                                       $uniquetimes{$item} = 1;                                        $uniquetimes{$item} = 1;
                                   }                                    }
                               }                                }
                               if (scalar(keys(%uniquetimes)) == 1) {                                 if (scalar(keys(%uniquetimes)) == 1) {
                                   my (%uniquedisplays,%uniquedones,$currdisp,$donebuttontime,                                    my (%uniquedisplays,%uniquedones,$currdisp,$donebuttontime,
                                       $donebuttonextras);                                        $donebuttonextras);
                                   if (keys(%countdowndisp)) {                                    if (keys(%countdowndisp)) {
Line 798  ENDEXT Line 722  ENDEXT
                                   }                                    }
                               }                                }
                           }                            }
                           if (keys(%cssrefs)) {  
                               my $links;  
                               if (keys(%cssrefs)) {  
                                   foreach my $css_href (keys(%cssrefs)) {  
                                       next unless ($css_href =~ m{^(/res/|/uploaded/|https?://)});  
                                       $links .= '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />'."\n";  
                                   }  
                               }  
                               if ($links) {  
                                   if (keys(%httpref)) {  
                                       &Apache::lonnet::appenv(\%httpref);  
                                   }  
                                   $allscript .= "\n$links";  
                               }  
                           }  
 # ------------------------------------------------------------------ Start body  # ------------------------------------------------------------------ Start body
   $r->print(&Apache::loncommon::start_page(undef,$allscript,    $r->print(&Apache::loncommon::start_page(undef,$allscript,
    {'force_register' => 1,     {'force_register' => 1,
Line 889  ENDEXT Line 798  ENDEXT
       }                     }             
       $r->print('>');        $r->print('>');
   }    }
                                   $r->print($ssibody{$rid});                                    unless (($cellexternal{$rid}) && 
                                             ($target eq 'tex') && ($target eq 'tex_answer')) {
                                         $r->print($ssibody{$rid});
                                     }
   unless (($target eq 'tex') || ($target eq 'tex_answer')) {    unless (($target eq 'tex') || ($target eq 'tex_answer')) {
       $r->print('</font>');        $r->print('</font>');
                                   }                                    }
Line 968  ENDEXT Line 880  ENDEXT
                   }                                      }                  
 # ------------------------------------------------------------- End render page  # ------------------------------------------------------------- End render page
               } else {                } else {
                   if ($hash{'map_type_'.$hash{'map_pc_'.$requrl}} eq 'none') {                    &Apache::loncommon::content_type($r,'text/html');
                       &Apache::loncommon::content_type($r,'text/html');                    $r->send_http_header;
                       $r->send_http_header;                    &Apache::lonsequence::viewmap($r,$requrl);
                       $r->print(&Apache::loncommon::start_page(undef,undef,  
                                                                {'force_register' => 1,}));  
                       my $crstype = &Apache::loncommon::course_type();  
                       if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) {  
                           $r->print('<span class="LC_warning">'.&mt('Missing composite page file.').'</span><br />'.  
                                     &mt("You may want to use the $crstype Editor to remove this item."));  
                       } else {  
                           $r->print('<span class="LC_info">'.  
                                     &mt('This resource was unavailable when your '.lc($crstype).' session was loaded').'<br />'.  
                                     &mt("Please use 'Contents' to list items available in the $crstype.").'</span>');  
                       }  
                       $r->print(&Apache::loncommon::end_page());  
                   } else {  
                       &Apache::loncommon::content_type($r,'text/html');  
                       $r->send_http_header;  
                       &Apache::lonsequence::viewmap($r,$requrl);  
                   }  
               }                }
 # ------------------------------------------------------------------ Untie hash  # ------------------------------------------------------------------ Untie hash
               unless (untie(%hash)) {                unless (untie(%hash)) {
Line 1009  ENDEXT Line 904  ENDEXT
 sub get_buttons {  sub get_buttons {
     my ($hash,$rid,$buttonshide,$hostname) = @_;      my ($hash,$rid,$buttonshide,$hostname) = @_;
   
       my $metainfo = '';
       my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid});
     my ($mapid,$resid)=split(/\./,$rid);      my ($mapid,$resid)=split(/\./,$rid);
     my $symb=&Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},      my $symb=&Apache::lonnet::encode_symb($hash->{'map_id_'.$mapid},
   $resid,    $resid,
   $hash->{'src_'.$rid});    $hash->{'src_'.$rid});
     my ($aname,$shownsymb);  
     if (($hash->{'encrypted_'.$rid}) && (!$env{'request.role.adv'})) {  
         $aname = 'LC_'.$rid;  
         $shownsymb = &Apache::lonenc::encrypted($symb);  
     } else {  
         $shownsymb = $symb;  
         my $dispsymb = $symb;  
         if ($symb =~ /\#([^\#]+)$/) {  
             my $escan = &escape('#');  
             $dispsymb =~ s/#([^\#]+)$/$escan$1/;  
         }  
         $aname = &escape($dispsymb);  
     }  
     my $metainfo = '<a name="'.$aname.'"></a>';  
     unless ($env{'request.role.adv'}) {      unless ($env{'request.role.adv'}) {
         if ($buttonshide->{$symb} eq 'yes') {          if ($buttonshide->{$symb} eq 'yes') {
             return $metainfo;              return;
         }          }
     }      }
     my $crs_sec = $env{'request.course.id'} . (($env{'request.course.sec'} ne '')      my $crs_sec = $env{'request.course.id'} . (($env{'request.course.sec'} ne '')
                                                ? "/$env{'request.course.sec'}"                                                 ? "/$env{'request.course.sec'}"
                                                : '');                                                 : '');
     my $esrc=&Apache::lonnet::declutter($hash->{'src_'.$rid});  
     if ($hash->{'encrypted_'.$rid}) {      if ($hash->{'encrypted_'.$rid}) {
  $esrc=&Apache::lonenc::encrypted($esrc);   $esrc=&Apache::lonenc::encrypted($esrc);
     }      }
Line 1044  sub get_buttons { Line 926  sub get_buttons {
  && !$env{'request.enc'}   && !$env{'request.enc'}
  && ($env{'request.role.adv'}   && ($env{'request.role.adv'}
     || !$hash->{'encrypted_'.$rid})) {       || !$hash->{'encrypted_'.$rid})) { 
  $metainfo .= '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" '.   $metainfo .='<a name="'.&escape($symb).'"></a>'.
     'target="LONcatInfo">'.      '<a href="'.$hash->{'src_'.$rid}.'.meta'.'" target="LONcatInfo">'.
             '<img src="/res/adm/pages/catalog.png" class="LC_icon"'.              '<img src="/res/adm/pages/catalog.png" class="LC_icon"'.
             ' alt="'.&mt('Show Metadata').'"'.              ' alt="'.&mt('Show Metadata').'"'.
             ' title="'.&mt('Show Metadata').'" />'.              ' title="'.&mt('Show Metadata').'" />'.
Line 1107  sub get_buttons { Line 989  sub get_buttons {
                 &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,$hash->{'src_'.$rid},$symb);                  &Apache::lonnet::can_edit_resource($file,$cnum,$cdom,$hash->{'src_'.$rid},$symb);
             if ($cfile ne '') {              if ($cfile ne '') {
                 my $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver,                  my $jscall = &Apache::lonhtmlcommon::jump_to_editres($cfile,$home,$switchserver,
                                                                      $forceedit,1,$symb,$shownsymb,                                                                       $forceedit,1,$symb,undef,
                                                                      undef,&escape($env{'form.title'}),                                                                       &escape($env{'form.title'}),
                                                                      $hostname);                                                                       $hostname);
                 if ($jscall) {                  if ($jscall) {
                     $editbutton = 1;                      $editbutton = 1;
Line 1179  sub add_countdown_timer { Line 1061  sub add_countdown_timer {
             $donebuttontext = &mt('Done');              $donebuttontext = &mt('Done');
             $type = 'map';              $type = 'map';
         }          }
         $donebutton =          $donebutton = 
             &Apache::lonmenu::done_button_js($type,'','',$proctor,$donebuttontext);              &Apache::lonmenu::done_button_js($type,'','',$proctor,$donebuttontext);
     }      }
     unless ($env{'environment.icons'} eq 'iconsonly') {      unless ($env{'environment.icons'} eq 'iconsonly') {
Line 1202  END Line 1084  END
     return;      return;
 }  }
   
 sub create_extlink {  
     my ($url,$anchor,$title,$linktext) = @_;  
     my $shownlink;  
     unless ($title eq '') {  
         $shownlink = '<span style="font-weight:bold;">'.$title.'</span><br />';  
     }  
     my $dest = &HTML::Entities::encode($url.$anchor,'&<>"');  
     $shownlink .= '<a href="'.$dest.'">'.$linktext.'</a>';  
     return $shownlink;  
 }  
   
 1;  1;
 __END__  __END__

Removed from v.1.111.2.13.2.5  
changed lines
  Added in v.1.134


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.