Filtre Sommaire Tableau 1.2

Petit filtre pour générer un sommaire dans les articles...

Souvent, lorsqu’on rédige un long texte, on souhaiterais pouvoir créer un système de navigation interne à l’article, afin de faciliter l’accès aux différents chapitres qui le composent. Dans ce cas, la fabrication d’une navigation sous forme de sommaire est une solution toute indiquée.

Il est possible de construire ce sommaire manuellement, grâce au système des ancres et liens gérés par Spip, mais la tâche s’avère souvent assez pénible, sans parler des erreurs toujours possibles, alors voici un nouveau petit filtre, baptisé « Sommaire Tableau », qui, comme son nom l’indique, sert à générer des sommaires automatiquement, sous forme de tableau, mais uniquement...

Présentation

Comme je le signalais dans l’introduction, on peut avoir besoin de fabriquer un petit système de navigation à l’intérieur d’un article, surtout si celui-ci est long est structuré en chapitres.

Un sommaire, ou table de matières, est la solution qu’on utilise communément, dans l’édition traditionnelle, pour aider le lecteur à accéder rapidement aux contenus de l’ouvrage qui lui semblent les plus pertinents.

De la même manière, en matière de publication internet, la mise en ligne des longs textes ne devrait pas échapper à cette judicieuse pratique.

Les concepteurs de SPIP ont pensé qu’il serait parfois utile de pouvoir faire des liens internes dans les articles et dans le site, en fournissant les outils syntaxiques nécessaires pour faciliter cette tâche lors de la rédaction d’un texte, notamment par l’insertion des ancres nommées.

Seulement, vous vous en doutez, fabriquer manuellement un sommaire nécessite un certain nombre de manipulations, qui peuvent être fort fastidieuses à la longue... et c’est là qu’une solution automatisant cette opération serait un moyen de d’économiser du temps (et quelques énervements en moins au passage :-), d’où l’idée de développer ce filtre...

Bien sûr, avant de me lancer dans cette réalisation, j’ai un peu regardé si d’autres solutions existaient déjà, et si elles convenaient à l’utilisation que j’imaginais...

J’ai trouvé alors deux contributions fort intéressantes :

-  Sommaire d’un article, proposée par Noplay.
-  Découper un article en plusieurs pages et lui ajouter un sommaire, proposée également par Noplay conjointement avec A. Perard.

Alors, pour être honnête, je n’ai testé que la première de ces deux contributions, et ça fonctionne plutôt bien... mais, ayant une autre idée en tête, je me suis dis qu’elle pouvait éventuellement intéresser d’autres que moi.

Mon idée était de pouvoir réaliser le sommaire sous forme de tableau, car je trouvais que visuellement ça avait l’avantage de créer une rupture avec le reste du contenu « normal » d’un article, rendant l’accès au sommaire plus évident et immédiat.

De plus, je voulais que le sommaire ne soit généré que si le rédacteur le souhaitait explicitement, de manière ponctuelle et non pas systématiquement, car certains articles, plus courts ou n’ayant pas nécessairement besoin d’une table de matières, ne méritent pas toujours d’avoir un sommaire de navigation.

Enfin, toujours dans le but de faciliter la navigation au sein de l’article, je voulais que tous les intertitres reçoivent un lien de retour vers le sommaire de navigation.

Après la version 1.0 du filtre, dont vous pouvez consulter l’article qui lui est consacré à cette adresse, cette nouvelle version a été en grand partie réécrite, elle possède désormais un code plus robuste et elle dispose des nouvelles fonctionnalités qui pourraient intéresser certains utilisateurs.

Pour la petite histoire, la conception de ce filtre entre dans le cadre plus général du développement du squelette MiniGriSpip, sur lequel je travaille encore afin de l’améliorer, tant au niveau du code que des fonctionnalités proposés.

Voici donc des informations sur les nouveautés apportées par cette version du filtre « Sommaire Tableau », ainsi que les explications nécessaires pour son installation et utilisation, même si dans l’ensemble ça ne change pas trop de la version précédente.

Bonne découverte et utilisation... n’hésitez pas à me faire part de vos remarques et suggestions dans le forum de cet article... :-)

Nouveautés

Voici une petite liste des nouveautés de cette version, la plupart seront détaillées dans les chapitres suivants.

-  Il est désormais possible de demander au filtre de numéroter automatiquement les intertitres et les éléments du sommaire de navigation, ce qui évite de le faire manuellement.

-  Il est aussi possible maintenant de masquer, ponctuellement, les intertitres qu’on ne désire pas afficher. Il devient ainsi possible de créer un sommaire de navigation sans forcément afficher les intertitres qui ont servi à sa fabrication, utile pour les longs articles non structurés en chapitres.

-  Un code en grand partie réécrit, plus robuste que le précédent, avec un certain nombre de tests et vérifications qui assurent le bon fonctionnement du filtre.

-  Correction d’un certain nombre de bugs, la plupart trouvés et rapportés par « Yann974 » (merci à lui :-) dans le forum de l’article de présentation du squelette "MiniGriSpip sur SPIP’Contrib, et dans le forum de l’article de la précédente version de ce filtre.

Parmi ces principales corrections, on peut signaler :

-  Correction de l’intégration du filtre sans l’argument optionnel, qui est désormais possible ;
-  Correction de l’affichage des numéros placés au début des intertitres, qui s’affichent correctement maintenant ;
-  Correction de l’utilisation des crochets à l’intérieur des intertitres, ils sont bien traités désormais ;
-  Correction de la gestion des intertitres présents dans les codes, ils sont maintenant tous ignorés, même ceux identiques au texte ;
-  Correction du traitement des intertitres vides, ils sont désormais tout simplement supprimés.

Installation

Ce filtre est fourni sous la forme d’un fichier nommé « somm_table.php », qu’il faut dupliquer ou déplacer dans votre dossier « squelettes ».

Ce filtre s’installe comme la plupart des autres, à savoir, par l’une des méthodes suivantes :

-  Si votre squelette dispose d’un fichier nommé « mes_fonctions.php », éditez-le, puis insérez la ligne de code suivante en tête du fichier, juste après la balise qui débute le code Php <?php, en s’assurant de ne pas le faire dans une autre fonction existante :

include("somm_table.php");

-  Une autre possibilité consisterait à éditer les deux fichiers « mes_fonctions.php » et « somm_table.php », et par un simple copier/coller, insérer, à partir du fichier du filtre, l’ensemble du code de la fonction nommée "somm_table" dans le fichier « mes_fonctions.php », n’importe où entre les balises <?php et ?>, mais pas à l’intérieur du code d’une autre fonction existante.

-  Enfin, si votre squelette ne dispose pas d’un fichier nommé « mes_fonctions.php », il suffit alors de renommer le fichier « somm_table.php » en « mes_fonctions.php ».

Intégration

Ce filtre est spécialement dédié au traitement des textes des articles et brèves, même si ces dernières n’ont pas besoin, en principe, d’avoir un sommaire, l’intégration demeure identique, consistant donc à placer le filtre à l’intérieur des boucles correspondantes sur la balise "#TEXTE".

Par exemple, dans une boucle "(ARTICLES)", il faut placer ce filtre sur la balise "#TEXTE" de la manière suivante :

[(#TEXTE*|somm_table|propre)]

Important, veuillez respecter les contraintes d’intégration suivantes :

Notez, dans l’exemple d’intégration, la présence d’un astérisque "*" après la balise "#TEXTE", celui-ci est absolument nécessaire afin de pouvoir travailler sur le contenu brut de l’article, c’est à dire, sans les mises en forme propres à Spip.

De plus, vous remarquerez qu’un autre filtre, nommé "propre", se place juste après le filtre "somm_table", ceci est également absolument nécessaire afin que Spip puisse rétablir son propre formatage du contenu de l’article.

Donc, pour résumer, l’astérisque inhibe le formatage de Spip, afin de pouvoir lancer les opérations du filtre sans dénaturer le contenu des articles et brèves, et le filtre "propre" permet de rétablir les formatages par défaut de Spip.

Enfin, si jamais vous avez d’autres filtres a utiliser sur la même balise, comme par exemple le filtre qui sert à redimensionner les images contenues dans l’article, insérez alors de préférence le filtre "somm_table" en premier, comme suit :

[(#TEXTE*|somm_table|propre|reduire_image{400,0})]

Utilisation

Voici comment utiliser ce filtre dans le texte des articles et brèves...

Tout d’abord, il faut préciser que ce filtre génère un sommaire de navigationuniquement si le rédacteur de l’article le demande explicitement, il n’est donc pas nécessaire d’enlever le filtre des boucles Spip pour inhiber son action.

Pour demander au filtre de générer un sommaire de navigation, il suffit de créer un intertitre « Sommaire » dans le corps de l’article, de préférence au début du texte, dès lors, le filtre détectera sa présence et analysera l’ensemble du texte afin d’isoler tous les autres intertitres existants, ce qui lui servira pour fabriquer le sommaire de navigation, qui s’affichera ensuite juste en dessous de l’intertitre « Sommaire » (logique non ? :-)...

Si vous ne souhaitez pas de sommaire de navigation, il suffit alors de ne pas créer d’intertitre « Sommaire » dans votre article... c’est tout.

Enfin, si vous avez quand-même besoin d’inscrire un intertitre « Sommaire » dans votre article, mais sans vouloir pour autant générer un sommaire de navigation, vous n’avez qu’à terminer l’intertitre avec une espace, comme ceci « Sommaire », du coup le filtre ne produira aucun effet.

Important, pour une utilisation basique, sans options particulières (voir chapitre « Options » ci-après pour plus de détails), l’intertitre « Sommaire », qui déclenche la fabrication du sommaire de navigation, doit être écrit tel quel (peu importe la casse), sans être précédé ni suivi d’aucun autre caractère ou numéro, sans quoi le filtre ne produira aucun effet.

Affichage

Deux différents affichages du sommaire de navigation sont disponibles : tableau ou liste.

-  Sommaire Tableau

Ce filtre propose donc, par défaut, la possibilité de générer un sommaire de navigation sous forme de tableau, juste en insérant un intertitre « Sommaire » dans le corps de votre article...

Le résultat sera comme celui de cette page par exemple, ou de cette capture d’écran tirée du site de démonstration du squelette MiniGriSpip :

  Cliquez sur la vignette pour agrandir l’image  
Cliquez sur la vignette pour l’aggrandir

Évidemment, le sommaire de navigation que vous obtiendrez aura le même aspect et formatage que les tableaux de votre squelette... n’hésitez pas alors à modifier les feuilles de style concernées afin d’adapter et améliorer leur affichage.


-  Sommaire Liste

Si la présentation sous forme de tableau ne convient pas vraiment au type de contenu traité dans votre site (textes universitaires, philosophiques, littéraires, religieux, etc.), le filtre autorise également de générer des sommaires de navigation sous forme de liste, plus discrets et peut-être d’avantage adaptés à l’esprit de votre site.

Pour générer une liste à la place d’un tableau, il suffit de terminer l’intertitre du sommaire avec un trait d’union (tiret simple), comme ceci « Sommaire- », ce qui produira un sommaire de ce type :

-  Présentation
-  Installation
-  Intégration
-  Utilisation
-  etc.

Important, comme précisé précédemment, pour une utilisation basique, sans options particulières (voir chapitre « Options » ci-après pour plus de détails), tout autre caractère autour de l’intertitre, hormis le trait d’union à la fin qui permet de générer le sommaire de navigation sous forme de liste, même une simple espace, aurait pour effet d’inhiber la fabrication du sommaire de navigation, quelque soit le type choisi.

Options

Cette version du filtre propose deux nouvelles options de traitement décrites ci-après.

-  Numérotation automatique

Si vous souhaitez ajouter une numérotation séquentielle aux intertitres, et aux éléments correspondants dans le sommaire de navigation, vous pouvez demander au filtre de le faire automatiquement, en précédent l’intertitre « Sommaire » d’un caractère dièse « # », comme ceci :

{{{#Somaire}}}

Dès lors, le filtre ajoutera automatiquement un numéro séquentiel, respectant l’ordre d’apparition de chaque intertitre, devant les intertitres et devant les éléments correspondants du sommaire de navigation.

Attention, la numération se fait uniquement avec des chiffres numériques courants (chiffres arabes), les numérotations avec des chiffres romains, avec des caractères alphabétiques ou autres, ne sont pas supportées, vous devrez les inscrire manuellement si vous les désirez.

Important, comme pour les autres syntaxes supportées, tout autre caractère autour de l’intertitre, même une simple espace, aurait pour effet d’inhiber la fabrication du sommaire de navigation.


-  Masquage des intertitres

Si vous souhaitez masquer un ou plusieurs intertitres, tout en les listant dans le sommaire de navigation, c’est-à-dire, en assurant la navigation interne de l’article par l’insertion automatique des ancres au sein du texte, vous pouvez le faire ponctuellement sur chaque intertitre que vous désirez masquer en l’entourant des crochets, comme ceci :

{{{[Intertitre]}}}

Tous les intertitres peuvent ainsi être masqués, même celui du sommaire, mais, sauf ce dernier, l’ensemble des intertitres seront listés dans le sommaire de navigation quelque soit leur état, masqués ou affichés.

Voici le code à utiliser pour masquer l’intertitre « Sommaire », lorsqu’on veut l’utiliser avec toutes les options actives (numérotation automatique et affichage sous forme de liste) :

{{{[#Sommaire-]}}}

Attention, si vous désirez inscrire un intertitre entouré des crochets, sans vouloir pour autant le masquer, il suffit d’ajouter une espace autour des crochets, de cette manière le filtre ne masquera pas l’intertitres.

Par ailleurs, si vos intertitres comportent un crochet ouvrant au début ou un crochet fermant à la fin, pour assurer correctement leur affichage, vous devrez précéder le crochet ouvrant d’une espace en début d’intertitre, et ajouter une espace après le crochet fermant en fin d’intertitre.

Enfin, si vous avez demandé la numérotation automatique des intertitres, et qu’en même temps vous avez souhaité masquer certains d’entre eux, la séquence de numérotation suivra l’ordre d’existence des intertitres, qu’ils soient masqués ou pas. Autrement dit, si vous souhaitez masquer le deuxième intertitre de votre texte, la numérotation sera « 1 » pour le premier intertitre affiché, et « 3 » pour le second intertitre affiché, puisque le deuxième intertitre, même s’il est masqué, est tout de même existant et listé dans le sommaire de navigation de l’article.

Important, comme pour les autres syntaxes supportées, tout autre caractère autour de l’intertitre, même une simple espace, aurait pour effet d’inhiber la fabrication du sommaire de navigation.

Personnalisation

Certains l’auront sans doute compris, ce filtre « Sommaire Tableau », particulièrement adapté pour des sites francophones, ou pour des articles rédigés dans notre belle langue, n’aura aucun effet dans le cadre d’une utilisation avec une autre langue que le français...

Et oui, étant donné que le terme par défaut, déclencheur de la fabrication du sommaire de navigation, est le mot « Sommaire », il devient difficile, voire absurde, de contraindre les rédacteurs polyglottes à utiliser toujours ce même mot dans tous leurs articles, quelque soit la langue utilisée...

Pour pallier à cet inconvénient, le filtre propose une option permettant de lui indiquer précisément quel est le mot qu’il doit considérer comme déclencheur de la fabrication du sommaire de navigation.

Ainsi, il est possible, très simplement, de l’intégrer dans un site multilingue, dès lors qu’on utilise des fichiers de localisation pour les textes recourants ou ceux de l’interface du squelette.


Voici alors la procédure à suivre pour pouvoir utiliser un autre mot que « Sommaire », afin que le filtre soit toujours fonctionnel, quelque soit la langue utilisée.

-  Il faut commencer par éditer le fichier de localisation nommé « local_fr.php » (s’il n’existe pas, il faudra le créer), et y ajouter une nouvelle définition, comme ceci par exemple : 'somm' => 'sommaire',. Il faut de préférence écrire le mot « sommaire » tout en minuscules.

-  Puis, si votre site reçois des textes en anglais, il faut éditer le fichier de localisation correspondant (ou le créer à défaut), à savoir "local_en.php, puis y ajouter une nouvelle définition, en respectant la clé utilisée dans le fichier de localisation précédent, à savoir 'somm', par exemple : 'somm' => 'summary',.

-  Si votre site accepte également des articles en espagnol, il faut alors éditer le fichier de localisation correspondant, c’est à dire "local_es.php (ou le créer à défaut), et y ajouter la définition qui va bien, par exemple : 'somm' => 'índice',, attention toutefois aux accents et aux encodages textes utilisés (Ascii, Unicode, etc.).

Puis, ainsi de suite avec les autres langues pratiquées dans votre site.


Maintenant, voici comment passer cette information au filtre, afin qu’il adapte son traitement en conséquence.

Au moment de l’intégration du filtre, dans les codes Html de vos pages « articles.html » et/ou « breve.html », il faudra ajouter un argument au filtre, qui correspond exactement à la balise 'somm' des textes localisés de notre exemple précédent, de la manière suivante :

[(#TEXTE*|somm_table{<:somm:>}|propre)]

Voilà, votre filtre « Sommaire Tableau » est prêt à fabriquer des beaux sommaires navigables dans l’ensemble de articles de votre site, quelque soit la langue utilisée, dès lors que sa définition existe dans un fichier de localisation correspondant.


Bien sûr, vous pouvez utiliser cette méthode pour changer d’intertitre déclencheur de la fabrication du sommaire de navigation, même si votre site n’est pas multilingue, et au lieu d’utiliser le mot « Sommaire » par défaut, vous pourriez lui préférer le terme « Table de matières », ou un autre, il suffit alors d’indiquer celui de votre choix dans l’argument du filtre, pour que celui-ci adapte son traitement en conséquence...

Attention, l’utilisation d’un intertitre déclencheur comportant des caractères accentués, peut poser certains problèmes si l’encodage du jeu des caractères utilisé n’est pas compatible. Le moteur de Spip fonctionne avec un encodage « Unicode » de type « Utf8 », je n’ai pas pu tester pour l’instant, mais je pense qu’il faut respecter le même encodage pour l’utilisation de intertitres déclencheurs avec des accents.

Codes

Voici le code intégral du filtre « Sommaire Tableau », largement commenté pour faciliter sa prise en main par les utilisateurs avertis.

Important, pour éviter un problème d’affichage du code ci-dessous, les balises « code » et « cadre » ont été légèrement modifiés, par l’ajout des espaces autour des textes, mais vous devrez effacer ces espaces pour que le code fonctionne correctement. Ces balises se trouvent dans les deux instructions juste après le commentaire suivant : // On isole les textes présents dans les balises "cadre" et "code"..

<?php
/*
*	+----------------------------------+
*	Nom du Filtre : "Sommaire Tableau"                                         
*	Version : 1.2                                               
*	Date : dimanche 10 septembre 2006
*	Auteur : FredoMkb (fredomkbfr@yahoo.fr)                                      
*	+-------------------------------------+
*	Fonctions de ce filtre :
*		Ce filtre permet de generer un sommaire de navigation dans les articles.
*		Le but est d'offrir un moyen simple et automatique pour fabriquer des 
*		sommaires de navigation a l'interieur de vos articles, aussi bien sous forme
*		de tableau (option par defaut) que sous forme de liste.
*		En plus du sommaire de navigation, le filtre ajoute donc les ancres et liens 
*		necessaires a une navigation aisee au sein de l'article.
*		Une option permet la numerotation automatique du sommaire et des intertitres,
*		une autre permet le masquage ponctuel des intertitres.
*	+-------------------------------------+ 
*	Integration de ce filtre dans le squelette :
*		Dans une boucle article, il faut placer ce filtre sur la balise "#TEXTE". 
*		Par exemple : [(#TEXTE*|somm_table|propre)]
*		Important : prendre soin a mettre un asterisque "*" apres la balise "#TEXTE"
*		et de terminer l'integration par le filtre "propre", pour retrouver le formatage 
*		typographique par defaut de Spip.
*	+-------------------------------------+ 
*	Utilisation de ce filtre dans le texte des articles et breves :
*		Il suffit de rediger votre article avec des intertitres puis d'inscrire 
* 		un intertitre "Sommaire" pour que le filtre fabrique le sommaire 
*		de navigation sous forme de tableau, ajoutez un trait d'union a la fin, 
*		"Sommaire-", pour generer une liste a la place du tableau.
*		Ajoutez un caractere diese "#" pour generer une numerotaion automatique.
*		Entourez les intertitres des crochets, "[" et "]", pour les masquer.
*	+-------------------------------------+ 
*	Personnalisation de l'intertitre declencheur :
*		Pour une utilisation dans un site multilingue, ou pour changer le terme 
*		declencheur de la fabrication du sommaire de navigation, ajoutez un argument
*		au filtre lors de son integration dans les fichiers Html, comme suit :
*		[(#TEXTE*|somm_table{'Declencheur'}|propre)]
*		ou 'Declencheur' represente le terme que vous choisirez de personnaliser.
*	+-------------------------------------+ 
*	Pour toute remarque ou suggestion, reportez-vous au forum de l'article.
*	<http://fredomkb.free.fr/spip/spip.php?article15> 
*	+-------------------------------------+ 
*/

function somm_table($texteOrig, $titreSommaire = '') {
// Fonction pour creer un sommaire sous forme d'une liste ou d'un tableau Spip.
// La fonction verifie l'existence d'un intertitre "Sommaire" par defaut, 
// ou le titre de sommaire fourni par l'tuilisateur (pour des articles multilingues).
// Si un intertitre sommaire existe, alors on analyse le texte fourni pour isoler
// tous les intertitres afin de pouvoir fabriquer le sommaire, avec des liens 
// internes vers tous les intertitres et de liens de retour vers le sommaire.
// Le sommaire ainsi cree sera place juste en dessous du titre "Sommaire".
	
	// Si l'utilisateur n'a pas fourni le titre sommaire a utiliser, 
	// alors on utilise le titre par defaut en francais.
	if (empty($titreSommaire)) {
		$titreSommMin = 'sommaire';
	} else {
		$titreSommMin = strtolower($titreSommaire);
	};
	
	// Test de l'existence d'un intertitre 'Sommaire' pour generer un tableau
	// ou 'Sommaire-' (avec un trait d'union a la fin) pour generer une liste. 
	$test = preg_match('#\{\{\{\[?\#?'.$titreSommMin.'-?\]?}\}\}#i', $texteOrig);

	// Si un des intertitres sommaire existe, alors on genere le sommaire.
	if ($test) {
	
		// On isole les textes presents dans les balises "cadre" et "code".
		preg_match_all('#< cadre >(.*?)</ cadre >#is', $texteOrig, $listeCadre);
		preg_match_all('#< code >(.*?)</ code >#is', $texteOrig, $listeCode);
		// On place les resultast, avec les balises, dans des variables.
		$listeCadreTexte = $listeCadre[0];
		$listeCodeTexte = $listeCode[0];
		
		// On modifie le format des balises intertitre dans les balises "cadre" pour ne pas les traiter.
		foreach ($listeCadreTexte as $texteCadreOrig) {
			$texteCadreNew = preg_replace('#(\{\{)(\{.*?\})(\}\})#i','$1-$2-$3',$texteCadreOrig);
			$texteOrig = str_replace($texteCadreOrig,$texteCadreNew,$texteOrig);
		};

		// On modifie le format des balises intertitre dans les balises "code" pour ne pas les traiter.
		foreach ($listeCodeTexte as $texteCodeOrig) {
			$texteCodeNew = preg_replace('#(\{\{)(\{.*?\})(\}\})#i','$1-$2-$3',$texteCodeOrig);
			$texteOrig = str_replace($texteCodeOrig,$texteCodeNew,$texteOrig);
		};

		// Recuperation des tous les intertitres presents dans le texte nettoye.
		preg_match_all('#\{\{\{(.*?)\}\}\}#i', $texteOrig, $listeOrig);
		
		// On place le resultat a utiliser dans une variable.
		$listeTitresOrig = $listeOrig[1];

		// On verifie qu'il y reste des intertitres a traiter.
		if (count($listeTitresOrig) > 0) {
		
			// On verifie si le sommaire demande est sous forme de liste ou tableau.	
			$testType = preg_match('#\{\{\{\[?\#?'.$titreSommMin.'-\]?\}\}\}#i', $texteOrig);
			
			// On verifie si la numerotation automatique est demandee.	
			$testNro = preg_match('#\{\{\{\[?\#'.$titreSommMin.'-?\]?\}\}\}#i', $texteOrig);
			
			// On initialise les autres variables.
			$newSomm = '';
			$esp = '&nbsp; &nbsp;';
			$nb = 1;
			
			// Boucle sur chaque element de la liste des intertitres originaux.
			foreach ($listeTitresOrig as $titreOrig) {
				$masquer = preg_match('#^\[(.*?)\]$#i', $titreOrig); // On test s'il faut masquer.
				$titreClean = rtrim(trim($titreOrig, '[#'),'-]'); // On supprime les eventuels indesirables.
				$titreClean = ucfirst($titreClean); // On met la premiere lettre en majuscule.
				$titreMin = strtolower($titreClean); // On converti en minuscules.

				if ($titreMin == $titreSommMin) {
					// Si le titre considere est 'sommaire', alors on fabrique le debut du sommaire.
					$titreSommOrig = '{{{'.$titreOrig.'}}}';
					// On insere l'ancre et l'intertitre, ou l'ancre seulement s'il faut masquer l'intertitre.
					if ($masquer) {
						$titreSommNew = '[somm<-]'."\n";
					} else {
						$titreSommNew = '[somm<-]'."\n".'{{{'.$titreClean.'}}}'."\n\n";
					}
				} else {
					// On insere la numerotation automatique si elle est demandee.
					if ($testNro) { $titreClean = $nb.'. '.$titreClean; };

					// On fabrique la liste ou le tableau et on place les ancres et liens des intertitres.
					if ($testType) {
						// On fabrique le sommaire sous forme de liste.
						$newSomm = $newSomm.'- [{{<html>'.$titreClean.'</html>}}->#inter'.$nb.']'."\n";
					} else {
						// On fabrique le sommaire sous forme de tableau.
						$newSomm = $newSomm.'|['.$esp.'{{<html>'.$titreClean.'</html>}}'.$esp.'->#inter'.$nb.']|'."\n";
					};
					// On insere l'ancre et l'intertitre, ou l'ancre seulement s'il faut masquer l'intertitre.
					if ($masquer) {
						$titreNew = '[inter'.$nb.'<-]'."\n";
					} else {
						$titreNew = '[inter'.$nb.'<-]'."\n".'{{{[<html>'.$titreClean.'</html>->#somm]}}}';
					}
					// On remplace les intertitres par d'autres avec une ancre et un lien vers le sommaire.
					$texteOrig = str_replace('{{{'.$titreOrig.'}}}', $titreNew, $texteOrig);
					$nb++;
				};
			};
			// On remplace l'intertitre "Sommaire" original par le nouveau sommaire.
			$texteOrig = str_replace($titreSommOrig, $titreSommNew.$newSomm, $texteOrig);
		};
		// On remet les balises intertitres dans les balises "cadre" et "code" a leur format initial.
		$texteOrig = preg_replace('#\{\{-\{(.*?)\}-\}\}#i','{{{$1}}}',$texteOrig); 
		
		// On efface tous les eventuels intertitres vides.
		$texteOrig = str_replace('{{{}}}', '', $texteOrig);
	};
	// Retour du texte avec le sommaire ou le texte original a defaut.
	return $texteOrig;
}
?>

Téléchargement

  Cliquez sur l’icône pour télécharger le filtre  
Filter « Sommaire Tableau » (4 Ko)

Avertissements

Important, étant donné la méthode d’analyse du texte et la technique de fabrication du sommaire de navigation, ce filtre sera inopérant sur les articles directement rédigés en Html, en effet, seule la syntaxe typographique de Spip est supportée pour l’instant, et vous devrez inscrire vos intertitres entourés de 3 accolades "{{{Intertitre}}}" pour que le filtre puisse fonctionner correctement.

Il n’est pas prévu pour l’instant une version gérant la syntaxe Html, mais si plusieurs utilisateurs se manifestent avec cette requête, je pourrais alors étudier la réalisation d’une version compatible Html. N’hésitez pas à formuler vos suggestions dans le forum de cet article, merci.

Remerciements

Tout d’abord, un Grand Merci à « Yann974 », qui a eu le courage de jouer le délicat jeu du bêta-testeur, apportant un bon nombre de remarques pertinentes et utiles qui ont servi au développement de cette nouvelle version du filtre.

Je remercie également tous les participants et utilisateurs du squelette MiniGriSpip pour leurs interventions toujours constructives et pour l’accueil qu’ils ont su réserver à ce projet.

Je voudrais remercier aussi aux différents participants des forums ExpReg.com ainsi que PhpFrance pour leur aide inestimable.

Enfin, un grand merci à la communauté Spipienne pour leur esprit d’entraide permanent, et aux concepteur et développeurs de ce magnifique outil de publication qu’est Spip.

Discussion

9 discussions

  • 1

    Bonjour,
    Je n’ai jamais installé ce filtre mais je l’utilisais. Je viens de faire un upgrade de SPIP et le {{{sommaire}}} ne se transforme plus en sommaire mais en

    sommaire

    . Peut-être faut-il simplement l’installer parce que ce n’est pas fait ? Je ne sais même pas comment !

    • Ah pardon, ca fonctionne bien. J’avais complètement mais alors complètement oublié la procédure d’installation de ce filtre. Il est vraiment super. Comme j’ai ajouté des idioties pour ien, j’en profite pour dire merci pour cette page.

    Répondre à ce message

  • 1

    Bonjour,

    Serait il envisageable d’avoir un sommaire à plusieurs niveau ?

    1 titre1

    1.1 soustitre 1 du 1

    1.2 sous titre 2 du 1

    2 titre 2

    2.1 soustitre 1 du 2

    etc.

    Merci pour la réponse

    Répondre à ce message

  • Garry Olivier

    Bonjour

    merci bcp pour ce filtre tres utile.

    Une question, comment faire si l’on veut intercaler entre le menu et le texte une autre séquence html indépendante de l’éditorial.

    Y aurait-il la possibilité d’avoir un appel du menu d’un côté et appel du texte de l’autre. Un peu comme sur l’autre contrib de generation de menu :
    http://www.spip-contrib.net/Sommaire-de-l-article

    merci

    Répondre à ce message

  • Laurent B. http://www.laurentbloch.org

    Merci pour ce filtre qui marche de façon impeccable (Spip 1.9.2c) avec un minimum d’intrusion dans le reste du code.

    Répondre à ce message

  • 1

    Je vous remercie de cette solution. Je viens de la tester, ca marche.

    Mais, j’ai une demande. J’ai vu aussi qu’il y avait un filtre qui découpe l’article en pages, malheureusement ca ne marche pas sur mon SPIP 1.9.2. Et j’aimerais appliquer cela sur mes articles (livres). Ca serait très de combiner les deux possibilités : sommaire + découpage en pages...

    Merci, bravo.

    • sommaire + découpage en pages...

      Le Couteau Suisse (qui fonctionne pour tout SPIP 1.9.X) propose très exactement cette alliance. Les fonctions sont légères et peuvent peut-être répondre à ton besoin. Je reste à l’écoute des expériences de chacun.

    Répondre à ce message

  • 1
    Cyprien

    Bonjour,

    bravo et merci pour ce filtre !
    J’ai ajouté une option pour, si l’on veut, n’avoir que le sommaire et non pas le texte de l’article. Cela m’est utile pour intégrer le sommaire de l’article ailleurs dans la page. C’est ici :

    http://logiciellibre.free.fr/contri...

    L’utilisation est la suivante.

    Dans l’article, on met {{{[#Sommaire-0]}}}
    Attention, le zéro « 0 » doit se trouver entre l’éventuel trait d’union « - » et l’éventuel crochet « ] » .

    Dans le squelette, par exemple en haut de page ou sur le côté, on peut mettre [(#TEXTE*|somm_table.php)] et le sommaire apparaîtra seul, avec la mise en page indiquée par les autres options (« # » et/ou « - »).

    À l’endroit prévu pour le texte de l’article, il suffit de ne pas utiliser le filtre : [(#TEXTE)]

    Voilà, si ça peut aider !

    • Cyprien

      Euh... finalement je change d’avis : j’ajoute un argument optionnel {externe} pour choisir si la balise (assortie du filtre) est destinée à afficher le corps de l’article avec son sommaire (par défaut) ou à être affichée de manière externe au corps de l’article et à générer seulement le sommaire, sous forme de liste (la mise en page pouvant alors se faire par une feuille de style, de manière uniforme sur tous les articles).

      (La version initiale laissait apparaître l’intertitre Sommaire dans le corps de l’article).

      Je reposte ici quand c’est fait.

    Répondre à ce message

  • 1

    votre script est intéressant mais si on a une présentation en deux colonnes on ne peut pas isoler le sommaire du corps de l’article comme les précédentes contributions.

    Pourriez vous me dire comment on pourrait faire ?

    Cordialement
    Manuel

    • Bonjour Manuel :-)

      J’imagine que par « précédentes contributions » vous faites référence aux autres solutions de construction de sommaires de navigation dans les articles, et c’est vrai que les autres contributions ont un mode de fonctionnement différent, qui en fait leur particularité... c’est, en définitive, une simple question d’approche différente pour satisfaire un même besoin...

      En ce qui concerne le problème de la présentation en deux colonnes, je suppose que vous faites allusion à une colonne de navigation puis une autre de contenu, et vous aimeriez générer le sommaire de navigation de l’article dans la colonne de navigation, est-ce bien ça ?

      Si c’est le cas, ce filtre, en l’état, n’est pas capable de faire ça, car son mode de fonctionnement même le contraint à travailler directement dans le contenu de l’article.

      En revanche, comme dans la réponse faite à thierry66ch (ci-dessous), vous pouvez générer le sommaire de navigation dans un bloc « div » particulier, puis traiter ce bloc « div » avec une feuille de style spéciale qui l’afficherait, par exemple, comme un bloc flotant...

      Enfin, les possibilités de présentation du sommaire de navigation généré par ce filtre ne sont pas très importantes, mais, en l’état, elles tentent de répondre à leur manière à un besoin de navigation à l’intérieur d’un article, sans pouvoir pour autant être une solution à tous les besoins de navigation...

      Bref... aucun projet ne peut satisfaire tous les besoins, je pense qu’il convient à chacun de bien definir les siens et de trouver les solutions les mieux adaptées...

      Désolé de ne pouvoir vous apporter une réponse plus concrète, mais, en l’état, je vois mal comment adapter ce projet pour répondre à votre requête...

      Merci, à bientôt Manuel :-)

    Répondre à ce message

  • 1

    Installé sur mon SPIP 1.9.1 tout neuf, ça marche nickel ! Merci pour cette contrib très utile.
    http://www.pogil.com/jarditrain/spip.php?article10

    J’aimerai mettre une petite bordure autour de mon sommaire, autrement dit mettre un < div > autour. Comment faire au mieux ?

    • Bonjour Thierry66ch :-)

      Alors, j’y vois deux possibilités :

      1. Si vous désirez le faire systématiquement, il serait peut-être intéressant de modifier le code source du filtre lui-même afin de l’adapter à vos besoins... Si vous ne trouvez pas comment le faire, je pourrais alors vous proposer le code modifié à vos besoins...

      2. Pour une utilisation occasionnelle, vous pouvez vous servir d’une astuce qui consiste à placer deux codes autour du sous-titre « Sommaire » déclencheur du sommaire de navigation, à savoir :

      2.1 Une ligne au dessus du sous-titre « Sommaire », il faut placer le code suivant :

      <html><div class="cadre_somm"></html>

      2.2 Une ligne en dessous du sous-titre « Sommaire », il faut placer le code suivant :

      <html></div></html>

      2.3 Vous pouvez désormais régler le formatage de ce bloc « div » à partir d’un style dans la feulle de style principale du squelette de votre site, en utilisant le sélecteur « cadre_somm » suivant mon exemple...

      2.4 Vous pouvez eventuellement vous passer d’un style dédié, en indiquant ponctuellement le formatage directement à l’insertion du premier code expliqué au point 2.1, par exemple, pour ajouter un cadre gris, vous pouvez vous inspirer du code suivant :

      <html><div class="cadre_somm" style="margin: 5px; padding: 15px; border: 1px solid #666666;"></html>

      Voià... j’espère que ceci pourra vous aider... n’hésitez pas à me tenir au courant Svp...

      Merci et à bientôt :-)

    Répondre à ce message

  • 1

    Bein vu ce filtre, la numérotation automatique est très pratique, bravo.

    Je me voulait savoir si c’était compliqué de changé les numéros normaux (1,2,3 etc) par des numéros romains (I, II, III, etc) ?

    Autre chose, si ont veut numéroté tout les titres sauf un ou deux, c’est possible ?

    Bravo encor et merci pour ce filtre

    Bicho

    • Bonjour Bicho :-)

      Merci pour ton appréciation...

      En ce qui concerne la numéroation avec des nombres Romains, le filtre n’est pas capable de les calculer automatiquement, ceci impliquerait un développement supplémentaire, dont je ne suis pas sûr de pouvoir assurer.

      En revanche, tu peux faire cette numérotation manuellement, ce qui est plus long je sais, mais c’est la seule solution que je puisse te proposer pour l’instant.

      Pour ce qui est de la numérotation de certains intertitres et d’autres non, là aussi, le filtre ne sait pas faire ça automatiqument, il faut alors procéder à une numérotation manuelle...

      Désolé de ne pas pouvoir te donner des solutions plus efficaces, mais je ne compte pas pour le moment reprendre le développement de ce filtre pour y apporter des nouvelles fonctionnalités... désolé...

      Bonne continuation Bicho et à bientôt :-)

    Répondre à ce message

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