[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / plugins-dist / textwheel / inc / notes.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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 if (!defined('_NOTES_OUVRE_REF')) define('_NOTES_OUVRE_REF','<span class="spip_note_ref">&nbsp;[');
19 if (!defined('_NOTES_FERME_REF')) define('_NOTES_FERME_REF',']</span>');
20 if (!defined('_NOTES_OUVRE_NOTE')) define('_NOTES_OUVRE_NOTE','<span class="spip_note_ref">[');
21 if (!defined('_NOTES_FERME_NOTE')) define('_NOTES_FERME_NOTE',']&nbsp;</span>');
22 if (!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
32 function inc_notes_dist($arg,$operation='traiter', $ignorer_autobr=false)
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,$ignorer_autobr);
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
101 function 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
149 // supprimer les ' ' ou 'nbsp;' avant un appel de note
150 $avant = preg_replace(',( |&nbsp;|'.chr(194).chr(160).')+$,S', '', substr($letexte, 0, $pos));
151
152 $letexte = $avant
153 . code_echappement($nom)
154 . substr($letexte, $pos + strlen($note_source));
155
156 }
157
158 return array($letexte, $mes_notes);
159 }
160
161
162 // http://code.spip.net/@traiter_les_notes
163 function traiter_les_notes($notes,$ignorer_autobr) {
164 $mes_notes = '';
165 if ($notes) {
166 $title = _T('info_notes');
167 foreach ($notes as $r) {
168 list($ancre, $nom, $texte) = $r;
169 $atts = " href='#nh$ancre' class='spip_note' title='$title $ancre' rev='footnote'";
170 $mes_notes .= "\n\n"
171 . "<div id='nb$ancre'><p". ($GLOBALS['class_spip'] ? " class='spip_note'" : "") .">"
172 . code_echappement($nom
173 ? _NOTES_OUVRE_NOTE."<a".$atts.">$nom</a>"._NOTES_FERME_NOTE
174 : '')
175 . trim($texte)
176 .'</div>';
177 }
178 if ($ignorer_autobr)
179 $mes_notes = _AUTOBR_IGNORER.$mes_notes;
180 $mes_notes = propre($mes_notes);
181 }
182 return ($GLOBALS['les_notes'] .= $mes_notes);
183 }
184
185 ?>