Ajouter des ID aux intertitres

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Ce petit filtre ajoute un ID unique à chaque intertitre, pour pouvoir pointer directement vers un intertitre donné (par exemple pour faire rapidement un sommaire de la page).

Il est souvent pratique de pouvoir pointer vers une URL de type page.html#ancre. Nous allons émuler ce comportement avec un petit filtre de SPIP rapide et pas cher :)

Définir les intertitres

Nous avons décidé avant tout de redéfinir les intertitres en <h2> (titres de niveau 2). Dans mes_fonctions.php3 on a donc :

$GLOBALS['debut_intertitre'] = "\n<h2>";
$GLOBALS['fin_intertitre'] = "</h2>\n";

Méthode : parcours de la page

Nous allons maintenant parcourir le contenu du #TEXTE, et chaque fois que nous trouverons un h2, nous le compléterons par un attribut id unique.

Le code

Dans mes_fonctions.php3, voici le code complet à ajouter :

/*
 *   +----------------------------------+
 *    Nom du Filtre :    creer_ancres
 *   +----------------------------------+
 *    Date : mercredi 27 juillet 2005
 *    Auteurs :
 *		Stéphane Deschamps http://www.spip-contrib.net/auteur.php3?id_auteur=327
 *		Yann Ducrocq http://www.spip-contrib.net/auteur.php3?id_auteur=1833
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *     Ce filtre donne un identifiant unique à chaque intertitre de la page
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.spip_contrib.net/article.php3?id_article=1053
*/

// declaration d'un compteur global
$cId = 0;

// le filtre a appliquer sur #TEXTE
// [(#TEXTE|creer_ancres)]

function creer_ancres($str)  {
	// l'expression reguliere a tester
	$regH2 = "/<h2[^>]*>(.*?)<\/h2>/i";
	// appel de la fonction de remplacement par callback
	$str = preg_replace_callback($regH2,'replaceH2',$str);
	// on renvoie la chaine resultante
	return $str;
}

function replaceH2($matches) {
	// recuperation du compteur global
	global $cId;
	// incrementation du compteur global pour faire des identifiants uniques
	$cId++;
	// renvoi a la fonction appelante de la chaine remplacee
	return '<h2 id="ancre' . $cId . '">' . $matches[1] . '</h2>';
}

Conclusion et développements possibles

Ce filtre une fois appliqué, vous pourrez faire référence à #ancre1 pour le premier intertitre, #ancre2 pour le deuxième, etc.

Attention cependant, dans certains vieux navigateurs, internet explorer par exemple, les liens vers les id ne fonctionnent pas toujours idéalement, il conviendra le cas échéant si vous voulez à tout prix éviter un dysfonctionnement de remplacer '<h2 id="ancre' . $cId . '">' par '<h2><a name="ancre' . $cId . ' id="ancre' . $cId . '"></a>' (oui, on a fait exprès de mettre un name et un id, mais ce serait trop long à expliquer dans le cadre de cet article).

Parmi les idées de développements possibles, vous pourrez par exemple vous appuyer sur un script en Javascript qui génère automatiquement le sommaire de la page, comme le TOC script de Peter-Paul Koch.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom