X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/e87c3ae6df9a8abc49879851a1c70a41c49176ed..8441d3153506bc704d97def187c7a77c10fa7e3f:/IkiWiki/Plugin/attachment.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/attachment.pm b/IkiWiki/Plugin/attachment.pm index 8d3d60de6..690b61cbc 100644 --- a/IkiWiki/Plugin/attachment.pm +++ b/IkiWiki/Plugin/attachment.pm @@ -15,12 +15,50 @@ sub checkconfig () { #{{{ $config{cgi_disable_uploads}=0; } #}}} +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//; + $page.="/" if length $page; + + return $page; +} + +sub attachment_list ($) { + my $page=shift; + my $loc=attachment_location($page); + + my @ret; + foreach my $f (values %pagesources) { + if (! defined IkiWiki::pagetype($f) && + $f=~m/^\Q$loc\E[^\/]+$/ && + -e "$config{srcdir}/$f") { + push @ret, { + "field-select" => '', + link => htmllink($page, $page, $f, noimageinline => 1), + size => (stat(_))[7], + mtime => displaytime($IkiWiki::pagemtime{$f}), + }; + } + } + + return @ret; +} + sub formbuilder_setup (@) { #{{{ my %params=@_; my $form=$params{form}; if ($form->field("do") eq "edit") { $form->field(name => 'attachment', type => 'file'); + $form->tmpl_param("attachment_list" => [attachment_list($form->field('page'))]); + + # These buttons are not put in the usual place, so + # is not added to the normal formbuilder button list. + $form->tmpl_param("field-upload" => ''); + $form->tmpl_param("field-link" => ''); } elsif ($form->title eq "preferences") { my $session=$params{session}; @@ -49,11 +87,13 @@ sub formbuilder_setup (@) { #{{{ sub formbuilder (@) { #{{{ my %params=@_; my $form=$params{form}; + my $q=$params{cgi}; return if $form->field("do") ne "edit"; - if ($form->submitted eq "Upload") { - my $q=$params{cgi}; + if ($form->submitted eq "Upload" || $form->submitted eq "Save Page") { + my $session=$params{session}; + my $filename=$q->param('attachment'); if (! defined $filename || ! length $filename) { # no file, so do nothing @@ -64,22 +104,17 @@ sub formbuilder (@) { #{{{ # of the temp file that CGI writes the upload to. my $tempfile=$q->tmpFileName($filename); - # Put the attachment in a subdir of the page it's attached - # to, unless that page is an "index" page. - my $page=$form->field('page'); - $page=~s/(^|\/)index//; - $filename=$page."/".IkiWiki::basename($filename); - - # To untaint the filename, escape any hazardous characters, - # and make sure it isn't pruned. - $filename=IkiWiki::titlepage(IkiWiki::possibly_foolish_untaint($filename)); + $filename=IkiWiki::titlepage( + IkiWiki::possibly_foolish_untaint( + attachment_location($form->field('page')). + IkiWiki::basename($filename))); if (IkiWiki::file_pruned($filename, $config{srcdir})) { error(gettext("bad attachment filename")); } # Check that the user is allowed to edit a page with the # name of the attachment. - IkiWiki::check_canedit($filename, $q, $params{session}, 1); + IkiWiki::check_canedit($filename, $q, $session, 1); # Use a special pagespec to test that the attachment is valid. my $allowed=1; @@ -97,7 +132,7 @@ sub formbuilder (@) { #{{{ error(gettext("attachment rejected")." ($allowed)"); } - # Needed for fast_file_copy. + # Needed for fast_file_copy and for rendering below. require IkiWiki::Render; # Move the attachment into place. @@ -115,9 +150,27 @@ sub formbuilder (@) { #{{{ }); } - # TODO add to vcs - - # TODO trigger a wiki build if there's no vcs + # Check the attachment in and trigger a wiki refresh. + if ($config{rcs}) { + IkiWiki::rcs_add($filename); + IkiWiki::disable_commit_hook(); + IkiWiki::rcs_commit($filename, gettext("attachment upload"), + IkiWiki::rcs_prepedit($filename), + $session->param("name"), $ENV{REMOTE_ADDR}); + IkiWiki::enable_commit_hook(); + IkiWiki::rcs_update(); + } + IkiWiki::refresh(); + IkiWiki::saveindex(); + } + elsif ($form->submitted eq "Insert Links") { + my $add=""; + foreach my $f ($q->param("attachment_select")) { + $add.="[[$f]]\n"; + } + $form->field(name => 'editcontent', + value => $form->field('editcontent')."\n\n".$add, + force => 1); } } # }}}