Valider 0e078576 rédigé par tcharlss@bravecassine.com's avatar tcharlss@bravecassine.com
Parcourir les fichiers

Possibilité de limiter le niveau de profondeur des menus.

On peut gérer ça de façon globale, via une nouvelle option dans le formulaire de configuration.
On peut aussi agir au cas par cas :

- Nouveau paramètre optionnel pour la balise à insérer dans les squelettes : `#SOMMAIRE{#TEXTE,N}`
- Nouveau paramètre optionnel pour la balise à insérer dans le texte : `<sommaire|niveau_max=N>`

N est le nombre de niveaux, de 1 à 6
parent 6f080a32
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+40 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -55,6 +55,45 @@
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
			</li>

			#SET{name,sommaire_niveau_max}#SET{obli,''}#SET{defaut,'6'}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
			<li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
				<label>[(#GET{fl}|concat{':label_',#GET{name}}|_T)]</label>
				<p class="explication"><:sommaire:explication_niveau_max:></p>[
				<span class='erreur_message'>(#GET{erreurs})</span>
				]
				#SET{val,1}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
				#SET{val,2}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
				#SET{val,3}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
				#SET{val,4}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
				#SET{val,5}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
				#SET{val,6}
				<div class="choix">
					<input type="radio" name="#GET{name}" class="radio" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
					<label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
				</div>
			</li>

		</ul>

		<p class="boutons"><span class="image_loading">&nbsp;</span><input type="submit" class="submit" value="<:bouton_enregistrer:>" /></p>
+12 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -13,6 +13,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'cfg_exemple_explication' => 'Explication de cet exemple',
	'cfg_titre_parametrages' => 'Paramétrages',

	// E
	'explication_niveau_max' => 'Profondeur maximale des sommaires. Cette valeur peut être changée au cas par cas via l\'utilisation de la balise <code>#SOMMAIRE{#TEXTE,2}</code> dans les squelettes, ou <code>&lt;sommaire|niveau_max=2&gt;</code> dans le texte des articles.',

	// L
	'label_sommaire_automatique' => 'Insertion du sommaire d\'article',
	'label_sommaire_automatique_off' => 'Aucune insertion dans le texte des articles',
@@ -24,6 +27,13 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
	'label_sommaire_automatique_numerote' => 'Type de liste pour le sommaire',
	'label_sommaire_automatique_numerote_off' => 'liste à puces',
	'label_sommaire_automatique_numerote_on' => 'liste numérotée',
	'label_sommaire_niveau_max' => 'Profondeur',
	'label_sommaire_niveau_max_1' => '1 niveau',
	'label_sommaire_niveau_max_2' => '2 niveaux',
	'label_sommaire_niveau_max_3' => '3 niveaux',
	'label_sommaire_niveau_max_4' => '4 niveaux',
	'label_sommaire_niveau_max_5' => '5 niveaux',
	'label_sommaire_niveau_max_6' => '6 niveaux',

	// T
	'titre_page_configurer_sommaire' => 'Sommaire automatique',
+4 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -2,11 +2,12 @@
[(#CONFIG{sommaire_automatique_numerote}|=={on}|oui)
	#SET{liste, '#'}
]
#SET{niveau_max,#ENV{niveau_max}|intval|sinon{6}}
<B_somm>
<div class="well nav-sommaire nav-sommaire-[(#ENV{sommaire}|count)]">
	<h2><:sommaire:titre_cadre_sommaire:></h2>
	<BOUCLE_somm(POUR){tableau #ENV{sommaire}}>
-[(#GET{liste}|str_pad{#VALEUR{niveau},#GET{liste}})] [#VALEUR{id}<-][#VALEUR{titre}->#VALEUR{href}]</BOUCLE_somm>
	<BOUCLE_somm(POUR){tableau #ENV{sommaire}}><BOUCLE_filtrer(CONDITION){si #VALEUR{niveau}|<={#GET{niveau_max}}}>
-[(#GET{liste}|str_pad{#VALEUR{niveau},#GET{liste}})] [#VALEUR{id}<-][#VALEUR{titre}->#VALEUR{href}]</BOUCLE_filtrer></BOUCLE_somm>
</div>
</B_somm>
#FILTRE{propre}
+2 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="sommaire"
	categorie="edition"
	version="1.1.2"
	version="1.2.0"
	etat="stable"
	compatibilite="[3.0.0;3.1.*]"
	logo="prive/themes/spip/images/sommaire-64.png"
+33 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -56,8 +56,10 @@ function ancres_sommaire($texte){
 */
function balise_SOMMAIRE_dist($p){
	$_texte = interprete_argument_balise(1,$p);
	$_niveau_max = interprete_argument_balise(2,$p);
	$_niveau_max = ($_niveau_max?$_niveau_max:"''");

	$p->code = "sommaire_empile_note().affiche_sommaire($_texte).sommaire_depile_note()";
	$p->code = "sommaire_empile_note().affiche_sommaire($_texte,$_niveau_max).sommaire_depile_note()";
	$p->interdire_scripts = false; // le contenu vient d'un modele
	return $p;
}
@@ -76,9 +78,10 @@ function sommaire_insert_head_css($flux){
 * @param string $texte
 * @return string
 */
function affiche_sommaire($texte){
function affiche_sommaire($texte,$niveau_max=''){

	// retirer le(s) sommaire(s) eventuel(s) deja la avant de re-calculer le sommaire
	return sommaire_post_propre(retire_sommaire($texte), $ajoute=true, $sommaire_seul=true);
	return sommaire_post_propre(retire_sommaire($texte), $ajoute=true, $sommaire_seul=true, $niveau_max);
}

/**
@@ -110,14 +113,20 @@ function sommaire_declarer_tables_interfaces($interfaces){
}

function sommaire_propre($texte, $connect, $env){
	// on cherche les balises <sommaire>, mais aussi <sommaireN|arg=x|arg=y> et [sommaire]
	$has_sommaire = preg_match("/[<\[]sommaire(\d+)?(?:\|.*)*[>\]]/",$texte);
	// le niveau maximal peut être passé en paramètre de la balise <sommaire|niveau_max=N>
	$niveau_max = (preg_match("/[<\[]sommaire.*niveau_max=(\d).*[>\]]/", $texte, $m)) ? $m[1] : '';

	$texte = propre($texte,$connect,$env);

	if (
		!isset($GLOBALS['meta']['sommaire_automatique'])
		OR $GLOBALS['meta']['sommaire_automatique']=="on"
		OR ($GLOBALS['meta']['sommaire_automatique']=="ondemand" AND
		(strpos($texte,"<sommaire>")!==false OR strpos($texte,"[sommaire]")!==false))
		$has_sommaire)
	){
		$texte = sommaire_post_propre($texte);
		$texte = sommaire_post_propre($texte,tru,false,$niveau_max);
	}
	return $texte;
}
@@ -173,17 +182,27 @@ function sommaire_filtre_texte_echappe($texte, $filtre, $balises='', $args=NULL)
	return echappe_retour($texte, 'FILTRETEXTECHAPPE');
}

function sommaire_filtre($texte, $ajoute=true, $sommaire_seul=false){
function sommaire_filtre($texte, $ajoute=true, $sommaire_seul=false, $niveau_max=''){
	$sommaire = sommaire_recenser($texte);

	// le niveau max peut être passé en paramètre (via la balise texte ou squelette)
	// à défaut on prend la valeur enregistrée dans la config
	$niveau_max_config = isset($GLOBALS['meta']['sommaire_niveau_max']) ? $GLOBALS['meta']['sommaire_niveau_max'] : '';
	$niveau_max = (intval($niveau_max) > 0) ? $niveau_max : $niveau_max_config;

	if ($ajoute OR $sommaire_seul){
		$sommaire = recuperer_fond("modeles/sommaire",array('sommaire'=>$sommaire));
		// on cherche les balises <sommaire>, mais aussi <sommaireN|arg=x|arg=y> et [sommaire]
		$pattern = "/[<\[]sommaire(\d+)?(?:\|.*)*[>\]]/";
		$sommaire = recuperer_fond("modeles/sommaire",array('sommaire'=>$sommaire,'niveau_max'=>$niveau_max));
		$sommaire = "<!--sommaire-->$sommaire<!--/sommaire-->";
		if ($sommaire_seul)
			return $sommaire;
		if ($p = strpos($texte,"<sommaire>") OR $p = strpos($texte,"[sommaire]")){
			$texte = substr_replace($texte,$sommaire,$p,strlen("<sommaire>"));
		if (preg_match($pattern, $texte)) {
			$texte = preg_replace($pattern, $sommaire, $texte);
		}
		/*if ($p = strpos($texte,"<sommaire>") OR $p = strpos($texte,"[sommaire]")){
			$texte = substr_replace($texte,$sommaire,$p,strlen("<sommaire>"));
		}*/
		else
			$texte = $sommaire . $texte;
	}
@@ -191,9 +210,10 @@ function sommaire_filtre($texte, $ajoute=true, $sommaire_seul=false){
	return $texte;
}

function sommaire_post_propre($texte, $ajoute=true, $sommaire_seul=false){
function sommaire_post_propre($texte, $ajoute=true, $sommaire_seul=false, $niveau_max=''){

	if (strpos($texte, '<h')!==false)
		$texte = sommaire_filtre_texte_echappe($texte,'sommaire_filtre','html|code|cadre|frame|script|acronym|cite',array($ajoute,$sommaire_seul));
		$texte = sommaire_filtre_texte_echappe($texte,'sommaire_filtre','html|code|cadre|frame|script|acronym|cite',array($ajoute,$sommaire_seul,$niveau_max));
	elseif ($sommaire_seul)
		return '';
	return $texte;