diff options
-rw-r--r-- | IkiWiki/Plugin/getsource.pm | 91 | ||||
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | doc/plugins/getsource.mdwn | 13 | ||||
-rw-r--r-- | doc/todo/source_link.mdwn | 2 | ||||
-rw-r--r-- | templates/page.tmpl | 3 |
5 files changed, 110 insertions, 0 deletions
diff --git a/IkiWiki/Plugin/getsource.pm b/IkiWiki/Plugin/getsource.pm new file mode 100644 index 000000000..e8aea2c39 --- /dev/null +++ b/IkiWiki/Plugin/getsource.pm @@ -0,0 +1,91 @@ +#!/usr/bin/perl +package IkiWiki::Plugin::getsource; + +use warnings; +use strict; +use IkiWiki; +use open qw{:utf8 :std}; + +sub import { + hook(type => "getsetup", id => "getsource", call => \&getsetup); + hook(type => "pagetemplate", id => "getsource", call => \&pagetemplate); + hook(type => "cgi", id => "getsource", call => \&cgi_getsource); +} + +sub getsetup () { + return + plugin => { + safe => 1, + rebuild => 1, + }, + getsource_mimetype => { + type => "string", + example => "text/plain; charset=utf-8", + description => "Mime type for returned source.", + safe => 1, + rebuild => 0, + }, +} + +sub pagetemplate (@) { + my %params=@_; + + my $page=$params{page}; + my $template=$params{template}; + + if (length $config{cgiurl}) { + $template->param(getsourceurl => IkiWiki::cgiurl(do => "getsource", page => $page)); + $template->param(have_actions => 1); + } +} + +sub cgi_getsource ($) { + my $cgi=shift; + + # Note: we use sessioncgi rather than just cgi + # because we need %pagesources to be + # populated. + + return unless (defined $cgi->param('do') && + $cgi->param("do") eq "getsource"); + + IkiWiki::decode_cgi_utf8($cgi); + + my $page=$cgi->param('page'); + + IkiWiki::loadindex(); + + if (! exists $pagesources{$page}) { + IkiWiki::cgi_custom_failure( + $cgi->header(-status => "404 Not Found"), + IkiWiki::misctemplate(gettext("missing page"), + "<p>". + sprintf(gettext("The page %s does not exist."), + htmllink("", "", $page)). + "</p>")); + exit; + } + + if (! defined pagetype($pagesources{$page})) { + IkiWiki::cgi_custom_failure( + $cgi->header(-status => "403 Forbidden"), + IkiWiki::misctemplate(gettext("not a page"), + "<p>". + sprintf(gettext("%s is an attachment, not a page."), + htmllink("", "", $page)). + "</p>")); + exit; + } + + if (! $config{getsource_mimetype}) { + $config{getsource_mimetype} = "text/plain; charset=utf-8"; + } + + print "Content-Type: $config{getsource_mimetype}\r\n"; + print ("\r\n"); + print readfile(srcfile($pagesources{$page})); + + exit 0; +} + +1 diff --git a/debian/changelog b/debian/changelog index 50bb0b945..e370a33ef 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,6 +16,7 @@ ikiwiki (3.15) UNRELEASED; urgency=low * map: Avoid emitting an unclosed ul element if the map is empty. (harishcm) * inline: Add pagenames parameter that can be used to list a set of pages to inline, in a specific order, without using a PageSpec. (smcv) + * Add getsource plugin (Will, smcv) -- Joey Hess <joeyh@debian.org> Tue, 02 Jun 2009 17:03:41 -0400 diff --git a/doc/plugins/getsource.mdwn b/doc/plugins/getsource.mdwn new file mode 100644 index 000000000..4fbf4be98 --- /dev/null +++ b/doc/plugins/getsource.mdwn @@ -0,0 +1,13 @@ +[[!template id=plugin name=getsource author="[[Will_Uther|Will]]"]] + +This plugin adds a `getsource` action to the IkiWiki CGI, and a "Source" link +that uses it to display pages' source. + +Configuration for this plugin in the setup file: + +* `getsource_mimetype => "text/plain; charset=utf-8"` + + Sets the MIME type used when page source is requested. The default is + usually appropriate, but you could set this to `application/octet-stream` + to encourage browsers to download the source to a file rather than showing + it in the browser. diff --git a/doc/todo/source_link.mdwn b/doc/todo/source_link.mdwn index 4a8285948..0c639a314 100644 --- a/doc/todo/source_link.mdwn +++ b/doc/todo/source_link.mdwn @@ -132,3 +132,5 @@ All of this code is licensed under the GPLv2+. -- [[Will]] } 1 + +[[done]] --[[smcv]] diff --git a/templates/page.tmpl b/templates/page.tmpl index 8622d1a01..653179e5d 100644 --- a/templates/page.tmpl +++ b/templates/page.tmpl @@ -50,6 +50,9 @@ <TMPL_IF NAME="HISTORYURL"> <li><a href="<TMPL_VAR HISTORYURL>">History</a></li> </TMPL_IF> +<TMPL_IF NAME="GETSOURCEURL"> +<li><a href="<TMPL_VAR GETSOURCEURL>">Source</a></li> +</TMPL_IF> <TMPL_IF NAME="PREFSURL"> <li><a href="<TMPL_VAR PREFSURL>">Preferences</a></li> </TMPL_IF> |