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 PAGE and URL that are already provided
by parentlinks.
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:
git://repo.or.cz/ikiwiki/intrigeri.git
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 johannes.schindelin@gmx.de ; 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 PEDIGREE_BUT_ROOT
and PEDIGREE_BUT_TWO_OLDEST (also is_second_ancestor ,
is_grand_mother etc). One way would be to include in PEDIGREE
a set of values like depth_1 , depth_2 , etc. The one corresponding
to the absdepth would 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::Template had 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 - 1 is 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 reldepth==2 to be given the same style? I guess some bits of
Javascript might do the trick, but if it's getting so complicated, I'll
just style my parentlinks another way.
Perhaps I misunderstood what is_grand_mother is 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_n variables. So the page gets depth_1 set, its parent gets
depth_2 set, etc. If you want to be able to include/exclude
from both ends, you could also have a height_n that 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 HTML::Template 's loop_context_vars (i.e.
__first__ , __last__ and __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 DISTANCE loop-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 PEDIGREE , DISTANCE , and some
CSS tricks to hide some parts of the list. IS_MOTHER and
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
RELDEPTH for completeness, but I'm not sure anyone
would use it. Let's give it up.
- Once
RELDEPTH is lost (modulo Git tendencies to preserve history), the
known bug is gone as well, and PEDIGREE_BUT_ROOT and
PEDIGREE_BUT_TWO_OLDEST are 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 PEDIGREE loop
(renamed to PARENTLINKS ), providing only PAGE , URL , ABSDEPTH (maybe
renamed to DEPTH ), and 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
DEPTH_n and DISTANCE_n are 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 DEPTH and HEIGHT
counters, 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_n variable that is currently
true". So I am in favor of keeping the DEPTH and HEIGHT counters,
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 PEDIGREE , DEPTH , HEIGHT , DEPTH_n and
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]]
[[!tag patch done]]
|