version 1.491, 2012/07/13 13:36:24
|
version 1.492, 2012/07/22 04:01:24
|
Line 69 sub mapread {
|
Line 69 sub mapread {
|
} |
} |
|
|
sub storemap { |
sub storemap { |
my ($coursenum,$coursedom,$map)=@_; |
my ($coursenum,$coursedom,$map,$contentchg)=@_; |
|
my $report; |
|
if (($contentchg) && ($map =~ /^default/)) { |
|
$report = 1; |
|
} |
my ($outtext,$errtext)= |
my ($outtext,$errtext)= |
&LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. |
&LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. |
$map,1); |
$map,1,$report); |
if ($errtext) { return ($errtext,2); } |
if ($errtext) { return ($errtext,2); } |
|
|
$hadchanges=1; |
$hadchanges=1; |
Line 305 sub group_import {
|
Line 309 sub group_import {
|
join(':', ($name, $url, $ext, 'normal', 'res')); |
join(':', ($name, $url, $ext, 'normal', 'res')); |
} |
} |
} |
} |
return &storemap($coursenum, $coursedom, $folder.'.'.$container); |
return &storemap($coursenum, $coursedom, $folder.'.'.$container,1); |
} |
} |
|
|
sub breadcrumbs { |
sub breadcrumbs { |
Line 612 sub docs_change_log {
|
Line 616 sub docs_change_log {
|
} |
} |
|
|
sub update_paste_buffer { |
sub update_paste_buffer { |
my ($coursenum,$coursedom) = @_; |
my ($coursenum,$coursedom,$folder) = @_; |
|
|
return if (!defined($env{'form.markcopy'})); |
return if (!defined($env{'form.markcopy'})); |
return if (!defined($env{'form.copyfolder'})); |
return if (!defined($env{'form.copyfolder'})); |
Line 633 sub update_paste_buffer {
|
Line 637 sub update_paste_buffer {
|
} |
} |
$url=~s{http(:|:)//https(:|:)//}{https$2//}; |
$url=~s{http(:|:)//https(:|:)//}{https$2//}; |
|
|
&Apache::lonnet::appenv({'docs.markedcopy_title' => $title, |
(my $cmd,undef)=split('_',$env{'form.cmd'}); |
'docs.markedcopy_url' => $url}); |
|
|
my %addtoenv = ( |
|
'docs.markedcopy_title' => $title, |
|
'docs.markedcopy_url' => $url, |
|
'docs.markedcopy_cmd' => $cmd, |
|
); |
|
&Apache::lonnet::delenv('docs.markedcopy_nested'); |
|
&Apache::lonnet::delenv('docs.markedcopy_nestednames'); |
|
if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(default|supplemental)_?(\d*)\.(page|sequence)$}) { |
|
my $prefix = $1; |
|
my $subdir =$2; |
|
if ($subdir eq '') { |
|
$subdir = $prefix; |
|
} |
|
my (%addedmaps,%removefrommap,%removeparam,%hierarchy,%titles,%allmaps); |
|
&contained_map_check($url,$folder,\%removefrommap,\%removeparam,\%addedmaps, |
|
\%hierarchy,\%titles,\%allmaps); |
|
if (ref($hierarchy{$url}) eq 'HASH') { |
|
my ($nested,$nestednames); |
|
&recurse_uploaded_maps($url,$subdir,\%hierarchy,\%titles,\$nested,\$nestednames); |
|
$nested =~ s/\&$//; |
|
$nestednames =~ s/\Q___&&&___\E$//; |
|
if ($nested ne '') { |
|
$addtoenv{'docs.markedcopy_nested'} = $nested; |
|
} |
|
if ($nestednames ne '') { |
|
$addtoenv{'docs.markedcopy_nestednames'} = $nestednames; |
|
} |
|
} |
|
} |
|
&Apache::lonnet::appenv(\%addtoenv); |
delete($env{'form.markcopy'}); |
delete($env{'form.markcopy'}); |
} |
} |
|
|
|
sub recurse_uploaded_maps { |
|
my ($url,$dir,$hierarchy,$titlesref,$nestref,$namesref) = @_; |
|
if (ref($hierarchy->{$url}) eq 'HASH') { |
|
my @maps = map { $hierarchy->{$url}{$_}; } sort { $a <=> $b } (keys(%{$hierarchy->{$url}})); |
|
my @titles = map { $titlesref->{$url}{$_}; } sort { $a <=> $b } (keys(%{$titlesref->{$url}})); |
|
my (@uploaded,@names,%shorter); |
|
for (my $i=0; $i<@maps; $i++) { |
|
my ($inner) = ($maps[$i] =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_(\d+)\.(?:page|sequence)$}); |
|
if ($inner ne '') { |
|
push(@uploaded,$inner); |
|
push(@names,&escape($titles[$i])); |
|
$shorter{$maps[$i]} = $inner; |
|
} |
|
} |
|
$$nestref .= "$dir:".join(',',@uploaded).'&'; |
|
$$namesref .= "$dir:".(join(',',@names)).'___&&&___'; |
|
foreach my $map (@maps) { |
|
if ($shorter{$map} ne '') { |
|
&recurse_uploaded_maps($map,$shorter{$map},$hierarchy,$titlesref,$nestref,$namesref); |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
sub print_paste_buffer { |
sub print_paste_buffer { |
my ($r,$container,$folder) = @_; |
my ($r,$container,$folder,$coursedom,$coursenum) = @_; |
return if (!defined($env{'docs.markedcopy_url'})); |
return if (!defined($env{'docs.markedcopy_url'})); |
|
|
my $is_external; |
my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent); |
my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; |
my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1]; |
if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
$is_external = 1; |
$is_external = 1; |
} |
} |
|
|
my $canpaste; |
my ($canpaste,$nopaste,$othercrs,$areachange,$is_uploaded_map); |
if ($folder =~ /^supplemental/) { |
if ($folder =~ /^supplemental/) { |
$canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); |
$canpaste = &supp_pasteable($env{'docs.markedcopy_url'}); |
|
unless ($canpaste) { |
|
$nopaste = &mt('Paste into Supplemental Content unavailable for this type of content.'); |
|
} |
} else { |
} else { |
$canpaste = 1; |
$canpaste = 1; |
} |
} |
|
|
my $pasteinfo; |
|
if ($canpaste) { |
if ($canpaste) { |
$pasteinfo = '<form name="pasteform" action="/adm/coursedocs" method="post">' |
if ($env{'docs.markedcopy_url'} =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { |
.'<input type="submit" name="pastemarked" value="'.&mt('Paste').'" /> '; |
my $srcdom = $1; |
} else { |
my $srcnum = $2; |
$pasteinfo = &mt('Paste buffer contains:').' '; |
my $rem = $3; |
|
if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { |
|
$othercourse = 1; |
|
if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
|
if ($canpaste) { |
|
$othercrs = '<br />'.&mt('(from another course).'); |
|
} |
|
} else { |
|
$canpaste = 0; |
|
$nopaste = &mt('Paste from another course unavailable.') |
|
} |
|
} |
|
if ($rem =~ m{^(default|supplemental)_?(\d*)\.(?:page|sequence)$}) { |
|
my $prefix = $1; |
|
$parent = $2; |
|
if ($folder !~ /^\Q$prefix\E/) { |
|
$areachange = 1; |
|
} |
|
$is_uploaded_map = 1; |
|
} |
|
} |
} |
} |
|
|
$r->print('<fieldset>' |
$r->print('<fieldset>' |
.'<legend>'.&mt('Clipboard').'</legend>' |
.'<legend>'.&mt('Clipboard').'</legend>'); |
.$pasteinfo |
my ($type,$buffer); |
); |
|
|
|
my $type; |
|
if ($is_external) { |
if ($is_external) { |
$type = &mt('External Resource'); |
$type = &mt('External Resource'); |
$r->print($type.': '. |
$buffer = $type.': '. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('. |
&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'); |
&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')'; |
} else { |
} else { |
my $icon = &Apache::loncommon::icon($extension); |
my $icon = &Apache::loncommon::icon($extension); |
if ($extension eq 'sequence' && |
if ($extension eq 'sequence' && |
$env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) { |
$env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) { |
$icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL')); |
$icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL')); |
$icon .= '/navmap.folder.closed.gif'; |
$icon .= '/navmap.folder.closed.gif'; |
} |
} |
$icon = '<img src="'.$icon.'" alt="" class="LC_icon" />'; |
$icon = '<img src="'.$icon.'" alt="" class="LC_icon" />'; |
$r->print($icon.$type.': '. &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}))); |
$buffer = $icon.$type.': '. &Apache::loncommon::parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})); |
} |
} |
if ($canpaste) { |
if ($canpaste) { |
|
$r->print('<form name="pasteform" action="/adm/coursedocs" method="post">'.$buffer); |
|
if (($is_uploaded_map) && (!$areachange)) { |
|
if ((!$othercourse) && ($env{'docs.markedcopy_cmd'} eq 'cut')) { |
|
$r->print((' 'x 4).'<span id="pasteoptionstext">'. |
|
'<a href="javascript:showPasteOptions();" class="LC_menubuttons_link">'. |
|
&mt('Show Paste Options').'</a></span><br />'. |
|
'<div id="pasteoptions" class="LC_dccid">'.(' 'x 4). |
|
'<label>'. |
|
'<input type="radio" name="docs.markedcopy_options" value="new" checked="checked" />'. |
|
&mt('Copy to new folder').'</label>'.(' ' x2). |
|
'<label>'. |
|
'<input type="radio" name="docs.markedcopy_options" value="move" />'. |
|
&mt('Move old folder').'</label><br />'); |
|
if ($env{'docs.markedcopy_nested'}) { |
|
$r->print('<br />'.&mt('Folder to paste contains sub-folders'). |
|
'<br /><table border="0">'); |
|
my @pastemaps = split(/\&/,$env{'docs.markedcopy_nested'}); |
|
my @titles = split(/\Q___&&&___\E/,$env{'docs.markedcopy_nestednames'}); |
|
my $lastdir = $parent; |
|
my %depths = ( |
|
$lastdir => 0, |
|
); |
|
my (%display,%deps); |
|
for (my $i=0; $i<@pastemaps; $i++) { |
|
($lastdir,my $subfolderstr) = split(/\:/,$pastemaps[$i]); |
|
my ($namedir,$esctitlestr) = split(/\:/,$titles[$i]); |
|
my @subfolders = split(/,/,$subfolderstr); |
|
$deps{$lastdir} = \@subfolders; |
|
my @subfoldertitles = map { &unescape($_); } split(/,/,$esctitlestr); |
|
my $depth = $depths{$lastdir} + 1; |
|
my $offset = int($depth * 4); |
|
my $indent = (' ' x $offset); |
|
for (my $j=0; $j<@subfolders; $j++) { |
|
$depths{$subfolders[$j]} = $depth; |
|
$display{$subfolders[$j]} = |
|
'<tr><td>'.$indent.$subfoldertitles[$j].' </td>'. |
|
'<td><label>'. |
|
'<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="new" checked="checked" />'.&mt('Copy to new').'</label>'.(' ' x2). |
|
'<label>'. |
|
'<input type="radio" name="docs.markedcopy_'.$subfolders[$j].'" value="move" />'. |
|
&mt('Move old').'</label>'. |
|
'</td></tr>'; |
|
} |
|
} |
|
&recurse_print($r,$parent,\%deps,\%display); |
|
$r->print('</table>'); |
|
} |
|
$r->print('</div>'); |
|
} |
|
} |
|
$r->print('<br /><input type="submit" name="pastemarked" value="'.&mt('Paste').'" />'.$othercrs); |
if ($container eq 'page') { |
if ($container eq 'page') { |
$r->print(' |
$r->print(' |
<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" /> |
<input type="hidden" name="pagepath" value="'.&HTML::Entities::encode($env{'form.pagepath'},'<>&"').'" /> |
<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" /> |
<input type="hidden" name="pagesymb" value="'.&HTML::Entities::encode($env{'form.pagesymb'},'<>&"').'" /> |
'); |
'); |
} else { |
} else { |
$r->print(' |
$r->print(' |
<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> |
<input type="hidden" name="folderpath" value="'.&HTML::Entities::encode($env{'form.folderpath'},'<>&"').'" /> |
'); |
'); |
} |
} |
$r->print('</form>'); |
$r->print('</form>'); |
} else { |
} else { |
$r->print('<br /><p class="LC_info">'.&mt('Paste into Supplemental Content unavailable for this type of content.').'</p>'); |
$r->print(&mt('Paste buffer contains:').' '.$buffer. |
|
'<br /><p class="LC_info">'.$nopaste.'</p>'); |
} |
} |
$r->print('</fieldset>'); |
$r->print('</fieldset>'); |
} |
} |
|
|
|
sub recurse_print { |
|
my ($r,$dir,$deps,$display) = @_; |
|
$r->print($display->{$dir}."\n"); |
|
if (ref($deps->{$dir}) eq 'ARRAY') { |
|
foreach my $subdir (@{$deps->{$dir}}) { |
|
&recurse_print($r,$subdir,$deps,$display); |
|
} |
|
} |
|
} |
|
|
sub supp_pasteable { |
sub supp_pasteable { |
my ($url) = @_; |
my ($url) = @_; |
if (($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//}) || |
if (($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//}) || |
Line 714 sub supp_pasteable {
|
Line 854 sub supp_pasteable {
|
return; |
return; |
} |
} |
|
|
|
sub paste_popup_js { |
|
my %lt = &Apache::lonlocal::texthash( |
|
show => 'Show Paste Options', |
|
hide => 'Hide Paste Options', |
|
); |
|
return <<"END"; |
|
|
|
function showPasteOptions() { |
|
document.getElementById('pasteoptions').style.display='block'; |
|
document.getElementById('pasteoptions').style.textAlign='left'; |
|
document.getElementById('pasteoptions').style.textFace='normal'; |
|
document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:hidePasteOptions();" class="LC_menubuttons_link">$lt{'hide'}</a><br />'; |
|
return; |
|
} |
|
|
|
function hidePasteOptions() { |
|
document.getElementById('pasteoptions').style.display='none'; |
|
document.getElementById('pasteoptionstext').innerHTML ='<a href="javascript:showPasteOptions()" class="LC_menubuttons_link">$lt{'show'}</a>'; |
|
return; |
|
} |
|
|
|
END |
|
|
|
} |
|
|
|
|
sub do_paste_from_buffer { |
sub do_paste_from_buffer { |
my ($coursenum,$coursedom,$folder,$errors) = @_; |
my ($coursenum,$coursedom,$folder,$container,$errors) = @_; |
|
|
|
# Early out if paste buffer is empty |
if (!$env{'form.pastemarked'}) { |
if (!$env{'form.pastemarked'}) { |
return; |
return (); |
} |
} |
|
|
# Preparing to paste resource at end of list |
# Supplemental content may only include certain types of content |
|
# Early out if pasted content is not supported in Supplemental area |
|
if ($folder =~ /^supplemental/) { |
|
unless (&supp_pasteable($env{'docs.markedcopy_url'})) { |
|
return (&mt('Paste failed: content type is not supported within Supplemental Content')); |
|
} |
|
} |
|
|
|
# Prepare to paste resource at end of list |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); |
my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); |
my $title=&LONCAPA::map::qtescape($env{'docs.markedcopy_title'}); |
|
|
my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges); |
my ($is_map,$srcdom,$srcnum,$prefixchg,%before,%after,%mapchanges,%tomove); |
if ($url=~/\.(page|sequence)$/) { |
if ($url=~/\.(page|sequence)$/) { |
$is_map = 1; |
$is_map = 1; |
} |
} |
Line 733 sub do_paste_from_buffer {
|
Line 908 sub do_paste_from_buffer {
|
$srcdom = $1; |
$srcdom = $1; |
$srcnum = $2; |
$srcnum = $2; |
my $oldprefix = $3; |
my $oldprefix = $3; |
|
# When paste buffer was populated using an active role in a different course |
|
# check for mdc privilege in the course from which the resource was pasted |
if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { |
if (($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { |
unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
unless ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
return &mt('Paste failed: Item is from a different course which you do not have rights to edit.'); |
return (&mt('Paste failed: Item is from a different course which you do not have rights to edit.')); |
} |
} |
} |
} |
|
# When pasting content from Main Content to Supplemental Content and vice versa |
|
# URLs will contain different paths (which depend on whether pasted item is |
|
# a folder/page or a document. |
if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) { |
if (($folder =~ /^supplemental/) && (($oldprefix =~ /^default/) || ($oldprefix eq 'docs'))) { |
$prefixchg = 1; |
$prefixchg = 1; |
%before = ( map => 'default', |
%before = ( map => 'default', |
Line 751 sub do_paste_from_buffer {
|
Line 931 sub do_paste_from_buffer {
|
%after = ( map => 'default', |
%after = ( map => 'default', |
doc => 'docs'); |
doc => 'docs'); |
} |
} |
} |
|
|
|
# Supplemental content may only include certain types of content |
# If pasting an uploaded map, get list of contained uploaded maps. |
if ($folder =~ /^supplemental/) { |
my @nested; |
unless (&supp_pasteable($env{'docs.markedcopy_url'})) { |
if ($env{'docs.markedcopy_nested'}) { |
return &mt('Paste failed: content type is not supported within Supplemental Content'); |
my ($type) = ($oldprefix =~ /^(default|supplemental)/); |
|
my @items = split(/\&/,$env{'docs.markedcopy_nested'}); |
|
my @deps = map { /\d+:([\d,]+$)/ } @items; |
|
foreach my $dep (@deps) { |
|
if ($dep =~ /,/) { |
|
push(@nested,split(/,/,$dep)); |
|
} else { |
|
push(@nested,$dep); |
|
} |
|
} |
|
foreach my $item (@nested) { |
|
if ($env{'form.docs.markedcopy_'.$item} eq 'move') { |
|
$tomove{$type.'_'.$item} = 1; |
|
} |
|
} |
} |
} |
} |
} |
|
|
# Maps need to be copied first |
# Maps need to be copied first |
my ($oldurl,%removefrommap,%addedmaps,%rewrites,%retitles,%copies,%dbcopies,%zombies, |
my ($oldurl,%removefrommap,%removeparam,%addedmaps,%rewrites,%retitles,%copies, |
%params,%docmoves,%mapmoves); |
%dbcopies,%zombies,%params,%docmoves,%mapmoves,%newsubdir,%newurls); |
$oldurl = $url; |
$oldurl = $url; |
if ($is_map) { |
if ($is_map) { |
# If pasting a map, check if map contains other maps |
|
my %allmaps; |
|
&contained_map_check($url,$folder,\%removefrommap,\%addedmaps); |
|
if ($folder =~ /^default/) { |
if ($folder =~ /^default/) { |
if (keys(%addedmaps) > 0) { |
my $lastchange = &Apache::lonnet::get_coursechange($coursedom,$coursenum); |
&reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"}); |
if ($lastchange > $env{'request.course.tied'}) { |
|
&reinit_role($coursedom,$coursenum,$env{"course.$env{'request.course.id'}.home"}); |
} |
} |
|
} |
|
# If pasting a map, check if map contains other maps |
|
my (%allmaps,%hierarchy,%titles); |
|
if ($folder =~ /^default/) { |
my $navmap = Apache::lonnavmaps::navmap->new(); |
my $navmap = Apache::lonnavmaps::navmap->new(); |
if (defined($navmap)) { |
if (defined($navmap)) { |
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) { |
foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) { |
Line 779 sub do_paste_from_buffer {
|
Line 974 sub do_paste_from_buffer {
|
} |
} |
} |
} |
} |
} |
|
&contained_map_check($url,$folder,\%removefrommap,\%removeparam, |
|
\%addedmaps,\%hierarchy,\%titles,\%allmaps); |
if ($url=~ m{^/uploaded/}) { |
if ($url=~ m{^/uploaded/}) { |
$title=&mt('Copy of').' '.$title; |
my $newurl; |
} |
unless ($env{'form.docs.markedcopy_options'} eq 'move') { |
my $now = time; |
($newurl,my $error) = |
my $suffix=$$.int(rand(100)).$now; |
&get_newmap_url($url,$folder,$prefixchg,$coursedom,$coursenum, |
my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); |
$srcdom,$srcnum,\$title,\%allmaps,\%newurls); |
if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) { |
if ($error) { |
my $path = $1; |
return ($error); |
my $prefix = $2; |
} |
my $ancestor = $3; |
if ($newurl ne '') { |
if (length($ancestor) > 10) { |
if ($newurl ne $url) { |
$ancestor = substr($ancestor,-10,10); |
if ($newurl =~ /(?:default|supplemental)_(\d+).(?:sequence|page)$/) { |
} |
$newsubdir{$url} = $1; |
my ($newurl,$newid); |
} |
if ($prefixchg) { |
$mapchanges{$url} = 1; |
if ($folder =~ /^supplemental/) { |
} |
$prefix =~ s/^default/supplemental/; |
|
} else { |
|
$prefix =~ s/^supplemental/default/; |
|
} |
|
} |
|
if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { |
|
$newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; |
|
} else { |
|
$newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext; |
|
} |
|
my $counter = 0; |
|
my $is_unique = &uniqueness_check($newurl); |
|
if ($folder =~ /^default/) { |
|
if ($allmaps{$newurl}) { |
|
$is_unique = 0; |
|
} |
|
} |
|
while (!$is_unique && $allmaps{$newurl} && $counter < 100) { |
|
$counter ++; |
|
$suffix ++; |
|
if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { |
|
$newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; |
|
} else { |
|
$newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext; |
|
} |
|
$is_unique = &uniqueness_check($newurl); |
|
} |
|
if ($is_unique) { |
|
if ($newurl ne $oldurl) { |
|
$mapchanges{$oldurl} = 1; |
|
} |
|
if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg)) { |
|
&url_paste_fixups($url,$prefixchg,$coursedom,$coursenum,\%allmaps, |
|
\%rewrites,\%retitles,\%copies,\%dbcopies,\%zombies, |
|
\%params,\%mapmoves,\%mapchanges); |
|
} |
|
} else { |
|
if ($url=~/\.page$/) { |
|
return &mt('Paste failed: an error occurred creating a unique URL for the composite page'); |
|
} else { |
|
return &mt('Paste failed: an error occurred creating a unique URL for the folder'); |
|
} |
} |
} |
} |
my $storefn=$newurl; |
if (($srcdom ne $coursedom) || ($srcnum ne $coursenum) || ($prefixchg) || |
$storefn=~s{^/\w+/$match_domain/$match_username/}{}; |
(($newurl ne '') && ($newurl ne $url))) { |
my $paste_map_result = |
unless (&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum, |
&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, |
\%allmaps,\%rewrites,\%retitles,\%copies,\%dbcopies, |
&Apache::lonnet::getfile($url)); |
\%zombies,\%params,\%mapmoves,\%mapchanges,\%tomove, |
if ($paste_map_result eq '/adm/notfound.html') { |
\%newsubdir,\%newurls)) { |
if ($url=~/\.page$/) { |
$mapmoves{$url} = 1; |
return &mt('Paste failed: an error occurred saving the composite page.'); |
} |
} else { |
$url = $newurl; |
return &mt('Paste failed: an error occurred saving the folder.'); |
} elsif ($env{'docs.markedcopy_nested'}) { |
} |
&url_paste_fixups($url,$folder,$prefixchg,$coursedom,$coursenum,\%allmaps,\%rewrites, |
|
\%retitles,\%copies,\%dbcopies,\%zombies,\%params,\%mapmoves, |
|
\%mapchanges,\%tomove,\%newsubdir,\%newurls); |
} |
} |
$url = $newurl; |
|
} elsif ($url=~m {^/res/}) { |
} elsif ($url=~m {^/res/}) { |
# published maps can only exists once, so remove it from paste buffer when done |
# published maps can only exists once, so remove it from paste buffer when done |
&Apache::lonnet::delenv('docs.markedcopy'); |
&Apache::lonnet::delenv('docs.markedcopy'); |
if ($folder =~ /^default/) { |
# if pasting published map (main content are only) check map is not already in course |
|
if ($folder =~ /^default/) { |
if ($allmaps{$url}) { |
if ($allmaps{$url}) { |
return &mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.'); |
return (&mt('Paste failed: only one instance of a particular published sequence or page is allowed within each course.')); |
} |
} |
} |
} |
} |
} |
Line 874 sub do_paste_from_buffer {
|
Line 1032 sub do_paste_from_buffer {
|
$url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; |
$url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; |
$title=&mt('Copy of').' '.$title; |
$title=&mt('Copy of').' '.$title; |
} else { |
} else { |
return &mt('Paste failed: An error occurred when copying the simple page.'); |
return (&mt('Paste failed: An error occurred when copying the simple page.')); |
} |
} |
} |
} |
} |
} |
Line 882 sub do_paste_from_buffer {
|
Line 1040 sub do_paste_from_buffer {
|
my $ext='false'; |
my $ext='false'; |
if ($url=~m{^http(|s)://}) { $ext='true'; } |
if ($url=~m{^http(|s)://}) { $ext='true'; } |
$url = &LONCAPA::map::qtunescape($url); |
$url = &LONCAPA::map::qtunescape($url); |
# Now insert the URL at the bottom |
|
my $newidx = &LONCAPA::map::getresidx($url); |
|
|
|
# For uploaded files (excluding pages/sequences) path in copied file is changed |
# For uploaded files (excluding pages/sequences) path in copied file is changed |
# if paste is from Main to Supplemental (or vice versa), or if pasting between |
# if paste is from Main to Supplemental (or vice versa), or if pasting between |
# courses. |
# courses. |
|
|
|
my $newidx; |
unless ($is_map) { |
unless ($is_map) { |
|
# Now insert the URL at the bottom |
|
$newidx = &LONCAPA::map::getresidx($url); |
if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) { |
if ($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(.+)$}) { |
my $relpath = $1; |
my $relpath = $1; |
if ($relpath ne '') { |
if ($relpath ne '') { |
my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); |
my ($prefix,$subdir,$rem) = ($relpath =~ m{^(default|\d+)/(\d+)/(.+)$}); |
my ($newloc,$newsubdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); |
my ($newloc,$newdocsdir) = ($folder =~ /^(default|supplemental)_?(\d*)/); |
my $newprefix = $newloc; |
my $newprefix = $newloc; |
if ($newloc eq 'default') { |
if ($newloc eq 'default') { |
$newprefix = 'docs'; |
$newprefix = 'docs'; |
} |
} |
if ($newsubdir eq '') { |
if ($newdocsdir eq '') { |
$newsubdir = 'default'; |
$newdocsdir = 'default'; |
} |
} |
if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { |
if (($prefixchg) || ($srcdom ne $coursedom) || ($srcnum ne $coursenum)) { |
my $newpath = "$newprefix/$newsubdir/$newidx/$rem"; |
my $newpath = "$newprefix/$newdocsdir/$newidx/$rem"; |
$url = |
$url = |
&Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, |
&Apache::lonclonecourse::writefile($env{'request.course.id'},$newpath, |
&Apache::lonnet::getfile($oldurl)); |
&Apache::lonnet::getfile($oldurl)); |
if ($url eq '/adm/notfound.html') { |
if ($url eq '/adm/notfound.html') { |
return &mt('Paste failed: an error occurred saving the file.'); |
return (&mt('Paste failed: an error occurred saving the file.')); |
} else { |
} else { |
my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); |
my ($newsubpath) = ($newpath =~ m{^(.*/)[^/]*$}); |
$newsubpath =~ s{/+$}{/}; |
$newsubpath =~ s{/+$}{/}; |
Line 918 sub do_paste_from_buffer {
|
Line 1077 sub do_paste_from_buffer {
|
} |
} |
} |
} |
} |
} |
my $result = |
# Apply any changes to maps, or copy dependencies for uploaded HTML pages |
&apply_fixups($is_map,$prefixchg,$coursedom,$coursenum,$oldurl,$url, |
my ($result,$save_err); |
\%removefrommap,\%rewrites,\%retitles,\%copies,\%dbcopies, |
$result = |
\%zombies,\%params,\%docmoves,\%mapmoves,$errors,\%before,\%after); |
&apply_fixups($folder,$is_map,$prefixchg,$coursedom,$coursenum,$oldurl, |
|
$url,\%removefrommap,\%removeparam,\%rewrites,\%retitles, |
|
\%copies,\%dbcopies,\%zombies,\%params,\%docmoves, |
|
\%mapmoves,\%newsubdir,$errors,\%before,\%after); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
|
if ($is_map) { |
|
my ($errtext,$fatal) = &mapread($coursenum,$coursedom, |
|
$folder.'.'.$container); |
|
return $errtext if ($fatal); |
|
|
|
if ($#LONCAPA::map::order<1) { |
|
my $idx=&LONCAPA::map::getresidx(); |
|
if ($idx<=0) { $idx=1; } |
|
$LONCAPA::map::order[0]=$idx; |
|
$LONCAPA::map::resources[$idx]=''; |
|
} |
|
$newidx = &LONCAPA::map::getresidx($url); |
|
} |
if ($env{'docs.markedcopy_supplemental'}) { |
if ($env{'docs.markedcopy_supplemental'}) { |
if ($folder =~ /^supplemental/) { |
if ($folder !~ /^supplemental/) { |
$title = $env{'docs.markedcopy_supplemental'}; |
|
} else { |
|
(undef,undef,$title) = |
(undef,undef,$title) = |
&Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); |
&Apache::loncommon::parse_supplemental_title($env{'docs.markedcopy_supplemental'}); |
} |
} |
Line 938 sub do_paste_from_buffer {
|
Line 1111 sub do_paste_from_buffer {
|
} |
} |
$LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; |
$LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; |
push(@LONCAPA::map::order, $newidx); |
push(@LONCAPA::map::order, $newidx); |
|
|
|
# Store the result |
|
my ($errtext,$fatal) = |
|
&storemap($coursenum,$coursedom,$folder.'.'.$container,1); |
|
if ($fatal) { |
|
$save_err = $errtext; |
|
} |
|
} |
|
|
|
if ($env{'form.docs.markedcopy_options'} eq 'move') { |
|
&Apache::lonnet::delenv('docs.markedcopy'); |
|
&Apache::lonnet::delenv('docs.markedcopy_nested'); |
|
&Apache::lonnet::delenv('docs.markedcopy_nestednames'); |
|
} |
|
return ($result,$save_err); |
|
} |
|
|
|
sub get_newmap_url { |
|
my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum, |
|
$titleref,$allmaps,$newurls) = @_; |
|
my $newurl; |
|
if ($url=~ m{^/uploaded/}) { |
|
$$titleref=&mt('Copy of').' '.$$titleref; |
|
} |
|
my $now = time; |
|
my $suffix=$$.int(rand(100)).$now; |
|
my ($oldid,$ext) = ($url=~/^(.+)\.(\w+)$/); |
|
if ($oldid =~ m{^(/uploaded/$match_domain/$match_courseid/)(\D+)(\d+)$}) { |
|
my $path = $1; |
|
my $prefix = $2; |
|
my $ancestor = $3; |
|
if (length($ancestor) > 10) { |
|
$ancestor = substr($ancestor,-10,10); |
|
} |
|
my $newid; |
|
if ($prefixchg) { |
|
if ($folder =~ /^supplemental/) { |
|
$prefix =~ s/^default/supplemental/; |
|
} else { |
|
$prefix =~ s/^supplemental/default/; |
|
} |
|
} |
|
if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { |
|
$newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; |
|
} else { |
|
$newurl = "/uploaded/$coursedom/$coursenum/$prefix".$now.'.'.$ext; |
|
} |
|
my $counter = 0; |
|
my $is_unique = &uniqueness_check($newurl); |
|
if ($folder =~ /^default/) { |
|
if ($allmaps->{$newurl}) { |
|
$is_unique = 0; |
|
} |
|
} |
|
while ((!$is_unique || $allmaps->{$newurl} || $newurls->{$newurl}) && ($counter < 100)) { |
|
$counter ++; |
|
$suffix ++; |
|
if (($srcdom eq $coursedom) && ($srcnum eq $coursenum)) { |
|
$newurl = $path.$prefix.$ancestor.$suffix.'.'.$ext; |
|
} else { |
|
$newurl = "/uploaded/$coursedom/$coursenum/$prefix".$ancestor.$suffix.'.'.$ext; |
|
} |
|
$is_unique = &uniqueness_check($newurl); |
|
} |
|
if ($is_unique) { |
|
$newurls->{$newurl} = 1; |
|
} else { |
|
if ($url=~/\.page$/) { |
|
return (undef,&mt('Paste failed: an error occurred creating a unique URL for the composite page')); |
|
} else { |
|
return (undef,&mt('Paste failed: an error occurred creating a unique URL for the folder')); |
|
} |
|
} |
} |
} |
return $result; |
return ($newurl); |
} |
} |
|
|
sub dbcopy { |
sub dbcopy { |
Line 974 sub uniqueness_check {
|
Line 1220 sub uniqueness_check {
|
} |
} |
|
|
sub contained_map_check { |
sub contained_map_check { |
my ($url,$folder,$removefrommap,$addedmaps) = @_; |
my ($url,$folder,$removefrommap,$removeparam,$addedmaps,$hierarchy,$titles, |
|
$allmaps) = @_; |
my $content = &Apache::lonnet::getfile($url); |
my $content = &Apache::lonnet::getfile($url); |
unless ($content eq '-1') { |
unless ($content eq '-1') { |
my $parser = HTML::TokeParser->new(\$content); |
my $parser = HTML::TokeParser->new(\$content); |
Line 986 sub contained_map_check {
|
Line 1233 sub contained_map_check {
|
my $ressrc = $token->[2]->{'src'}; |
my $ressrc = $token->[2]->{'src'}; |
if ($folder =~ /^supplemental/) { |
if ($folder =~ /^supplemental/) { |
unless (&supp_pasteable($ressrc)) { |
unless (&supp_pasteable($ressrc)) { |
$removefrommap->{$url}{$token->[2]->{'id'}}; |
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
next; |
next; |
} |
} |
} |
} |
if ($ressrc =~ /\.(sequence|page)$/) { |
if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) { |
if (ref($addedmaps->{$ressrc}) eq 'ARRAY') { |
if ($1 eq 'uploaded') { |
push(@{$addedmaps->{$ressrc}},$url); |
$hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc; |
|
$titles->{$url}{$token->[2]->{'id'}} = $token->[2]->{'title'}; |
} else { |
} else { |
$addedmaps->{$ressrc} = [$url]; |
if ($allmaps->{$ressrc}) { |
|
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
|
} elsif (ref($addedmaps->{$ressrc}) eq 'ARRAY') { |
|
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
|
} else { |
|
$addedmaps->{$ressrc} = [$url]; |
|
} |
} |
} |
&contained_map_check($ressrc,$folder,$removefrommap,$addedmaps); |
&contained_map_check($ressrc,$folder,$removefrommap,$removeparam, |
|
$addedmaps,$hierarchy,$titles,$allmaps); |
} |
} |
} elsif ($token->[1] !~ /^resource|map|link$/) { |
} elsif ($token->[1] eq 'param') { |
if ($folder =~ /^supplemental/) { |
if ($folder =~ /^supplemental/) { |
$removefrommap->{$url}{$token->[1]}; |
if (ref($removeparam->{$url}{$token->[2]->{'to'}}) eq 'ARRAY') { |
|
push(@{$removeparam->{$url}{$token->[2]->{'to'}}},$token->[2]->{'name'}); |
|
} else { |
|
$removeparam->{$url}{$token->[2]->{'to'}} = [$token->[2]->{'name'}]; |
|
} |
} |
} |
} |
} |
} |
} |
Line 1018 sub reinit_role {
|
Line 1277 sub reinit_role {
|
} |
} |
|
|
sub url_paste_fixups { |
sub url_paste_fixups { |
my ($oldurl,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies, |
my ($oldurl,$folder,$prefixchg,$cdom,$cnum,$allmaps,$rewrites,$retitles,$copies, |
$dbcopies,$zombies,$params,$mapmoves,$mapchanges) = @_; |
$dbcopies,$zombies,$params,$mapmoves,$mapchanges,$tomove,$newsubdir,$newurls) = @_; |
my $checktitle; |
my $checktitle; |
if (($prefixchg) && |
if (($prefixchg) && |
($oldurl =~ m{^/uploaded/($match_domain)/($match_courseid)/supplemental})) { |
($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/supplemental})) { |
$checktitle = 1; |
$checktitle = 1; |
} |
} |
|
my $skip; |
|
if ($oldurl =~ m{^\Q/uploaded/$cdom/$cnum/\E(default|supplemental)(_?\d*)\.(?:page|sequence)$}) { |
|
my $mapid = $1.$2; |
|
if ($tomove->{$mapid}) { |
|
$skip = 1; |
|
} |
|
} |
my $file = &Apache::lonnet::getfile($oldurl); |
my $file = &Apache::lonnet::getfile($oldurl); |
return if ($file eq '-1'); |
return if ($file eq '-1'); |
my $parser = HTML::TokeParser->new(\$file); |
my $parser = HTML::TokeParser->new(\$file); |
Line 1036 sub url_paste_fixups {
|
Line 1302 sub url_paste_fixups {
|
my $ressrc = $token->[2]->{'src'}; |
my $ressrc = $token->[2]->{'src'}; |
next if ($ressrc eq ''); |
next if ($ressrc eq ''); |
my $id = $token->[2]->{'id'}; |
my $id = $token->[2]->{'id'}; |
|
my $title = $token->[2]->{'title'}; |
if ($checktitle) { |
if ($checktitle) { |
my $title = $token->[2]->{'title'}; |
|
if ($title =~ m{\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { |
if ($title =~ m{\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { |
$retitles->{$oldurl}{$ressrc} = $id; |
$retitles->{$oldurl}{$ressrc} = $id; |
|
|
} |
} |
} |
} |
next if ($token->[2]->{'type'} eq 'external'); |
next if ($token->[2]->{'type'} eq 'external'); |
if ($token->[2]->{'type'} eq 'zombie') { |
if ($token->[2]->{'type'} eq 'zombie') { |
|
next if ($skip); |
$zombies->{$oldurl}{$ressrc} = $id; |
$zombies->{$oldurl}{$ressrc} = $id; |
$changed = 1; |
$changed = 1; |
} elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { |
} elsif ($ressrc =~ m{^/uploaded/($match_domain)/($match_courseid)/(.+)$}) { |
my $srccdom = $1; |
my $srcdom = $1; |
my $srccnum = $2; |
my $srcnum = $2; |
my $rem = $3; |
my $rem = $3; |
if (($srccdom ne $cdom) || ($srccnum ne $cnum) || ($prefixchg) || |
my $newurl; |
($mapchanges->{$oldurl})) { |
my $mapname; |
|
if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { |
|
my $prefix = $1; |
|
$mapname = $prefix.$2; |
|
if ($tomove->{$mapname}) { |
|
&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps, |
|
$rewrites,$retitles,$copies,$dbcopies,$zombies, |
|
$params,$mapmoves,$mapchanges,$tomove,$newsubdir, |
|
$newurls); |
|
next; |
|
} else { |
|
($newurl,my $error) = |
|
&get_newmap_url($ressrc,$folder,$prefixchg,$cdom,$cnum, |
|
$srcdom,$srcnum,\$title,$allmaps,$newurls); |
|
if ($newurl =~ /(?:default|supplemental)_(\d+)\.(?:sequence|page)$/) { |
|
$newsubdir->{$ressrc} = $1; |
|
} |
|
if ($error) { |
|
next; |
|
} |
|
} |
|
} |
|
if (($srcdom ne $cdom) || ($srcnum ne $cnum) || ($prefixchg) || |
|
($mapchanges->{$oldurl}) || (($newurl ne '') && ($newurl ne $oldurl))) { |
|
|
if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { |
if ($rem =~ /^(default|supplemental)(_?\d*).(sequence|page)$/) { |
$rewrites->{$oldurl}{$ressrc} = $id; |
$rewrites->{$oldurl}{$ressrc} = $id; |
$mapchanges->{$ressrc} = 1; |
$mapchanges->{$ressrc} = 1; |
unless (&url_paste_fixups($ressrc,$prefixchg,$cdom,$cnum,$allmaps, |
unless (&url_paste_fixups($ressrc,$folder,$prefixchg,$cdom,$cnum,$allmaps, |
$rewrites,$retitles,$copies,$dbcopies,$zombies, |
$rewrites,$retitles,$copies,$dbcopies,$zombies, |
$params,$mapmoves,$mapchanges)) { |
$params,$mapmoves,$mapchanges,$tomove,$newsubdir, |
|
$newurls)) { |
$mapmoves->{$ressrc} = 1; |
$mapmoves->{$ressrc} = 1; |
} |
} |
$changed = 1; |
$changed = 1; |
Line 1069 sub url_paste_fixups {
|
Line 1360 sub url_paste_fixups {
|
} |
} |
} |
} |
} elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) { |
} elsif ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(.+)$}) { |
my $srccdom = $1; |
next if ($skip); |
my $srccnum = $2; |
my $srcdom = $1; |
if (($srccdom ne $cdom) || ($srccnum ne $cnum)) { |
my $srcnum = $2; |
|
if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { |
$rewrites->{$oldurl}{$ressrc} = $id; |
$rewrites->{$oldurl}{$ressrc} = $id; |
$dbcopies->{$oldurl}{$ressrc} = $id; |
$dbcopies->{$oldurl}{$ressrc} = $id; |
$changed = 1; |
$changed = 1; |
} |
} |
} elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) { |
} elsif ($ressrc =~ m{^/public/($match_domain)/($match_courseid)/(.+)$}) { |
my $srccdom = $1; |
next if ($skip); |
my $srccnum = $2; |
my $srcdom = $1; |
if (($srccdom ne $cdom) || ($srccnum ne $cnum)) { |
my $srcnum = $2; |
|
if (($srcdom ne $cdom) || ($srcnum ne $cnum)) { |
$rewrites->{$oldurl}{$ressrc} = $id; |
$rewrites->{$oldurl}{$ressrc} = $id; |
$dbcopies->{$oldurl}{$ressrc} = $id; |
$dbcopies->{$oldurl}{$ressrc} = $id; |
$changed = 1; |
$changed = 1; |
} |
} |
} |
} |
} elsif ($token->[1] eq 'param') { |
} elsif ($token->[1] eq 'param') { |
|
next if ($skip); |
my $to = $token->[2]->{'to'}; |
my $to = $token->[2]->{'to'}; |
if ($to ne '') { |
if ($to ne '') { |
if (ref($params->{$oldurl}{$to}) eq 'ARRAY') { |
if (ref($params->{$oldurl}{$to}) eq 'ARRAY') { |
push (@{$params->{$oldurl}{$to}},$token->[2]->{'name'}); |
push(@{$params->{$oldurl}{$to}},$token->[2]->{'name'}); |
} else { |
} else { |
@{$params->{$oldurl}{$to}} = ($token->[2]->{'name'}); |
@{$params->{$oldurl}{$to}} = ($token->[2]->{'name'}); |
} |
} |
Line 1100 sub url_paste_fixups {
|
Line 1394 sub url_paste_fixups {
|
} |
} |
|
|
sub apply_fixups { |
sub apply_fixups { |
my ($is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap,$rewrites, |
my ($folder,$is_map,$prefixchg,$cdom,$cnum,$oldurl,$url,$removefrommap, |
$retitles,$copies,$dbcopies,$zombies,$params,$docmoves,$mapmoves,$errors, |
$removeparam,$rewrites,$retitles,$copies,$dbcopies,$zombies,$params, |
$before,$after) = @_; |
$docmoves,$mapmoves,$newsubdir,$errors,$before,$after) = @_; |
my ($oldsubdir,$newsubdir,$subdirchg); |
|
if ($is_map) { |
|
($oldsubdir) = |
|
($oldurl =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_?(\d*)}); |
|
if ($oldsubdir eq '') { |
|
$oldsubdir = 'default'; |
|
} |
|
($newsubdir) = |
|
($url =~ m{^/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_?(\d*)}); |
|
if ($newsubdir eq '') { |
|
$newsubdir = 'default'; |
|
} |
|
if ($oldsubdir ne $newsubdir) { |
|
$subdirchg = 1; |
|
} |
|
} |
|
foreach my $key (keys(%{$copies}),keys(%{$docmoves})) { |
foreach my $key (keys(%{$copies}),keys(%{$docmoves})) { |
my @allcopies; |
my @allcopies; |
if (ref($copies->{$key}) eq 'HASH') { |
if (ref($copies->{$key}) eq 'HASH') { |
Line 1140 sub apply_fixups {
|
Line 1418 sub apply_fixups {
|
} |
} |
if (@allcopies > 0) { |
if (@allcopies > 0) { |
foreach my $item (@allcopies) { |
foreach my $item (@allcopies) { |
my ($relpath,$fname) = |
my ($relpath,$oldsubdir,$fname) = |
($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(?:default|\d+)/.*/)([^/]+)$}); |
($item =~ m{^(/uploaded/$match_domain/$match_courseid/(?:docs|supplemental)/(default|\d+)/.*/)([^/]+)$}); |
if ($fname ne '') { |
if ($fname ne '') { |
my $content = &Apache::lonnet::getfile($item); |
my $content = &Apache::lonnet::getfile($item); |
unless ($content eq '-1') { |
unless ($content eq '-1') { |
Line 1154 sub apply_fixups {
|
Line 1432 sub apply_fixups {
|
if ($prefixchg) { |
if ($prefixchg) { |
$storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/; |
$storefn =~ s/^\Q$before->{'doc'}\E/$after->{'doc'}/; |
} |
} |
if (($key eq $oldurl) && ($subdirchg)) { |
if ($newsubdir->{$key}) { |
$storefn =~ s{^(docs|supplemental)/\Q$oldsubdir\E/}{$1/$newsubdir/}; |
$storefn =~ s#^(docs|supplemental)/\Q$oldsubdir\E/#$1/$newsubdir->{$key}#; |
} |
} |
} |
} |
©_dependencies($item,$storefn,$relpath,$errors,\$content); |
©_dependencies($item,$storefn,$relpath,$errors,\$content); |
Line 1180 sub apply_fixups {
|
Line 1458 sub apply_fixups {
|
if ($prefixchg) { |
if ($prefixchg) { |
$storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; |
$storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; |
} |
} |
|
if ($newsubdir->{$key}) { |
|
$storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/; |
|
} |
my $mapcontent = &Apache::lonnet::getfile($key); |
my $mapcontent = &Apache::lonnet::getfile($key); |
if ($mapcontent eq '-1') { |
if ($mapcontent eq '-1') { |
if (ref($errors) eq 'HASH') { |
if (ref($errors) eq 'HASH') { |
Line 1199 sub apply_fixups {
|
Line 1480 sub apply_fixups {
|
my %updates; |
my %updates; |
if ($is_map) { |
if ($is_map) { |
foreach my $key (keys(%{$rewrites})) { |
foreach my $key (keys(%{$rewrites})) { |
$updates{$key} = 1; |
$updates{$key} = 1; |
} |
} |
foreach my $key (keys(%{$zombies})) { |
foreach my $key (keys(%{$zombies})) { |
$updates{$key} = 1; |
$updates{$key} = 1; |
} |
} |
foreach my $key (keys(%{$removefrommap})) { |
foreach my $key (keys(%{$removefrommap})) { |
$updates{$key} = 1; |
$updates{$key} = 1; |
} |
} |
|
foreach my $key (keys(%{$removeparam})) { |
|
$updates{$key} = 1; |
|
} |
foreach my $key (keys(%{$dbcopies})) { |
foreach my $key (keys(%{$dbcopies})) { |
$updates{$key} = 1; |
$updates{$key} = 1; |
} |
} |
foreach my $key (keys(%{$retitles})) { |
foreach my $key (keys(%{$retitles})) { |
$updates{$key} = 1; |
$updates{$key} = 1; |
} |
} |
foreach my $key (keys(%updates)) { |
foreach my $key (keys(%updates)) { |
my (%torewrite,%toretitle,%toremove,%zombie,%newdb); |
my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb); |
if (ref($rewrites->{$key}) eq 'HASH') { |
if (ref($rewrites->{$key}) eq 'HASH') { |
%torewrite = %{$rewrites->{$key}}; |
%torewrite = %{$rewrites->{$key}}; |
} |
} |
Line 1224 sub apply_fixups {
|
Line 1508 sub apply_fixups {
|
if (ref($removefrommap->{$key}) eq 'HASH') { |
if (ref($removefrommap->{$key}) eq 'HASH') { |
%toremove = %{$removefrommap->{$key}}; |
%toremove = %{$removefrommap->{$key}}; |
} |
} |
|
if (ref($removeparam->{$key}) eq 'HASH') { |
|
%remparam = %{$removeparam->{$key}}; |
|
} |
if (ref($zombies->{$key}) eq 'HASH') { |
if (ref($zombies->{$key}) eq 'HASH') { |
%zombie = %{$zombies->{$key}}; |
%zombie = %{$zombies->{$key}}; |
} |
} |
Line 1232 sub apply_fixups {
|
Line 1519 sub apply_fixups {
|
$newdb{$item} = &dbcopy($item); |
$newdb{$item} = &dbcopy($item); |
} |
} |
} |
} |
my $map = &Apache::lonnet::getfile($key); |
if (ref($params->{$key}) eq 'HASH') { |
my $newcontent; |
%currparam = %{$params->{$key}}; |
if ($map eq '-1') { |
} |
return &mt('Paste failed: an error occurred reading a folder or page: [_1].',$key); |
my ($errtext,$fatal) = &LONCAPA::map::mapread($key); |
} else { |
if ($fatal) { |
my $parser = HTML::TokeParser->new(\$map); |
return $errtext; |
$parser->attr_encoded(1); |
} |
while (my $token = $parser->get_token) { |
for (my $i=0; $i<@LONCAPA::map::zombies; $i++) { |
if ($token->[0] eq 'S') { |
if (defined($LONCAPA::map::zombies[$i])) { |
if ($token->[2]->{'type'} eq 'zombie') { |
my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::zombies[$i]); |
next if (($token->[2]->{'src'} ne '') && |
if ($zombie{$src} eq $i) { |
($zombie{$token->[2]->{'src'}} eq $token->[2]->{'id'})); |
undef($LONCAPA::map::zombies[$i]); |
} |
} |
if ($token->[1] eq 'resource') { |
} |
my $src = $token->[2]->{'src'}; |
} |
my $id = $token->[2]->{'id'}; |
for (my $i=0; $i<@LONCAPA::map::resources; $i++) { |
my $title = $token->[2]->{'title'}; |
if (defined($LONCAPA::map::resources[$i])) { |
my $changed; |
my $changed; |
if ((exists($toretitle{$src})) && ($toretitle{$src} eq $id)) { |
my ($title,$src,$ext,$type)=split(/\:/,$LONCAPA::map::resources[$i]); |
if ($title =~ m{^\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { |
if ($toremove{$src} eq $i) { |
$token->[2]->{'title'} = $1; |
splice(@LONCAPA::map::order,$i,1); |
$changed = 1; |
if (ref($currparam{$i}) eq 'ARRAY') { |
} |
foreach my $name (@{$currparam{$i}}) { |
|
&LONCAPA::map::delparameter($i,'parameter_'.$name); |
} |
} |
if ((exists($torewrite{$src})) && ($torewrite{$src} eq $id)) { |
} |
$src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/}; |
next; |
if ($src =~ m{^/uploaded/}) { |
} |
if ($prefixchg) { |
my $origsrc = $src; |
if ($src =~ /\.(page|sequence)$/) { |
if ((exists($toretitle{$src})) && ($toretitle{$src} eq $i)) { |
$src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#; |
if ($title =~ m{^\d+\Q___&&&___\E$match_username\Q___&&&___\E$match_domain\Q___&&&___\E(.+)$}) { |
} else { |
$changed = 1; |
$src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#; |
} |
} |
} |
} |
if ((exists($torewrite{$src})) && ($torewrite{$src} eq $i)) { |
if (($key eq $oldurl) && ($src !~ /\.(page|sequence)$/) && ($subdirchg)) { |
$src =~ s{^/(uploaded|adm|public)/$match_domain/$match_courseid/}{/$1/$cdom/$cnum/}; |
$src =~ s{^(/uploaded/$match_domain/$match_courseid/\w+/)\Q$oldsubdir\E}{$1$newsubdir}; |
if ($origsrc =~ m{^/uploaded/}) { |
} |
if ($prefixchg) { |
|
if ($src =~ /\.(page|sequence)$/) { |
|
$src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'map'}\E#$1$after->{'map'}#; |
|
} else { |
|
$src =~ s#^(/uploaded/$match_domain/$match_courseid/)\Q$before->{'doc'}\E#$1$after->{'doc'}#; |
} |
} |
$token->[2]->{'src'} = $src; |
|
$changed = 1; |
|
} elsif ($newdb{$src} ne '') { |
|
$token->[2]->{'src'} = $newdb{$src}; |
|
$changed = 1; |
|
} |
} |
if ($changed) { |
if ($newsubdir->{$origsrc}) { |
$newcontent .= "<$token->[1]"; |
if ($src =~ /\.(page|sequence)$/) { |
foreach my $attr (@{$token->[3]}) { |
$src =~ s#^(/uploaded/$match_domain/$match_courseid/(?:default|supplemental)_)(\d+)#$1$newsubdir->{$origsrc}#; |
if ($attr =~ /^\w+$/) { |
} else { |
$newcontent .= ' '.$attr.'="'.$token->[2]->{$attr}.'"'; |
$src =~ s#^(/uploaded/$match_domain/$match_courseid/\w+/)(\d+)#$1$newsubdir->{$origsrc}#; |
} |
|
} |
} |
$newcontent .= ' />'."\n"; |
|
} else { |
|
$newcontent .= $token->[4]."\n"; |
|
} |
} |
} elsif (($token->[2]->{'id'} ne '') && |
|
(exists($toremove{$token->[2]->{'id'}}))) { |
|
next; |
|
} else { |
|
$newcontent .= $token->[4]."\n"; |
|
} |
} |
} elsif ($token->[0] eq 'E') { |
$changed = 1; |
$newcontent .= $token->[2]."\n"; |
} elsif ($newdb{$src} ne '') { |
|
$src = $newdb{$src}; |
|
$changed = 1; |
|
} |
|
if ($changed) { |
|
$LONCAPA::map::resources[$i] = join(':',($title,$src,$ext,$type)); |
|
} |
|
} |
|
} |
|
foreach my $idx (keys(%remparam)) { |
|
if (ref($remparam{$idx}) eq 'ARRAY') { |
|
foreach my $name (@{$remparam{$idx}}) { |
|
&LONCAPA::map::delparameter($idx,'parameter_'.$name); |
} |
} |
} |
} |
} |
} |
Line 1308 sub apply_fixups {
|
Line 1598 sub apply_fixups {
|
if ($prefixchg) { |
if ($prefixchg) { |
$storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; |
$storefn =~ s/^\Q$before->{'map'}\E/$after->{'map'}/; |
} |
} |
|
if ($newsubdir->{$key}) { |
|
$storefn =~ s/^((?:default|supplemental)_)(\d+)/$1$newsubdir->{$key}/; |
|
} |
} |
} |
my $newmapurl = |
my $report; |
&Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, |
if ($folder !~ /^supplemental/) { |
$newcontent); |
$report = 1; |
if ($newmapurl eq '/adm/notfound.html') { |
} |
|
my ($outtext,$errtext) = |
|
&LONCAPA::map::storemap("/uploaded/$cdom/$cnum/$storefn",1,$report); |
|
if ($errtext) { |
return &mt('Paste failed: an error occurred saving the folder or page.'); |
return &mt('Paste failed: an error occurred saving the folder or page.'); |
} |
} |
} |
} |
Line 1496 sub editor {
|
Line 1792 sub editor {
|
|
|
if ($env{'form.pastemarked'}) { |
if ($env{'form.pastemarked'}) { |
my %paste_errors; |
my %paste_errors; |
my $paste_res = |
my ($paste_res,$save_error) = |
&do_paste_from_buffer($coursenum,$coursedom,$folder,\%paste_errors); |
&do_paste_from_buffer($coursenum,$coursedom,$folder,$container, |
if ($paste_res eq 'ok') { |
\%paste_errors); |
# Store the result |
if ($save_error ne '') { |
($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container); |
return $save_error; |
return $errtext if ($fatal); |
} |
} elsif ($paste_res ne '') { |
if ($paste_res ne 'ok') { |
$r->print('<p><span class="LC_error">'.$paste_res.'</span></p>'); |
$r->print('<p><span class="LC_error">'.$paste_res.'</span></p>'); |
} |
} |
if (keys(%paste_errors) > 0) { |
if (keys(%paste_errors) > 0) { |
Line 1519 sub editor {
|
Line 1815 sub editor {
|
$r->print($upload_output); |
$r->print($upload_output); |
|
|
if (&handle_edit_cmd()) { |
if (&handle_edit_cmd()) { |
($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); |
my $contentchg; |
|
if ($env{'form.cmd'} =~ /^(del|cut)_/) { |
|
$contentchg = 1; |
|
} |
|
($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container,$contentchg); |
return $errtext if ($fatal); |
return $errtext if ($fatal); |
} |
} |
# Group import/search |
# Group import/search |
Line 1546 sub editor {
|
Line 1846 sub editor {
|
$LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx; |
$LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx; |
} |
} |
($errtext,$fatal)=&storemap($coursenum,$coursedom, |
($errtext,$fatal)=&storemap($coursenum,$coursedom, |
$folder.'.'.$container); |
$folder.'.'.$container,1); |
return $errtext if ($fatal); |
return $errtext if ($fatal); |
} else { |
} else { |
$r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>'); |
$r->print('<p><span class="LC_error">'.&mt('No map selected.').'</span></p>'); |
Line 1638 sub editor {
|
Line 1938 sub editor {
|
my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; |
my $readfile="/uploaded/$coursedom/$coursenum/$folder.$container"; |
$r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, |
$r->print(&generate_edit_table($tid,$orderhash,$to_show,$iconpath,$jumpto, |
$readfile)); |
$readfile)); |
&print_paste_buffer($r,$container,$folder); |
&print_paste_buffer($r,$container,$folder,$coursedom,$coursenum); |
} else { |
} else { |
if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { |
if (&Apache::lonnet::allowed('mdc',$env{'request.course.id'})) { |
#Function Box for Supplemental Content for users with mdc priv. |
#Function Box for Supplemental Content for users with mdc priv. |
Line 1726 sub process_file_upload {
|
Line 2026 sub process_file_upload {
|
$comment.':'.$url.':'.$ext.':normal:res'; |
$comment.':'.$url.':'.$ext.':normal:res'; |
$LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx; |
$LONCAPA::map::order[$#LONCAPA::map::order+1]= $newidx; |
($errtext,$fatal)=&storemap($coursenum,$coursedom, |
($errtext,$fatal)=&storemap($coursenum,$coursedom, |
$folder.'.'.$container); |
$folder.'.'.$container,1); |
if ($fatal) { |
if ($fatal) { |
$$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>'; |
$$upload_output = '<div class="LC_error" id="uploadfileresult">'.$errtext.'</div>'; |
return; |
return; |
Line 1884 sub entryline {
|
Line 2184 sub entryline {
|
'cp' => 'Copy'); |
'cp' => 'Copy'); |
my $nocopy=0; |
my $nocopy=0; |
my $nocut=0; |
my $nocut=0; |
if ($url=~/\.(page|sequence)$/) { |
if ($url=~ m{^/res/.+\.(page|sequence)$}) { |
if ($url =~ m{/res/}) { |
# no copy for published maps |
# no copy for published maps |
$nocopy=1; |
$nocopy = 1; |
|
} else { |
|
foreach my $item (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) { |
|
my ($title,$url,$ext,$type)=split(/\:/,$item); |
|
if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) { |
|
$nocopy=1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
} |
if ($url=~/^\/res\/lib\/templates\//) { |
if ($url=~/^\/res\/lib\/templates\//) { |
$nocopy=1; |
$nocopy=1; |
Line 3047 sub handler {
|
Line 3337 sub handler {
|
onload => "javascript:resize_scrollbox('contentscroll','1','1');", |
onload => "javascript:resize_scrollbox('contentscroll','1','1');", |
}; |
}; |
} |
} |
|
if ($env{'docs.markedcopy_url'}) { |
|
$script .= &paste_popup_js(); |
|
} |
} |
} |
# -------------------------------------------------------------------- Body tag |
# -------------------------------------------------------------------- Body tag |
$script = '<script type="text/javascript">'."\n" |
$script = '<script type="text/javascript">'."\n" |
Line 3234 ERFORM
|
Line 3527 ERFORM
|
|
|
|
|
if ($allowed) { |
if ($allowed) { |
&update_paste_buffer($coursenum,$coursedom); |
my $folder = $env{'form.folder'}; |
|
if ($folder eq '') { |
|
$folder='default'; |
|
} |
|
&update_paste_buffer($coursenum,$coursedom,$folder); |
$r->print(<<HIDDENFORM); |
$r->print(<<HIDDENFORM); |
<form name="renameform" method="post" action="/adm/coursedocs"> |
<form name="renameform" method="post" action="/adm/coursedocs"> |
<input type="hidden" name="title" /> |
<input type="hidden" name="title" /> |
Line 3758 sub remove_archive {
|
Line 4055 sub remove_archive {
|
my ($title,$url,@rrest) = |
my ($title,$url,@rrest) = |
split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]); |
split(/:/,$LONCAPA::map::resources[$LONCAPA::map::order[$position]]); |
if (&handle_edit_cmd($docuname,$docudom)) { |
if (&handle_edit_cmd($docuname,$docudom)) { |
($errtext,$fatal) = &storemap($docuname,$docudom,$map); |
($errtext,$fatal) = &storemap($docuname,$docudom,$map,1); |
if ($fatal) { |
if ($fatal) { |
if ($container eq 'page') { |
if ($container eq 'page') { |
$delwarning = &mt('An error occurred updating the contents of the current page.'); |
$delwarning = &mt('An error occurred updating the contents of the current page.'); |
Line 4474 Return hash with valid author names
|
Line 4771 Return hash with valid author names
|
|
|
=item do_paste_from_buffer() |
=item do_paste_from_buffer() |
|
|
|
=item get_newmap_url() |
|
|
|
=item dbcopy() |
|
|
|
=item uniqueness_check() |
|
|
|
=item contained_map_check() |
|
|
|
=item reinit_role() |
|
|
|
=item url_paste_fixups() |
|
|
|
=item apply_fixups() |
|
|
|
=item copy_dependencies() |
|
|
=item update_parameter() |
=item update_parameter() |
|
|
=item handle_edit_cmd() |
=item handle_edit_cmd() |