source: spip-zone/_core_/plugins/textwheel/inc/notes.php @ 48777

Last change on this file since 48777 was 48527, checked in by cedric@…, 10 years ago

Retablir les crochets décorants les références de note. Au passage,

  • on supprime les anciennes globales $ouvre_ref, $ferme_ref, $ouvre_note, $ferme_note au profit des define _NOTES_OUVRE_REF, _NOTES_FERME_REF, _NOTES_OUVRE_NOTE, _NOTES_FERME_NOTE
  • on renome le define _RACCOURCI_NOTES en _NOTES_RACCOURCI
  • on introduit une classe spip_note_ref pour encapsuler le lien de ref et sa decoration, et permettre le stylage complet de la reference.
File size: 6.4 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2010                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15//
16// Notes de bas de page
17//
18if (!defined('_NOTES_OUVRE_REF')) define('_NOTES_OUVRE_REF','<span class="spip_note_ref">&nbsp;[');
19if (!defined('_NOTES_FERME_REF')) define('_NOTES_FERME_REF',']</span>');
20if (!defined('_NOTES_OUVRE_NOTE')) define('_NOTES_OUVRE_NOTE','<span class="spip_note_ref">[');
21if (!defined('_NOTES_FERME_NOTE')) define('_NOTES_FERME_NOTE',']</span>');
22if (!defined('_NOTES_RACCOURCI')) define('_NOTES_RACCOURCI', ',\[\[(\s*(<([^>\'"]*)>)?(.*?))\]\],msS');
23
24// argument = true: empiler l'etat courant, initialiser un nouvel etat
25// argument = false: restaurer l'etat precedent, denonce un etat courant perdu
26// argument chaine, on y recherche les notes et on les renvoie en tableau
27// argument tableau, texte de notes a rajouter dans ce qu'on a deja
28// le dernier cas retourne la composition totale
29// en particulier, envoyer un tableau vide permet de tout recuperer
30// C'est stocke dans la globale $les_notes, mais pas besoin de le savoir
31
32function inc_notes_dist($arg,$operation='traiter')
33{
34        static $pile = array();
35        static $next_marqueur = 1;
36        static $marqueur = 1;
37        global $les_notes, $compt_note, $notes_vues;
38        switch ($operation){
39                case 'traiter':
40                        if (is_array($arg)) return traiter_les_notes($arg);
41                        else
42                                return traiter_raccourci_notes($arg, $marqueur>1?$marqueur:'');
43                        break;
44                case 'empiler':
45                        if ($compt_note==0)
46                                // si le marqueur n'a pas encore ete utilise, on le recycle dans la pile courante
47                                array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,0));
48                        else {
49                                // sinon on le stocke au chaud, et on en cree un nouveau
50                                array_push($pile, array(@$les_notes, @$compt_note, $notes_vues,$marqueur));
51                                $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
52                                $marqueur = $next_marqueur; // et on le prend comme marqueur courant
53                        }
54                        $les_notes = '';
55                        $compt_note = 0;
56                        break;
57                case 'depiler':
58                        #$prev_notes = $les_notes;
59                        if (strlen($les_notes)) spip_log("notes perdues");
60                        // si le marqueur n'a pas servi, le liberer
61                        if (!strlen($les_notes) AND $marqueur==$next_marqueur)
62                                $next_marqueur--;
63                        // on redepile tout suite a une fin d'inclusion ou d'un affichage des notes
64                        list($les_notes, $compt_note, $notes_vues, $marqueur) = array_pop($pile);
65                        #$les_notes .= $prev_notes;
66                        // si pas de marqueur attribue, on le fait
67                        if (!$marqueur){
68                                $next_marqueur++; // chaque fois qu'on rempile on incremente le marqueur general
69                                $marqueur = $next_marqueur; // et on le prend comme marqueur courant
70                        }
71                        break;
72                case 'sauver_etat':
73                        if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
74                                return array($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur);
75                        else
76                                return ''; // rien a sauver
77                        break;
78                case 'restaurer_etat':
79                        if ($arg AND is_array($arg)) // si qqchose a restaurer
80                                list($les_notes, $compt_note, $notes_vues, $marqueur,$next_marqueur) = $arg;
81                        break;
82                case 'contexter_cache':
83                        if ($compt_note OR $marqueur>1 OR $next_marqueur>1)
84                                return array("$compt_note:$marqueur:$next_marqueur");
85                        else
86                                return '';
87                        break;
88                case 'reset_all': // a n'utiliser qu'a fins de test
89                        if (strlen($les_notes)) spip_log("notes perdues [reset_all]");
90                        $pile = array();
91                        $next_marqueur = 1;
92                        $marqueur = 1;
93                        $les_notes = '';
94                        $compt_note = 0;
95                        $notes_vues = array();
96                        break;
97        }
98}
99
100
101function traiter_raccourci_notes($letexte, $marqueur_notes)
102{
103        global $compt_note, $notes_vues;
104
105        if (strpos($letexte, '[[') === false
106        OR !preg_match_all(_NOTES_RACCOURCI, $letexte, $m, PREG_SET_ORDER))
107                return array($letexte, array());
108
109        // quand il y a plusieurs series de notes sur une meme page
110        $mn =  !$marqueur_notes ? '' : ($marqueur_notes.'-');
111        $mes_notes = array();
112        foreach ($m as $r) {
113                list($note_source, $note_all, $ref, $nom, $note_texte) = $r;
114
115                // reperer une note nommee, i.e. entre chevrons
116                // On leve la Confusion avec une balise en regardant
117                // si la balise fermante correspondante existe
118                // Cas pathologique:   [[ <a> <a href="x">x</a>]]
119
120                if (!(isset($nom) AND $ref
121                AND ((strpos($note_texte, '</' . $nom .'>') === false)
122                     OR preg_match(",<$nom\W.*</$nom>,", $note_texte)))) {
123                        $nom = ++$compt_note;
124                        $note_texte = $note_all;
125                }
126
127                // eliminer '%' pour l'attribut id
128                $ancre = $mn . str_replace('%','_', rawurlencode($nom));
129
130                // ne mettre qu'une ancre par appel de note (XHTML)
131                $att = ($notes_vues[$ancre]++) ? '' : " id='nh$ancre'";
132
133                // creer le popup 'title' sur l'appel de note
134                // propre est couteux => nettoyer_raccourcis_typo
135                if ($title = supprimer_tags(nettoyer_raccourcis_typo($note_texte))) {
136                        $title = " title='" . couper($title,80) . "'";
137                }
138
139                // ajouter la note aux notes precedentes
140                if ($note_texte) {
141                        $mes_notes[]= array($ancre, $nom, $note_texte);
142                }
143
144                // dans le texte, mettre l'appel de note a la place de la note
145                if ($nom) $nom = _NOTES_OUVRE_REF."<a href='#nb$ancre' class='spip_note' rel='footnote'$title$att>$nom</a>"._NOTES_FERME_REF;
146
147                $pos = strpos($letexte, $note_source);
148                $letexte = rtrim(substr($letexte, 0, $pos), ' ')
149                . code_echappement($nom)
150                . substr($letexte, $pos + strlen($note_source));
151
152        }
153        return array($letexte, $mes_notes);
154}
155
156
157// http://doc.spip.org/@traiter_les_notes
158function traiter_les_notes($notes) {
159        $mes_notes = '';
160        if ($notes) {
161                $title =  _T('info_notes');
162                foreach ($notes as $r) {
163                        list($ancre, $nom, $texte) = $r;
164                        $atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='footnote'";
165                        $mes_notes .= "\n\n"
166                        . "<div id='nb$ancre'><p". ($GLOBALS['class_spip'] ? " class='spip_note'" : "") .">"
167                        . code_echappement($nom
168                                ? _NOTES_OUVRE_NOTE."<a".$atts.">$nom</a>"._NOTES_FERME_NOTE
169                                : '')
170                        . $texte
171                        .'</div>';
172                }
173                $mes_notes = propre($mes_notes);
174        }
175        return ($GLOBALS['les_notes'] .= $mes_notes);
176}
177
178?>
Note: See TracBrowser for help on using the repository browser.