+
+>>> 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:<br/>
+>>> (a) it's more secure not to be evaluating code on the fly<br/>
+>>> (b) it's simpler<br/>
+>>> (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]]
+
+>>>> Regarding my comments: I wasn't clear what you are/were intending to
+>>>> achieve with your modifications. I've aimed for a self-contained plugin
+>>>> which could be merged with ikiwiki proper. I think I initially took your
+>>>> developments as being an evolution of that with the same goal, which is
+>>>> why I commented on the (change of) name. However, I guess your work is
+>>>> more of a fork than a continuation, in which case you can call it
+>>>> whatever you like ☺ I like some of the enhancements you've made, but
+>>>> having the aliases/subsets/"things" work in any pagespec (inside map, or
+>>>> inline) is a deal-breaker for me. — [[Jon]]
+
+>>>>> I'm a bit confused by your statement "having the aliases/subsets/"things" work in any pagespec (inside map, or inline) is a deal-breaker for me".
+>>>>> Do you mean that you want them to work in any pagespec, or that you *don't* want them to work in any pagespec? -- [[KathrynAndersen]]
+
+>>>>>> I mean I would want them to work in any pagespec. — [[Jon]]
+
+----
+
+Hi, it's been 7 years since I last looked at this, and I'm surprised to find
+that I'd got it up to a merge-request state; I've dusted it off and done some
+clean up and testing, but it's working (albeit not via websetup). I've revamped
+the docs and rebased the branch. Can someone please consider merging ([[joey]]
+or [[smcv]]?) or otherwise feed back on this? Thanks! — [[Jon]] (2018-09-25)
+
+> To hide it from `websetup`, the `example` needs to be a hash reference
+> like `example => { images => "*.png or *.jpg or *.gif" }`, I think?
+> (Please try it on a websetup-enabled wiki, possibly by copying
+> `t/manual/git_revert` to `t/manual/websetup` and adapting it as required.)
+>
+> For a less magical variant, you could consider using `alias(images)`
+> instead of `images()` for the pagespec syntax that is enabled by the
+> example above. I'm not sure which way is better.
+>
+> If `safe_key` fails, you probably want to log a warning, or even fail
+> `checkconfig` with a fatal `error`?
+>
+> If `checkconfig` detects that the given pagespec function already
+> exists, for example `title` after loading the meta plugin, you probably
+> want to log a warning or fail? It seems you can detect this with
+> `defined ref *$subname{CODE}`.
+>
+> If you define a loop of mutually recursive aliases (or even an alias
+> that refers to itself), I think you'll get infinite recursion.
+> You can probably bypass that with a construct like:
+>
+> my $entered;
+> *{ $subname } = sub {
+> return IkiWiki::ErrorReason->new("Alias $key is defined recursively") if $entered;
+> $entered = 1;
+> my $result = IkiWiki::pagespec_match($path, $value);
+> $entered = 0;
+> return $result;
+> }
+>
+> (but don't take my word for it, a regression test would tell you whether
+> this works.)
+>
+> --[[smcv]]
+
+----
+
+Thank you for the review (nearly a year ago, I've just noticed!). I've
+added checks for the issues you outline above, and test coverage for all
+those issues.
+I've also decided to rename the plugin (back) to just "alias":
+I mooted that right back when I started this but I was worried about
+potential ambiguity. That was ten years ago and I think the concern has
+prove unfounded. I've left the config key as `pagespec_aliases` though,
+as that's one area I think its clearer.
+
+With regards `aliasname()` versus `alias(aliasname)`:
+I've given this some thought. Pros and cons of that approach: it would be
+a little uglier; you would not inadvertently clash with a PageSpec defined
+elsewhere. However, I wonder if someone might actually *want* to define a
+PageSpec this way that was the same as that defined by something else: Perhaps,
+you have disabled a plugin that defined a PageSpec name and you want to substitute
+what it would have expanded to with something else, for example.
+
+I will (after writing this) rebase my branch. Please take another look!
+(just in case the rebase and/or the "-" in the branchnames causes problems
+with IkiWiki's auto-mirror-pull, the branch is here:
+<https://github.com/jmtd/ikiwiki/tree/pagespec-alias>)
+
+*— [[Jon]], 2021-01-10*
+
+> Scratch that, more work needed ☹ *— [[Jon]], 2021-01-11*
+
+>> This is really ready now. *— [[Jon]], 2021-01-13*