Un plugin qui insère un sommaire automatiquement dans la page, basé sur les titres avec des liens sur les différentes partie de votre page.
Il ajoute aussi une barre de navigation (Prec.-Top-Accueil) devant chaque titre de la page.
Download
Demo
// ***********************************************************
// * SOMMAIRE by Soda *
// ***********************************************************
// * for english support mail to [email protected] *
// ***********************************************************
// * Ce plugin insère un sommaire automatiquement *
// * sur les pages comportant <!--sommaire--> *
// * *
// * for english support mail to [email protected] *
// * version:0.1 - license:free (mais un ptit mot serait sympa)
// ***********************************************************
// * Remarque, bug, remerciement, don ;) : [email protected] *
// * !: Vos titre de document ne doivent pas avoir d'attribut, juste <h2>, pas <h2 style="jhhjh"> ou alors, il faut modifier la ligne : $search= array ('/(<h['.$titre_a_chercher.']>)(.+?)(<\/h['.$titre_a_chercher.']>)/m');
// ***********************************************************
// * Utilisation: *
// * Administration - Ressources - Gestion des ressources *
// * nouveau plugin *
// * dans "événements système, cocher OnWebPagePrerender *
// * dans général , entrez un nom, pourquoi pas 'sommaire'*
// * dans code source coller cette page *
// * Par défaut tous les titres h2 seront inclus dans le sommaire avec une barre de navigation devant chaque h2
// * Usage : placer <!--sommaire--> (tel quel !) là ou le sommaire doit être inséré dans votre page ou votre template(pour toutes les pages auxquelles il est lié
// * (eventuellement) :Modifier le niveau de titre à inclure dans le sommaire (par défaut <h2>) modifier $titre_a_chercher=2, 3 pour h3 ...
// * (eventuellement) :le sommaire utilise une liste ul, vous pouvez spécifier ici une classe pour pouvoir modifier le style dans votre css par défaut <ul class="plan">
// * (eventuellement) :si vous voulez enlevez la barre de navigation (précédent - haut de page - accueil) avant chaque titre de document mettre $navbar à '': $navbar='';
// * (eventuellement) :vous pouvez modifier la barre de navigation (afin de mettre vos images par ex) en modifiant $navbar
// ***********************************************************
// * TODO: remplacer $navbar par un snippet evalSnippet ??? (je ne sais pas intégrer un snippet depuis un plugin, si vous avez la solution: [email protected] !!!. Use the MODx API, je débute, votre aide est la bienvenue
// ***********************************************************
// variable pouvant nécessiter une configuration
ini_set('display_errors', 1); // 1 pour debug, 0 pour normal
global $tab_titres, $navbar, $premier;
$titre_a_chercher='2';//pour h2 sinon 3 pour h3 ... Niveau des titre pris en compte pour créer le sommaire
$titre_sommaire="\n<h2>Sommaire</h2>\n";// titre (en html) apparaissant avant le sommaire
$pied_sommaire="";// pied du sommaire (en html) apparaissant après le sommaire
$classe_ul = 'plan'; // le sommaire utilise une liste ul, vous pouvez spécifier ici une classe pour pouvoir affecter un style dans votre css. Par défaut <ul class="plan">
// barre de navigation (ou autre) à insérer avant chaque titre dans la page (hors sommaire): Accueil - Haut - Préc.
$navbar='';
$navbar.="<div class=\"navibar\">\n";
$navbar.=" <a class=\"iconeprec\" href=\"".$_SERVER['HTTP_REFERER']."\" title=\"Retour à votre page précédente\">Préc.</a>\n";
$navbar.=" <a class=\"iconehaut\" href=\"".$_SERVER['REQUEST_URI']."#dpsite\" title=\"Allez en haut de la page\">Haut</a>\n";
$navbar.=" <a class=\"iconeaccueil\" href=\"/\"title=\"Aller à la page Accueil\">Accueil</a>\n";
$navbar.="<!-- fin navibar --></div>\n";
//$navbar="<h2>------------------</h2>";
// ***********************************************************
// * fin de la configuration, début du traitement *
// ***********************************************************
$premier=true;
function rep($matches)
{
global $tab_titres, $navbar,$premier;
$start_tag=$matches[1]; //<h2>
$h=trim($matches[2]); //titre dans les balises <h2> </h2>
$end_tag=$matches[3]; //</h2>
// création de l'ancre:
$nom_ancre = html_entity_decode($h);
//$nom_ancre=substr($h2, 0, 15); //longueur de nom_ancre maxi
$search=array ('/\s+/','/é/','/è/','/ê/','/à/','/ô/','/î/','/û/','/ù/','/ç/','/\//','/</','/>/','/\&/');
$replace=array('_', 'e' ,'e' , 'e' ,'a' ,'o', 'i', 'u', 'u', 'c','');
$nom_ancre=preg_replace ($search, $replace,$nom_ancre);// vire les accents
$nom_ancre=strtolower($nom_ancre); //$nom_ancre=strtolower(rawurlencode($nom_ancre));
$tab_titres[$h]=$nom_ancre; // sauvegarde du titre et de l'ancre pour le sommaire
$start_tag = substr($start_tag, 0, -1); // vire le > de <h_>
if ($premier) { $str="\n$start_tag id=\"$nom_ancre\">$h$end_tag\n";} else { $str=$navbar . "\n$start_tag id=\"$nom_ancre\">$h$end_tag\n";}
$premier=false;
return $str;
}
$all_lines = $modx->documentOutput;
$findme='<!--sommaire-->';
//$pos=strpos($all_lines, $findme);
//if ($pos === false) { // si le sommaire n'est pas à insérer, aucun traitement, sinon, bin ca bosse. Marche po!
// exit;
// } else { // La chaîne '$findme' a été trouvée dans la chaîne '$mystring'";
$tab_titres =array(); // tableau contenant les titres et les noms d'ancre
$search= array ('/(<h'.$titre_a_chercher.'>)(.+?)(<\/h'.$titre_a_chercher.'>)/m');
$all_lines_replaced=preg_replace_callback($search, 'rep', $all_lines); //replace les titre <h2> </h2> par <h2 id=""></h2>
if ( count($tab_titres) ){ //s'il existe des titres
$sommaire = $titre_sommaire. "\n<ul class=\"$classe_ul\">\n";
foreach ($tab_titres as $nom_titre_h2 =>$ancre_h2 )
{
$sommaire.= "\n <li><a href=\"".$_SERVER['REQUEST_URI']."#". $ancre_h2."\">$nom_titre_h2</a></li>"; // $modx->documentObject['objectName']; //href=\"[(base_url)][*alias*]#dpsite\" //REQUEST_URI
}
$sommaire.= "\n</ul>\n".$pied_sommaire;
$all_lines_replaced=preg_replace ( array ('/<\!--sommaire-->/m'),array($sommaire),$all_lines_replaced); //insere le sommaire
$modx->documentOutput=$all_lines_replaced; // renvoie la page modifiée
}
// }
I love MODx and I use it !