, Copyright 2007. * see http://www.pmwiki.org/wiki/Cookbook/Hg * Modified by: Kathryn Andersen * Further mods by Hans Bracker */ $RecipeInfo['Cluster']['Version'] = '2007-03-19a'; #==== Customisation Variables for use in local config file ====== SDV($ClusterSeparator, '-'); SDV($ClusterMaxLevels, 7); SDV($ClusterBreadCrumbSeparator, ' - '); SDV($EnableBreadCrumbName, 1); SDV($EnableBreadCrumbTitles, 0); /* ================================================================ * Page Variables */ $FmtPV['$g0'] = 'ClusterCountLevels($group)'; $FmtPV['$n0'] = 'ClusterCountLevels($name)'; for ($i=0; $i < $ClusterMaxLevels; $i++) { $hg = "g" . ($i + 1); $hn = "n" . ($i + 1); $FmtPV['$' . $hg] = 'ClusterSplitName($group, ' . $i . ')'; $FmtPV['$' . $hn] = 'ClusterSplitName($name, ' . $i . ')'; } # breadcrumb trail page variables: $FmtPV['$BreadCrumb'] = 'ClusterBreadCrumb($pn, "")'; $FmtPV['$BreadCrumbTitle'] = 'ClusterBreadCrumb($pn, "title=1")'; $FmtPV['$BreadCrumbNoTitle'] = 'ClusterBreadCrumb($pn, "title=0")'; # Grouptitle PVs (both equal) $FmtPV['$GroupTitle'] = 'ClusterGroupTitle($pn, $var)'; $FmtPV['$GroupTitlespaced'] = 'ClusterGroupTitle($pn, $var)'; # Subpage PVs $FmtPV['$ClusterSideBar'] = 'ClusterPageName($group, "SideBar")'; /* ================================================================ * Markup for link shortcuts */ Markup('[[cluster','= count($parts)) return ''; else return $parts[$ind]; } # if exists returns a group title function ClusterGroupTitle($pagename, $var, $fmt = NULL) { global $DefaultName, $SpaceWikiWords, $AsSpacedFunction; // look for a group-title for this specific group, first if (is_null($fmt)) { SDV($GroupTitlePathFmt, array( '$Group.GroupAttributes', '$Group.GroupHeader', '$Group.GroupFooter', '$Group.$Group', "\$Group.$DefaultName")); $fmt = $GroupTitlePathFmt; } foreach((array)$fmt as $f) { $pn = FmtPageName($f, $pagename); $page = ReadPage($pn, READPAGE_CURRENT); if ($page['title']) { return $page['title']; } } // okay, didn't find one $num_parts = PageVar($pagename, '$g0'); if ($num_parts == 1) { $grouptitle = PageVar($pagename, '$Group'); } else { // get the last part of the group $grouptitle = PageVar($pagename, '$g' . PageVar($pagename, '$g0')); } return ($var == '$GroupTitlespaced' || $SpaceWikiWords) ? $AsSpacedFunction($grouptitle) : $grouptitle; } # return the pagename of the closest ancestor function ClusterPageName($group, $name) { global $ClusterSeparator; global $SiteGroup; $groups = explode($ClusterSeparator, $group); while (count($groups) != 0) { $cluster_group = implode ($ClusterSeparator, $groups); if (PageExists("$cluster_group.$name")) { // short-circuit return! return "$cluster_group.$name"; } array_pop($groups); } return "$SiteGroup.$name"; } function ClusterLinks($pagename, $prefix, $inlink) { global $ClusterSeparator; $group = FmtPageName('$Group', $pagename); if ($prefix == "-") { return "[[$group$ClusterSeparator$inlink]]"; } $groups = explode($ClusterSeparator, $group); $c = strlen($prefix); $i = 0; while ($i < $c) { if (substr($prefix, 0, 1) == "*") $link = $link . $groups[$i] . $ClusterSeparator; if (substr($prefix, 0, 1) == "^") array_pop($groups); $i = $i + 1; } if (substr($prefix, 0, 1) == "*") $link = substr ($link, 0, -1); if (substr($prefix, 0, 1) == "^") $link = implode($ClusterSeparator, $groups); return "[[$link$inlink]]"; } # breadcrumb markup Markup('breadcrumb', 'directives', '/\\(:breadcrumb\\s*(.*?):\\)/ei', "ClusterBreadCrumb(\$pagename, PSS('$1'))"); # make a "breadcrumb trail" of group links function ClusterBreadCrumb($pagename, $opt) { global $ClusterSeparator, $ClusterBreadCrumbSeparator, $DefaultName, $EnableBreadCrumbName, $EnableBreadCrumbTitles, $FmtPV; $defaults = array( 'level' => 0, 'separator' => $ClusterBreadCrumbSeparator, 'title' => $EnableBreadCrumbTitles, 'name' => $EnableBreadCrumbName, ); $opt = array_merge($defaults, ParseArgs($opt)); $name = PageVar($pagename,'$Name'); $group = PageVar($pagename,'$Group'); $Title = PageVar($pagename,'$Titlespaced'); $Namespaced = PageVar($pagename,'$Namespaced'); # building grouplink trail incl. separators $groups = explode($ClusterSeparator, $group); $i = abs($opt['level']); while (count($groups) > $i) { $grp = implode($ClusterSeparator, $groups); if(PageExists($grp.".".$grp)) $groupname = $grp.".".$grp; else $groupname = $grp.".".$DefaultName; # checking for group title if ($FmtPV['$GroupTitlespaced'] && $opt['title']) $grouptitle = PageVar($groupname, '$GroupTitlespaced'); else $grouptitle = $groups[count($groups)-1]; $out = "[[$groupname|".$grouptitle."]]" . $opt['separator'] . $out; array_pop($groups); } # removing trailing crumb separator if pagename is not wanted if($opt['name']==false OR $name==$DefaultName OR $name==$group) return substr($out,0,-strlen($opt['separator'])); # adding page name else if($opt['title']==1) $out .= "[[$pagename|".$Title."]]"; else $out .= "[[$pagename|".$Namespaced."]]"; return $out; }