summaryrefslogtreecommitdiff
path: root/doc/plugins/contrib/field/discussion.mdwn
blob: fc1759fab5560995b7b0acfb2864b5d01907feb7 (plain)

Having tried out field, some comments (from [[smcv]]):

The general concept looks great.

The pagetemplate hook seems quite namespace-polluting: on a site containing a list of books, I'd like to have an author field, but that would collide with IkiWiki's use of <TMPL_VAR AUTHOR> for the author of the page (i.e. me). Perhaps it'd be better if the pagetemplate hook was only active for <TMPL_VAR FIELD_AUTHOR> or something? (For those who want the current behaviour, an auxiliary plugin would be easy.)

From a coding style point of view, the $CamelCase variable names aren't IkiWiki style, and the match_foo functions look as though they could benefit from being thin wrappers around a common &IkiWiki::Plugin::field::match function (see meta for a similar approach).

I think the documentation would probably be clearer in a less manpage-like and more ikiwiki-like style?

If one of my branches from [[todo/allow_plugins_to_add_sorting_methods]] is accepted, a field() cmp type would mean that [[plugins/contrib/report]] can stop reimplementing sorting. Here's the implementation I'm using, with your "sortspec" concept (a sort-hook would be very similar): if merged, I think it should just be part of field rather than a separate plugin.

# Copyright © 2010 Simon McVittie, released under GNU LGPL >= 2.1
package IkiWiki::Plugin::fieldsort;
use warnings;
use strict;
use IkiWiki 3.00;
use IkiWiki::Plugin::field;

sub import {
	hook(type => "getsetup", id => "fieldsort",  call => \&getsetup);
}

sub getsetup () {
	return
		plugin => {
			safe => 1,
			rebuild => undef,
		},
}

package IkiWiki::PageSpec;

sub check_cmp_field {
	if (!length $_[0]) {
		error("sort=field requires a parameter");
	}
}

sub cmp_field {
	my $left = IkiWiki::Plugin::field::field_get_value($_[2], $_[0]);
	my $right = IkiWiki::Plugin::field::field_get_value($_[2], $_[1]);

	$left = "" unless defined $left;
	$right = "" unless defined $right;
	return $left cmp $right;
}

1;