--- loncom/interface/lonindexer.pm 2003/08/21 21:57:36 1.75 +++ loncom/interface/lonindexer.pm 2018/08/07 17:41:40 1.228 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Directory Indexer # -# $Id: lonindexer.pm,v 1.75 2003/08/21 21:57:36 albertel Exp $ +# $Id: lonindexer.pm,v 1.228 2018/08/07 17:41:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,21 +25,6 @@ # # http://www.lon-capa.org/ # -# YEAR=1999 -# 5/21/99, 5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer) -# 11/23 Gerd Kortemeyer -# YEAR=2000 -# 07/20-08/04 H.K. Ng -# YEAR=2001 -# 05/9-05/19/2001 H. K. Ng -# 05/21/2001 H. K. Ng -# 05/23/2001 H. K. Ng -# 6/26,7/8 H. K. Ng -# 8/14 H. K. Ng -# 11/30 Matthew Hall -# YEAR=2002 -# 6/29/2002 H. K. Ng -# ### ############################################################################### @@ -49,9 +34,8 @@ ## 1. Description of functions ## ## 2. Modules used by this module ## ## 3. Choices for different output views (detailed, summary, xml, etc) ## -## 4. BEGIN block (to be run once after compilation) ## -## 5. Handling routine called via Apache and mod_perl ## -## 6. Other subroutines ## +## 4. Handling routine called via Apache and mod_perl ## +## 5. Other subroutines ## ## ## ############################################################################### @@ -59,18 +43,25 @@ package Apache::lonindexer; # ------------------------------------------------- modules used by this module use strict; -use Apache::lonnet(); +use Apache::lonnet; use Apache::loncommon(); +use Apache::lonhtmlcommon(); +use Apache::lonsequence(); use Apache::Constants qw(:common); use Apache::lonmeta; use Apache::File; +use Apache::lonlocal; +use Apache::lonsource(); +use Apache::groupsort(); use GDBM_File; +use LONCAPA qw(:match); # ---------------------------------------- variables used throughout the module -my %hash; # tied to a user-specific gdbm file +my %hash; # global user-specific gdbm file my %dirs; # keys are directories, values are the open/close status -my %language; # has the reference information present in language.tab - +my %dynhash; # hash of hashes for dynamic metadata +my %dynread; # hash of directories already read for dynamic metadata +my %fieldnames; # Metadata fieldnames # ----- Values which are set by the handler subroutine and are accessible to # ----- other methods. my $extrafield; # default extra table cell @@ -82,11 +73,13 @@ my @Only = (); my @Omit = (); + + # ----------------------------- Handling routine called via Apache and mod_perl sub handler { my $r = shift; my $c = $r->connection(); - $r->content_type('text/html'); + &Apache::loncommon::content_type($r,'text/html'); &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; @@ -97,73 +90,111 @@ sub handler { # these global to this package? It is just so wrong....) undef (@Only); undef (@Omit); + %fieldnames=&Apache::lonmeta::fieldnames(); -# ------------------------------------- read in machine configuration variables +# --------------------------------------------------------------- get icon path my $iconpath= $r->dir_config('lonIconsURL') . "/"; - my $domain = $r->dir_config('lonDefDomain'); - my $role = $r->dir_config('lonRole'); - my $loadlim = $r->dir_config('lonLoadLim'); - my $servadm = $r->dir_config('lonAdmEMail'); - my $sysadm = $r->dir_config('lonSysEMail'); - my $lonhost = $r->dir_config('lonHostID'); - my $tabdir = $r->dir_config('lonTabDir'); + my $defdom = &Apache::lonnet::default_login_domain(); - my $fileclr='#ffffe6'; +#SB my $fileclr='#ffffe6'; my $line; - my (@attrchk,@openpath); + my (@attrchk,@openpath,$typeselect); my $uri=$r->uri; # -------------------------------------- see if called from an interactive mode # Get the parameters from the query string &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['catalogmode','launch','acts','mode','form','element', - 'only','omit']); + 'only','omit','titleelement']); #------------------------------------------------------------------- my $closebutton=''; my $groupimportbutton=''; my $colspan=''; - + $extrafield=''; - my $diropendb = - "/home/httpd/perl/tmp/$ENV{'user.domain'}_$ENV{'user.name'}_indexer.db"; + my $diropendb = LONCAPA::tempdir() . + "$env{'user.domain'}_$env{'user.name'}_sel_res.db"; %hash = (); { my %dbfile; - if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) { + if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_WRITER(),0640)) { + if ($env{'form.launch'} eq '1') { + &start_fresh_session(\%dbfile); + } while(my($key,$value)=each(%dbfile)) { $hash{$key}=$value; } untie(%dbfile); } } +# - Evaluate actions from previous page (both cumulatively and chronologically) + if ($env{'form.catalogmode'} eq 'import' || $hash{'form.catalogmode'} eq 'import') { + &Apache::groupsort::update_actions_hash(\%hash); + } + { - if ($ENV{'form.launch'} eq '1') { - &start_fresh_session(); - } + #Hijack lonindexer to verify a title and be close down. + if ($env{'form.launch'} eq '2') { + &Apache::loncommon::content_type($r,'text/html'); + my $extra=''; + if (defined($env{'form.titleelement'}) && + $env{'form.titleelement'} ne '') { + my $verify_title = &Apache::lonnet::gettitle($env{'form.acts'}); +# &Apache::lonnet::logthis("Hrrm $env{'form.acts'} -- $verify_title"); + $verify_title=~s/'/\\'/g; + $extra='window.opener.document.forms["'.$env{'form.form'}.'"].elements["'.$env{'form.titleelement'}.'"].value=\''.$verify_title.'\';'; + } + my $js = < + function load() { + window.opener.document.forms["$env{'form.form'}"] + .elements["$env{'form.element'}"] + .value='$env{'form.acts'}'; + $extra + window.close(); + } + +ENDSUBM + $r->print(&Apache::loncommon::start_page(undef,$js, + {'only_body' =>1, + 'add_modal' => 1, + 'add_wishlist' => 1, + 'add_entries' => + {'onload' => "load();"},} + ). + &Apache::loncommon::end_page()); + return OK; + } + # -------------------- refresh environment with user database values (in %hash) - &setvalues(\%hash,'form.catalogmode',\%ENV,'form.catalogmode' ); + &setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode' ); # --------------------- define extra fields and buttons in case of special mode - if ($ENV{'form.catalogmode'} eq 'interactive') { - $extrafield=''. - ''; + if ($env{'form.catalogmode'} eq 'interactive') { +#SB $extrafield=''. + $extrafield=''. + ''; $colspan=" colspan='2' "; + my $cl=&mt('Close'); $closebutton=< + END } - elsif ($ENV{'form.catalogmode'} eq 'groupimport') { - $extrafield=''. - ''; + elsif ($env{'form.catalogmode'} eq 'import') { +#SB $extrafield=''. + $extrafield=''. + ''; $colspan=" colspan='2' "; + my $cl=&mt('Close'); + my $gi=&mt('Import'); $closebutton=< + END $groupimportbutton=< + END } # Additions made by Matthew to make the browser a little easier to deal @@ -174,32 +205,34 @@ END # selection is made. # $element is the name of the element in $formname which receives # the URL. - # &Apache::lonxml::debug('Checking mode, form, element'); - &setvalues(\%hash,'form.mode' ,\%ENV,'form.mode' ); - &setvalues(\%hash,'form.form' ,\%ENV,'form.form' ); - &setvalues(\%hash,'form.element',\%ENV,'form.element'); - &setvalues(\%hash,'form.only' ,\%ENV,'form.only' ); - &setvalues(\%hash,'form.omit' ,\%ENV,'form.omit' ); + #&Apache::lonxml::debug('Checking mode, form, element'); + &setvalues(\%hash,'form.mode' ,\%env,'form.mode' ); + &setvalues(\%hash,'form.form' ,\%env,'form.form' ); + &setvalues(\%hash,'form.element' ,\%env,'form.element'); + &setvalues(\%hash,'form.titleelement',\%env,'form.titleelement'); + &setvalues(\%hash,'form.only' ,\%env,'form.only' ); + &setvalues(\%hash,'form.omit' ,\%env,'form.omit' ); # Deal with 'omit' and 'only' - if (exists $ENV{'form.omit'}) { - @Omit = split(',',$ENV{'form.omit'}); + if (exists $env{'form.omit'}) { + @Omit = split(',',$env{'form.omit'}); } - if (exists $ENV{'form.only'}) { - @Only = split(',',$ENV{'form.only'}); + if (exists $env{'form.only'}) { + @Only = split(',',$env{'form.only'}); } - my $mode = $ENV{'form.mode'}; - my ($form,$element); + my $mode = $env{'form.mode'}; + my ($form,$element,$titleelement); if ($mode eq 'edit' || $mode eq 'parmset') { - $form = $ENV{'form.form'}; - $element = $ENV{'form.element'}; + $form = $env{'form.form'}; + $element = $env{'form.element'}; + $titleelement = $env{'form.titleelement'}; } - &Apache::lonxml::debug("mode=$mode form=$form element=$element"); + #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement"); # ------ set catalogmodefunctions to have extra needed javascript functionality my $catalogmodefunctions=''; - if ($ENV{'form.catalogmode'} eq 'interactive' or - $ENV{'form.catalogmode'} eq 'groupimport') { + if ($env{'form.catalogmode'} eq 'interactive' or + $env{'form.catalogmode'} eq 'import') { # The if statement below sets us up to use the old version # by default (ie. if $mode is undefined). This is the easy # way out. Hopefully in the future I'll find a way to get @@ -210,25 +243,17 @@ END # # if (!defined($mode) || ($mode ne 'edit' && $mode ne 'parmset')) { - my $location = "/adm/groupsort?catalogmode=groupimport&"; + my $location = "/adm/groupsort?&inhibitmenu=yes&catalogmode=import&"; $location .= "mode=".$mode."&"; $location .= "acts="; $catalogmodefunctions=<<"END"; -function select_data(title,url) { - changeTitle(title); +function select_data(url) { changeURL(url); self.close(); } function select_group() { window.location="$location"+document.forms.fileattr.acts.value; } -function changeTitle(val) { - if (opener.inf) { - if (opener.inf.document.forms.resinfo.elements.t) { - opener.inf.document.forms.resinfo.elements.t.value=val; - } - } -} function changeURL(val) { if (opener.inf) { if (opener.inf.document.forms.resinfo.elements.u) { @@ -242,11 +267,13 @@ END $location .= "form=$form&element=$element&mode=edit&acts="; $catalogmodefunctions=<print(< - -The LearningOnline Network With CAPA Directory Browser - + + my $js = <<"ENDHEADER"; - - ENDHEADER -my ($headerdom)=($uri=~/^\/res\/(\w+)\//); -$r->print(&Apache::loncommon::bodytag('Browse Resources',undef,undef,undef, - $headerdom)); -# - Evaluate actions from previous page (both cumulatively and chronologically) - if ($ENV{'form.catalogmode'} eq 'groupimport') { - my $acts=$ENV{'form.acts'}; - my @Acts=split(/b/,$acts); - my %ahash; - my %achash; - my $ac=0; - # some initial hashes for working with data - foreach (@Acts) { - my ($state,$ref)=split(/a/); - $ahash{$ref}=$state; - $achash{$ref}=$ac; - $ac++; - } - # sorting through the actions and changing the tied database hash - foreach (sort {$achash{$a}<=>$achash{$b}} (keys %ahash)) { - my $key=$_; - if ($ahash{$key} eq '1') { - $hash{'store_'.$hash{'pre_'.$key.'_link'}}= - $hash{'pre_'.$key.'_title'}; - $hash{'storectr_'.$hash{'pre_'.$key.'_link'}}= - $hash{'storectr'}+0; - $hash{'storectr'}++; - } - if ($ahash{$key} eq '0') { - if ($hash{'store_'.$hash{'pre_'.$key.'_link'}}) { - delete $hash{'store_'.$hash{'pre_'.$key.'_link'}}; - } - } - } - # deleting the previously cached listing - foreach (keys %hash) { - if ($_ =~ /^pre_/ && $_ =~/link$/) { - my $key = $_; - $key =~ s/^pre_//; - $key =~ s/_[^_]*$//; - delete $hash{'pre_'.$key.'_title'}; - delete $hash{'pre_'.$key.'_link'}; - } - } + + my ($headerdom)=($uri=~m{^/res/($match_domain)/}); + + if ($env{'form.catalogmode'}) { + # "Popup mode" + $r->print(&Apache::loncommon::start_page('Browse published resources',$js, + {'only_body' => 1, 'add_wishlist'=>1, 'add_modal' =>1, + 'domain' => $headerdom,})); + } else { + # Only display page header and breadcrumbs in non-popup mode + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Browse published resources', + 'href' => '/res/'.$headerdom.'/?launch=1', + }); + $r->print(&Apache::loncommon::start_page('Browse published resources',$js, + {'domain' => $headerdom,}) + .&Apache::lonhtmlcommon::breadcrumbs() + ); + } + +# ---------------------------------- get state of file types to be showing + if ($env{'form.only'}) { + $typeselect = $env{'form.only'}; + } else { + $typeselect = ''; } - + # ---------------------------------- get state of file attributes to be showing - if ($ENV{'form.attrs'} ne '') { - for (my $i=0; $i<=9; $i++) { + if ($env{'form.attrs'}) { + for (my $i=0; $i<=16; $i++) { delete $hash{'display_attrs_'.$i}; - if ($ENV{'form.attr'.$i} == 1) { + if ($env{'form.attr'.$i} == 1) { $attrchk[$i] = 'checked'; $hash{'display_attrs_'.$i} = 1; } } } else { - for (my $i=0; $i<=9; $i++) { - $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1; + for (my $i=0; $i<=16; $i++) { + $attrchk[$i] = 'checked="checked"' if $hash{'display_attrs_'.$i} == 1; } } + + my @file_categories = &Apache::loncommon::filecategories(); + my %select_file_categories; + my @select_form_order = (''); + $select_file_categories{''} = &mt('All file types'); + foreach my $cat (@file_categories) { + my $types = join(",",&Apache::loncommon::filecategorytypes($cat)); + $select_file_categories{$types} = &mt($cat); + push(@select_form_order,$types); + } + $select_file_categories{'select_form_order'} = \@select_form_order; + my $onchange = 'this.form.submit();'; + my $type_element= + &Apache::loncommon::select_form( + $typeselect, + 'only', + \%select_file_categories,$onchange); + my $type_selector = ''; + # ------------------------------- output state of file attributes to be showing # All versions has to the last item # since it does not take an extra col - $r->print(< -Display file attributes
- - - - - - - - - - - - -
Title Size Last access Last modified Statistics
Author Keywords Language Show Resource All versions 
- + my %lt=&Apache::lonlocal::texthash( + 'av' => 'All versions', + 'ud' => 'Update Display', + 'pr' => 'Problems', + 'gr' => 'Graphics', + 'at' => 'All types', + 'hd' => 'Display Options' + ); + my @disp_order = ('0','4','5','6','13','1','2','3','10','14','8','11','7','12','15','16'); + my %disp_options = &Apache::lonlocal::texthash ( + 0 => 'Title', + 4 => 'Author', + 5 => 'Keywords', + 6 => 'Language', + 13 => 'Notes', + 1 => 'Size', + 2 => 'Last access', + 3 => 'Last modified', + 10 => 'Source Available', + 14 => 'Abstract', + 8 => 'Statistics', + 11 => 'Linked/Related Resources', + 7 => 'Show resource', + 12 => 'Subject', + 15 => 'Grade Level', + 16 => 'Standards', + ); + my $cell = 0; + my $numinrow = 4; + $r->print(' +
+
+'.$lt{'hd'}.' +'."\n"); + foreach my $item (@disp_order) { + my $style = 'padding-left: 12px; padding-right: 8px;'; + if ($cell%$numinrow == 0) { + $r->print(''); + } + $cell ++; + if ($cell > 3 * $numinrow) { + $style .= ' padding-bottom: 6px;'; + } + if (defined($disp_options{$item})) { + $r->print(''."\n"); + } + if ($cell > 1 && $cell%$numinrow == 0) { + $r->print(''); + } + } + $r->print(< + + + +
'. + '
+ +$type_selector
+ +
+ - -$closebutton -$groupimportbutton -
+$closebutton $groupimportbutton END - + $r->print(&Apache::loncommon::inhibit_menu_check('input')); + +# -------------- Filter out sequence containment in crumbs and "recent folders" + my $storeuri=$uri; + $storeuri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $storeuri=~s/\/+/\//g; +# ---------------------------------------------------------------- Bread crumbs + $r->print( + '

' + .&Apache::lonhtmlcommon::crumbs( + $storeuri, + '', + '', + (($env{'form.catalogmode'} eq 'import')? + 'document.forms.fileattr':'')) + .'
' + .&Apache::lonhtmlcommon::select_recent( + 'residx', + 'resrecent', + 'window.status=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.action=this.form.resrecent.options[this.form.resrecent.selectedIndex].value;this.form.submit();') + .'

' + ); +# -------------------------------------------------------- Resource Home Button + my $reshome=$env{'course.'.$env{'request.course.id'}.'.reshome'}; + if ($reshome) { + $r->print("
print('javascript:document.forms.fileattr.action="'.&Apache::loncommon::inhibit_menu_check($reshome).'";document.forms.fileattr.submit();'); + } else { + $r->print($reshome); + } + $r->print("'>".&mt('Home directory').''); + } + $r->print(''); +# ------------------------------------------------------ Remember where we were + &Apache::loncommon::storeresurl($storeuri); + &Apache::lonhtmlcommon::store_recent('residx',$storeuri,$storeuri); +# -------------------------------------------------- Check All and Uncheck all + if ($env{'form.catalogmode'} eq 'import') { + $r->print('

'); + $r->print('

'); + } # ----------------- output starting row to the indexed file/directory hierarchy - my $titleclr="#ddffff"; -# $r->print(&initdebug()); -# $r->print(&writedebug("Omit:@Omit")) if (@Omit); -# $r->print(&writedebug("Only:@Only")) if (@Only); - $r->print("
\n"); - $r->print("\n"); - $r->print("\n"); - $r->print("\n") + #$r->print(&initdebug()); + #$r->print(&writedebug("Omit:@Omit")) if (@Omit); + #$r->print(&writedebug("Only:@Only")) if (@Only); + $r->print(&Apache::loncommon::start_data_table("LC_tableBrowseRes") + .&Apache::loncommon::start_data_table_header_row()); + $r->print("\n"); + $r->print("\n"); + $r->print("\n") if ($hash{'display_attrs_0'} == 1); - $r->print("\n") if ($hash{'display_attrs_1'} == 1); - $r->print("\n") + $r->print('\n") if ($hash{'display_attrs_1'} == 1); + $r->print("\n") if ($hash{'display_attrs_2'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_3'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_4'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_5'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_6'} == 1); - $r->print("\n") - if ($hash{'display_attrs_7'} == 1); - $r->print("\n") + $r->print("\n") if ($hash{'display_attrs_8'} == 1); - $r->print(''); + $r->print("\n") + if ($hash{'display_attrs_10'} == 1); + $r->print("\n") + if ($hash{'display_attrs_11'} == 1); + $r->print("\n") + if ($hash{'display_attrs_7'} == 1); + $r->print("\n") + if ($hash{'display_attrs_12'} == 1); + $r->print("\n") + if ($hash{'display_attrs_13'} == 1); + $r->print("\n") + if ($hash{'display_attrs_14'} == 1); + $r->print("\n") + if ($hash{'display_attrs_15'} == 1); + $r->print("\n") + if ($hash{'display_attrs_16'} == 1); + + $r->print(&Apache::loncommon::end_data_table_header_row()); + + # ----------------- read in what directories have previously been set to "open" - foreach (keys %hash) { + foreach (keys(%hash)) { if ($_ =~ /^diropen_status_/) { my $key = $_; $key =~ s/^diropen_status_//; @@ -461,8 +632,8 @@ END } } - if ($ENV{'form.openuri'}) { # take care of review and refresh options - my $uri=$ENV{'form.openuri'}; + if ($env{'form.openuri'}) { # take care of review and refresh options + my $uri=$env{'form.openuri'}; if (exists($hash{'diropen_status_'.$uri})) { my $cursta = $hash{'diropen_status_'.$uri}; $dirs{$uri} = 'open'; @@ -477,18 +648,16 @@ END } } - my $bredir = $ENV{'form.dirPointer'}; my $toplevel; my $indent = 0; $uri = $uri.'/' if $uri !~ /.*\/$/; - if ($bredir ne 'on') { - $hash{'top.level'} = $uri; - $toplevel = $uri; - - } else { - $toplevel = $hash{'top.level'}; - } + if ($env{'form.dirPointer'} ne 'on') { + $hash{'top.level'} = $uri; + $toplevel = $uri; + } else { + $toplevel = $hash{'top.level'}; + } # -------------------------------- if not at top level, provide an uplink arrow if ($toplevel ne '/res/'){ @@ -496,29 +665,25 @@ END pop @uri_com; my $upone = join('/',@uri_com); my @list = qw (0); - &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list); + &display_line ($r,$defdom,'opened',$upone.'&viewOneUp',0,$upone,@list); $indent = 1; } # -------- recursively go through all the directories and output as appropriate - &scanDir ($r,$toplevel,$indent,\%hash); - -# ---------------------------- embed hidden information useful for group import - $r->print(""); - $r->print(""); + &scanDir ($r,$toplevel,$indent,\%hash,$defdom); # -------------------------------------------------------------- end the tables - $r->print('
NameTitle".&mt('Name')."".&mt('Title')."Size (bytes) ". - "Last accessed'.&mt("Size")." (".&mt("bytes").") ". + "".&mt("Last accessed")."Last modified".&mt("Last modified")."Author(s)".&mt("Author(s)")."Keywords".&mt("Keywords")."Language".&mt("Language")."ResourceUsage Statistics
(Courses/Network Hits)
".&mt("Usage Statistics")."
(". + &mt("Courses/Network Hits").") ".&mt('updated periodically')."
".&mt("Source Available")."".&mt("Linked/Related Resources")."".&mt("Resource")."".&mt("Subject")."".&mt("Notes")."".&mt("Abstract")."".&mt("Grade Level")."".&mt("Standards")."
'); - $r->print('
'); + $r->print(&Apache::loncommon::end_data_table()); + +# ---------------------------- embed hidden information useful for group import + $r->print("
"); + $r->print("
"); # --------------------------------------------------- end the output and return - $r->print(''."\n"); -# } else { -# $r->print('Unable to tie hash to db '. -# 'file'); -# return OK; + $r->print(&Apache::loncommon::end_page()."\n"); } if(! $c->aborted()) { +# write back into the temporary file my %dbfile; if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_NEWDB(),0640)) { while (my($key,$value) = each(%hash)) { @@ -533,20 +698,35 @@ END # ----------------------------------------------- recursive scan of a directory sub scanDir { - my ($r,$startdir,$indent,$hashref)=@_; + my ($r,$startdir,$indent,$hashref,$defdom)=@_; my $c = $r->connection(); my ($compuri,$curdir); my $dirptr=16384; + my $obs; $indent++; - my %dupdirs = %dirs; my @list=&get_list($r,$startdir); foreach my $line (@list) { return if ($c->aborted()); - my ($strip,$dom,undef,$testdir,undef)=split(/\&/,$line,5); - next if $strip =~ /.*\.meta$/; + #This is a kludge, sorry aboot this + my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16); + next if (($strip =~ /\.meta$/) || ($obs)); + if ($dom ne 'domain') { + my ($udom,$uname); + if ($dom eq 'user') { + ($udom) = ($startdir =~ m{^/res/($match_domain)}); + $uname = $strip; + } else { + ($udom,$uname) = ($startdir =~ m{^/res/($match_domain)/($match_courseid)}); + } + if ($udom ne '' && $uname ne '') { + # Don't display "course author" directory. + next if (&Apache::lonnet::is_course($udom.'_'.$uname)); + } + } my (@fileparts) = split(/\./,$strip); if ($hash{'display_attrs_9'} != 1) { + # if not all versions to be shown if (scalar(@fileparts) >= 3) { my $fext = pop @fileparts; my $ov = pop @fileparts; @@ -565,7 +745,7 @@ sub scanDir { $curdir = $startdir; } my $diropen = 'closed'; - if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/)) { + if (($dirptr&$testdir) or ($dom =~ /^(domain|user)$/) or ($compuri=~/\.(sequence|page)\/$/)) { while (my ($key,$val)= each %dupdirs) { if ($key eq $compuri and $val eq "open") { $diropen = "opened"; @@ -574,8 +754,8 @@ sub scanDir { } } } - &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list); - &scanDir ($r,$compuri,$indent) if $diropen eq 'opened'; + &display_line($r,$defdom,$diropen,$line,$indent,$curdir,$hashref,@list); + &scanDir ($r,$compuri,$indent,undef,$defdom) if $diropen eq 'opened'; } $indent--; } @@ -583,27 +763,77 @@ sub scanDir { # --------------- get complete matched list based on the uri (returns an array) sub get_list { my ($r,$uri)=@_; - my @list; + my @list=(); + my $listerror; + (my $luri = $uri) =~ s/\//_/g; - - if ($ENV{'form.attrs'} eq 'Update Display') { - foreach (keys %hash) { + if ($env{'form.updatedisplay'}) { + foreach (keys(%hash)) { delete $hash{$_} if ($_ =~ /^dirlist_files_/); - } + delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/); + } } - if ($hash{'dirlist_files'.$luri}) { + if (defined($hash{'dirlist_files_'.$luri}) && + $hash{'dirlist_timestamp_files_'.$luri}+600 > (time)) { @list = split(/\n/,$hash{'dirlist_files_'.$luri}); + } elsif ($uri=~/\.(page|sequence)\/$/) { +# is a page or a sequence + $uri=~s/\/$//; + $uri='/'.(split(/\.(page|sequence)\/\//,$uri))[-1]; + $uri=~s/\/+/\//g; + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$uri))) { + my @ratpart=split(/\:/,$_); + push(@list,&LONCAPA::map::qtescape($ratpart[1])); + } + $hash{'dirlist_files_'.$luri} = join("\n",@list); } else { - @list = &Apache::lonnet::dirlist($uri); - $hash{'dirlist_files_'.$luri} = join('\n',@list); +# is really a directory + (my $listref,$listerror) = &Apache::lonnet::dirlist($uri); + if (ref($listref) eq 'ARRAY') { + @list = @{$listref}; + } + $hash{'dirlist_files_'.$luri} = join("\n",@list); + $hash{'dirlist_timestamp_files_'.$luri} = time; } - return @list=&match_ext($r,@list); +#Checking for error messages associated with empty directories or inaccessible servers (See Bug 4984) + if (($listerror eq 'no_such_dir') || ($listerror eq 'no_such_host') || ($listerror eq 'no_host')) { + $r->print("

" . &mt("Directory does not exist."). "

"); + } elsif ($listerror eq 'con_lost') { + $r->print("

" . &mt("Directory temporarily not accessible."). "

"); + } + + return @list=&match_ext($r,@list); +} + +sub dynmetaread { + my $uri=shift; + if (($hash{'display_attrs_8'}==1) || ($hash{'display_attrs_11'}==1)) { +# We don't want the filename + $uri=~s/\/[^\/]+$//; +# Did we already see this? + my $builddir=$uri; + while ($builddir) { + if ($dynread{$builddir}) { + return 0; + } + $builddir=~s/\/[^\/]+$//; + } +# Actually get the data + %dynhash= + (%dynhash,&Apache::lonmeta::get_dynamic_metadata_from_sql($uri.'/')); +# Remember that we got it + $dynread{$uri}=1; + } } sub initdebug { + my $start_page= + &Apache::loncommon::start_page('Debug',undef, + {'only_body' => 1,}); + $start_page =~ s/\n/ /g; return < + ENDJS } sub writedebug { - my $text = shift; - return ""; + my ($text) = @_; + return ""; } # -------------------- filters out files based on extensions (returns an array) @@ -640,7 +870,7 @@ sub match_ext { next if ($unpackline[0] eq '..'); my @filecom = split (/\./,$unpackline[0]); my $fext = pop(@filecom); - my $fnptr = $unpackline[3]&$dirptr; + my $fnptr = ($unpackline[3]&$dirptr) || ($fext=~/\.(page|sequence)$/); if ($fnptr == 0 and $unpackline[3] ne "") { my $embstyle = &Apache::loncommon::fileembstyle($fext); push @trimlist,$line if (defined($embstyle) && @@ -649,325 +879,601 @@ sub match_ext { push @trimlist,$line; } } - @trimlist = sort (@trimlist); + @trimlist = sort {uc($a) cmp uc($b)} (@trimlist); return @trimlist; } # ------------------------------- displays one line in appropriate table format sub display_line { - my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; + my ($r,$defdom,$diropen,$line,$indent,$startdir,$hashref,@list)=@_; my (@pathfn, $fndir); +# there could be relative paths (files actually belonging into this directory) +# or absolute paths (for example, from sequences) + my $absolute; + my $pathprefix; + if ($line=~m|^/res/| && $startdir ne '') { + $absolute=1; + $pathprefix=''; + } else { + $absolute=0; + $pathprefix=$startdir; + } my $dirptr=16384; - my $fileclr="#ffffe6"; +#SB my $fileclr="#ffffe6"; my $iconpath= $r->dir_config('lonIconsURL') . '/'; my @filecom = split (/\&/,$line); my @pathcom = split (/\//,$filecom[0]); my $listname = $pathcom[scalar(@pathcom)-1]; my $fnptr = $filecom[3]&$dirptr; - my $msg = 'View '.$filecom[0].' resources'; - $msg = 'Close '.$filecom[0].' directory' if $diropen eq 'opened'; + my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources'); + $msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened'; + my $nowOpen = ($diropen eq 'opened' ? 1 : 0); my $tabtag=''; my $i=0; - - while ($i<=8) { + while ($i<=16) { $tabtag=join('',$tabtag," ") - if $hash{'display_attrs_'.$i} == 1; + if ($i != 9 && + $hash{'display_attrs_'.$i} == 1); $i++; } - my $valign = ($hash{'display_attrs_7'} == 1 ? 'top' : 'bottom'); # display uplink arrow if ($filecom[1] eq 'viewOneUp') { - $r->print("$extrafield"); + my $updir=$startdir; +# -------------- Filter out sequence containment in crumbs and "recent folders" + $updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1]; + $updir=~s/\/+/\//g; + +#SB $r->print("$extrafield"); + $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!? + $r->print($extrafield); $r->print("\n"); - $r->print ('
'."\n"); - $r->print (''."\n"); - $r->print (''."\n"); - $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print(&Apache::loncommon::inhibit_menu_check('input')); + $r->print (''."\n"); + $r->print (''."\n"); + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); - $r->print("Up $tabtag\n"); + $r->print(&mt("Up")."
$tabtag"); + $r->print(&Apache::loncommon::end_data_table_row()); return OK; } # Do we have permission to look at this? + if($filecom[15] ne '1') { return OK if ((!&Apache::lonnet::allowed('bre',$pathprefix.$filecom[0])) && (!&Apache::lonnet::allowed('bro',$pathprefix.$filecom[0]))); } - return OK if (!&Apache::lonnet::allowed('bre',$startdir.$filecom[0])); + if (($filecom[1] eq 'domain') && ($defdom ne $listname)) { + unless (&Apache::lonnet::will_trust('shared',$listname,$defdom)) { + return OK; + } + unless (&Apache::lonnet::will_trust('content',$defdom,$listname)) { + return OK; + } + } + +# make absolute links appear on different background +#SB if ($absolute) { $fileclr='#ccdd99'; } # display domain if ($filecom[1] eq 'domain') { - $r->print (''."\n") - if ($ENV{'form.dirPointer'} eq "on"); - $r->print("$extrafield"); + $r->print (''."\n") + if ($env{'form.dirPointer'} eq "on"); +#SB $r->print("$extrafield"); + $r->print(&Apache::loncommon::start_data_table_row()); # valign="$valign" ?!?" + $r->print($extrafield); $r->print(""); &begin_form ($r,$filecom[0]); my $anchor = $filecom[0]; - $anchor =~ s/\///g; - $r->print (''); - $r->print (''); - $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $anchor =~ s/\W//g; + $r->print (''); +$r->print (''); + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); - $r->print ('print (' border="0" />'."\n"); - $r->print ("Domain - $listname "); - if ($Apache::lonnet::domaindescription{$listname}) { - $r->print("(".$Apache::lonnet::domaindescription{$listname}. + my $quotable_filecom = &Apache::loncommon::escape_single($filecom[0]); + $r->print ('print (' class="LC_fileicon" />'."\n"); + $r->print (&mt("Domain")." - $listname "); + if (&Apache::lonnet::domain($listname,'description')) { + $r->print("
(".&Apache::lonnet::domain($listname,'description'). ")"); } - $r->print (" $tabtag\n"); + $r->print("$tabtag"); + $r->print(&Apache::loncommon::end_data_table_row()); return OK; # display user directory } + if ($filecom[1] eq 'user') { - $r->print("$extrafield"); - $r->print("\n"); + my $domain=(split(m|/|,$startdir))[2]; + if ($defdom ne $domain) { + unless (&Apache::lonnet::will_trust('shared',$domain,$defdom)) { + return OK; + } + unless (&Apache::lonnet::will_trust('content',$defdom,$domain)) { + return OK; + } + } + # $r->print("$extrafield"); my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; - $anchor =~ s/\///g; + $anchor =~ s/\W//g; +#SB $r->print("$extrafield"); + $r->print(&Apache::loncommon::start_data_table_row() + .$extrafield.''); &begin_form ($r,$curdir); - $r->print (''."\n"); - $r->print (''); - $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + $r->print (''."\n"); + $r->print (''); + $r->print (''); + $r->print ('print (' alt="'.$msg.'"/>'. "\n"); - $r->print (''); + my $quotable_curdir = &Apache::loncommon::escape_single($curdir); + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + + $r->print (''.$msg.''); my $domain=(split(m|/|,$startdir))[2]; my $plainname=&Apache::loncommon::plainname($listname,$domain); - $r->print ($listname); - if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); } - $r->print ($tabtag.''."\n"); - return OK; + $r->print ($listname.''); + + if (defined($plainname) && $plainname) { $r->print(" ($plainname) "); } +# Wishlistlink + $r->print(''. + ''.$tabtag); + $r->print(&Apache::loncommon::end_data_table_row()); + return OK; } # display file - if ($fnptr == 0 and $filecom[3] ne '') { - my $filelink = $startdir.$filecom[0]; - my @file_ext = split (/\./,$listname); - my $curfext = $file_ext[-1]; - if (@Omit) { - foreach (@Omit) { return OK if ($curfext eq $_); } - } - if (@Only) { - my $skip = 1; - foreach (@Only) { $skip = 0 if ($curfext eq $_); } - return OK if ($skip > 0); - } - # Set the icon for the file - my $iconname = "unknown.gif"; - my $embstyle = &Apache::loncommon::fileembstyle($curfext); - # The unless conditional that follows is a bit of overkill - $iconname = $curfext.".gif" unless - (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn'); - # - $r->print(""); - my $metafile = grep /^\Q$filecom[0]\E\.meta\&/, @list; - my $title; - if ($ENV{'form.catalogmode'} eq 'interactive') { - $title=$listname; - $title = &Apache::lonnet::metadata($filelink,'title') - if ($metafile == 1); - $title=$listname unless $title; - my $titleesc=HTML::Entities::encode($title); - $titleesc=~s/\'/\\'/; #' (clean up this spare quote) + if (($fnptr == 0 and $filecom[3] ne '') or $absolute) { + my $title; + my $filelink = $pathprefix.$filecom[0]; + if ($hash{'display_attrs_0'} == 1) { + $title = &Apache::lonnet::gettitle($filelink); + } + my @file_ext = split (/\./,$listname); + my $curfext = $file_ext[-1]; + if (@Omit) { + foreach (@Omit) { return OK if (lc($curfext) eq $_); } + } + if (@Only) { + my $skip = 1; + foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); } + return OK if ($skip > 0); + } + # Set the icon for the file + my $iconname = &Apache::loncommon::icon($listname); +#SB $r->print("); + $r->print(&Apache::loncommon::start_data_table_row()); #SB valign="$valign" ?!? + $r->print(''); + + if ($env{'form.catalogmode'} eq 'interactive') { + my $quotable_filelink = &Apache::loncommon::escape_single($filelink); $r->print(""); - $r->print("". + $quotable_filelink,"')\">"); + $r->print("\"\"". "\n"); - $r->print(""); - } - elsif ($ENV{'form.catalogmode'} eq 'groupimport') { - $title=$listname; - $title = &Apache::lonnet::metadata($filelink,'title') - if ($metafile == 1); - $title=$listname unless $title; - my $titleesc=&HTML::Entities::encode($title); - $r->print("
\n"); + $r->print(''); + } elsif ($env{'form.catalogmode'} eq 'import') { + $r->print("\n"); $r->print("print("checked"); } - $r->print(">\n"); - $r->print("\n"); - $r->print("
\n"); - $r->print(""); + $r->print(" />\n"); + $r->print(''); $hash{"pre_${fnum}_link"}=$filelink; - $hash{"pre_${fnum}_title"}=$titleesc; + $hash{"pre_${fnum}_title"}=$title; + if (!$hash{"pre_${fnum}_title"}) { + $hash{"pre_${fnum}_title"} = 'Not_retrieved'; + } $fnum++; } - - if ($indent > 0 and $indent < 11) { - $r->print("\n"); - } elsif ($indent >0) { - my $ten = int($indent/10.); - my $rem = $indent%10.0; +# Form to open or close sequences + if ($filelink=~/\.(page|sequence)$/) { + my $curdir = $startdir.$filecom[0].'/'; + &begin_form($r,$curdir); + $indent--; + } +# General indentation my $count = 0; - while ($count < $ten) { - $r->print("\n"); - $count++; + while ($count < $indent) { + $r->print(''); + $count++; } - $r->print("\n") if $rem > 0; +# Sequence open/close icon + if ($filelink=~/\.(page|sequence)$/) { + my $curdir = $startdir.$filecom[0].'/'; + my $anchor = $curdir; + $anchor =~ s/\W//g; + $r->print (''); + $r->print (''); + $r->print (''); + $r->print ('print (' alt="'.$msg.'" />'. + "\n"); + } +# Filetype icons + $r->print("\"\"\n"); + my $quotable_filelink = &Apache::loncommon::escape_single($filelink); + my $quotable_startdir = Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + + $r->print (" $listname "); + $quotable_filelink = &Apache::loncommon::escape_single($filelink.'.meta'); + &Apache::loncommon::inhibit_menu_check(\$quotable_filelink); + $r->print (" (".&mt('metadata').") "); +# Close form to open/close sequence + if ($filelink=~/\.(page|sequence)$/) { + $r->print(''); } - - $r->print("\n"); - $r->print (" $listname "); - - $r->print (" (metadata) ") if ($metafile == 1); - $r->print("\n"); +# Wishlistlink + $r->print(''. + ''); if ($hash{'display_attrs_0'} == 1) { - my $title = &Apache::lonnet::gettitle($filelink,'title') - if ($metafile == 1); $r->print(' '.($title eq '' ? ' ' : $title). ' '."\n"); } - $r->print(' ', + $r->print(' ', $filecom[8]," \n") if $hash{'display_attrs_1'} == 1; - $r->print(' '. - (localtime($filecom[9]))." \n") + $r->print(' '. + (&Apache::lonlocal::locallocaltime($filecom[9]))." \n") if $hash{'display_attrs_2'} == 1; - $r->print(' '. - (localtime($filecom[10]))." \n") + $r->print(' '. + (&Apache::lonlocal::locallocaltime($filecom[10]))." \n") if $hash{'display_attrs_3'} == 1; if ($hash{'display_attrs_4'} == 1) { - my $author = &Apache::lonnet::metadata($filelink,'author') - if ($metafile == 1); - $r->print(' '.($author eq '' ? ' ' : $author). + my $author = &Apache::lonnet::metadata($filelink,'author'); + $r->print(' '.($author eq '' ? ' ' : $author). " \n"); } if ($hash{'display_attrs_5'} == 1) { - my $keywords = &Apache::lonnet::metadata($filelink,'keywords') - if ($metafile == 1); + my $keywords = &Apache::lonnet::metadata($filelink,'keywords'); # $keywords = ' ' if (!$keywords); $r->print(' '.($keywords eq '' ? ' ' : $keywords). " \n"); } + if ($hash{'display_attrs_6'} == 1) { - my $lang = &Apache::lonnet::metadata($filelink,'language') - if ($metafile == 1); + my $lang = &Apache::lonnet::metadata($filelink,'language'); $lang = &Apache::loncommon::languagedescription($lang); $r->print(' '.($lang eq '' ? ' ' : $lang). " \n"); } - if ($hash{'display_attrs_7'} == 1) { - my $output=''; - my $embstyle=&Apache::loncommon::fileembstyle($curfext); - if ($embstyle eq 'ssi') { - $output=&Apache::lonnet::ssi_body($filelink); - $output=''.$output.''; - } elsif ($embstyle eq 'img') { - $output=''; - } elsif ($filelink=~/^\/res\/(\w+)\/(\w+)\//) { - $output=''; - } - $r->print(' '.($output eq '' ? ' ':$output). - " \n"); - } if ($hash{'display_attrs_8'} == 1) { - my (%stat) = &Apache::lonmeta::dynamicmeta($filelink) if ($metafile == 1); - my $stat = (exists($stat{'course'}) ? $stat{'course'} : ''). - ((exists($stat{'course'}) || exists($stat{'count'})) ? '/' : ''). - (exists($stat{'count'}) ? $stat{'count'} : ''); - $r->print(' '.($stat eq '' ? ' ' : $stat). - ' '."\n"); - } +# statistics + &dynmetaread($filelink); + $r->print(""); + + for (qw(count course stdno avetries difficulty disc clear technical + correct helpful depth)) { + + dynmetaprint($r,$filelink,$_); + } - $r->print("\n"); + $r->print(" \n"); + + } + if ($hash{'display_attrs_10'} == 1) { + my $source = &Apache::lonnet::metadata($filelink,'sourceavail'); + if($source eq 'open') { + my $sourcelink = &Apache::lonsource::make_link($filelink,$listname); + my $quotable_sourcelink = &Apache::loncommon::escape_single($sourcelink); + &Apache::loncommon::inhibit_menu_check(\$quotable_sourcelink); + $r->print(''."".&mt('Source Code')." "."\n"); + } else { #A cuddled else. :P + $r->print(" \n"); + } + } + if ($hash{'display_attrs_11'} == 1) { +# links + &dynmetaread($filelink); + $r->print(''); + &coursecontext($r,$filelink); + for (qw(goto_list comefrom_list sequsage_list dependencies course_list)) { + dynmetaprint($r,$filelink,$_); + } + $r->print(''); + } + + + + if ($hash{'display_attrs_7'} == 1) { +# Show resource + my $output=&showpreview($filelink); + $r->print(''.($output eq '' ? ' ':$output). + " \n"); } + + if ($hash{'display_attrs_12'} == 1) { + my $subject = &Apache::lonnet::metadata($filelink,'subject'); + $r->print(' '.($subject eq '' ? ' ' : $subject). + " \n"); + } + + if ($hash{'display_attrs_13'} == 1) { + my $notes = &Apache::lonnet::metadata($filelink,'notes'); + $r->print(' '.($notes eq '' ? ' ' : $notes). + " \n"); + } + + if ($hash{'display_attrs_14'} == 1) { + my $abstract = &Apache::lonnet::metadata($filelink,'abstract'); + $r->print(' '.($abstract eq '' ? ' ' : $abstract). + " \n"); + } + + if ($hash{'display_attrs_15'} == 1) { + my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel'); + $r->print(' '.($gradelevel eq '' ? ' ' : $gradelevel). + " \n"); + } + + if ($hash{'display_attrs_16'} == 1) { + my $standards = &Apache::lonnet::metadata($filelink,'standards'); + $r->print(' '.($standards eq '' ? ' ' : $standards). + " \n"); + } + + $r->print(&Apache::loncommon::end_data_table_row()); +} + + # -- display directory if ($fnptr == $dirptr) { - my @file_ext = split (/\./,$listname); - my $curfext = $file_ext[scalar(@file_ext)-1]; my $curdir = $startdir.$filecom[0].'/'; my $anchor = $curdir; - $anchor =~ s/\///g; - $r->print("$extrafield"); + $anchor =~ s/\W//g; +#SB $r->print("$extrafield"); + $r->print(&Apache::loncommon::start_data_table_row()); # SB: bgcolor suggestion: darkgrey ("LC_info_row"?!?) +# $r->print(''); + $r->print($extrafield.''); &begin_form ($r,$curdir); my $indentm1 = $indent-1; - if ($indentm1 < 11 and $indentm1 > 0) { - $r->print("\n"); - } else { - my $ten = int($indentm1/10.); - my $rem = $indentm1%10.0; - my $count = 0; - while ($count < $ten) { - $r->print ("\n"); - $count++; - } - $r->print ("\n") if $rem > 0; - } - $r->print (''); - $r->print ('print (' name="'.$msg.'" height="22" type="image" border="0">'. + my $count = 0; + while ($count < $indentm1) { + $r->print (''); + $count++; + } + $r->print (''); + $r->print (''); + $r->print ('print (' alt="'.$msg.'" class="LC_fileicon" />'. "\n"); - $r->print (''. - "\n"); - $r->print ("$listname$tabtag\n"); + my $quotable_curdir = &Apache::loncommon::escape_single($curdir); + my $quotable_startdir = &Apache::loncommon::escape_single($startdir); + my $quotable_listname = &Apache::loncommon::escape_single($listname); + + my $location = &Apache::loncommon::lonhttpdurl("/adm/lonIcons"); + my $icon = "navmap.folder.".($nowOpen ? "open":"closed").'.gif'; + $r->print ('' + .''.&mt('Open Folder').'' + ."\n"); + $r->print ("$listname"); +# Wishlistlink + $r->print(''. + ''); +# Attributes + my $filelink = $startdir.$filecom[0].'/default'; + + if ($hash{'display_attrs_0'} == 1) { + my $title = &Apache::lonnet::gettitle($filelink); + $r->print(' '.($title eq '' ? ' ' : $title). + ' '."\n"); + } + $r->print(' ', + $filecom[8]," \n") + if $hash{'display_attrs_1'} == 1; + $r->print(' '. + (&Apache::lonlocal::locallocaltime($filecom[9]))." \n") + if $hash{'display_attrs_2'} == 1; + $r->print(' '. + (&Apache::lonlocal::locallocaltime($filecom[10]))." \n") + if $hash{'display_attrs_3'} == 1; + + if ($hash{'display_attrs_4'} == 1) { + my $author = &Apache::lonnet::metadata($filelink,'author'); + $r->print(' '.($author eq '' ? ' ' : $author). + " \n"); + } + if ($hash{'display_attrs_5'} == 1) { + my $keywords = &Apache::lonnet::metadata($filelink,'keywords'); + # $keywords = ' ' if (!$keywords); + $r->print(' '.($keywords eq '' ? ' ' : $keywords). + " \n"); + } + if ($hash{'display_attrs_6'} == 1) { + my $lang = &Apache::lonnet::metadata($filelink,'language'); + $lang = &Apache::loncommon::languagedescription($lang); + $r->print(' '.($lang eq '' ? ' ' : $lang). + " \n"); + } + + if ($hash{'display_attrs_8'} == 1) { + $r->print(' '); + } + if ($hash{'display_attrs_10'} == 1) { + $r->print(' '); + } + if ($hash{'display_attrs_7'} == 1) { + $r->print(' '); + } + if ($hash{'display_attrs_11'} == 1) { + $r->print(' '); + } + if ($hash{'display_attrs_12'} == 1) { + my $subject = &Apache::lonnet::metadata($filelink,'subject'); + $r->print(' '.($subject eq '' ? ' ' : $subject). + " \n"); + } + if ($hash{'display_attrs_13'} == 1) { + my $notes = &Apache::lonnet::metadata($filelink,'notes'); + $r->print(' '.($notes eq '' ? ' ' : $notes). + " \n"); + } + + if ($hash{'display_attrs_14'} == 1) { + my $abstract = &Apache::lonnet::metadata($filelink,'abstract'); + $r->print(' '.($abstract eq '' ? ' ' : $abstract). + " \n"); + } + + if ($hash{'display_attrs_15'} == 1) { + my $gradelevel = &Apache::lonnet::metadata($filelink,'gradelevel'); + $r->print(' '.($gradelevel eq '' ? ' ' : $gradelevel). + " \n"); + } + + if ($hash{'display_attrs_16'} == 1) { + my $standards = &Apache::lonnet::metadata($filelink,'standards'); + $r->print(' '.($standards eq '' ? ' ' : $standards). + " \n"); + } + + + $r->print(&Apache::loncommon::end_data_table_row()); + } + +} + +sub coursecontext { + my ($r,$filelink)=@_; + my $filesymb=&Apache::lonnet::symbread($filelink); + if ($filesymb) { + my ($map,$index,$resource)=&Apache::lonnet::decode_symb($filesymb); + $r->print( + &mt('Already in this course:').'
' + .&mt('[_1] in folder/map [_2]', + &Apache::lonnet::gettitle($resource), + &Apache::lonnet::gettitle($map)) + .'
'); } +} +sub showpreview { + my ($filelink)=@_; + if ($filelink=~m-^(/ext/|https?://)-) { + return &mt('External Resource, preview not enabled'); + } + my ($curfext)=($filelink=~/\.(\w+)$/); + my $output=''; + my $embstyle=&Apache::loncommon::fileembstyle($curfext); + if ($embstyle eq 'ssi') { + my $cache=$Apache::lonnet::perlvar{'lonDocRoot'}.$filelink. + '.tmp'; + if ((!$env{'form.updatedisplay'}) && + (-e $cache)) { + open(FH,$cache); + $output=join("\n",); + close(FH); + } else { +# In update display mode, remove old cache. This is done to retroactively +# clean up course context renderings. + if (-e $cache) { + unlink($cache); + } + $output=&Apache::lonnet::ssi_body($filelink); +# Is access denied? Don't render, don't store + if ($output=~/LONCAPAACCESSCONTROLERRORSCREEN/s) { + $output=''; +# Was this rendered in course content? Don't store + } elsif (!&Apache::lonnet::symbread($filelink)) { + open(FH,">$cache"); + print FH $output; + close(FH); + } + } + } elsif ($embstyle eq 'img') { + $output=''.&mt('Preview').''; + } elsif ($filelink=~m{^/res/($match_domain)/($match_username)/}) { + $output=''.&mt('Preview').''; + } + return $output; +} + +sub dynmetaprint { + my ($r,$filelink,$item)=@_; + if ($dynhash{$filelink}->{$item}) { + $r->print("\n
".$fieldnames{$item}.': '. + &Apache::lonmeta::prettyprint($item, + $dynhash{$filelink}->{$item}, + (($env{'form.catalogmode'} ne 'import')?'preview':''), + '', + (($env{'form.catalogmode'} eq 'import')?'document.forms.fileattr':''),1)); + } } # ------------------- prints the beginning of a form for directory or file link sub begin_form { my ($r,$uri) = @_; my $anchor = $uri; - $anchor =~ s/\///g; + $anchor =~ s/\W//g; + $uri=&Apache::loncommon::escape_single($uri); $r->print ('
'."\n"); - $r->print (''. + $r->print (''. "\n"); - $r->print (''."\n"); + $r->print (''."\n"); + $r->print(&Apache::loncommon::inhibit_menu_check('input')); $dnum++; } # --------- settings whenever the user causes the indexer window to be launched sub start_fresh_session { - delete $hash{'form.catalogmode'}; - delete $hash{'form.mode'}; - delete $hash{'form.form'}; - delete $hash{'form.element'}; - delete $hash{'form.omit'}; - delete $hash{'form.only'}; - foreach (keys %hash) { - delete $hash{$_} if (/^(pre_|store)/); + my ($hash) = @_; + delete $hash->{'form.catalogmode'}; + delete $hash->{'form.mode'}; + delete $hash->{'form.form'}; + delete $hash->{'form.element'}; + delete $hash->{'form.omit'}; + delete $hash->{'form.only'}; + foreach (keys(%{$hash})) { + delete $hash->{$_} if (/^(pre_|store)/); } } @@ -990,8 +1496,13 @@ sub cleanup { if (tied(%hash)){ &Apache::lonnet::logthis('Cleanup indexer: hash'); } + return OK; } + + + + =head1 NAME Apache::lonindexer - mod_perl module for cross server filesystem browsing @@ -1012,18 +1523,6 @@ This module enables a scheme of browsing This is part of the LearningOnline Network with CAPA project described at http://www.lon-capa.org. -=head1 BEGIN SUBROUTINE - -This routine is only run once after compilation. - -=over 4 - -=item * - -Initializes %language hash table. - -=back - =head1 HANDLER SUBROUTINE This routine is called by Apache and mod_perl. 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.