, , ,
Adaptation du plugin Pagequery

Ce plugin très puissant permet de créer et d'afficher de manière esthétique et hautement configurable une liste de pages basée sur une requête plus ou moins complexe.

Bon la syntaxe et la pléthore d'options possibles font un peu peur 8-O.

Voici la syntaxe utilisée pour l'index sur la page d'accueil de ce wiki :

{{pagequery>*;
  sort=ns:asc,name:asc;
  display={title};
  group;
  cols=5;
  border;
  snippet;
  hidejump;
  bullet=square;
  layout=column;
  filter=!ns:(user);
}}

Le paramètre display n'est pas très bien documenté sur la page officielle du plugin. Il récupère les métadonnées des pages et voici devel:metadataune liste de ce qui existe.

Et une autre pour un espace de nom spécifié (cette fois basé sur les noms des pages et pas leur titre) :

{{pagequery>@:espace:de:nom *;
  sort=ns:asc,name:asc;
  group;
  cols=5;
  proper;
  border;
  snippet=quote,5,c20;
  hidejump;
  bullet=square;
  layout=column;
}}

Ne sachant pas comment Pagequery gère les droits d'accès, il me semble judicieux de cacher l'espace de nom user, d'où le dernier commutateur.

Et voici un exemple du résultat avec le code initial :

Mouais :-/.
Pas terrible avec tous ces liens Accueil qui se baladent un peu partout lorsque le lien de l'espace de nom pointe sur cette même page.

Pagequery propose un commutateur fait justement pour cela: hidestart. Mais le résultat est très loin d'être satisfaisant :

Revoici le premier exemple avec ce qui a été supprimé (<color blue>à raison</color> ou <color red>à tord</color>) :

À mon humble avis :

Donc, en l'état actuel (version du 09/11/2014), le commutateur hidestart est inutilisable et il faut donc bidouiller le code :-|.

La bidouille

Sur un wiki très fourni, cette bidouille va beaucoup ralentir le chargement de la page car il s'agit de passer en revue tous les éléments de la requête Pagequery.

Il faut modifier le fichier syntax.php du plugin en ajoutant sous la ligne suivante (actuellement n°317) :

$sorted_results = $pq->mgroup($sort_array, $keys, $group_opts);

Ceci :

// Bidouille
$prevpagetarget = "nopagetestedyet";
// Pour chaque élément récolté par la requête
foreach ($sorted_results as $key => $page) {
    // Noter le lien sur lequel pointe l'élément en court
    $newpagetarget = $page[2];
    // Eléments de comparaison
    $startns = array (1, "[".$conf['start']."]", "", "", "", "");
    $userns = array (1, "user", "", "", "", "");
    // Si l'élément en court est identique à $startns
    if ($page == $startns) {
        // Lien à intégrer
        $newpagetarget = $conf['start'];
        // Intégration du lien
        $sorted_results[$key] = array (1, "[".$conf['start']."]", $newpagetarget, "", "", "");
    // Si le lien de l'élément en court est identique = celui de l'élément précédent
    } elseif (($newpagetarget == $prevpagetarget) or ($page == $userns)) {
        // suppression de l'élément en court
        unset($sorted_results[$key]);
    }
    // Le lien de l'élément en court deviens le prochain lien précédent
    $prevpagetarget = $newpagetarget;
}

Et le tour est joué :

[hidepages] : DokuWiki à la rescousse

Dans le cas plus simples où il suffit d'exclure un espace de nom ou un nom de page précis (comme les pages topbar.txt ou sidebar.txt), il est plus simple de se reposer sur l'option générale [hidepages] qui est justement prévue pour masquer des éléments correspondants à une expression régulière aux plugins conçus pour générer des listes de pages.

Pourquoi ne pas procéder ainsi pour l'espace :user ?
Si l'on utilise cette possibilité, aucun plugin ne pourra plus lister le contenu de cet espace de nom ou de ces sous espaces, même en le désignant comme cible dans la syntaxe.

Voici les pages à exclure ici :

Donc :

Je suis loin d'être à l'aise avec les expression régulière mais celle-ci était à ma portée :

topbar$|^:tag:

Et voici le résultat :