summaryrefslogtreecommitdiff
path: root/IkiWiki/Plugin/getsource.pm
blob: 4e74eaea0f0078bd7c56a13467a62b36299f0721 (plain)
  1. #!/usr/bin/perl
  2. package IkiWiki::Plugin::getsource;
  3. use warnings;
  4. use strict;
  5. use IkiWiki;
  6. use open qw{:utf8 :std};
  7. sub import {
  8. hook(type => "getsetup", id => "getsource", call => \&getsetup);
  9. hook(type => "pagetemplate", id => "getsource", call => \&pagetemplate);
  10. hook(type => "sessioncgi", id => "getsource", call => \&cgi_getsource);
  11. }
  12. sub getsetup () {
  13. return
  14. plugin => {
  15. safe => 1,
  16. rebuild => 1,
  17. },
  18. getsource_mimetype => {
  19. type => "string",
  20. example => "application/octet-stream",
  21. description => "Mime type for returned source.",
  22. safe => 1,
  23. rebuild => 0,
  24. },
  25. }
  26. sub pagetemplate (@) {
  27. my %params=@_;
  28. my $page=$params{page};
  29. my $template=$params{template};
  30. if (length $config{cgiurl}) {
  31. $template->param(getsourceurl => IkiWiki::cgiurl(do => "getsource", page => $page));
  32. $template->param(have_actions => 1);
  33. }
  34. }
  35. sub cgi_getsource ($$) {
  36. my $cgi=shift;
  37. my $session=shift;
  38. # Note: we use sessioncgi rather than just cgi
  39. # because we need $IkiWiki::pagesources{} to be
  40. # populated.
  41. return unless (defined $cgi->param('do') &&
  42. $cgi->param("do") eq "getsource");
  43. IkiWiki::decode_cgi_utf8($cgi);
  44. my $page=$cgi->param('page');
  45. if ($IkiWiki::pagesources{$page}) {
  46. my $data = IkiWiki::readfile(IkiWiki::srcfile($IkiWiki::pagesources{$page}));
  47. if (! $config{getsource_mimetype}) {
  48. $config{getsource_mimetype} = "text/plain";
  49. }
  50. print "Content-Type: $config{getsource_mimetype}\r\n";
  51. print ("\r\n");
  52. print $data;
  53. exit 0;
  54. }
  55. error("Unable to find page source for page: $page");
  56. exit 0;
  57. }
  58. 1