After realizing (thanks to Allow TITLE to include part of the path in addition to the basename) that I needed some kind of "parentlinks on steroids", I wrote a new plugin, called pedigree.
This plugin provides a bunch of loops that one can use in his/her
HTML::Template's to iterate over all or a subset of a page's
parents. Inside these loops, half a dozen variables are made
available, in addition to
URL that are already provided
Amongst many possibilities, one can e.g. simply use this plugin to
give every parent link a different
class= attribute, depending
either on its depth in the path leading to the current page, or on its
distance to it.
The code and documentation (including simple and complex usage examples) are in the 'pedigree' Git branch in this repo:
Seems there is also a gitweb.
Ok, I'll take a look. BTW, could you allow user joey on repo.or.cz push access to the main ikiwiki repo you set up there? --Joey
I did not. The main ikiwiki repo on repo.or.cz seems to have been been setup by firstname.lastname@example.org ; mine is what they call a "fork" (but it's not, obviously). -- intrigeri
Any opinions on the idea/design/implementation?
Seems that there should be a more generic way to do
is_grand_motheretc). One way would be to include in
PEDIGREEa set of values like
depth_2, etc. The one corresponding to the
absdepthwould be true. This would allow a template like this:
<TMPL_LOOP NAME="PEDIGREE"> <TMPL_IF NAME="depth_1"> </TMPL_ELSE> <TMPL_IF NAME="depth_2"> </TMPL_ELSE> <TMPL_VAR PAGE> /* only showing pages 2 levels deep */ </TMPL_IF> </TMPL_IF> </TMPL_LOOP>
The only missing information would be
reldepth, but in the above example the author of that template knows that it's
absdepth - 1(Things would be a lot nicer if
HTML::Templatehad equality tests!)
Since this would make it more generic and also fix your one documented bug, I can see no reason not to do it. --Joey
Thanks for your comments. I'll answer soon. (Grrr, I really need to find a way to edit this wiki offline, every minute online costs bucks to me, my old modem gently weeps, and I hate webbrowsers.) -- intrigeri
Well, I maybe didn't get your idea properly; I may be missing something obvious, but:
- I don't understand how this would replace
is_grand_mother. As a template writer, I don't know, given an absolute array index (and this is the only piece of data your solution gives me), if it will be e.g. the before-last (how do I say this in correct English?) element of an array whose (variable) size is unknown to me.
- Knowing that
reldepth's value is, in a given loop, always equal to
absdepth - 1is of little use to me (as a template writer): how do I use this piece of information programmatically in my templates, if I want all links with
Perhaps I misunderstood what
is_grand_motheris supposed to do. The docs were not very clear to me. If it's supposed to be 2 down from the page, (and not from the root), this could be achieved by reversing the
depth_nvariables. So the page gets
depth_1set, its parent gets
depth_2set, etc. If you want to be able to include/exclude from both ends, you could also have a
height_nthat is 1 for the root, and counts upwards. --Joey
In my understanding, your suggestion gives us little more than can already be achieved anyway with
__counter__). The only added bonus is doing custom stuff for an arbitrary element in the loop, chosen by its absolute depth. Please correct me if needed.
(Intermezzo: in the meantime, to suit my personal real-world needs, I added a
DISTANCEloop-variable. Quoting the documentation, it's "thedistance, expressed in path elements, from the current page to the current path element; e.g. this is 1 for the current page's mother, 2 for its grand-mother, etc.".)
Anyway, your comments have made me think of other ways to simplify a bit this plugin, which admittedly provides too much overlapping functionality. Bellow is my reasoning.
In one of my own real world examples, my two main use cases are :
- the "full-blown example" provided in the documentation (i.e. displaying every parent but mother and grand'ma as a group, and giving every of these two last ones their dedicated div);
- skipping the two oldest parents, and inside what's left, displaying the three youngest parents (i.e. mother, grand'ma and grand'grand'ma), each one with a dedicated style;
Both of these can be achieved by combining
DISTANCE, and some CSS tricks to hide some parts of the list.
IS_GRAND_MOTHER, as well as
PEDIGREE_BUT_TWO_OLDEST, would be convenient shortcuts, but I do not formally need them.
So... it seems things can be simplified greatly:
- I initially added
RELDEPTHfor completeness, but I'm not sure anyone would use it. Let's give it up.
RELDEPTHis lost (modulo Git tendencies to preserve history), the known bug is gone as well, and
PEDIGREE_BUT_TWO_OLDESTare now only convenient shortcuts functions; they could as well disappear, if you prefer to.
It appears then that I'd be personally happy with the single
PEDIGREEloop (renamed to
PARENTLINKS), providing only
ABSDEPTH(maybe renamed to
DISTANCE. This would make my templates a bit more complicated to write and read, but would also keep the plugin's code to the bare minimum. Let's say it is my up-to-date proposal. (Well, if the various shortcuts don't really annoy you, I'd be glad to keep them
This sounds fairly similar to what I just described above. (I called DISTANCE "height".) I don't know about the CSS tricks; seems like if
DISTANCE_nare provided, you can test for them inside the loop using HTML::Template's lame testing, and isolate any page or range of pages. --Joey
Ok, I definitely like this idea, as an effective and generic page-range selection tool; this seems the way to go to me.
But if you discard the
HEIGHTcounters, we lack a way to style, for example, every parent link depending on its depth or height; one can do this for arbitrary parents (chosen by their height or depth), but not for any parent, since there is no way to express, with HTML::Template, something like "display the name of the only
DEPTH_nvariable that is currently true". So I am in favor of keeping the
HEIGHTcounters, to allow constructs like:
<TMPL_LOOP NAME="PARENTLINKS"> <a href="<TMPL_VAR NAME="URL">" class="parentdistance<TMPL_VAR NAME="DISTANCE">"> <TMPL_VAR NAME="PAGE"> </a> / </TMPL_LOOP>
This seems to me a nice functionality bonus, and should not imply too bloated code. I'm thus going to rewrite the plugin with only
HEIGHT_n. -- intrigeri
Done, and pushed in my pedigree branch. Update: I've also done and pushed two commits that rename the plugin and replace the core parentlinks with this one. --intrigeri
(I'll try never to rebase this branch, but writing this plugin has been a pretext for me to start learning Git, so...)
To finish with, it seems no plugin bundled with ikiwiki uses the current parentlinks implementation, so one could event think of moving it from the core to this plugin (which should then be enabled by default, since the default templates do use parentlinks ;).
I think that moving parentlinks out to a plugin is a good idea. However, if it's done, I think the plugin should be named parentlinks, and should continue to use the same template variables as are used now, to avoid needing to change custom templates. Pedigree is a quite nice name, but renaming it to parentlinks seems to be the way to go to me. --Joey
Agreed. -- intrigeri
Just commited a testsuite for this plugin, BTW. It's nearly twice big as the plugin itself, I'm wondering... -- intrigeri
Merged, nice work. (Overkill having a test suite. --Joey
Thanks. If the testsuite reveals itself to be harder to maintain than the plugin, my ego won't be offended to see it removed. It's been nice to find a way, step by step, to work with you on this small plugin thing. I'm starting to feel a bit at home in ikiwiki sourcetree, which is great since I may have to start working on some more ambitious ikiwiki stuff, such as the ~multilingual wiki (master language + translations) support. Expect news from me on this front in the next weeks. --intrigeri