X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/50d2704db6fec29756e930d82aecca67802a063e..e74f9ba459c3b24f8282b5d198cc2722579b493b:/doc/todo/pagespec_aliases.mdwn diff --git a/doc/todo/pagespec_aliases.mdwn b/doc/todo/pagespec_aliases.mdwn index 09155754c..c5b8504b0 100644 --- a/doc/todo/pagespec_aliases.mdwn +++ b/doc/todo/pagespec_aliases.mdwn @@ -1,3 +1,4 @@ +[[!template id=gitbranch branch=jon/pagespec_alias author="[[Jon]]"]] [[!tag patch wishlist]]I quite often find myself repeating a boiler-plate [[ikiwiki/pagespec]] chunk, e.g. @@ -10,64 +11,7 @@ pagespec "alias", and instead write I wrote the following plugin to achieve this: - commit f3a9dd113338fe5d2b717de1dc69679ff74e2f8d - Author: Jon Dowland - Date: Tue May 3 17:40:16 2011 +0100 - - new plugin: alias.pm - pagespec aliases - - diff --git a/IkiWiki/Plugin/alias.pm b/IkiWiki/Plugin/alias.pm - new file mode 100644 - index 0000000..b8d4574 - --- /dev/null - +++ b/IkiWiki/Plugin/alias.pm - @@ -0,0 +1,47 @@ - +package IkiWiki::Plugin::alias; - + - +use warnings; - +use strict; - +use IkiWiki '3.00'; - + - +sub import { - + hook(type => "getsetup", id=> "alias", call => \&getsetup); - + hook(type => "checkconfig", id=> "alias", call => \&checkconfig); - +} - + - +sub getsetup () { - + return - + plugin => { - + description => "allows the definition of pagespec aliases", - + safe => 1, - + rebuild => 1, - + section => "misc", - + }, - + pagespec_aliases => { - + type => "string", - + example => {"image" => "*jpg or *jpeg or *png or *gif or *ico" }, - + description => "a set of mappings from alias name to pagespec", - + safe => 1, - + rebuild => 0, - + }, - +} - + - +sub checkconfig () { - + no strict 'refs'; - + no warnings 'redefine'; - + - + if ($config{pagespec_aliases}) { - + foreach my $key (keys %{$config{pagespec_aliases}}) { - + my $value = ${$config{pagespec_aliases}}{$key}; - + # XXX: validate key? - + my $subname = "IkiWiki::PageSpec::match_$key"; - + *{ $subname } = sub { - + my $path = shift; - + return IkiWiki::pagespec_match($path, $value); - + } - + } - + } - +} - + - +1; + I need to reflect on this a bit more before I send a pull request. In particular I imagine the strict/warnings stuff will make you puke. Also, I'm @@ -136,6 +80,19 @@ however, to add ' or internal()' to `boring`, for some reason. >> Useful indeed! --[[Joey]] + +>>> I've tweaked my patch in light of your above feedback: The plugin has +>>> been renamed, and I now validate keys. I've also added documentation to +>>> the branch. I haven't read rubykat's code properly yet, and don't have +>>> access at the time of writing (I'm on a beach in Greece ☺), but I expect +>>> it would be possible to extend what I've got here to support defining the +>>> aliases in a PageSpec, once the dependency stuff has been reasoned out +>>> properly. +>>> +>>> I'd like to solve the issue of this not being web-configurable by +>>> implementing support for more nested datatypes in [[plugins/websetup]]. — +>>> [[Jon]] + --------------------------- Based on the above, I have written an experimental plugin called "subset". @@ -166,3 +123,21 @@ Unfortunately I haven't figured out how to do the dependencies - I'd really appr > > Cool! I like the caching idea. I'm not sure about the name. I don't like defining > > stuff in pages, but I appreciate this is a matter of taste, and would be happy with > > supporting both. — [[Jon]] + +>>> I've now gone and completely re-done "subset" so that it is less like an alias, but it a bit clearer and simpler: +>>> instead of having a separate "match_" function for every alias, I simply have one function, "match_subset" +>>> which takes the name of the subset. Thus a \[[!subset name="foo"...]] would be called `subset(foo)` rather than `foo()`. + +>>> There are a few reasons for this:
+>>> (a) it's more secure not to be evaluating code on the fly
+>>> (b) it's simpler
+>>> (c) (and this was my main reason) it makes it possible to do caching without having to have a separate "subset" argument. +>>> I've done a bit of a hack for this: basically, the PageSpec is checked to see if the very start of the PageSpec is `subset(foo) and` or if the whole pagespec is just `subset(foo)` and if either of those is true, then it does the subset caching stuff. +>>> The reason I check for "and" is that if it is "subset(foo) or something" then it would be an error to use the subset cache in that case. +>>> The reason I just check the start of the PageSpec is because I don't want to have to do complex parsing of the PageSpec. + +>>> As for defining subsets in the config rather than on pages, I perfectly understand that desire, and I could probably add that in. + +>>> As for the name "subset"... well, it's even less like an alias now, and "alias" is already a reserved name. What other names would you suggest? + +>>>--[[KathrynAndersen]]