X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/6d80bdda7c0cea5fa538733d5ed5c510bb7b1ee1..7f18c1ce48630507b744fa56b83999e8ca684606:/IkiWiki/Plugin/attachment.pm diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index 490014a7e..d56dd18ad 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -116,9 +116,10 @@ sub formbuilder_setup (@) { $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") { + # Save attachments in holding area before previewing and + # saving. + if ($form->submitted eq "Preview" || + $form->submitted eq "Save Page") { attachments_save($form, $params{session}); } } @@ -147,7 +148,7 @@ sub formbuilder (@) { $f=Encode::decode_utf8($f); $f=~s/^$page\///; if (IkiWiki::isinlinableimage($f) && - UNIVERSAL::can("IkiWiki::Plugin::img", "import")) { + IkiWiki::Plugin::img->can("import")) { $add.='[[!img '.$f.' align="right" size="" alt=""]]'; } else { @@ -228,8 +229,10 @@ sub attachment_store { check_canattach($session, $final_filename, $tempfile); }; if ($@) { - json_response($q, $dest."/".$filename, $@); - error $@; + # save error in case called functions clobber $@ + my $error = $@; + json_response($q, $form, $dest."/".$filename, $error); + error $error; } # Move the attachment into holding directory. @@ -259,7 +262,7 @@ sub attachment_store { }); } - json_response($q, $dest."/".$filename, stored_msg()); + json_response($q, $form, $dest."/".$filename, stored_msg()); } # Save all stored attachments for a page. @@ -271,18 +274,21 @@ sub attachments_save { my @attachments; my $dir=attachment_holding_location($form->field('page')); foreach my $filename (glob("$dir/*")) { + $filename=Encode::decode_utf8($filename); next unless -f $filename; - my $dest=$config{srcdir}."/". - linkpage(IkiWiki::possibly_foolish_untaint( - attachment_location($form->field('page')))). - IkiWiki::basename($filename); + my $destdir=linkpage(IkiWiki::possibly_foolish_untaint( + attachment_location($form->field('page')))); + my $absdestdir=$config{srcdir}."/".$destdir; + my $destfile=IkiWiki::basename($filename); + my $dest=$absdestdir.$destfile; unlink($dest); + IkiWiki::prep_writefile($destfile, $absdestdir); rename($filename, $dest); - push @attachments, $dest; + push @attachments, $destdir.$destfile; } return unless @attachments; require IkiWiki::Render; - IkiWiki::prune($dir); + IkiWiki::prune($dir, $config{wikistatedir}."/attachments"); # Check the attachments in and trigger a wiki refresh. if ($config{rcs}) { @@ -303,8 +309,8 @@ sub attachment_location ($) { my $page=shift; # Put the attachment in a subdir of the page it's attached - # to, unless that page is an "index" page. - $page=~s/(^|\/)index//; + # to, unless that page is the "index" page. + return "" if $page eq 'index'; $page.="/" if length $page; return $page; @@ -342,6 +348,7 @@ sub attachment_list ($) { my $dir=attachment_holding_location($page); my $heldmsg=gettext("this attachment is not yet saved"); foreach my $file (glob("$dir/*")) { + $file=Encode::decode_utf8($file); next unless -f $file; my $base=IkiWiki::basename($file); my $f=$loc.$base; @@ -360,17 +367,17 @@ sub stored_msg { gettext("just uploaded"); } -sub json_response ($$$) { +sub json_response ($$$$) { my $q=shift; + my $form=shift; my $filename=shift; my $stored_msg=shift; - # for the jquery file upload widget - if ($q->Accept("application/json") >= 1.0 && - grep { /application\/json/i } $q->Accept) { + if (! defined $form->submitted || + $form->submitted ne "Upload Attachment") { eval q{use JSON}; error $@ if $@; - print "Content-type: application/json\n\n"; + print "Content-type: text/html\n\n"; my $size=-s $filename; print to_json([ {