X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/1d951583a6d3718ea5e44b8c52fb2acbe5a989e8..2e086b3263f33d3d42ddbcb451e9995c466929cd:/IkiWiki/Plugin/attachment.pm diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index f46388948..4bd08bf7b 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -10,7 +10,7 @@ sub import { hook(type => "getsetup", id => "attachment", call => \&getsetup); hook(type => "checkconfig", id => "attachment", call => \&checkconfig); hook(type => "formbuilder_setup", id => "attachment", call => \&formbuilder_setup); - hook(type => "formbuilder", id => "attachment", call => \&formbuilder); + hook(type => "formbuilder", id => "attachment", call => \&formbuilder, last => 1); IkiWiki::loadplugin("filecheck"); } @@ -103,6 +103,12 @@ sub formbuilder_setup (@) { else { $form->tmpl_param("attachments-class" => "toggleable-open"); } + + # Save attachments in holding area before previewing so + # they can be seen in the preview. + if ($form->submitted eq "Preview") { + attachments_save($form, $params{session}); + } } } @@ -147,10 +153,25 @@ sub formbuilder (@) { $form->tmpl_param("attachment_list" => [attachment_list($form->field('page'))]); } -sub attachment_holding_dir { - my $page=shift; +sub attachment_holding_location { + my $page=attachment_location(shift); - return $config{wikistatedir}."/attachments/$page"; + my $dir=$config{wikistatedir}."/attachments/". + IkiWiki::possibly_foolish_untaint(linkpage($page)); + $dir=~s/\/$//; + return $dir; +} + +sub is_held_attachment { + my $attachment=shift; + + my $f=attachment_holding_location($attachment); + if (-f $f) { + return $f + } + else { + return undef; + } } # Stores the attachment in a holding area, not yet in the wiki proper. @@ -194,7 +215,7 @@ sub attachment_store { # Move the attachment into holding directory. # Try to use a fast rename; fall back to copying. - my $dest=attachment_holding_dir($form->field('page')); + my $dest=attachment_holding_location($form->field('page')); IkiWiki::prep_writefile($filename, $dest); unlink($dest."/".$filename); if (rename($tempfile, $dest."/".$filename)) { @@ -214,8 +235,7 @@ sub attachment_store { } } binmode($fh); - # Needed for fast_file_copy. - require IkiWiki::Render; + require IkiWiki::Render; writefile($filename, $dest, undef, 1, sub { IkiWiki::fast_file_copy($tempfile, $filename, $fh, @_); }); @@ -229,19 +249,20 @@ sub attachments_save { # Move attachments out of holding directory. my @attachments; - my $dir=attachment_holding_dir($form->field('page')); + my $dir=attachment_holding_location($form->field('page')); foreach my $filename (glob("$dir/*")) { next unless -f $filename; my $dest=$config{srcdir}."/". linkpage(IkiWiki::possibly_foolish_untaint( attachment_location($form->field('page')))). - $filename; + IkiWiki::basename($filename); unlink($dest); rename($filename, $dest); push @attachments, $dest; } return unless @attachments; - rmdir($dir); + require IkiWiki::Render; + IkiWiki::prune($dir); # Check the attachments in and trigger a wiki refresh. if ($config{rcs}) { @@ -273,23 +294,47 @@ sub attachment_list ($) { my $page=shift; my $loc=attachment_location($page); - my @ret; + my $std=sub { + my $file=shift; + my $mtime=shift; + my $size=shift; + + "field-select" => '', + size => IkiWiki::Plugin::filecheck::humansize($size), + mtime => displaytime($mtime), + mtime_raw => $mtime, + }; + + # attachments already in the wiki + my %attachments; foreach my $f (values %pagesources) { if (! defined pagetype($f) && $f=~m/^\Q$loc\E[^\/]+$/) { - push @ret, { - "field-select" => '', + $attachments{$f}={ + $std->($f, $IkiWiki::pagemtime{$f}, (stat($f))[7]), link => htmllink($page, $page, $f, noimageinline => 1), - size => IkiWiki::Plugin::filecheck::humansize((stat($f))[7]), - mtime => displaytime($IkiWiki::pagemtime{$f}), - mtime_raw => $IkiWiki::pagemtime{$f}, }; } } + + # attachments in holding directory + my $dir=attachment_holding_location($page); + my $heldmsg=gettext("this attachment is not yet saved"); + foreach my $file (glob("$dir/*")) { + next unless -f $file; + my $mtime=(stat(_))[9]; + my $base=IkiWiki::basename($file); + my $f=$loc.$base; + $attachments{$f}={ + $std->($f, (stat($file))[9], (stat(_))[7]), + link => "$base", + } + } # Sort newer attachments to the top of the list, so a newly-added # attachment appears just before the form used to add it. - return sort { $b->{mtime_raw} <=> $a->{mtime_raw} || $a->{link} cmp $b->{link} } @ret; + return sort { $b->{mtime_raw} <=> $a->{mtime_raw} || $a->{link} cmp $b->{link} } + values %attachments; } 1