374 lines
17 KiB
Markdown
374 lines
17 KiB
Markdown
thanks for this plugin. it might help me in my application, which is to provide album/galleries which can be edited (ie. new images added, taken away, etc.) through web interface.
|
|
|
|
> That's my goal eventually, too. Perhaps you can help to
|
|
> design/write this plugin? At the moment I'm mostly
|
|
> waiting for a design "sanity check" from [[Joey]],
|
|
> but any feedback you can provide on the design would
|
|
> also be helpful. --[[smcv]]
|
|
|
|
i have two challenges: firstly, for installation, i'm not sure what all the files are that need to be downloaded (because of my setup i can't easily pull the repo). so far i have Ikiwiki/Plugins/album.pm; ikiwiki-album; and 4 files in templates/ any others?
|
|
|
|
> Those are all the added files; ikiwiki-album isn't strictly
|
|
> needed (IkiWiki itself doesn't use that code, but you can
|
|
> use it to turn a directory full of images into correct
|
|
> input for the album plugin).
|
|
>
|
|
> You probably also want the album plugin's expanded version of
|
|
> style.css (or put its extra rules in your local.css).
|
|
> Without that, your albums will be quite ugly.
|
|
>
|
|
> There aren't currently any other files modified by my branch.
|
|
> --[[smcv]]
|
|
|
|
secondly: barring the CGI interface for editing the album, which would be great, is there at least a way to use attachment plugin or any other to manually add images and then create viewers for them?
|
|
|
|
> Images are just attachments, and viewers are pages (any supported
|
|
> format, but .html will be fastest to render). Attach each image,
|
|
> then write a page for each image containing the
|
|
> \[[!albumimage]] directive (usually it will *only* contain that
|
|
> directive).
|
|
>
|
|
> The script ikiwiki-album can help you to do this in a git/svn/etc.
|
|
> tree; doing it over the web will be a lot of work (until I get
|
|
> the CGI interface written), but it should already be possible!
|
|
>
|
|
> The structure is something like this:
|
|
>
|
|
> * album.mdwn (contains the \[[!album]] directive, and perhaps also
|
|
> some \[[!albumsection]] directives)
|
|
> * album/a.jpg
|
|
> * album/a.html (contains the \[[!albumimage]] directive for a.jpg)
|
|
> * album/b.jpg
|
|
> * album/b.html (contains the \[[!albumimage]] directive for b.jpg)
|
|
>
|
|
> Have a look at ikiwiki-album to see how the directives are meant to
|
|
> work in practice.
|
|
>
|
|
> --[[smcv]]
|
|
|
|
i'm new to ikiwiki, apologies if this is dealt with elsewhere. -brush
|
|
|
|
> This plugin is pretty ambitious, and is unfinished, so I'd recommend
|
|
> playing with a normal IkiWiki installation for a bit, then trying
|
|
> out this plugin when you've mastered the basics of IkiWiki. --[[smcv]]
|
|
|
|
----
|
|
|
|
You had wanted my feedback on the design of this. I have not looked at the
|
|
code or tried it yet, but here goes. --[[Joey]]
|
|
|
|
* Needing to create the albumimage "viewer" pages for each photo
|
|
seems like it will become a pain. Everyone will need to come up
|
|
with their own automation for it, and then there's the question
|
|
of how to automate it when uploading attachments. -J
|
|
|
|
> There's already a script (ikiwiki-album) to populate a git
|
|
> checkout with skeleton "viewer" pages; I was planning to make a
|
|
> specialized CGI interface for albums after getting feedback from
|
|
> you (since the requirements for that CGI interface change depending
|
|
> on the implementation). I agree that this is ugly, though. -s
|
|
|
|
>> Would you accept a version where the albumimage "viewer" pages
|
|
>> could be 0 bytes long, at least until metadata gets added?
|
|
>>
|
|
>> The more I think about the "binaries as first-class pages" approach,
|
|
>> the more subtle interactions I notice with other plugins. I
|
|
>> think I'm up to needing changes to editpage, comments, attachment
|
|
>> and recentchanges, plus adjustments to img and Render (to reduce
|
|
>> duplication when thumbnailing an image with a strange extension
|
|
>> while simultaneously changing the extension, and to hardlink/copy
|
|
>> an image with a strange extension to a differing target filename
|
|
>> with the normal extension, respectively). -s
|
|
|
|
* With each viewer page having next/prev links, I can see how you
|
|
were having the scalability issues with ikiwiki's data structures
|
|
earlier! -J
|
|
|
|
> Yeah, I think they're a basic requirement from a UI point of view
|
|
> though (although they don't necessarily have to be full wikilinks).
|
|
> -s
|
|
|
|
>> I think that with the new dependency types system, the dependencies for
|
|
>> these can be presence dependencies, which will probably help with
|
|
>> avoiding rebuilds of a page if the next/prev page is changed.
|
|
>> (Unless you use img to make the thumbnails for those links, then it
|
|
>> would rebuild the thumbnails anyway. Have not looked at the code.) --[[Joey]]
|
|
|
|
* And doesn't each viewer page really depend on every other page in the
|
|
same albumsection? If a new page is added, the next/prev links
|
|
may need to be updated, for example. If so, there will be much
|
|
unnecessary rebuilding. -J
|
|
|
|
> albumsections are just a way to insert headings into the flow of
|
|
> photos, so they don't actually affect dependencies.
|
|
>
|
|
> One non-obvious constraint of ikiwiki's current design is that
|
|
> everything "off-page" necessary to build any page has to happen
|
|
> at scan time, which has caused a few strange design decisions,
|
|
> like the fact that each viewer controls what album it's in.
|
|
>
|
|
> It's difficult for the contents of the album to just be a
|
|
> pagespec, like for inline, because pagespecs can depend on
|
|
> metadata, which is gathered in arbitrary order at scan time;
|
|
> so the earliest you can safely apply a pagespec to the wiki
|
|
> contents to get a concrete list of pages is at rebuild time.
|
|
>
|
|
> (This stalled my attempt at a trail plugin, too.) -s
|
|
|
|
>> Not sure I understand why these need to look at pagespecs at scan time?
|
|
>> Also, note that it is fairly doable to detect if a pagespec uses such
|
|
>> metadata. Er, I mean, I have a cheezy hack in `add_depends` now that does
|
|
>> it to deal with a similar case. --[[Joey]]
|
|
|
|
>>> I think I was misunderstanding how early you have to call `add_depends`?
|
|
>>> The critical thing I missed was that if you're scanning a page, you're
|
|
>>> going to rebuild it in a moment anyway, so it doesn't matter if you
|
|
>>> have no idea what it depends on until the rebuild phase. -s
|
|
|
|
* One thing I do like about having individual pages per image is
|
|
that they can each have their own comments, etc. -J
|
|
|
|
> Yes; also, they can be wikilinked. I consider those to be
|
|
> UI requirements. -s
|
|
|
|
* Seems possibly backwards that the albumimage controls what album
|
|
an image appears in. Two use cases -- 1: I may want to make a locked
|
|
album, but then anyone who can write to any other page on the wiki can
|
|
add an image to it. 2: I may want an image to appear in more than one
|
|
album. Think tags. So it seems it would be better to have the album
|
|
directive control what pages it includes (a la inline). -J
|
|
|
|
> I'm inclined to fix this by constraining images to be subpages of exactly
|
|
> one album: if they're subpages of 2+ nested albums then they're only
|
|
> considered to be in the deepest-nested one (i.e. longest URL), and if
|
|
> they're not in any album then that's a usage error. This would
|
|
> also make prev/next links sane.
|
|
>
|
|
> If you want to reference images from elsewhere in the wiki and display
|
|
> them as if in an album, then you can use an ordinary inline with
|
|
> the same template that the album would use, and I'll make sure the
|
|
> templates are set up so this works.
|
|
>
|
|
> (Implementation detail: this means that an image X/Y/Z/W/V, where X and
|
|
> Y are albums, Z does not exist and W exists but is not an album,
|
|
> would have a content dependency on Y, a presence dependency on Z
|
|
> and a content dependency on W.)
|
|
>
|
|
> Perhaps I should just restrict to having the album images be direct
|
|
> subpages of the album, although that would mean breaking some URLs
|
|
> on the existing website I'm doing all this work for... -s
|
|
|
|
* Putting a few of the above thoughts together, my ideal album system
|
|
seems to be one where I can just drop the images into a directory and
|
|
have them appear in the album index, as well as each generate their own wiki
|
|
page. Plus some way I can, later, edit metadata for captions,
|
|
etc. (Real pity we can't just put arbitrary metadata into the images
|
|
themselves.) This is almost pointing toward making the images first-class
|
|
wiki page sources. Hey, it worked for po! :) But the metadata and editing
|
|
problems probably don't really allow that. -J
|
|
|
|
> Putting a JPEG in the web form is not an option from my point of
|
|
> view :-) but perhaps there could just be a "web-editable" flag supplied
|
|
> by plugins, and things could be changed to respect it.
|
|
|
|
>> Replying to myself: would you accept patches to support
|
|
>> `hook(type => 'htmlize', editable => 0, ...)` in editpage? This would
|
|
>> essentially mean "this is an opaque binary: you can delete it
|
|
>> or rename it, and it might have its own special editing UI, but you
|
|
>> can never get it in a web form".
|
|
>>
|
|
>> On the other hand, that essentially means we need to reimplement
|
|
>> editpage in order to edit the sidecar files that contain the metadata.
|
|
>> Having already done one partial reimplementation of editpage (for
|
|
>> comments) I'm in no hurry to do another.
|
|
>>
|
|
>> I suppose another possibility would be to register hook
|
|
>> functions to be called by editpage when it loads and saves the
|
|
>> file. In this case, the loading hook would be to discard
|
|
>> the binary and use filter() instead, and the saving conversion
|
|
>> would be to write the edited content into the metadata sidecar
|
|
>> (creating it if necessary).
|
|
>>
|
|
>> I'd also need to make editpage (and also comments!) not allow the
|
|
>> creation of a file of type albumjpg, albumgif etc., which is something
|
|
>> I previously missed; and I'd need to make attachment able to
|
|
>> upload-and-rename.
|
|
>> -s
|
|
|
|
> In a way, what you really want for metadata is to have it in the album
|
|
> page, so you can batch-edit the whole lot by editing one file (this
|
|
> does mean that editing the album necessarily causes each of its viewers
|
|
> to be rebuilt, but in practice that happens anyway). -s
|
|
|
|
>> Replying to myself: in practice that *doesn't* happen anyway. Having
|
|
>> the metadata in the album page is somewhat harmful because it means
|
|
>> that changing the title of one image causes every viewer in the album
|
|
>> to be rebuilt, whereas if you have a metadata file per image, only
|
|
>> the album itself, plus the next and previous viewers, need
|
|
>> rebuilding. So, I think a file per image is the way to go.
|
|
>>
|
|
>> Ideally we'd have some way to "batch-edit" the metadata of all
|
|
>> images in an album at once, except that would make conflict
|
|
>> resolution much more complicated to deal with; maybe just
|
|
>> give up and scream about mid-air collisions in that case?
|
|
>> (That's apparently good enough for Bugzilla, but not really
|
|
>> for ikiwiki). -s
|
|
|
|
>> Yes, [all metadata in one file] would make some sense.. It also allows putting one image in
|
|
>> two albums, with different caption etc. (Maybe for different audiences.)
|
|
>> --[[Joey]]
|
|
|
|
>>> Eek. No, that's not what I had in mind at all; the metadata ends up
|
|
>>> in the "viewer" page, so it's necessarily the same for all albums. -s
|
|
|
|
>> It would probably be possible to add a new dependency type, and thus
|
|
>> make ikiwiki smart about noticing whether the metadata has actually
|
|
>> changed, and only update those viewers where it has. But the dependency
|
|
>> type stuff is still very new, and not plugin friendly .. so only just
|
|
>> possible, --[[Joey]]
|
|
|
|
----
|
|
|
|
Trying to use the "special extension" design:
|
|
|
|
Suppose that each viewer is a JPEG-or-GIF-or-something, with extension
|
|
".albumimage". We have a gallery "memes" with three images, badger,
|
|
mushroom and snake.
|
|
|
|
> An alternative might be to use ".album.jpg", and ".album.gif"
|
|
> etc as the htmlize extensions. May need some fixes to ikiwiki to support
|
|
> that. --[[Joey]]
|
|
|
|
>> foo.albumjpg (etc.) for images, and foo._albummeta (with
|
|
>> `keepextension => 1`) for sidecar metadata files, seems viable. -s
|
|
|
|
Files in git repo:
|
|
|
|
* index.mdwn
|
|
* memes.mdwn
|
|
* memes/badger.albumjpg (a renamed JPEG)
|
|
* memes/badger/comment_1._comment
|
|
* memes/badger/comment_2._comment
|
|
* memes/mushroom.albumgif (a renamed GIF)
|
|
* memes/mushroom._albummeta (sidecar file with metadata)
|
|
* memes/snake.albummov (a renamed video)
|
|
|
|
Files in web content:
|
|
|
|
* index.html
|
|
* memes/index.html
|
|
* memes/96x96-badger.jpg (from img)
|
|
* memes/96x96-mushroom.gif (from img)
|
|
* memes/96x96-snake.jpg (from img, hacked up to use totem-video-thumbnailer :-) )
|
|
* memes/badger/index.html (including comments)
|
|
* memes/badger.jpg
|
|
* memes/mushroom/index.html
|
|
* memes/mushroom.gif
|
|
* memes/snake/index.html
|
|
* memes/snake.mov
|
|
|
|
ispage("memes/badger") (etc.) must be true, to make the above rendering
|
|
happen, so albumimage needs to be a "page" extension.
|
|
|
|
To not confuse other plugins, album should probably have a filter() hook
|
|
that turns .albumimage files into HTML? That'd probably be a reasonable
|
|
way to get them rendered anyway.
|
|
|
|
> I guess that is needed to avoid preprocess, scan, etc trying to process
|
|
> the image, as well as eg, smiley trying to munge it in sanitize.
|
|
> --[[Joey]]
|
|
|
|
>> As long as nothing has a filter() hook that assumes it's already
|
|
>> text... filters are run in arbitrary order. We seem to be OK so far
|
|
>> though.
|
|
>>
|
|
>> If this is the route I take, I propose to have the result of filter()
|
|
>> be the contents of the sidecar metadata file (empty string if none),
|
|
>> with the `\[[!albumimage]]` directive (which no longer requires
|
|
>> arguments) prepended if not already present. This would mean that
|
|
>> meta directives in the metadata file would work as normal, and it
|
|
>> would be possible to insert text both before and after the viewer
|
|
>> if desired. The result of filter() would also be a sensible starting
|
|
>> point for editing, and the result of editing could be diverted into
|
|
>> the metadata file. -s
|
|
|
|
do=edit&page=memes/badger needs to not put the JPG in a text box: somehow
|
|
divert or override the normal edit CGI by telling it that .albumimage
|
|
files are not editable in the usual way?
|
|
|
|
> Something I missed here is that editpage also needs to be told that
|
|
> creating new files of type albumjpg, albumgif etc. is not allowed
|
|
> either! -s
|
|
|
|
Every image needs to depend on, and link to, the next and previous images,
|
|
which is a bit tricky. In previous thinking about this I'd been applying
|
|
the overly strict constraint that the ordered sequence of pages in each
|
|
album must be known at scan time. However, that's not *necessarily* needed:
|
|
the album and each photo could collect an unordered superset of dependencies
|
|
at scan time, and at rebuild time that could be refined to be the exact set,
|
|
in order.
|
|
|
|
> Why do you need to collect this info at scan time? You can determine it
|
|
> at build time via `pagespec_match_list`, surely .. maybe with some
|
|
> memoization to avoid each image in an album building the same list.
|
|
> I sense that I may be missing a subtelty though. --[[Joey]]
|
|
|
|
>> I think I was misunderstanding how early you have to call `add_depends`
|
|
>> as mentioned above. -s
|
|
|
|
Perhaps restricting to "the images in an album A must match A/*"
|
|
would be useful; then the unordered superset could just be "A/*". Your
|
|
"albums via tags" idea would be nice too though, particularly for feature
|
|
parity with e.g. Facebook: "photos of Joey" -> "tags/joey and albumimage()"
|
|
maybe?
|
|
|
|
If images are allowed to be considered to be part of more than one album,
|
|
then a pretty and usable UI becomes harder - "next/previous" expands into
|
|
"next photo in holidays/2009/germany / next photo in tagged/smcv / ..."
|
|
and it could get quite hard to navigate. Perhaps next/previous links could
|
|
be displayed only for the closest ancestor (in URL space) that is an
|
|
album, or something?
|
|
|
|
> Ugh, yeah, that is a problem. Perhaps wanting to support that was just
|
|
> too ambitious. --[[Joey]]
|
|
|
|
>> I propose to restrict to having images be subpages of albums, as
|
|
>> described above. -s
|
|
|
|
Requiring renaming is awkward for non-technical Windows/Mac users, with both
|
|
platforms' defaults being to hide extensions; however, this could be
|
|
circumvented by adding some sort of hook in attachment to turn things into
|
|
a .albumimage at upload time, and declaring that using git/svn/... without
|
|
extensions visible is a "don't do that then" situation :-)
|
|
|
|
> Or extend `pagetype` so it can do the necessary matching without
|
|
> renaming. Maybe by allowing a subdirectory to be specified along
|
|
> with an extension. (Or allow specifying a full pagespec,
|
|
> but I hesitate to seriously suggest that.) --[[Joey]]
|
|
|
|
>> I think that might be a terrifying idea for another day. If we can
|
|
>> mutate the extension during the `attach` upload, that'd be enough;
|
|
>> I don't think people who are skilled enough to use git/svn/...,
|
|
>> but not skilled enough to tell Explorer to show file extensions,
|
|
>> represent a major use case. -s
|
|
|
|
Ideally attachment could also be configured to upload into a specified
|
|
underlay, so that photos don't have to be in your source-code control
|
|
(you might want that, but I don't!).
|
|
|
|
> Replying to myself: perhaps best done as an orthogonal extension
|
|
> to attach? -s
|
|
|
|
> Yet another non-obvious thing this design would need to do is to find
|
|
> some way to have each change to memes/badger._albummeta show up as a
|
|
> change to memes/badger in `recentchanges`. -s
|
|
|
|
Things that would be nice, and are probably possible:
|
|
|
|
* make the "Edit page" link on viewers divert to album-specific CGI instead
|
|
of just failing or not appearing (probably possible via pagetemplate)
|
|
|
|
* some way to deep-link to memes/badger.jpg with a wikilink, without knowing a
|
|
priori that it's secretly a JPEG (probably harder than it looks - you'd
|
|
have to make a directive for it and it's probably not worth it)
|