summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/remove.pm
blob: 396bff2e4cebbdd2bf3a96845008590a466659c6 (plain)
  1. #!/usr/bin/perl
  2. package IkiWiki::Plugin::remove;
  3. use warnings;
  4. use strict;
  5. use IkiWiki 2.00;
  6. sub import { #{{{
  7. hook(type => "formbuilder_setup", id => "remove", call => \&formbuilder_setup);
  8. hook(type => "formbuilder", id => "remove", call => \&formbuilder);
  9. hook(type => "sessioncgi", id => "remove", call => \&sessioncgi);
  10. } # }}}
  11. sub formbuilder_setup (@) { #{{{
  12. my %params=@_;
  13. my $form=$params{form};
  14. my $q=$params{cgi};
  15. if (defined $form->field("do") && $form->field("do") eq "edit") {
  16. push @{$params{buttons}}, "Remove";
  17. # TODO button for attachments
  18. }
  19. } #}}}
  20. sub confirmation_form ($$) { #{{{
  21. my $q=shift;
  22. my $session=shift;
  23. eval q{use CGI::FormBuilder};
  24. error($@) if $@;
  25. my @fields=qw(do page);
  26. my $f = CGI::FormBuilder->new(
  27. title => "confirm removal",
  28. name => "remove",
  29. header => 0,
  30. charset => "utf-8",
  31. method => 'POST',
  32. javascript => 0,
  33. params => $q,
  34. action => $config{cgiurl},
  35. stylesheet => IkiWiki::baseurl()."style.css",
  36. fields => \@fields,
  37. );
  38. $f->field(name => "do", type => "hidden", value => "remove", force => 1);
  39. $f->field(name => "page", label => "Will remove:", size => 60,
  40. validate => sub {
  41. # Validate page by checking that the page exists, and that
  42. # the user is allowed to edit(/remove) it.
  43. my $page=IkiWiki::titlepage(shift);
  44. if (! exists $pagesources{$page}) {
  45. $f->field(name => "page", message => gettext("page does not exist"));
  46. return 0;
  47. }
  48. else {
  49. IkiWiki::check_canedit($page, $q, $session);
  50. return 1;
  51. }
  52. });
  53. return $f, ["Remove", "Cancel"];
  54. } #}}}
  55. sub formbuilder (@) { #{{{
  56. my %params=@_;
  57. my $form=$params{form};
  58. if (defined $form->field("do") && $form->field("do") eq "edit" &&
  59. $form->submitted eq "Remove") {
  60. my $q=$params{cgi};
  61. my $session=$params{session};
  62. # Save current form state to allow returning to it later
  63. # without losing any edits.
  64. # (But don't save what button was submitted, to avoid
  65. # looping back to here.)
  66. # Note: "_submit" is CGI::FormBuilder internals.
  67. $q->param(-name => "_submit", -value => "");
  68. $session->param(postremove => scalar $q->Vars);
  69. IkiWiki::cgi_savesession($session);
  70. # Display a small confirmation form.
  71. my ($f, $buttons)=confirmation_form($q, $session);
  72. $f->field(name => "page",
  73. value => IkiWiki::pagetitle($form->field("page")),
  74. force => 1);
  75. IkiWiki::showform($f, $buttons, $session, $q);
  76. exit 0;
  77. }
  78. } #}}}
  79. sub sessioncgi ($$) { #{{{
  80. my $q=shift;
  81. if ($q->param("do") eq 'remove') {
  82. my $session=shift;
  83. my ($form, $buttons)=confirmation_form($q, $session);
  84. IkiWiki::decode_form_utf8($form);
  85. if ($form->submitted eq 'Cancel') {
  86. # Load saved form state and return to edit form.
  87. my $postremove=CGI->new($session->param("postremove"));
  88. $session->clear("postremove");
  89. IkiWiki::cgi_savesession($session);
  90. IkiWiki::cgi($postremove, $session);
  91. }
  92. elsif ($form->submitted eq 'Remove' && $form->validate) {
  93. my $page=IkiWiki::titlepage($form->field("page"));
  94. my $file=$pagesources{$page};
  95. # Do removal, and update the wiki.
  96. require IkiWiki::Render;
  97. if ($config{rcs}) {
  98. IkiWiki::rcs_remove($file);
  99. IkiWiki::disable_commit_hook();
  100. IkiWiki::rcs_commit($file, gettext("removed"),
  101. IkiWiki::rcs_prepedit($file),
  102. $session->param("name"), $ENV{REMOTE_ADDR});
  103. IkiWiki::enable_commit_hook();
  104. IkiWiki::rcs_update();
  105. }
  106. IkiWiki::prune("$config{srcdir}/$file");
  107. IkiWiki::refresh();
  108. IkiWiki::saveindex();
  109. # Redirect to parent of the page.
  110. my $parent=IkiWiki::dirname($page);
  111. if (! exists $pagesources{$parent}) {
  112. $parent="index";
  113. }
  114. IkiWiki::redirect($q, $config{url}."/".htmlpage($parent));
  115. }
  116. else {
  117. IkiWiki::showform($form, $buttons, $session, $q);
  118. }
  119. exit 0;
  120. }
  121. }
  122. 1