Browse Source

v1.3.3 : prendre en compte le niveau max pour l'ajout des ancres

master v1.3.3
tcharlss 3 months ago
parent
commit
83e7efadfd
  1. 2
      paquet.xml
  2. 57
      sommaire_fonctions.php

2
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="sommaire"
categorie="edition"
version="1.3.2"
version="1.3.3"
etat="stable"
compatibilite="[3.0.0;4.0.*]"
logo="prive/themes/spip/images/sommaire-64.png"

57
sommaire_fonctions.php

@ -53,7 +53,8 @@ function ancres_sommaire($texte) {
/**
* Balise #SOMMAIRE pour afficher le sommaire d'un contenu
* #SOMMAIRE{#TEXTE}
* `#SOMMAIRE{#TEXTE}`
* Limiter en profondeur : `#SOMMAIRE{#TEXTE,2}`
* gere les notes pour eviter leur doublement
*
* @param $p
@ -62,7 +63,7 @@ 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:"''");
$_niveau_max = ($_niveau_max?$_niveau_max:'null');
$p->code = "sommaire_empile_note().affiche_sommaire($_texte,$_niveau_max).sommaire_depile_note()";
$p->interdire_scripts = false; // le contenu vient d'un modele
@ -81,9 +82,10 @@ function sommaire_insert_head_css($flux) {
/**
* Affiche le sommaire d'un texte
* @param string $texte
* @param int|null $niveau_max
* @return string
*/
function affiche_sommaire($texte, $niveau_max = '') {
function affiche_sommaire($texte, $niveau_max = null) {
// 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, $niveau_max);
@ -148,7 +150,7 @@ function sommaire_propre($texte, $connect, $env) {
// puis on remplace la balise par un simple marqueur <!--inserer_sommaire-->.
// Perf : d'abord sans regex pour les formes simples, puis en regex si paramètres.
$has_sommaire = false;
$niveau_max = '';
$niveau_max = null;
$marqueur = '<!--inserer_sommaire-->';
if (
$p = strpos($texte, '<sommaire>')
@ -163,7 +165,7 @@ function sommaire_propre($texte, $connect, $env) {
$has_sommaire = true;
$texte = preg_replace($pattern, $marqueur, $texte);
// On récupère le niveau maximal éventuel passé en paramètre
$niveau_max = (preg_match('/niveau_max=(\d+)/i', $matches['parametres'], $m)) ? $m[1] : '';
$niveau_max = ((preg_match('/niveau_max=(\d+)/i', $matches['parametres'], $m)) ? intval($m[1]) : null);
}
$texte = propre($texte, $connect, $env);
@ -249,21 +251,28 @@ function sommaire_filtre_texte_echappe($texte, $filtre, $balises = '', $args = n
* @param string $texte
* @param boolean $ajoute
* @param boolean $sommaire_seul
* @param int|string $niveau_max
* @param int|null $niveau_max
* @return string
*/
function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = '') {
function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = null) {
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)
// à 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;
// on filtre les entrées du sommaire selon le niveau max
$sommaire = sommaire_filtrer_niveaux($sommaire, $niveau_max);
// si la valeur est définie, on s'assure qu'elle soit supérieure à 0
$niveau_max_config = (isset($GLOBALS['meta']['sommaire_niveau_max']) ? intval($GLOBALS['meta']['sommaire_niveau_max']) : null);
$niveau_max = ($niveau_max ? $niveau_max : $niveau_max_config);
$niveau_max = (!is_null($niveau_max) ? max($niveau_max, 1) : $niveau_max);
// Recenser les hn et ajouter les ancres
$sommaire = sommaire_recenser($texte, $niveau_max);
// filtrer les entrées du sommaire selon le niveau max
if ($niveau_max) {
$sommaire = sommaire_filtrer_niveaux($sommaire, $niveau_max);
}
if ($ajoute or $sommaire_seul) {
$sommaire = recuperer_fond('modeles/sommaire',
@ -300,10 +309,10 @@ function sommaire_filtre($texte, $ajoute = true, $sommaire_seul = false, $niveau
* @param string $texte
* @param boolean $ajoute
* @param boolean $sommaire_seul
* @param int|string $niveau_max
* @param int|null $niveau_max
* @return string
*/
function sommaire_post_propre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = '') {
function sommaire_post_propre($texte, $ajoute = true, $sommaire_seul = false, $niveau_max = null) {
if (strpos($texte, '<h') !== false) {
$texte = sommaire_filtre_texte_echappe(
@ -323,9 +332,10 @@ function sommaire_post_propre($texte, $ajoute = true, $sommaire_seul = false, $n
* $page=false reinitialise le compteur interne des ancres
*
* @param string $texte
* @param int|null $niveau_max
* @return string
*/
function sommaire_recenser(&$texte) {
function sommaire_recenser(&$texte, $niveau_max = null) {
$sommaire = array();
$ancres_vues = array();
@ -354,8 +364,17 @@ function sommaire_recenser(&$texte) {
$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)) {
if (
($pos = strpos($texte, $m[0], $currentpos)) !==false
and ($pos < $debutsommairedejala or $pos >= $finsommairedejala)
and (
!$niveau_max
or (
$niveau_max
and (intval($m[2]) < ($niveau_max + $toplevel))
)
)
) {
$titre = $m[3];
$titre = preg_replace(",</?a\b[^>]*>,Uims", '', $titre);
$ancre = sommaire_intertitre_ancre($titre, $m, $ancres_vues);
@ -426,12 +445,12 @@ function sommaire_intertitre_ancre($titre, $h, $ancres_vues = array()) {
*
* @param array $sommaire
* tableau associatif des entrées du sommaire
* @param int $niveau_max
* @param int|null $niveau_max
* niveau de profondeur maximal
* @return array
* tableau associatif des entrées du sommaire expurgé de certaines entrées
*/
function sommaire_filtrer_niveaux($sommaire, $niveau_max = '') {
function sommaire_filtrer_niveaux($sommaire, $niveau_max = null) {
$niveau_max = intval($niveau_max);
if ($niveau_max <= 0 or $niveau_max > 5) {

Loading…
Cancel
Save