source: spip-zone/_plugins_/couteau_suisse/outils/sommaire_fonctions.php @ 34010

Last change on this file since 34010 was 34010, checked in by patfr@…, 10 years ago

Sommaire automatique : tenir compte des images typo

File size: 6.9 KB
Line 
1<?php
2
3@define('_sommaire_NB_TITRES_MINI', 2);
4@define('_sommaire_SANS_FOND', '[!fond]');
5
6// aide le Couteau Suisse a calculer la balise #INTRODUCTION
7$GLOBALS['cs_introduire'][] = 'sommaire_nettoyer_raccourcis';
8
9// renvoie le sommaire d'une page d'article
10// $page=false reinitialise le compteur interne des ancres
11function sommaire_d_une_page(&$texte, &$nbh3, $page=0, $num_pages=0) {
12        static $index = 0;
13        if($page===false) $index = 0;
14        static $self = NULL; 
15        if(!isset($self)) 
16                $self = str_replace('&', '&amp;', nettoyer_uri());//self();//$GLOBALS['REQUEST_URI'];
17        if($page===false) return;
18        // trouver quel <hx> est utilise
19        $hierarchie = preg_match(',<h(\d),',$GLOBALS['debut_intertitre'],$regs)?$regs[1]:'3';
20        @define('_sommaire_NB_CARACTERES', 30);
21        // traitement des intertitres <hx>
22        preg_match_all(",(<h{$hierarchie}[^>]*)>(.*)</h{$hierarchie}>,Umsi", $texte, $regs);
23        $nbh3 += count($regs[0]);
24        $pos = 0; $sommaire = '';
25        // calcul de la page
26        $suffixe = $page?_T('couteau:sommaire_page', array('page'=>$page)):'';
27        $fct_lien_retour = function_exists('sommaire_lien_retour')?'sommaire_lien_retour':'sommaire_lien_retour_dist';
28        for($i=0;$i<count($regs[0]);$i++,$index++){
29                $ancre = " id=\"outil_sommaire_$index\">";
30                if (($pos2 = strpos($texte, $regs[0][$i], $pos))!==false) {
31                        $titre = preg_replace(',^<p[^>]*>(.*)</p>$,Umsi', '\\1', trim($regs[2][$i]));
32                        // ancre 'retour au sommaire', sauf :
33                        // si on imprime, ou si les blocs depliables utilisent h{$hierarchie}...
34                        $haut = (defined('_CS_PRINT') OR (strpos($regs[0][$i], 'blocs_titre')!==false))
35                                ?''
36                                :$fct_lien_retour($self, $titre);
37                        $texte = substr($texte, 0, $pos2) . $regs[1][$i] . $ancre . $haut
38                                . substr($texte, $pos2 + strlen($regs[1][$i])+1 + strlen($regs[2][$i]));
39                        $pos = $pos2 + strlen($ancre) + strlen($regs[0][$i]);
40                        // tout le texte, sans les notes
41                        $brut = preg_replace(',\[<a href=["\']#nb.*?</a>\],','', echappe_retour($regs[2][$i],'CS'));
42                        // pas de glossaire
43                        if(function_exists('cs_retire_glossaire')) $brut = cs_retire_glossaire($brut);
44                        // texte brut
45                        $brut2 = preg_replace(',[\n\r]+,',' ',textebrut($brut));
46                        // cas des intertitres en image_typo
47                        if(!strlen($brut2)) $brut2 = extraire_attribut($brut, 'alt');
48                        // pas trop long quand meme...
49                        $lien = cs_propre(couper($brut2, _sommaire_NB_CARACTERES));
50                        // eviter une ponctuation a la fin, surtout si la page est precisee
51                        $lien = preg_replace('/(&nbsp;|\s)*'.($page?'[!?,;.:]+$/':'[,;.:]+$/'), '', $lien);
52                        $titre = attribut_html(couper($brut2, 100));
53                        // si la decoupe en page est active...
54                        $artpage = (function_exists('decoupe_url') && (strlen(_request('artpage')) || $page>1) )
55                                ?decoupe_url($self, $page, $num_pages):$self;
56                        $sommaire .= "<li><a $st title=\"$titre\" href=\"{$artpage}#outil_sommaire_$index\">$lien</a>$suffixe</li>";
57                }
58        }
59        return $sommaire;
60}
61
62/*
63 Fonction surchargeable qui reconstruit les titres de la page
64 en ajoutant une ancre de retour au sommaire.
65 La fonction de surcharge a placer dans config/mes_options.php est :
66   sommaire_lien_retour($self, $titre)
67 Exemple sans lien de retour :
68   function sommaire_lien_retour($self, $titre) { return $titre; }
69*/
70function sommaire_lien_retour_dist($self, $titre) {
71        static $haut = NULL;
72        if(!isset($haut))
73                $haut = '<a title="'._T('couteau:sommaire_titre').'" href="'.$self.'#outil_sommaire" class="sommaire_ancre">&nbsp;</a>';
74        return $haut . $titre;
75}
76
77// fonction appellee sur les parties du textes non comprises entre les balises : html|code|cadre|frame|script|acronym|cite
78function sommaire_d_article_rempl($texte0, $sommaire_seul=false) {
79        // pour sommaire_nettoyer_raccourcis()
80        include_spip('outils/sommaire');
81        // si le sommaire est malvenu ou s'il n'y a pas de balise <hx>, alors on laisse tomber
82        $inserer_sommaire =  defined('_sommaire_AUTOMATIQUE')
83                ?strpos($texte0, _CS_SANS_SOMMAIRE)===false
84                :strpos($texte0, _CS_AVEC_SOMMAIRE)!==false;
85        if (!$inserer_sommaire || strpos($texte0, '<h')===false) 
86                return $sommaire_seul?'':sommaire_nettoyer_raccourcis($texte0);
87        // on retire les raccourcis du texte
88        $texte = sommaire_nettoyer_raccourcis($texte0);
89        // on masque les onglets s'il y en a
90        if(defined('_onglets_FIN'))
91                $texte = preg_replace_callback(',<div class="onglets_bloc_initial.*'._onglets_FIN.',Ums', 'sommaire_echappe_onglets_callback', $texte);
92        // et la, on y va...
93        $sommaire = ''; $i = 1; $nbh3 = 0;
94        // reinitialisation de l'index interne de la fonction
95        sommaire_d_une_page($texte, $nbh3, false);
96        // couplage avec l'outil 'decoupe_article'
97        if(defined('_decoupe_SEPARATEUR') && !defined('_CS_PRINT')) {
98                $pages = explode(_decoupe_SEPARATEUR, $texte);
99                if (($num_page=count($pages)) == 1) $sommaire = sommaire_d_une_page($texte, $nbh3);
100                else {
101                        foreach($pages as $p=>$page) { $sommaire .= sommaire_d_une_page($page, $nbh3, $i++, $num_page); $pages[$p] = $page; }
102                        $texte = join(_decoupe_SEPARATEUR, $pages);
103                }
104        } else $sommaire = sommaire_d_une_page($texte, $nbh3);
105        if(!strlen($sommaire) || $nbh3<_sommaire_NB_TITRES_MINI)
106                return $sommaire_seul?'':sommaire_nettoyer_raccourcis($texte0);
107
108        // calcul du sommaire
109        include_spip('public/assembler');
110        $sommaire = recuperer_fond('fonds/sommaire', array(
111                'sommaire'=>$sommaire,
112                'fond_css'=>strpos($texte0, _sommaire_SANS_FOND)===false ?'avec':'sans',
113        ));
114
115        // si on ne veut que le sommaire, on renvoie le sommaire
116        // sinon, on n'insere ce sommaire en tete de texte que si la balise #CS_SOMMAIRE n'est pas activee
117        if($sommaire_seul) return $sommaire;
118        if(defined('_sommaire_BALISE')) return $texte;
119        return _sommaire_REM.$sommaire._sommaire_REM.$texte;
120}
121
122// fonction de callback qui echappe les onglets
123function sommaire_echappe_onglets_callback($matches) {
124 return cs_code_echappement($matches[0], 'CS');
125}
126
127// fonction appelee par le traitement de #TEXTE/articles
128function sommaire_d_article($texte) {
129        // s'il n'y a aucun intertitre, on ne fait rien
130        // si la balise est utilisee, il faut quand meme inserer les ancres de retour
131        if((strpos($texte, '<h')===false)) return $texte;
132        return cs_echappe_balises('html|code|cadre|frame|script|acronym|cite|onglets|table', 'sommaire_d_article_rempl', $texte, false);
133}
134
135// fonction appelee par le traitement post_propre de #CS_SOMMAIRE
136function sommaire_d_article_balise($texte) {
137        // si la balise n'est pas utilisee ou s'il n'y a aucun intertitre, on ne fait rien
138        if(!defined('_sommaire_BALISE') || (strpos($texte, '<h')===false)) return '';
139        return cs_echappe_balises('html|code|cadre|frame|script|acronym|cite|onglets|table', 'sommaire_d_article_rempl', $texte, true);
140}
141
142// si on veut la balise #CS_SOMMAIRE
143if (defined('_sommaire_BALISE')) {
144        function balise_CS_SOMMAIRE_dist($p) {
145                if ($p->type_requete == 'articles') {
146                        $p->code = 'cs_supprime_notes('.champ_sql('texte', $p).')';
147                } else {
148                        $p->code = "''";
149                }
150                $p->interdire_scripts = true;
151                return $p;
152        }
153}
154?>
Note: See TracBrowser for help on using the repository browser.