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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
|
[[!template id=plugin name=album author="[[Simon_McVittie|smcv]]"]]
[[!template id=gitbranch branch=smcv/album author="[[Simon_McVittie|smcv]]"]]
[[!tag type/chrome]]
Available from [[smcv]]'s git repository, in the `album` branch
([[users/smcv/gallery|users/smcv/gallery]] contains some older
thoughts about this plugin).
This plugin formats a collection of images into a photo album,
in the same way as many websites: good examples include the
PHP application [Gallery](http://gallery.menalto.com/), Flickr,
and Facebook's Photos "application".
I've called it `album` to distinguish it from
[[contrib/gallery|plugins/contrib/gallery]], although `gallery` might well be
a better name for this functionality.
The web UI I'm trying to achieve consists of one
[HTML page of thumbnails](http://www.pseudorandom.co.uk/2008/2008-03-08-panic-cell-gig/)
as an entry point to the album, where each thumbnail links to
[a "viewer" HTML page](http://www.pseudorandom.co.uk/2008/2008-03-08-panic-cell-gig/img_0068/)
with a full size image, next/previous thumbnail links, and
[[plugins/comments]].
(The Summer of Code [[plugins/contrib/gallery]] plugin does the
next/previous UI in Javascript using Lightbox, which means that
individual photos can't be bookmarked in a meaningful way, and
the best it can do as a fallback for non-Javascript browsers
is to provide a direct link to the image.)
<h2 id="album"><code>album</code> directive</h2>
Each page containing an `album` directive is treated as a photo album.
Every image attached to an album or its subpages is considered to be part of
the album. A "viewer" page, with the wiki's default page extension, will be
generated to display the image, if there isn't already a page of the same
name as the image: for instance, if `debconf` is an album and
`debconf/tuesday/p100.jpg` exists, then `debconf/tuesday/p100.mdwn` might
be created.
There's currently a hard-coded list of extensions that are treated as images:
`png`, `gif`, `jpg`, `jpeg` or `mov` files. More image and video types could
be added in future. Videos aren't currently handled very well;
ideally, something like totem-video-thumbnailer would be used.
The `album` directive also produces an [[ikiwiki/directive/inline]] which
automatically includes all the viewers for this album, except those that
will appear in an <a href="#albumsection">albumsection</a> (if every image
is in a section, then the `album` directive won't have any visible effect).
The `inline` is in `archive` and `quick` mode, but can include some
extra information about the images, including file size and a thumbnail made
using [[ikiwiki/directive/img]]). The default template is `albumitem.tmpl`,
which takes advantage of these things.
<h2 id="albumsection"><code>albumsection</code> directive</h2>
The `albumsection` directive is used to split an album into sections. It can
only appear on a page that also has the <a href="#album">album</a> directive.
The `filter` parameter is a [[ikiwiki/PageSpec]] against which viewer pages
are matched. The `albumsection` directive displays all the images that match
the filter, and the `album` directive displays any leftover images, like
this:
# Holiday photos
\[[!album]]
<!-- replaced with a list of any uncategorized photos, which might be
empty -->
## People
\[[!albumsection filter="tagged(people)"]]
<!-- replaced with a list of photos tagged 'people', including
any that are also tagged 'landscapes' -->
## Landscapes
\[[!albumsection filter="tagged(landscapes)"]]
<!-- replaced with a list of photos tagged 'landscapes', including
any that are also tagged 'people' -->
<h2 id="albumimage"><code>albumimage</code> directive</h2>
Each viewer page produced by the <a href="#album">album</a> directive
contains an `albumimage` directive, which is replaced by an
[[ikiwiki/directive/img]], wrapped in some formatting using a
template (by default it's `albumviewer.tmpl`). That template can also include
links to the next photo, the previous photo and the album it's in; the default
template has all of these.
The next/previous links are themselves implemented by evaluating a template,
either `albumnext.tmpl` or `albumprev.tmpl` by default.
The directive can also have parameters:
* `title`, `copyright` and `date` are short-cuts for the corresponding
[[ikiwiki/directive/meta]] directives
* `caption` sets a caption which is displayed in the album and viewer
pages
The viewer page can also have other contents before or after the actual
image viewer.
## Bugs
* The plugin doesn't do anything special to handle albums that are subpages
of each other. If, say, `debconf` and `debconf/monday` are both albums,
then `debconf/monday/p100.jpg` will currently be assigned to one or the
other, arbitrarily.
* The plugin doesn't do anything special to handle photos with similar names.
If you have `p100.jpg` and `p100.png`, one will get a viewer page called
`p100` and the other will be ignored.
* If there's no `albumimage` in a viewer page, one should probably be appended
automatically.
## TODO
* The documentation should mention how to replicate the appearance of
`album` and `albumsection` using an `inline` of viewer pages.
* The documentation should mention all the template variables and
all the parameters.
* The generated viewer page should include most or all of the possible
parameters to the `albumimage` directive, with empty values, as a
template for editing.
* The generated viewer page should extract as much metadata as possible from
the photo's EXIF tags (creation/modification dates, author, title, caption,
copyright). [[smcv]] has a half-written implementation which runs
`scanimage` hooks, and has an `exiftool` plugin using [[!cpan Image::ExifTool]]
as a reference implementation of that hook.
* There should be an option to reduce the size of photos and write them into
an underlay, for this workflow:
* your laptop's local ikiwiki has two underlays, `photos` and `webphotos`
* `photos` contains full resolution photos with EXIF tags
* for each photo that exists in `photos` but not in `webphotos`, the album
plugin automatically resamples it down to a web-compatible resolution
([[smcv]] uses up to 640x640), optimizes it with `jpegoptim`, strips out
all EXIF tags, and and writes it into the corresponding location
in `webphotos`
* `webphotos` is what you rsync to the web server
* the web server's ikiwiki only has `webphotos` as an underlay
* Eventually, there could be a specialized CGI user interface to batch-edit
all the photos of an album (so for each photo, you get an edit box each for
title, author, copyright etc.) - this would work by making programmatic
edits to all the `albumimage` directives.
|