--- loncom/interface/londocs.pm 2004/12/14 21:10:58 1.156 +++ loncom/interface/londocs.pm 2004/12/15 15:21:43 1.157 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.156 2004/12/14 21:10:58 albertel Exp $ +# $Id: londocs.pm,v 1.157 2004/12/15 15:21:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -283,7 +283,6 @@ sub exportcourse { $outcome = '
As you did not select any content items or discussions for export, an IMS package has not been created. Please go back to select either content items or discussions for export'; } else { my $now = time; - my $count = 0; my %symbs; my $manifestok = 0; my $imsresources; @@ -291,7 +290,7 @@ sub exportcourse { my $copyresult; my $ims_manifest = &create_ims_store($now,\$manifestok,\$outcome,\$tempexport); if ($manifestok) { - &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,\$tempexport,\$copyresult,$ims_manifest); + &build_package($now,$navmap,\@exportitems,\@discussions,\$outcome,$tempexport,\$copyresult,$ims_manifest); close($ims_manifest); #Create zip file in prtspool @@ -504,8 +503,8 @@ sub build_package { my $lastcontainer = 0; my %parent = (); my @dependencies = (); - my $cnum = $ENV{'request.'.$ENV{'request.course.id'}.'.num'}; - my $cdom = $ENV{'request.'.$ENV{'request.course.id'}.'.domain'}; + my $cnum = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; + my $cdom = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; while ($curRes = $it->next()) { if (ref($curRes)) { $count ++; @@ -534,57 +533,64 @@ sub build_package { $count = 0; my $imsresources; my $pkgdepth; - if ($curRes == $it->BEGIN_MAP()) { - $prevdepth = $depth; - $depth++; - } - if ($curRes == $it->END_MAP()) { - $prevdepth = $depth; - $depth--; - } - - if (ref($curRes)) { - if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) { - my $symb = $curRes->symb(); - my $isvisible = 'true'; - my $resourceref; - if ($curRes->randomout()) { - $isvisible = 'false'; - } - unless ($curRes->is_sequence()) { - $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"'; - } - if (($depth <= $prevdepth) && ($count > 1)) { - print $ims_manifest ' '."\n"; - } + my $included = 0; + while ($curRes = $it->next()) { + if ($curRes == $it->BEGIN_MAP()) { $prevdepth = $depth; + $depth++; + } + if ($curRes == $it->END_MAP()) { + $prevdepth = $depth; + $depth--; + } + + if (ref($curRes)) { + $count ++; + if ((grep/^$count$/,@$exportitems) || (grep/^$count$/,@dependencies)) { + my $symb = $curRes->symb(); + my $isvisible = 'true'; + my $resourceref; + if ($curRes->randomout()) { + $isvisible = 'false'; + } + unless ($curRes->is_sequence()) { + $resourceref = 'identifierref="RES-'.$ENV{'request.course.id'}.'-'.$count.'"'; + } + if (($depth <= $prevdepth) && ($count > 1) && ($included)) { + print $ims_manifest "\n".' '."\n"; + } + $included = 1; + $prevdepth = $depth; - my $itementry = + my $itementry = ''. ''.$curRes->title().''; - print $ims_manifest "\n".$itementry; + print $ims_manifest "\n".$itementry; - unless ($curRes->is_sequence()) { - my $content_file; - my @hrefs = (); - &process_content($count,$curRes,$cdom,$cnum,$symb,$content_file,\@hrefs,$copyresult,$tempexport); - if ($content_file) { - $imsresources .= "\n". + unless ($curRes->is_sequence()) { + my $content_file; + my @hrefs = (); + &process_content($count,$curRes,$cdom,$cnum,$symb,\$content_file,\@hrefs,$copyresult,$tempexport); + if ($content_file) { + $imsresources .= "\n". ' '."\n". ' '."\n"; - foreach (@hrefs) { - $imsresources .= + foreach (@hrefs) { + $imsresources .= ' '."\n"; + } + $imsresources .= ' '."\n"; } - $imsresources .= ' '."\n"; } + $pkgdepth = $depth; + } else { + $included = 0; } - $pkgdepth = $depth; } } - while ($pkgdepth > -1) { + while ($pkgdepth > 0) { print $ims_manifest " \n"; $pkgdepth --; } @@ -602,7 +608,7 @@ sub build_package { sub get_dependencies { my ($exportitems,$parent,$depth,$dependencies) = @_; if ($depth > 1) { - unless (grep/^$$parent{$depth}$/,@$exportitems || grep/^$$parent{$depth}$/,@$dependencies) { + if ((!grep/^$$parent{$depth}$/,@$exportitems) && (!grep/^$$parent{$depth}$/,@$dependencies)) { push @$dependencies, $$parent{$depth}; if ($depth > 2) { &get_dependencies($exportitems,$parent,$depth-1,$dependencies); @@ -616,29 +622,33 @@ sub process_content { my $content_type; my $message; # find where user is author or co-author - my %roleshash = &Appache::lonnet::get_my_roles(); - if ($curRes->is_page()) { - $content_type = 'page'; + my %roleshash = &Apache::lonnet::get_my_roles(); + if ($curRes->is_sequence()) { + $content_type = 'sequence'; + } elsif ($curRes->is_page()) { + $content_type = 'page'; # need to handle individual items in pages. } elsif ($symb =~ m-public/$cdom/$cnum/syllabus$-) { $content_type = 'syllabus'; - } elsif ($symb =~ m-\.sequence____\d+____ext-) { + } elsif ($symb =~ m-\.sequence___\d+___ext-) { $content_type = 'external'; } elsif ($symb =~ m-adm/navmaps$-) { $content_type = 'navmap'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/smppg$-) { $content_type = 'simplepage'; - } elsif ($symb =~ m-$-) { + } elsif ($symb =~ m-/lib/templates/simpleproblem\.problem$-) { $content_type = 'simpleproblem'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/bulletinboard$-) { $content_type = 'bulletinboard'; } elsif ($symb =~ m-adm/$cdom/$cnum/\d+/aboutme$-) { $content_type = 'aboutme'; } elsif ($symb =~ m-uploaded/$cdom/$cnum-) { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'uploaded'); - } elsif ($symb =~ m-\.sequence____\d+____([^/])/([^/])-) { - my $coauth = $2.':'.$1.':ca'; + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); + } elsif ($symb =~ m-\.(sequence|page)___\d+___uploaded/$cdom/$cnum/-) { + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'uploaded'); + } elsif ($symb =~ m-\.(sequence|page)___\d+___([^/])/([^/])-) { + my $coauth = $3.':'.$2.':ca'; my $canedit = 0; - if ($1 eq $ENV{'user.domain'} && $2 eq $ENV{'user.name'}) { + if ($2 eq $ENV{'user.domain'} && $3 eq $ENV{'user.name'}) { $canedit= 1; } elsif (defined($roleshash{$coauth})) { if ($roleshash{$coauth} =~ /(\d+):(\d+)/) { @@ -650,45 +660,53 @@ sub process_content { } } if ($canedit) { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'resource'); + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'resource'); } else { - &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,'noedit'); + $$content_file = &replicate_content($cdom,$cnum,$tempexport,$symb,$count,\$message,$href,'noedit'); } } - $$copyresult .= $message."\n"; + if ($message) { + $$copyresult .= $message."\n"; + } } sub replicate_content { - my ($cdom,$cnum,$tempexport,$symb,$count,$message,$caller) = @_; + my ($cdom,$cnum,$tempexport,$symb,$count,$message,$href,$caller) = @_; my ($map,$ind,$url)=&Apache::lonnet::decode_symb($symb); my $feedurl = &Apache::lonnet::clutter($url); my $content; my $filename; my $repstatus; - if ($url =~ m-[^/]/(.+)$-) { + my $content_name; + if ($url =~ m-/([^/]+)$-) { $filename = $1; if (!-e $tempexport.'/resources') { mkdir($tempexport.'/resources',0700); } - if (!-e $tempexport.'/resources') { + if (!-e $tempexport.'/resources/'.$count) { mkdir($tempexport.'/resources/'.$count,0700); } - my $destination = $$tempexport.'/resources/'.$count.'/'.$filename; + my $destination = $tempexport.'/resources/'.$count.'/'.$filename; my $copiedfile; if ($copiedfile = Apache::File->new('>'.$destination)) { my $content; - if ($caller eq 'uploaded' || $caller eq 'resource') { + if ($caller eq 'resource') { $content = &Apache::lonnet::getfile($url); if ($content eq -1) { $$message = 'Could not copy file '.$filename; } else { + &extract_media($content,$count,$tempexport,$href,'resource'); $repstatus = 'ok'; } - } elsif ($caller eq 'noedit') { + } elsif ($caller eq 'noedit' || $caller eq 'uploaded') { my $rtncode; - $repstatus = &getuploaded('GET',$url,$cdom,$cnum,$content,$rtncode); - unless ($repstatus eq 'ok') { + $repstatus = &Apache::lonnet::getuploaded('GET',$url,$cdom,$cnum,\$content,$rtncode); + if ($repstatus eq 'ok') { + if ($url =~ /\.html?$/i) { + &extract_media(\$content,$count,$tempexport,$href,'uploaded'); + } + } else { $$message = 'Could not render '.$url.' server message - '.$rtncode; } } @@ -700,9 +718,21 @@ sub replicate_content { $$message = 'Could not open destination file for '.$filename."\n"; } } else { - $$message = 'Could not determine name of file for '; + $$message = 'Could not determine name of file for '.$url."\n"; } - return $repstatus; + if ($repstatus eq 'ok') { + $content_name = $count.'/'.$filename; + } + return $content_name; +} + +sub extract_media { + my ($content,$count,$tempexport,$href,$caller) = @_; +# @$href will contain path to any embedded resources in the content. +# For LON-CAPA problems this would be images. applets etc. +# For uploaded HTML files this would be images etc. +# paths will be in the form $count/res/$file, and urls in the $content will be rewritten with the new paths. + return; } # Imports the given (name, url) resources into the course