[pmwiki-users] New Hierarchical Groups Recipe...

The Editor editor at fast.st
Thu Feb 1 22:12:19 CST 2007


On 2/1/07, Kathryn Andersen <kat_lists at katspace.homelinux.org> wrote:
> On Thu, Feb 01, 2007 at 09:12:12PM -0500, The Editor wrote:
> > On 2/1/07, Kathryn Andersen <kat_lists at katspace.homelinux.org> wrote:
> >
> > > The $FmyPV variable needs to be defined as a call to a function which
> > > takes a group name or a page name as one of the arguments; that means it
> > > is dynamic and will be recalculated appropriately, and will work with
> > > pagelists.
> >
> > Ok, that makes sense.  But how do you get it to take a group name?
> > something like
> >
> > function hgsubgroup($x=$Group) {
> >
> > Pardon the sloppy notation, just trying to get the idea..
> >
> > It's also a bit tricky.  As it is, Hg generates the appropriate number
> > of pagevars dynamically based on the number of hyphens in the group
> > name.  In a pagelist, theoretically, that number would be variable
> > depending on the individual pages.  Would that mean each variable
> > would have to have a separate line calling the function, something
> > like
> >
> > FmtPv [$g1] = ' hgsubgroup($x={$group}, level=1)  ';
> > FmtPv [$g2] = ' hgsubgroup($x={$group}, level=2)  ';
> >
> > This would mean, it would only work to a predefined number of
> > levels--say 5 or 10, rather than unlimited.  Am I correct?
>
> Yes, but you could make the limit not hardcoded, if one goes through a
> loop.  I've been having a go, and the following is what I've come up
> with.  It seems to work.
>
> SDV($hgseparator,'-'); # as before
> SDV($hgmaxlevels,10);
>
> // counts of group-levels and name-levels
> $FmtPV['$g0'] = 'HgCountNameParts($group)';
> $FmtPV['$n0'] = 'HgCountNameParts($name)';
>
> // create up to $hgmaxlevels of variables
> for ($i=0; $i < $hgmaxlevels; $i++)
> {
>    $hg = "g" . ($i + 1);
>    $hn = "n" . ($i + 1);
>    $FmtPV['$' . $hg] = 'HgSplitName($group, ' . $i . ')';
>    $FmtPV['$' . $hn] = 'HgSplitName($name, ' . $i . ')';
> }
>
> // split a name on $hgseparator, and return the count of parts
> function HgCountNameParts($name) {
>    global $hgseparator;
>    $parts = explode($hgseparator, $name);
>    return count($parts);
> }
>
> // split a name on $hgseparator, and return the requested bit
> function HgSplitName($name, $ind) {
>    global $hgseparator;
>    $parts = explode($hgseparator, $name);
>    if ($ind < 0 || $ind >= count($parts))
>    {
>        return '';
>    }
>    else
>    {
>        return $parts[$ind];
>    }
> }
>
> Using this, I've been able to make some nifty pagelist templates:
>
> !!!fmt=#hgtitle
>
> List of groups (showing title), giving nested hierarchical groups;
> assumes that list=group
>
> [@
> [[#hgtitle]]
> (:if !equal "{<$g1}" "{=$g1}":)
> *[[{=$Group}.|+]]
> (:if ( equal "{<$g1}" "{=$g1}" and equal "{=$g1}" "{*$g1}" ) :)
> **[[{=$Group}.|+]]
> (:ifend:)
> [[#hgtitleend]]
> @]
>
> ----
> !!!fmt=#hgtitle3
>
> Three-level list of groups (showing title), giving nested hierarchical
> groups; assumes that list=group
>
> [@
> [[#hgtitle3]]
> (:if ( !equal "{<$g1}" "{=$g1}" and equal "{=$g0}" "1" ):)
> *[[{=$Group}.|+]]
> (:if ( ( equal "{<$g1}" "{=$g1}" and equal "{=$g1}" "{*$g1}" ) and
> equal "{=$g0}" "2" ) :)
> **[[{=$Group}.|+]]
> (:if ( equal "{*$g1}" "{=$g1}" and ( equal "{=$g2}" "{*$g2}" and !equal
> "{=$g3}" "" ) ) :)
> ***[[{=$Group}.|+]]
> (:ifend:)
> [[#hgtitle3end]]
> @]
>
> The above templates assume that the following $SearchPatterns is defined
> in one's config.php; this makes it easier/quicker to make pagelists that
> consist only of groups, which is often what one wants to do in, say, a
> SideBar.
>
> # make a group-only Group.Group search pattern
> $SearchPatterns['group'][] = '/([-\w]+)\.\1$|\.' . "$DefaultName" . '$/';
>
> Kathryn Andersen


Why don't you upload the changes to PmWiki.  If it's working, that's
great!  10 levels should be enough. :)  And I'm eager to try it out...
 Have you seen the stripper markup I added (very simple).  Gives
effects like what can be seen here...

http://www.fast.st/hgtest/index.php?n=Test.Main

I'll be using in ZAP to make it easy to add pages to specific
subgroups.  Very powerful.  Could be used in other recipes as well,
I'm sure. Can't wait to roll out my next site!  Will be organized
completely different.

Cheers,
Dan

P.S.  Just so happens I'll be traveling from the US to Melborne for a
conference next week.  Small world, eh?



More information about the pmwiki-users mailing list