+[[!tag reviewed]]
[[!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.
>>> implementing support for more nested datatypes in [[plugins/websetup]]. —
>>> [[Jon]]
+>>>> Well, it's a difficult problem. websetup builds a form using
+>>>> CGI::FormBuilder, which makes it easy to build the simple UI we have
+>>>> now, but sorta precludes anything more complicated. And anything with
+>>>> a nested datatype probably needs a customized UI for users to be able
+>>>> to deal with it. I don't think websetupability need be a deal-breaker
+>>>> for this patch. I personally like special pages like Kathryn is doing
+>>>> more than complex setup files. --[[Joey]]
+
+>>>>> I've ran out of time to keep working on this, so I'm just going to
+>>>>> submit it as a 'contrib' plugin and leave things at that for now.
+>>>>> — [[Jon]]
+
---------------------------
Based on the above, I have written an experimental plugin called "subset".
>>>>> 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*