Browse Source

close #3

Choses qui était discutée sur spip-dev il y a quelques mois.
Option pour permettre que le liens de retour renvoient vers le haut du
sommaire plutôt que vers l'emplacement du titre dans le sommaire.

Il peut arriver qu'il y ait plusieurs sommaires par page (par ex. si on
boucle sur plusieurs articles).

Dans ce cas il convient d'avoir un uniquid().

La difficulté vient du fait que parfois le sommaire est inséré via

 #SOMMAIRE{#TEXTE}
 [(#TEXTE|ancres_sommaire)]

Dans ce cas, le sommaire et l'insertion des ancres se fait en 2 temps.
Nous stockons le uniqueid dans une globale, à ce moment là.

Mais ceci suppose que nous n'ayions pas l'ordre inverse d'appel.

 [(#TEXTE|ancres_sommaire)]
 #SOMMAIRE{#TEXTE}

Ne marchera pas ! Mais qui ferait cela ? La solution pour éviter cela
soit que les gens passent leur ancre eux-même, mais cela compliquerait
la syntaxe pour un cas infinito-marginale.
master
Maïeul 1 year ago
parent
commit
39b7cab788
  1. 18
      formulaires/configurer_sommaire.html
  2. 3
      lang/sommaire_fr.php
  3. 2
      modeles/sommaire.html
  4. 20
      sommaire_fonctions.php

18
formulaires/configurer_sommaire.html

@ -73,6 +73,24 @@
</BOUCLE_niveaux>
</li>
#SET{name,sommaire_retour}#SET{obli,''}#SET{defaut,'titre'}#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>[
<span class='erreur_message'>(#GET{erreurs})</span>
]
#SET{val,titre}
<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>
<br/>
</div>
#SET{val,haut}
<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>

3
lang/sommaire_fr.php

@ -33,6 +33,9 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'label_sommaire_niveau_max_4' => '4 niveaux',
'label_sommaire_niveau_max_5' => '5 niveaux',
'label_sommaire_niveau_max_6' => '6 niveaux',
'label_sommaire_retour' => 'Où renvoient les liens de retour',
'label_sommaire_retour_titre' => 'Sur le titre au sein du sommaire',
'label_sommaire_retour_haut' => 'En haut du sommaire',
// S
'sommaire_titre' => 'Sommaire automatique',

2
modeles/sommaire.html

@ -3,7 +3,7 @@
#SET{liste, '#'}
]
<B_somm>
<div class="well nav-sommaire nav-sommaire-[(#ENV{sommaire}|count)]">
<div class="well nav-sommaire nav-sommaire-[(#ENV{sommaire}|count)]" id="#ENV{id_sommaire}">
<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>

20
sommaire_fonctions.php

@ -9,6 +9,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
include_spip('inc/config');
/**
* Filtre |retire_sommaire
* pour retirer le sommaire automatique et les ancres d'un texte
@ -252,6 +253,9 @@ function sommaire_filtre_texte_echappe($texte, $filtre, $balises = '', $args = n
* @return string
*/
function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = '') {
if ($ajoute) {
$GLOBALS['sommaire_id_sommaire'] = uniqid('nav', true);// Obliger de passer par $globals dans le cas où l'on utilise #SOMMAIRE et |ancres_sommaire
}
$sommaire = sommaire_recenser($texte);
// le niveau max peut être passé en paramètre (via la balise texte ou squelette)
@ -262,7 +266,13 @@ function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau
$sommaire = sommaire_filtrer_niveaux($sommaire, $niveau_max);
if ($ajoute or $sommaire_seul) {
$sommaire = recuperer_fond('modeles/sommaire', array('sommaire' => $sommaire, 'niveau_max' => $niveau_max));
$sommaire = recuperer_fond('modeles/sommaire',
array(
'sommaire' => $sommaire,
'niveau_max' => $niveau_max,
'id_sommaire' => $GLOBALS['sommaire_id_sommaire'],
)
);
$sommaire = "<!--sommaire-->$sommaire<!--/sommaire-->";
if ($sommaire_seul) {
return $sommaire;
@ -340,7 +350,9 @@ function sommaire_recenser(&$texte) {
$currentpos = 0;
$titleretour = attribut_html(_T('sommaire:titre_retour_sommaire'));
$id_sommaire = $GLOBALS['sommaire_id_sommaire'];
$retour = lire_config('sommaire_retour') ? lire_config('sommaire_retour') : 'titre';
foreach ($matches as $m) {
if (($pos = strpos($texte, $m[0], $currentpos)) !==false
and ($pos < $debutsommairedejala or $pos >= $finsommairedejala)) {
@ -355,8 +367,12 @@ function sommaire_recenser(&$texte) {
'href' => "#$ancre",
'id' => "s-$ancre"
);
if ($retour == 'titre') {
$lien_back = "<a class='sommaire-back' href='#s-$ancre' title='$titleretour'></a>";
} else {
$lien_back = "<a class='sommaire-back' href='#$id_sommaire' title='$titleretour'></a>";
}
$lien_back = "<a class='sommaire-back' href='#s-$ancre' title='$titleretour'></a>";
$h = inserer_attribut($m[1], 'id', $ancre).retire_ancres_sommaire($m[3]).$lien_back.$m[4];
$texte = substr_replace($texte, $h, $pos, strlen($m[0]));
$currentpos = $pos + strlen($h);

Loading…
Cancel
Save