1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
How about a direct link from the page header to the source of the latest version, to avoid the need to either use edit or navigate to the current version via the history link?
I'd like this too (and might try to implement it). -- [[users/jon]]
I just implemented this. There is one [[patch]] to the default page template, and a new plugin. -- [[Will]]
> The use of sessioncgi here seems undesirable: on wikis where anonymity is
> not allowed, you'll be asked to log in. Couldn't you achieve the same thing
> by loading the index with IkiWiki::loadindex, like [[plugins/goto]] does?
> --[[smcv]]
[[!template id=gitbranch branch=smcv/ready/getsource
author="[[Will]]/[[smcv]]"]]
>> I've applied the patch below in a git branch, fixed my earlier criticism,
>> and also fixed a couple of other issues I noticed:
>>
>> * missing pages could be presented better as a real 404 page
>> * the default Content-type should probably be UTF-8 since the rest of
>> IkiWiki tends to assume that
>> * emitting attachments (images, etc.) as text/plain isn't going to work :-)
>>
>> Any opinions on my branch? I think it's ready for merge, if Joey approves.
>>
>> --[[smcv]]
>>> That looks like a nice set of fixes. One more that might be worthwhile: instead of reading the page source into a var, and then writing it out later, it might be nice to just
>>> `print readfile(srcfile(pagesources{$page}));` at the appropriate point. -- [[Will]]
>>>> OK, I've committed that. --[[smcv]]
----
diff --git a/templates/page.tmpl b/templates/page.tmpl
index f2f9c34..3176bed 100644
--- a/templates/page.tmpl
+++ b/templates/page.tmpl
@@ -46,6 +46,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>">Get Source</a></li>
+</TMPL_IF>
<TMPL_IF NAME="PREFSURL">
<li><a href="<TMPL_VAR PREFSURL>">Preferences</a></li>
</TMPL_IF>
----
#!/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 => "sessioncgi", id => "getsource", call => \&cgi_getsource);
}
sub getsetup () {
return
plugin => {
safe => 1,
rebuild => 1,
},
getsource_mimetype => {
type => "string",
example => "application/octet-stream",
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;
my $session=shift;
# Note: we use sessioncgi rather than just cgi
# because we need $IkiWiki::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');
if ($IkiWiki::pagesources{$page}) {
my $data = IkiWiki::readfile(IkiWiki::srcfile($IkiWiki::pagesources{$page}));
if (! $config{getsource_mimetype}) {
$config{getsource_mimetype} = "text/plain";
}
print "Content-Type: $config{getsource_mimetype}\r\n";
print ("\r\n");
print $data;
exit 0;
}
error("Unable to find page source for page: $page");
exit 0;
}
1
|