version 1.1042, 2011/12/21 18:01:58
|
version 1.1055, 2012/01/31 23:47:15
|
Line 154 sub ssi_with_retries {
|
Line 154 sub ssi_with_retries {
|
# ----------------------------------------------- Filetypes/Languages/Copyright |
# ----------------------------------------------- Filetypes/Languages/Copyright |
my %language; |
my %language; |
my %supported_language; |
my %supported_language; |
|
my %latex_language; # For choosing hyphenation in <transl..> |
|
my %latex_language_bykey; # for choosing hyphenation from metadata |
my %cprtag; |
my %cprtag; |
my %scprtag; |
my %scprtag; |
my %fe; my %fd; my %fm; |
my %fe; my %fd; my %fm; |
Line 186 BEGIN {
|
Line 188 BEGIN {
|
while (my $line = <$fh>) { |
while (my $line = <$fh>) { |
next if ($line=~/^\#/); |
next if ($line=~/^\#/); |
chomp($line); |
chomp($line); |
my ($key,$two,$country,$three,$enc,$val,$sup)=(split(/\t/,$line)); |
my ($key,$two,$country,$three,$enc,$val,$sup,$latex)=(split(/\t/,$line)); |
$language{$key}=$val.' - '.$enc; |
$language{$key}=$val.' - '.$enc; |
if ($sup) { |
if ($sup) { |
$supported_language{$key}=$sup; |
$supported_language{$key}=$sup; |
} |
} |
|
if ($latex) { |
|
$latex_language_bykey{$key} = $latex; |
|
$latex_language{$two} = $latex; |
|
} |
} |
} |
close($fh); |
close($fh); |
} |
} |
Line 3227 sub languagedescription {
|
Line 3233 sub languagedescription {
|
($supported_language{$code}?' ('.&mt('interface available').')':''); |
($supported_language{$code}?' ('.&mt('interface available').')':''); |
} |
} |
|
|
|
=pod |
|
|
|
=item * &plainlanguagedescription |
|
|
|
Returns both the plain language description (e.g. 'Creoles and Pidgins, English-based (Other)') |
|
and the language character encoding (e.g. ISO) separated by a ' - ' string. |
|
|
|
=cut |
|
|
sub plainlanguagedescription { |
sub plainlanguagedescription { |
my $code=shift; |
my $code=shift; |
return $language{$code}; |
return $language{$code}; |
} |
} |
|
|
|
=pod |
|
|
|
=item * &supportedlanguagecode |
|
|
|
Returns the supported language code (e.g. sptutf maps to pt) given a language |
|
code. |
|
|
|
=cut |
|
|
sub supportedlanguagecode { |
sub supportedlanguagecode { |
my $code=shift; |
my $code=shift; |
return $supported_language{$code}; |
return $supported_language{$code}; |
Line 3239 sub supportedlanguagecode {
|
Line 3263 sub supportedlanguagecode {
|
|
|
=pod |
=pod |
|
|
|
=item * &latexlanguage() |
|
|
|
Given a language key code returns the correspondnig language to use |
|
to select the correct hyphenation on LaTeX printouts. This is undef if there |
|
is no supported hyphenation for the language code. |
|
|
|
=cut |
|
|
|
sub latexlanguage { |
|
my $code = shift; |
|
return $latex_language{$code}; |
|
} |
|
|
|
=pod |
|
|
|
=item * &latexhyphenation() |
|
|
|
Same as above but what's supplied is the language as it might be stored |
|
in the metadata. |
|
|
|
=cut |
|
|
|
sub latexhyphenation { |
|
my $key = shift; |
|
return $latex_language_bykey{$key}; |
|
} |
|
|
|
=pod |
|
|
=item * ©rightids() |
=item * ©rightids() |
|
|
returns list of all copyrights |
returns list of all copyrights |
Line 4980 body {
|
Line 5033 body {
|
a:focus, |
a:focus, |
a:focus img { |
a:focus img { |
color: red; |
color: red; |
background: yellow; |
|
} |
} |
|
|
form, .inline { |
form, .inline { |
Line 5075 div.LC_confirm_box .LC_success img {
|
Line 5127 div.LC_confirm_box .LC_success img {
|
} |
} |
|
|
.LC_discussion { |
.LC_discussion { |
background: $tabbg; |
background: $data_table_dark; |
border: 1px solid black; |
border: 1px solid black; |
margin: 2px; |
margin: 2px; |
} |
} |
|
|
.LC_disc_action_links_bar { |
|
background: $tabbg; |
|
border: none; |
|
margin: 4px; |
|
} |
|
|
|
.LC_disc_action_left { |
.LC_disc_action_left { |
|
background: $sidebg; |
text-align: left; |
text-align: left; |
|
padding: 4px; |
|
margin: 2px; |
} |
} |
|
|
.LC_disc_action_right { |
.LC_disc_action_right { |
|
background: $sidebg; |
text-align: right; |
text-align: right; |
|
padding: 4px; |
|
margin: 2px; |
} |
} |
|
|
.LC_disc_new_item { |
.LC_disc_new_item { |
background: white; |
background: white; |
border: 2px solid red; |
border: 2px solid red; |
margin: 2px; |
margin: 4px; |
|
padding: 4px; |
} |
} |
|
|
.LC_disc_old_item { |
.LC_disc_old_item { |
background: white; |
background: white; |
border: 1px solid black; |
margin: 4px; |
margin: 2px; |
padding: 4px; |
} |
} |
|
|
table.LC_pastsubmission { |
table.LC_pastsubmission { |
Line 5225 td.LC_table_cell_checkbox {
|
Line 5278 td.LC_table_cell_checkbox {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
li.LC_menubuttons_inline_text img,a { |
li.LC_menubuttons_inline_text img { |
cursor:pointer; |
cursor:pointer; |
text-decoration: none; |
text-decoration: none; |
} |
} |
Line 6080 div.LC_createcourse {
|
Line 6133 div.LC_createcourse {
|
display:none; |
display:none; |
} |
} |
|
|
a:hover, |
|
ol.LC_primary_menu a:hover, |
ol.LC_primary_menu a:hover, |
ol#LC_MenuBreadcrumbs a:hover, |
ol#LC_MenuBreadcrumbs a:hover, |
ol#LC_PathBreadcrumbs a:hover, |
ol#LC_PathBreadcrumbs a:hover, |
Line 6314 ul.LC_TabContent li.active a {
|
Line 6366 ul.LC_TabContent li.active a {
|
background:#FFFFFF; |
background:#FFFFFF; |
outline: none; |
outline: none; |
} |
} |
|
|
|
ul.LC_TabContent li.goback { |
|
float: left; |
|
border-left: none; |
|
} |
|
|
#maincoursedoc { |
#maincoursedoc { |
clear:both; |
clear:both; |
} |
} |
Line 6563 a#LC_content_toolbar_changefolder_toggle
|
Line 6621 a#LC_content_toolbar_changefolder_toggle
|
background-image:url(/res/adm/pages/open-all-folders.gif); |
background-image:url(/res/adm/pages/open-all-folders.gif); |
} |
} |
|
|
|
a#LC_content_toolbar_edittoplevel { |
|
background-image:url(/res/adm/pages/edittoplevel.gif); |
|
} |
|
|
ul#LC_toolbar li a:hover { |
ul#LC_toolbar li a:hover { |
background-position: bottom center; |
background-position: bottom center; |
} |
} |
Line 6969 sub end_page {
|
Line 7031 sub end_page {
|
|
|
sub wishlist_window { |
sub wishlist_window { |
return(<<'ENDWISHLIST'); |
return(<<'ENDWISHLIST'); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
// <!-- BEGIN LON-CAPA Internal |
// <!-- BEGIN LON-CAPA Internal |
function set_wishlistlink(title, path) { |
function set_wishlistlink(title, path) { |
Line 6991 ENDWISHLIST
|
Line 7053 ENDWISHLIST
|
|
|
sub modal_window { |
sub modal_window { |
return(<<'ENDMODAL'); |
return(<<'ENDMODAL'); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
// <!-- BEGIN LON-CAPA Internal |
// <!-- BEGIN LON-CAPA Internal |
var modalWindow = { |
var modalWindow = { |
Line 7035 ENDMODAL
|
Line 7097 ENDMODAL
|
} |
} |
|
|
sub modal_link { |
sub modal_link { |
my ($link,$linktext,$width,$height,$target,$scrolling)=@_; |
my ($link,$linktext,$width,$height,$target,$scrolling,$title)=@_; |
unless ($width) { $width=480; } |
unless ($width) { $width=480; } |
unless ($height) { $height=400; } |
unless ($height) { $height=400; } |
unless ($scrolling) { $scrolling='yes'; } |
unless ($scrolling) { $scrolling='yes'; } |
return '<a href="'.$link.'" target="'.$target.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'. |
return '<a href="'.$link.'" target="'.$target.'" title="'.$title.'" onclick="openMyModal(\''.$link.'\','.$width.','.$height.',\''.$scrolling.'\'); return false;">'. |
$linktext.'</a>'; |
$linktext.'</a>'; |
} |
} |
|
|
sub modal_adhoc_script { |
sub modal_adhoc_script { |
my ($funcname,$width,$height,$content)=@_; |
my ($funcname,$width,$height,$content)=@_; |
return (<<ENDADHOC); |
return (<<ENDADHOC); |
<script type="text/javascript" lang="javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
var $funcname = function() |
var $funcname = function() |
{ |
{ |
Line 7142 sub end_togglebox {
|
Line 7204 sub end_togglebox {
|
} |
} |
|
|
sub LCprogressbar_script { |
sub LCprogressbar_script { |
|
my ($id)=@_; |
return(<<ENDPROGRESS); |
return(<<ENDPROGRESS); |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
var LCprogressTxt='---'; |
\$('#progressbar$id').progressbar({ |
|
|
\$('#progressbar').progressbar({ |
|
value: 0, |
value: 0, |
change: function(event, ui) { |
change: function(event, ui) { |
var newVal = \$(this).progressbar('option', 'value'); |
var newVal = \$(this).progressbar('option', 'value'); |
Line 7167 sub LCprogressbarUpdate_script {
|
Line 7228 sub LCprogressbarUpdate_script {
|
</style> |
</style> |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
function LCupdateProgress(percent,progresstext) { |
var LCprogressTxt='---'; |
|
|
|
function LCupdateProgress(percent,progresstext,id) { |
LCprogressTxt=progresstext; |
LCprogressTxt=progresstext; |
\$('#progressbar').progressbar('value',percent); |
\$('#progressbar'+id).progressbar('value',percent); |
} |
} |
// ]]> |
// ]]> |
</script> |
</script> |
Line 7177 ENDPROGRESSUPDATE
|
Line 7240 ENDPROGRESSUPDATE
|
} |
} |
|
|
my $LClastpercent; |
my $LClastpercent; |
|
my $LCidcnt; |
|
my $LCcurrentid; |
|
|
sub LCprogressbar { |
sub LCprogressbar { |
my ($r)=(@_); |
my ($r)=(@_); |
$LClastpercent=0; |
$LClastpercent=0; |
|
$LCidcnt++; |
|
$LCcurrentid=$$.'_'.$LCidcnt; |
my $starting=&mt('Starting'); |
my $starting=&mt('Starting'); |
my $content=(<<ENDPROGBAR); |
my $content=(<<ENDPROGBAR); |
<p> |
<p> |
<div id="progressbar"> |
<div id="progressbar$LCcurrentid"> |
<span class="pblabel">$starting</span> |
<span class="pblabel">$starting</span> |
</div> |
</div> |
</p> |
</p> |
ENDPROGBAR |
ENDPROGBAR |
$r->print($content.&LCprogressbar_script()); |
&r_print($r,$content.&LCprogressbar_script($LCcurrentid)); |
$r->rflush(); |
|
} |
} |
|
|
sub LCprogressbarUpdate { |
sub LCprogressbarUpdate { |
Line 7207 sub LCprogressbarUpdate {
|
Line 7273 sub LCprogressbarUpdate {
|
$LClastpercent=$val; |
$LClastpercent=$val; |
unless ($text) { $text=$val.'%'; } |
unless ($text) { $text=$val.'%'; } |
$text=&js_ready($text); |
$text=&js_ready($text); |
$r->print(<<ENDUPDATE); |
&r_print($r,<<ENDUPDATE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
LCupdateProgress($val,'$text'); |
LCupdateProgress($val,'$text','$LCcurrentid'); |
// ]]> |
// ]]> |
</script> |
</script> |
ENDUPDATE |
ENDUPDATE |
$r->rflush(); |
|
} |
} |
|
|
sub LCprogressbarClose { |
sub LCprogressbarClose { |
my ($r)=@_; |
my ($r)=@_; |
$LClastpercent=0; |
$LClastpercent=0; |
$r->print(<<ENDCLOSE); |
&r_print($r,<<ENDCLOSE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
\$("#progressbar").hide('slow'); |
\$("#progressbar$LCcurrentid").hide('slow'); |
// ]]> |
// ]]> |
</script> |
</script> |
ENDCLOSE |
ENDCLOSE |
$r->rflush(); |
} |
|
|
|
sub r_print { |
|
my ($r,$to_print)=@_; |
|
if ($r) { |
|
$r->print($to_print); |
|
$r->rflush(); |
|
} else { |
|
print($to_print); |
|
} |
} |
} |
|
|
sub html_encode { |
sub html_encode { |
Line 7237 sub html_encode {
|
Line 7311 sub html_encode {
|
|
|
return $result; |
return $result; |
} |
} |
|
|
sub js_ready { |
sub js_ready { |
my ($result) = @_; |
my ($result) = @_; |
|
|
Line 9633 sub check_for_traversal {
|
Line 9708 sub check_for_traversal {
|
return $cleanpath; |
return $cleanpath; |
} |
} |
|
|
|
sub is_archive_file { |
|
my ($mimetype) = @_; |
|
if (($mimetype eq 'application/octet-stream') || |
|
($mimetype eq 'application/x-stuffit') || |
|
($mimetype =~ m{^application/(x\-)?(compressed|tar|zip|tgz|gz|gtar|gzip|gunzip|bz|bz2|bzip2)})) { |
|
return 1; |
|
} |
|
return; |
|
} |
|
|
|
sub decompress_form { |
|
my ($mimetype,$archiveurl,$action,$noextract,$hiddenelements) = @_; |
|
my %lt = &Apache::lonlocal::texthash ( |
|
this => 'This file is an archive file.', |
|
youm => 'You may wish to extract its contents.', |
|
camt => 'Extraction of contents is recommended for Camtasia zip files.', |
|
perm => 'Permanently remove archive file after extraction of contents?', |
|
extr => 'Extract contents', |
|
yes => 'Yes', |
|
no => 'No', |
|
); |
|
my $output = '<p>'.$lt{'this'}.' '.$lt{'youm'}.'<br />'; |
|
if ($mimetype =~ m{^application/(x\-)?(compressed|zip)}) { |
|
$output .= $lt{'camt'}; |
|
} |
|
$output .= '</p>'; |
|
$output .= <<"START"; |
|
<p> |
|
$lt{'this'} $lt{'youm'} |
|
</p> |
|
<div id="uploadfileresult"> |
|
<form name="uploaded_decompress" action="$action" method="post"> |
|
<input type="hidden" name="archiveurl" value="$archiveurl" /> |
|
START |
|
if (ref($hiddenelements) eq 'HASH') { |
|
foreach my $hidden (sort(keys(%{$hiddenelements}))) { |
|
$output .= '<input type="hidden" name="'.$hidden.'" value="'.$hiddenelements->{$hidden}.'" />'."\n"; |
|
} |
|
} |
|
$output .= <<"END"; |
|
<span class="LC_nobreak">$lt{'perm'} |
|
<label><input type="radio" name="archivedelete" value="0" checked="checked" />$lt{'no'}</label> |
|
<label><input type="radio" name="archivedelete" value="1" />$lt{'yes'}</label></span><br /> |
|
<input type="submit" name="decompress" value="$lt{'extr'}" /> |
|
</form> |
|
$noextract |
|
</div> |
|
END |
|
return $output; |
|
} |
|
|
|
sub decompress_uploaded_file { |
|
my ($file,$dir) = @_; |
|
&Apache::lonnet::appenv({'cgi.file' => $file}); |
|
&Apache::lonnet::appenv({'cgi.dir' => $dir}); |
|
my $result = &Apache::lonnet::ssi_body('/cgi-bin/decompress.pl'); |
|
my ($handle) = ($env{'user.environment'} =~m{/([^/]+)\.id$}); |
|
my $lonidsdir = $Apache::lonnet::perlvar{'lonIDsDir'}; |
|
&Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle,1); |
|
my $decompressed = $env{'cgi.decompressed'}; |
|
&Apache::lonnet::delenv('cgi.file'); |
|
&Apache::lonnet::delenv('cgi.dir'); |
|
&Apache::lonnet::delenv('cgi.decompressed'); |
|
return ($decompressed,$result); |
|
} |
|
|
|
sub process_decompression { |
|
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_; |
|
my ($dir,$error,$warning,$output); |
|
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) { |
|
$error = &mt('File name not a supported archive file type.'). |
|
'<br />'.&mt('File name should end with one of: [_1].', |
|
'.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz'); |
|
} else { |
|
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
|
if ($docuhome eq 'no_host') { |
|
$error = &mt('Could not determine home server for course.'); |
|
} else { |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my $currdir = "$dir_root/$destination"; |
|
my ($currdirlistref,$currlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom,$docuname,1); |
|
if (grep(/^\Q$docuhome\E$/,@ids)) { |
|
$dir = &LONCAPA::propath($docudom,$docuname). |
|
"$dir_root/$destination"; |
|
} else { |
|
$dir = $Apache::lonnet::perlvar{'lonDocRoot'}. |
|
"$dir_root/$docudom/$docuname/$destination"; |
|
unless (&Apache::lonnet::repcopy_userfile("$dir/$file") eq 'ok') { |
|
$error = &mt('Archive file not found.'); |
|
} |
|
} |
|
if ($dir eq '') { |
|
$error = &mt('Directory containing archive file unavailable.'); |
|
} elsif (!$error) { |
|
my ($decompressed,$display) = &decompress_uploaded_file($file,$dir); |
|
if ($decompressed eq 'ok') { |
|
$output = &mt('Files extracted successfully from archive.').'<br />'; |
|
my ($warning,$result,@contents); |
|
my ($newdirlistref,$newlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom, |
|
$docuname,1); |
|
my (%is_dir,%changes,@newitems); |
|
my $dirptr = 16384; |
|
if (ref($currdirlistref) eq 'ARRAY') { |
|
my @curritems; |
|
foreach my $dir_line (@{$currdirlistref}) { |
|
my ($item,$rest)=split(/\&/,$dir_line,2); |
|
unless ($item =~ /\.+$/) { |
|
push(@curritems,$item); |
|
} |
|
} |
|
if (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,4); |
|
unless ($item =~ /^\.+$/) { |
|
if ($dirptr&$testdir) { |
|
$is_dir{$item} = 1; |
|
} |
|
push(@newitems,$item); |
|
} |
|
} |
|
my @diffs = &compare_arrays(\@curritems,\@newitems); |
|
if (@diffs > 0) { |
|
foreach my $item (@diffs) { |
|
$changes{$item} = 1; |
|
} |
|
} |
|
} |
|
} elsif (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
|
unless ($item =~ /\.+$/) { |
|
push(@newitems,$item); |
|
if ($dirptr&$testdir) { |
|
$is_dir{$item} = 1; |
|
} |
|
$changes{$item} = 1; |
|
} |
|
} |
|
} |
|
if (keys(%changes) > 0) { |
|
foreach my $item (sort(@newitems)) { |
|
if ($changes{$item}) { |
|
push(@contents,$item); |
|
} |
|
} |
|
} |
|
if (@contents > 0) { |
|
my (%children,%parent); |
|
my $wantform = 1; |
|
my ($count,$datatable) = &get_extracted($docudom,$docuname, |
|
$currdir,\%is_dir, |
|
\%children,\%parent, |
|
\@contents,$wantform); |
|
if ($datatable ne '') { |
|
$output .= &archive_options_form('decompressed',$datatable, |
|
$count,$hiddenelem); |
|
my $startcount = 3; |
|
$output .= &archive_javascript($startcount,$count, |
|
%children); |
|
} |
|
} else { |
|
$warning = &mt('No new items extracted from archive file.'); |
|
} |
|
} else { |
|
$output = $display; |
|
$error = &mt('An error occurred during extraction from the archive file.'); |
|
} |
|
} |
|
} |
|
} |
|
if ($error) { |
|
$output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
$error.'</p>'."\n"; |
|
} |
|
if ($warning) { |
|
$output .= '<p class="LC_warning">'.$warning.'</p>'."\n"; |
|
} |
|
return $output; |
|
} |
|
|
|
sub get_extracted { |
|
my ($docudom,$docuname,$currdir,$is_dir,$children,$parent,$contents,$wantform) = @_; |
|
my $count = 0; |
|
my $lastcontainer = 0; |
|
my $depth = 0; |
|
my $datatable; |
|
return unless ((ref($is_dir) eq 'HASH') && (ref($children) eq 'HASH') && |
|
(ref($parent) eq 'HASH') && (ref($contents) eq 'ARRAY')); |
|
foreach my $item (@{$contents}) { |
|
$count ++; |
|
&archive_hierarchy($depth,$count,$parent,$children); |
|
if ($wantform) { |
|
$datatable .= &archive_row($is_dir->{$item},$item, |
|
$currdir,$depth,$count); |
|
} |
|
if ($is_dir->{$item}) { |
|
$depth ++; |
|
$lastcontainer = $count; |
|
$parent->{$depth} = $lastcontainer; |
|
$datatable .= |
|
&recurse_extracted_archive("$currdir/$item",$docudom,$docuname, |
|
\$depth,\$count,\$lastcontainer, |
|
$children,$parent,$wantform); |
|
$depth --; |
|
$lastcontainer = $parent->{$depth}; |
|
} |
|
} |
|
return ($count,$datatable); |
|
} |
|
|
|
sub recurse_extracted_archive { |
|
my ($currdir,$docudom,$docuname,$depth,$count,$lastcontainer, |
|
$children,$parent,$wantform) = @_; |
|
my $result=''; |
|
unless ((ref($depth)) && (ref($count)) && (ref($lastcontainer)) && |
|
(ref($children) eq 'HASH') && (ref($parent) eq 'HASH')) { |
|
return $result; |
|
} |
|
my $dirptr = 16384; |
|
my ($newdirlistref,$newlisterror) = |
|
&Apache::lonnet::dirlist($currdir,$docudom,$docuname,1); |
|
if (ref($newdirlistref) eq 'ARRAY') { |
|
foreach my $dir_line (@{$newdirlistref}) { |
|
my ($item,undef,undef,$testdir)=split(/\&/,$dir_line,5); |
|
unless ($item =~ /^\.+$/) { |
|
$$count ++; |
|
&archive_hierarchy($$depth,$$count,$parent,$children); |
|
my $is_dir; |
|
if ($dirptr&$testdir) { |
|
$is_dir = 1; |
|
} |
|
if ($wantform) { |
|
$result .= &archive_row($is_dir,$item,$currdir,$$depth,$$count); |
|
} |
|
if ($is_dir) { |
|
$$depth ++; |
|
$$lastcontainer = $$count; |
|
$parent->{$$depth} = $$lastcontainer; |
|
$result .= |
|
&recurse_extracted_archive("$currdir/$item",$docudom, |
|
$docuname,$depth,$count, |
|
$lastcontainer,$children, |
|
$parent,$wantform); |
|
$$depth --; |
|
$$lastcontainer = $parent->{$$depth}; |
|
} |
|
} |
|
} |
|
} |
|
return $result; |
|
} |
|
|
|
sub archive_hierarchy { |
|
my ($depth,$count,$parent,$children) =@_; |
|
if ((ref($parent) eq 'HASH') && (ref($children) eq 'HASH')) { |
|
if (exists($parent->{$depth})) { |
|
$children->{$parent->{$depth}} .= $count.':'; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub archive_row { |
|
my ($is_dir,$item,$currdir,$depth,$count) = @_; |
|
my ($name) = ($item =~ m{([^/]+)$}); |
|
my %choices = &Apache::lonlocal::texthash ( |
|
'display' => 'Add as File', |
|
'dependency' => 'Include as dependency', |
|
'discard' => 'Discard', |
|
); |
|
if ($is_dir) { |
|
$choices{'display'} = &mt('Add as Folder'); |
|
} |
|
my $output = &start_data_table_row()."\n"; |
|
foreach my $action ('display','dependency','discard') { |
|
$output .= '<td><span class="LC_nobreak">'. |
|
'<label><input type="radio" name="archive_'.$count. |
|
'" id="archive_'.$action.'_'.$count.'" value="'.$action.'"'; |
|
my $text = $choices{$action}; |
|
if ($is_dir) { |
|
$output .= ' onclick="javascript:propagateCheck(this.form,'."'$count'".');"'; |
|
if ($action eq 'display') { |
|
$text = &mt('Add as Folder'); |
|
} |
|
} |
|
$output .= ' /> '.$choices{$action}.'</label></span></td>'; |
|
} |
|
$output .= '<td><input type="hidden" name="archive_content_'.$count.'" value="'. |
|
&HTML::Entities::encode("$currdir/$item",'"<>&').'" />'.(' ' x 2); |
|
for (my $i=0; $i<$depth; $i++) { |
|
$output .= ('<img src="/adm/lonIcons/whitespace1.gif" class="LC_docs_spacer" alt="" />' x2)."\n"; |
|
} |
|
if ($is_dir) { |
|
$output .= '<img src="/adm/lonIcons/navmap.folder.open.gif" alt="" /> '."\n". |
|
'<input type="hidden" name="archive_directory" value="'.$count.'" />'."\n"; |
|
} else { |
|
$output .= '<input type="hidden" name="archive_file" value="'.$count.'" />'."\n"; |
|
} |
|
$output .= ' '.$name.'</td>'."\n". |
|
&end_data_table_row(); |
|
return $output; |
|
} |
|
|
|
sub archive_options_form { |
|
my ($form,$output,$count,$hiddenelem) = @_; |
|
return '<form name="'.$form.'" method="post" action="">'."\n". |
|
'<input type="hidden" name="phase" value="decompress_cleanup" />'."\n". |
|
'<p>'. |
|
&mt('How should each item be incorporated in the course?'). |
|
'</p>'. |
|
'<div class="LC_columnSection"><fieldset>'. |
|
'<legend>'.&mt('Content actions for all').'</legend>'. |
|
'<input type="button" value="'.&mt('Display in Contents').'" '. |
|
'onclick="javascript:checkAll(document.'.$form.",'display'".')" />'. |
|
' <input type="button" value="'.&mt('Include as dependency for a displayed item').'"'. |
|
' onclick="javascript:checkAll(document.'.$form.",'dependency'".')" />'. |
|
' <input type="button" value="'.&mt('Discard').'"'. |
|
' onclick="javascript:checkAll(document.'.$form.",'discard'".')" />'. |
|
'</fieldset></div>'. |
|
&start_data_table()."\n". |
|
$output."\n". |
|
&end_data_table()."\n". |
|
'<input type="hidden" name="archive_count" value="'.$count.'" />'. |
|
$hiddenelem. |
|
'<br /><input type="submit" name="archive_submit" value="'.&mt('Save').'" />'. |
|
'</form>'; |
|
} |
|
|
|
sub archive_javascript { |
|
my ($startcount,$numitems,%children) = @_; |
|
my $scripttag = <<START; |
|
<script type="text/javascript"> |
|
// <![CDATA[ |
|
|
|
function checkAll(form,prefix) { |
|
var idstr = new RegExp("^archive_"+prefix+"_\\\\d+\$"); |
|
for (var i=0; i < form.elements.length; i++) { |
|
var id = form.elements[i].id; |
|
if ((id != '') && (id != undefined)) { |
|
if (idstr.test(id)) { |
|
if (form.elements[i].type == 'radio') { |
|
form.elements[i].checked = true; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
function propagateCheck(form,count) { |
|
if (count > 0) { |
|
var startelement = $startcount + (count-1) * 5; |
|
for (var j=1; j<4; j++) { |
|
var item = startelement + j; |
|
if (form.elements[item].type == 'radio') { |
|
if (form.elements[item].checked) { |
|
containerCheck(form,count,j); |
|
break; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
numitems = $numitems |
|
var parents = new Array(numitems) |
|
for (var i=0; i<numitems; i++) { |
|
parents[i] = new Array |
|
} |
|
|
|
START |
|
|
|
foreach my $container (sort { $a <=> $b } (keys(%children))) { |
|
my @contents = split(/:/,$children{$container}); |
|
for (my $i=0; $i<@contents; $i ++) { |
|
$scripttag .= 'parents['.$container.']['.$i.'] = '.$contents[$i]."\n"; |
|
} |
|
} |
|
|
|
$scripttag .= <<END; |
|
|
|
function containerCheck(form,count,offset) { |
|
if (count > 0) { |
|
var item = $startcount + ((count-1) * 5) + offset; |
|
form.elements[item].checked = true; |
|
if(Object.prototype.toString.call(parents[count]) === '[object Array]') { |
|
if (parents[count].length > 0) { |
|
for (var j=0; j<parents[count].length; j++) { |
|
containerCheck(form,parents[count][j],offset) |
|
} |
|
} |
|
} |
|
} |
|
} |
|
// ]]> |
|
</script> |
|
END |
|
return $scripttag; |
|
} |
|
|
|
sub process_extracted_files { |
|
my ($context,$docudom,$docuname,$destination,$dir_root,$hiddenelem) = @_; |
|
my $numitems = $env{'form.archive_count'}; |
|
return unless ($numitems); |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my ($prefix,$pathtocheck,$dir,$ishome,$error,$warning,%toplevelitems,%is_dir, |
|
%folders,%containers,%mapinner); |
|
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom); |
|
if (grep(/^\Q$docuhome\E$/,@ids)) { |
|
$prefix = &LONCAPA::propath($docudom,$docuname); |
|
$pathtocheck = "$dir_root/$destination"; |
|
$dir = $dir_root; |
|
$ishome = 1; |
|
} else { |
|
$prefix = $Apache::lonnet::perlvar{'lonDocRoot'}; |
|
$pathtocheck = "$dir_root/$docudom/$docuname/$destination"; |
|
$dir = "$dir_root/$docudom/$docuname"; |
|
} |
|
my $currdir = "$dir_root/$destination"; |
|
(my $docstype,$mapinner{'0'}) = ($destination =~ m{^(docs|supplemental)/(\w+)/}); |
|
if ($env{'form.folderpath'}) { |
|
my @items = split('&',$env{'form.folderpath'}); |
|
$folders{'0'} = $items[-2]; |
|
$containers{'0'}='sequence'; |
|
} elsif ($env{'form.pagepath'}) { |
|
my @items = split('&',$env{'form.pagepath'}); |
|
$folders{'0'} = $items[-2]; |
|
$containers{'0'}='page'; |
|
} |
|
my @archdirs = &get_env_multiple('form.archive_directory'); |
|
if ($numitems) { |
|
for (my $i=1; $i<=$numitems; $i++) { |
|
my $path = $env{'form.archive_content_'.$i}; |
|
if ($path =~ m{^\Q$pathtocheck\E/([^/]+)$}) { |
|
my $item = $1; |
|
$toplevelitems{$item} = $i; |
|
if (grep(/^\Q$i\E$/,@archdirs)) { |
|
$is_dir{$item} = 1; |
|
} |
|
} |
|
} |
|
} |
|
my ($output,%children,%parent); |
|
if (keys(%toplevelitems) > 0) { |
|
my @contents = sort(keys(%toplevelitems)); |
|
my ($count,undef) = &get_extracted($docudom,$docuname,$currdir,\%is_dir, |
|
\%children,\%parent,\@contents); |
|
} |
|
my (@above,%hierarchy,%referrer,%orphaned,%todelete); |
|
foreach my $depth (sort { $a <=> $b } keys(%parent)) { |
|
push(@above,$parent{$depth}); |
|
foreach my $item (split(/:/,$children{$parent{$depth}})) { |
|
$hierarchy{$item} = \@above; |
|
} |
|
} |
|
if ($numitems) { |
|
for (my $i=1; $i<=$numitems; $i++) { |
|
my $path = $env{'form.archive_content_'.$i}; |
|
if ($path =~ /^\Q$pathtocheck\E/) { |
|
if ($env{'form.archive_'.$i} eq 'discard') { |
|
if ($prefix ne '' && $path ne '') { |
|
if (-e $prefix.$path) { |
|
$todelete{$prefix.$path} = 1; |
|
} |
|
} |
|
} elsif ($env{'form.archive_'.$i} eq 'display') { |
|
my ($title,$url,$outer); |
|
($title) = ($path =~ m{/([^/]+)$}); |
|
$outer = 0; |
|
if (ref($hierarchy{$i}) eq 'ARRAY') { |
|
if (@{$hierarchy{$i}} > 0) { |
|
foreach my $item (reverse(@{$hierarchy{$i}})) { |
|
if ($env{'form.archive_'.$item} eq 'display') { |
|
$outer = $item; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
my ($errtext,$fatal) = |
|
&LONCAPA::map::mapread('/uploaded/'.$docudom.'/'.$docuname. |
|
'/'.$folders{$outer}.'.'. |
|
$containers{$outer}); |
|
next if ($fatal); |
|
if ((@archdirs > 0) && (grep(/^\Q$i\E$/,@archdirs))) { |
|
if ($context eq 'coursedocs') { |
|
$mapinner{$i} = time; |
|
$folders{$i} = 'default_'.$mapinner{$i}; |
|
$containers{$i} = 'sequence'; |
|
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
|
$folders{$i}.'.'.$containers{$i}; |
|
my $newidx = &LONCAPA::map::getresidx(); |
|
$LONCAPA::map::resources[$newidx]= |
|
$title.':'.$url.':false:normal:res'; |
|
push(@LONCAPA::map::order,$newidx); |
|
my ($outtext,$errtext) = |
|
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
|
$docuname.'/'.$folders{$outer}. |
|
'.'.$containers{$outer},1); |
|
} |
|
} else { |
|
if ($context eq 'coursedocs') { |
|
my $newidx=&LONCAPA::map::getresidx(); |
|
my $url = '/uploaded/'.$docudom.'/'.$docuname.'/'. |
|
$docstype.'/'.$mapinner{$outer}.'/'.$newidx.'/'. |
|
$title; |
|
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}") { |
|
mkdir("$prefix$dir/$docstype/$mapinner{$outer}",0755); |
|
} |
|
if (!-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
|
mkdir("$prefix$dir/$docstype/$mapinner{$outer}/$newidx"); |
|
} |
|
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx") { |
|
system("mv $prefix$path $prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title"); |
|
} |
|
$LONCAPA::map::resources[$newidx]= |
|
$title.':'.$url.':false:normal:res'; |
|
push(@LONCAPA::map::order, $newidx); |
|
my ($outtext,$errtext)= |
|
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'. |
|
$docuname.'/'.$folders{$outer}. |
|
'.'.$containers{$outer},1); |
|
} |
|
} |
|
} elsif ($env{'form.archive_'.$i} eq 'dependency') { |
|
if (ref($hierarchy{$i}) eq 'ARRAY') { |
|
foreach my $item (reverse(@{$hierarchy{$i}})) { |
|
if ($env{'form.archive_'.$item} eq 'display') { |
|
$referrer{$i} = $item; |
|
last; |
|
#FIXME identify as dependency in db file |
|
#FIXME need to move item to referrer location |
|
#FIXME need to setup httprefs so access allowed |
|
} elsif ($env{'form.archive_'.$item} eq 'discard') { |
|
$orphaned{$i} = $item; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
$warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'<br />'; |
|
} |
|
} |
|
if (keys(%todelete)) { |
|
foreach my $key (keys(%todelete)) { |
|
unlink($key); |
|
unless ($ishome) { |
|
#FIXME Need to notify homeserver to delete files. |
|
} |
|
} |
|
} |
|
} else { |
|
$warning = &mt('No items found in archive.'); |
|
} |
|
if ($error) { |
|
$output .= '<p class="LC_error">'.&mt('Not extracted.').'<br />'. |
|
$error.'</p>'."\n"; |
|
} |
|
if ($warning) { |
|
$output .= '<p class="LC_warning">'.$warning.'</p>'."\n"; |
|
} |
|
return $output; |
|
} |
|
|
=pod |
=pod |
|
|
=item * &get_turnedin_filepath() |
=item * &get_turnedin_filepath() |