Add an optional "sort" argument to meta titles, defaulting to the title
authorSimon McVittie <smcv@debian.org>
Wed, 24 Mar 2010 03:18:24 +0000 (03:18 +0000)
committerSimon McVittie <smcv@debian.org>
Wed, 24 Mar 2010 03:18:24 +0000 (03:18 +0000)
This allows correct sorting of titles, names, etc., with:

    [[!meta title="David Bowie" sort="Bowie, David"]]
    [[!meta title="The Beatles" sort="Beatles, The"]]

IkiWiki/Plugin/meta.pm
doc/ikiwiki/directive/meta.mdwn
doc/ikiwiki/pagespec/sorting.mdwn

index bf8159814ac61d498917826305a6d083bd2699e4..a470041c97a528700b575e5b1f59c7c31a390764 100644 (file)
@@ -90,6 +90,12 @@ sub preprocess (@) {
        # Metadata collection that needs to happen during the scan pass.
        if ($key eq 'title') {
                $pagestate{$page}{meta}{title}=HTML::Entities::encode_numeric($value);
+               if (exists $params{sort}) {
+                       $pagestate{$page}{meta}{titlesort}=$params{sort};
+               }
+               else {
+                       $pagestate{$page}{meta}{titlesort}=$value;
+               }
                return "";
        }
        elsif ($key eq 'description') {
@@ -283,18 +289,18 @@ sub pagetemplate (@) {
        }
 }
 
-sub title {
-       my $title = $pagestate{$_[0]}{meta}{title};
+sub titlesort {
+       my $key = $pagestate{$_[0]}{meta}{titlesort};
 
-       if (defined $title) {
-               return $title;
+       if (defined $key) {
+               return $key;
        }
 
        return pagetitle(IkiWiki::basename($_[0]));
 }
 
 sub sort_meta_title {
-       return title($_[0]) cmp title($_[1]);
+       return titlesort($_[0]) cmp titlesort($_[1]);
 }
 
 sub match {
index 557441c0b8dbe424a62657d38b156a36fba92482..8d2a5b1ad40129622f2d20724955c0bfdeeeb845 100644 (file)
@@ -23,6 +23,13 @@ Supported fields:
   be set to a true value in the template; this can be used to format things
   differently in this case.
 
+  An optional `sort` parameter will be used preferentially when
+  [[ikiwiki/pagespec/sorting]] by `meta_title`:
+
+       \[[!meta title="The Beatles" sort="Beatles, The"]]
+
+       \[[!meta title="David Bowie" sort="Bowie, David"]]
+
 * license
 
   Specifies a license for the page, for example, "GPL". Can contain
index 3a9fef9b622c55d7604b7dafc27cdd386eaecde3..61516bec53338f12d98d2d8e705a188d69eba3ef 100644 (file)
@@ -5,13 +5,14 @@ orders can be specified.
 
 * `age` - List pages from the most recently created to the oldest.
 * `mtime` - List pages with the most recently modified first.
-* `title` - Order by title.
+* `title` - Order by title (page name).
 * `title_natural` - Only available if [[!cpan Sort::Naturally]] is
   installed. Orders by title, but numbers in the title are treated
   as such, ("1 2 9 10 20" instead of "1 10 2 20 9")
 [[!if test="enabled(meta)" then="""
-* `meta_title` - Order by the full title set by the `\[[!meta title="foo"]]`
-  [[ikiwiki/directive]].
+* `meta_title` - Order according to the `\[[!meta title="foo" sort="bar"]]`
+  or `\[[!meta title="foo"]]` [[ikiwiki/directive]], or the page name if no
+  full title was set.
 """]]
 
 Plugins can add additional sort orders, so more might be available on this