Mise en route du suivi.
[aidenligne_francais_universite.git] / plugins / couteau_suisse / outils / decoupe_fonctions.php
1 <?php
2 @define('_decoupe_NB_CARACTERES', 60);
3
4 define('_onglets_CONTENU', '<div class="onglets_contenu"><h2 class="cs_onglet"><a href="#">');
5 define('_onglets_DEBUT', '<div class="onglets_bloc_initial">');
6
7 // aide le Couteau Suisse a calculer la balise #INTRODUCTION
8 $GLOBALS['cs_introduire'][] = 'decoupe_nettoyer_raccourcis';
9
10 function onglets_callback($matches) {
11 // cas des onglets imbriques
12 $matches[2] = preg_replace_callback(',<onglets([0-9]*)>(.*?)</onglets\1>,ms', 'onglets_callback', $matches[2]);
13 // nettoyage apres les separateurs
14 $matches[2] = preg_replace(','.preg_quote(_decoupe_SEPARATEUR,',').'\s+,', _decoupe_SEPARATEUR, $matches[2]);
15 // au cas ou on ne veuille pas d'onglets, on remplace les '++++' par un filet et on entoure d'une classe.
16 if (defined('_CS_PRINT')) {
17 @define(_decoupe_FILET, '<p style="border-bottom:1px dashed #666; padding:0; margin:1em 20%; font-size:4pt;" >&nbsp; &nbsp;</p>');
18 $t = preg_split(',(\n\n|\r\n\r\n|\r\r),', $matches[2], 2);
19 $texte = preg_replace(','.preg_quote(_decoupe_SEPARATEUR, ',').'(.*?)(\n\n|\r\n\r\n|\r\r),ms', _decoupe_FILET."<h4>$1</h4>\n\n", $t[1]);
20 // on sait jamais...
21 str_replace(_decoupe_SEPARATEUR, _decoupe_FILET, $texte);
22 return '<div class="onglets_print"><h4>' . textebrut($t[0]) . "</h4>\n$texte</div>";
23 }
24 $onglets = $contenus = array();
25 $pages = explode(_decoupe_SEPARATEUR, $matches[2]);
26 foreach ($pages as $p) {
27 $t = preg_split(',(\n\n|\r\n\r\n|\r\r),', $p, 2);
28 $t = array(trim(textebrut(nettoyer_raccourcis_typo($t[0]))), cs_safebalises($t[1]));
29 if(strlen($t[0].$t[1])) $contenus[] = _onglets_CONTENU.$t[0]."</a></h2><div>\n".$t[1]."\n</div></div>";
30 }
31 return _onglets_DEBUT.join('', $contenus).'</div>'._onglets_FIN;
32 }
33
34 // fonction appellee sur les parties du texte non comprises entre les balises : html|code|cadre|frame|script|acronym|cite
35 function decouper_en_onglets_rempl($texte) {
36 // compatibilite avec la syntaxe de Pierre Troll
37 if (strpos($texte, '<onglet|')!==false) {
38 $texte = str_replace('<onglet|fin>', '</onglets>', $texte);
39 $texte = preg_replace(',<onglet\|debut[^>]*\|titre=([^>]*)>\s*,', "<onglets>\\1\n\n", $texte);
40 $texte = preg_replace(',\s*<onglet\|titre=([^>]*)>\s*,', "\n\n++++\\1\n\n", $texte);
41 }
42 // il faut un callback pour analyser l'interieur du texte
43 return preg_replace_callback(',<onglets([0-9]*)>(.*?)</onglets\1>,ms', 'onglets_callback', $texte);
44 }
45
46 // fonction renvoyant l'image appellee dans img/decoupe
47 function decoupe_image($fich, $help, $self, $off, $val, &$images, $double=false) {
48 $alt = _T('couteau:'.$help);
49 $alt = "title=\"$alt\" alt=\"$alt\"";
50 if ($off) {
51 $tmp = $images[$fich.'_off']." $alt />";
52 return $double?$tmp.$tmp:$tmp;
53 } else {
54 $tmp=$images[$fich]." $alt />";
55 return '<a href="'.parametre_url($self,'artpage', $val).'">'.($double?$tmp.$tmp:$tmp).'</a>';
56 }
57 }
58
59 // fonction appellee sur les parties du textes non comprises entre les balises : html|code|cadre|frame|script|acronym|cite
60 function decouper_en_pages_rempl($texte) {
61 // si pas de separateur, on sort
62 if (strpos($texte, _decoupe_SEPARATEUR)===false) return $texte;
63
64 // au cas ou on ne veuille pas de decoupe, on remplace les '++++' par un filet.
65 if (defined('_CS_PRINT')) {
66 @define(_decoupe_FILET, '<p style="border-bottom:1px dashed #666; padding:0; margin:1em 20%; font-size:4pt;" >&nbsp; &nbsp;</p>');
67 return str_replace(_decoupe_SEPARATEUR, _decoupe_FILET, $texte);
68 }
69 // recherche du sommaire s'il existe
70 if (defined('_sommaire_REM') && (substr_count($texte, _sommaire_REM)==2)) {
71 $pages = explode(_sommaire_REM, $texte);
72 $sommaire = $pages[0].$pages[1];
73 $texte = $pages[2];
74 } else $sommaire = '';
75
76 // traitement des pages
77 $pages = explode(_decoupe_SEPARATEUR, $texte);
78 $num_pages = count($pages);
79 if ($num_pages == 1) return $texte;
80 $artpage = max(intval(artpage()), 1);
81 $artpage = min($artpage, $num_pages);
82 /*
83 // si numero illegal ou si var_recherche existe, alors renvoyer toutes les pages, separees par une ligne <hr/>.
84 // la surbrillance pourra alors fonctionner correctement.
85 if (strlen($_GET['var_recherche']) || $artpage < 1 || $artpage > $num_pages)
86 return join("<hr/>", $pages);
87 */
88 $self = nettoyer_uri();//self();//$GLOBALS['REQUEST_URI'];
89
90 // images calculees par decoupe_installe()
91 $images = unserialize($GLOBALS['meta']['cs_decoupe']);
92
93 // images et liens pour la navigation sous forme : << < ... > >>
94 $precedent = decoupe_image('precedent', 'page_precedente', $self, $artpage==1, ($artpage - 1)."-$num_pages", $images);
95 $suivant = decoupe_image('suivant', 'page_suivante', $self, $artpage==$num_pages, ($artpage + 1)."-$num_pages", $images);
96 if ($num_pages>3) {
97 $debut = isset($images['debut'])
98 ?decoupe_image('debut', 'page_debut', $self, $artpage==1, 0, $images)
99 :decoupe_image('precedent', 'page_debut', $self, $artpage==1, 0, $images, true);
100 $fin = isset($images['fin'])
101 ?decoupe_image('fin', 'page_fin', $self, $artpage==$num_pages, "{$num_pages}-$num_pages", $images)
102 :decoupe_image('suivant', 'page_fin', $self, $artpage==$num_pages, "{$num_pages}-$num_pages", $images, true);
103 }
104 // liens des differentes pages sous forme : 1 2 3 4
105 $milieu = array();
106 for ($i = 1; $i <= $num_pages; $i++) {
107 if ($i == $artpage) {
108 $milieu[] = "<span style=\"color: lightgrey; font-weight: bold; text-decoration: underline;\">$i</span>";
109 } else {
110 // isoler la premiere ligne non vide de chaque page pour l'attribut title
111 $page = supprimer_tags(cs_safebalises(cs_introduire($pages[$i-1])));
112 $title = preg_split("/[\r\n]+/", trim($page), 2);
113 $title = attribut_html(/*propre*/(couper($title[0], _decoupe_NB_CARACTERES)));//.' (...)';
114 $title = _T('couteau:page_lien', array('page' => $i, 'title' => $title));
115 $milieu[] = '<a href="' . parametre_url($self,'artpage',"{$i}-$num_pages") . "\" title=\"$title\">$i</a>";
116 }
117 }
118 $milieu = join(' ', $milieu);
119
120 // s'il existe plus de trois pages on retourne la pagination << < 1 2 3 4 > >>
121 // sinon une forme simplifiee : < 1 2 3 >
122 $pagination = $num_pages>3?"$debut\n$precedent\n$milieu\n$suivant\n$fin":"$precedent\n$milieu\n$suivant";
123 $pagination1 = "<div id='decoupe_haut' class='pagination decoupe_haut'>\n$pagination\n</div>\n";
124 $pagination2 = "<div id='decoupe_bas' class='pagination decoupe_bas'>\n$pagination\n</div>\n";
125 $page = cs_safebalises($pages[$artpage-1]);
126 if (isset($_GET['decoupe_recherche'])) {
127 include_spip('inc/surligne');
128 $page = surligner_mots($page, $_GET['decoupe_recherche']);
129 }
130 decoupe_notes_orphelines($page);
131 return $sommaire.$pagination1.$page.$pagination2;
132 }
133
134 // supprime les notes devenues orphelines
135 function decoupe_notes_orphelines(&$texte) {
136 if($GLOBALS['les_notes']=='') return;
137 $notes = $GLOBALS['les_notes'];
138 tester_variable('ouvre_note', '[');
139 $ouvre = preg_quote($GLOBALS['ouvre_note']);
140 $appel = "<p[^>]*>$ouvre<a [^>]*name=\"nb([0-9]+)\" class=\"spip_note\" [^>]+>[^<]+</a>.*?</p>";
141 preg_match_all(",$appel,", $GLOBALS['les_notes'], $tableau);
142 for($i=0;$i<count($tableau[0]);$i++) {
143 if (!preg_match(",<a href=\"#nb{$tableau[1][$i]}\",",$texte))
144 $notes = str_replace($tableau[0][$i], '', $notes);
145 }
146 $GLOBALS['les_notes'] = trim($notes);
147 }
148
149 // ici on est en pre_propre, tests de compatibilite requis
150 function cs_onglets($texte){
151 // surcharge possible de _decoupe_SEPARATEUR par _decoupe_COMPATIBILITE
152 $rempl = ',\s*('
153 . preg_quote(_decoupe_SEPARATEUR,',')
154 . (defined('_decoupe_COMPATIBILITE')?'|'.preg_quote(_decoupe_COMPATIBILITE,','):'')
155 . ')\s*,';
156 // mise au clair des separateurs : pour les onglets ET la decoupe en page
157 $texte = preg_replace($rempl, "\n\n"._decoupe_SEPARATEUR."\n\n", $texte);
158 // si pas d'onglets, on sort
159 if (strpos($texte, '<onglet')===false) return $texte;
160 return cs_echappe_balises('html|code|cadre|frame|script|acronym|cite', 'decouper_en_onglets_rempl', $texte);
161 }
162
163 // ici on est en post_propre, tests de compatibilite non requis
164 function cs_decoupe($texte){
165 // si pas de separateur, on sort
166 if (strpos($texte, _decoupe_SEPARATEUR)===false) return $texte;
167 // verification des metas qui stockent les liens d'image
168 if (!isset($GLOBALS['meta']['cs_decoupe'])) {
169 include_spip('outils/decoupe');
170 decoupe_installe();
171 }
172 return cs_echappe_balises('html|code|cadre|frame|script|acronym|cite|table', 'decouper_en_pages_rempl', $texte);
173 }
174
175 // Compatibilite
176 function decouper_en_pages($texte){ return cs_decoupe($texte); }
177
178 // Balises pour des onglets en squelette
179 function balise_ONGLETS_DEBUT($p) {
180 $arg = interprete_argument_balise(1,$p);
181 eval("\$arg=_onglets_DEBUT._onglets_CONTENU.$arg.'</a></h2>';");
182 $p->code = "'$arg'";
183 return $p;
184 }
185 function balise_ONGLETS_TITRE($p) {
186 $arg = interprete_argument_balise(1,$p);
187 eval("\$arg='</div>'._onglets_CONTENU.$arg.'</a></h2>';");
188 $p->code = "'$arg'";
189 return $p;
190 }
191 function balise_ONGLETS_FIN($p) {
192 $p->code = "'</div></div>'";
193 return $p;
194 }
195
196 // decode le parametre artpage=page-total
197 // attention, artpage n'est pas toujours present
198 function artpage($t=false, $index=0) {
199 if($t===false) $t=_request('artpage');
200 $t=strlen($t)?explode('-', $t, 2):array('1','0');
201 return $t[$index];
202 }
203 function artpage_fin($t=false) {
204 if($t===false) $t=_request('artpage');
205 $t=strlen($t)?explode('-', $t, 2):array('1','0');
206 return $t[0]>0 && $t[0]==$t[1];
207 }
208 function artpage_debut($t=false) {
209 return artpage($t)==1;
210 }
211
212 ?>