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