source: spip-zone/_plugins_/_stable_/couteau_suisse/outils/decoupe_fonctions.php @ 23197

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

oups

File size: 10.2 KB
Line 
1<?php
2@define('_decoupe_NB_CARACTERES', 60);
3
4define('_onglets_CONTENU', '<div class="onglets_contenu"><h2 class="cs_onglet"><a href="#">');
5define('_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
10function 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
35function 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
47function 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
60function decouper_en_pages_rempl($texte, $pagination_seule=false) {
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') && !$pagination_seule) {
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 $pagination_seule?'':$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
89        // page demandee
90        $page = cs_safebalises($pages[$artpage-1]);
91        if (isset($_GET['decoupe_recherche'])) {
92                include_spip('inc/surligne');
93                $page = surligner_mots($page, $_GET['decoupe_recherche']);
94        }
95        decoupe_notes_orphelines($page);
96        // si la balise #CS_DECOUPE est utilisee on renvoie le texte sans pagination
97        if (!$pagination_seule && defined('_decoupe_BALISE')) return $sommaire.$page;
98
99        $self = nettoyer_uri();//self();//$GLOBALS['REQUEST_URI'];
100
101        // images calculees par decoupe_installe()
102        $images = unserialize($GLOBALS['meta']['cs_decoupe']);
103
104        // images et liens pour la navigation sous forme : << < ... > >>
105        $precedent = decoupe_image('precedent', 'page_precedente', $self, $artpage==1, ($artpage - 1)."-$num_pages", $images);
106        $suivant = decoupe_image('suivant', 'page_suivante', $self, $artpage==$num_pages, ($artpage + 1)."-$num_pages", $images);
107        if ($num_pages>3) {
108                $debut = isset($images['debut'])
109                        ?decoupe_image('debut', 'page_debut', $self, $artpage==1, 0, $images)
110                        :decoupe_image('precedent', 'page_debut', $self, $artpage==1, 0, $images, true);
111                $fin = isset($images['fin'])
112                        ?decoupe_image('fin', 'page_fin', $self, $artpage==$num_pages, "{$num_pages}-$num_pages", $images)
113                        :decoupe_image('suivant', 'page_fin', $self, $artpage==$num_pages, "{$num_pages}-$num_pages", $images, true);
114        }
115        // liens des differentes pages sous forme : 1 2 3 4
116        $milieu = array();
117        for ($i = 1; $i <= $num_pages; $i++) {
118                if ($i == $artpage) {
119                        $milieu[] = "<span style=\"color: lightgrey; font-weight: bold; text-decoration: underline;\">$i</span>";
120                } else {
121                        // isoler la premiere ligne non vide de chaque page pour l'attribut title
122                        $page_ = supprimer_tags(cs_safebalises(cs_introduire($pages[$i-1])));
123                        $title = preg_split("/[\r\n]+/", trim($page_), 2);
124                        $title = attribut_html(/*propre*/(couper($title[0], _decoupe_NB_CARACTERES)));//.' (...)';
125                        $title = _T('couteau:page_lien', array('page' => $i, 'title' => $title));
126                        $milieu[] = '<a href="' . parametre_url($self,'artpage',"{$i}-$num_pages") . "\" title=\"$title\">$i</a>";
127                }
128        }
129        $milieu = join(' ', $milieu);
130
131        // s'il existe plus de trois pages on retourne la pagination << < 1 2 3 4 > >>
132        // sinon une forme simplifiee : < 1 2 3 >
133        $pagination = $num_pages>3?"$debut\n$precedent\n$milieu\n$suivant\n$fin":"$precedent\n$milieu\n$suivant";
134        if ($pagination_seule)
135                return "<div id='decoupe_balise' class='pagination decoupe_balise'>\n$pagination\n</div>\n";
136        $pagination1 = "<div id='decoupe_haut' class='pagination decoupe_haut'>\n$pagination\n</div>\n";
137        $pagination2 = "<div id='decoupe_bas' class='pagination decoupe_bas'>\n$pagination\n</div>\n";
138        return $sommaire.$pagination1.$page.$pagination2;
139}
140
141// supprime les notes devenues orphelines
142function decoupe_notes_orphelines(&$texte) {
143        if($GLOBALS['les_notes']=='') return;
144        $notes = $GLOBALS['les_notes'];
145        tester_variable('ouvre_note', '[');
146        $ouvre = preg_quote($GLOBALS['ouvre_note']);
147        $appel = "<p[^>]*>$ouvre<a [^>]*name=\"nb([0-9]+)\" class=\"spip_note\" [^>]+>[^<]+</a>.*?</p>";
148        preg_match_all(",$appel,", $GLOBALS['les_notes'], $tableau);
149        for($i=0;$i<count($tableau[0]);$i++) {
150                if (!preg_match(",<a href=\"#nb{$tableau[1][$i]}\",",$texte)) 
151                        $notes = str_replace($tableau[0][$i], '', $notes);
152        }
153        $GLOBALS['les_notes'] = trim($notes);
154}
155
156function cs_decoupe_compat($texte){
157        // surcharge possible de _decoupe_SEPARATEUR par _decoupe_COMPATIBILITE
158        $rempl = ',\s*('
159                . preg_quote(_decoupe_SEPARATEUR,',')
160                . (defined('_decoupe_COMPATIBILITE')?'|'.preg_quote(_decoupe_COMPATIBILITE,','):'')
161                . ')\s*,';
162        // mise au clair des separateurs : pour les onglets ET la decoupe en page
163        $texte = preg_replace($rempl, "\n\n"._decoupe_SEPARATEUR."\n\n", $texte);
164        // si pas d'onglets ou pagination seule demandee, on sort
165        if (strpos($texte, '<onglet')===false) return $texte;
166        // traitement des onglets
167        return decouper_en_onglets_rempl($texte);
168}
169
170// ici on est en pre_propre, tests de compatibilite requis, puis traitement des onglets
171function cs_onglets($texte){
172        return cs_echappe_balises('html|code|cadre|frame|script|cite|jeux', 'cs_decoupe_compat', $texte);
173}
174
175// ici on est en post_propre, tests de compatibilite effectues
176function cs_decoupe($texte, $pagination_seule=false){
177        // si pas de separateur, on sort
178        if (strpos($texte, _decoupe_SEPARATEUR)===false) return $texte;
179        // verification des metas qui stockent les liens d'image
180        if (!isset($GLOBALS['meta']['cs_decoupe'])) {
181                include_spip('outils/decoupe');
182                decoupe_installe();
183        }
184        return cs_echappe_balises('html|code|cadre|frame|script|cite|table|jeux', 'decouper_en_pages_rempl', $texte, $pagination_seule);
185}
186
187// Compatibilite
188function decouper_en_pages($texte){ return cs_decoupe($texte); }
189
190// Balises pour des onglets en squelette
191function balise_ONGLETS_DEBUT($p) {
192        $arg = interprete_argument_balise(1,$p);
193        eval("\$arg=_onglets_DEBUT._onglets_CONTENU.$arg.'</a></h2>';");
194        $p->code = "'$arg'";
195        return $p;
196}
197function balise_ONGLETS_TITRE($p) {
198        $arg = interprete_argument_balise(1,$p);
199        eval("\$arg='</div>'._onglets_CONTENU.$arg.'</a></h2>';");
200        $p->code = "'$arg'";
201        return $p;
202}
203function balise_ONGLETS_FIN($p) {
204        $p->code = "'</div></div>'";
205        return $p;
206}
207
208// decode le parametre artpage=page-total
209// attention, artpage n'est pas toujours present
210function artpage($t=false, $index=0) {
211        if($t===false) $t=_request('artpage');
212        $t=strlen($t)?explode('-', $t, 2):array('1','0');
213        return $t[$index];
214}
215function artpage_fin($t=false) {
216        if($t===false) $t=_request('artpage');
217        $t=strlen($t)?explode('-', $t, 2):array('1','0');
218        return $t[0]>0 && $t[0]==$t[1];
219}
220function artpage_debut($t=false) {
221        return artpage($t)==1;
222}
223
224// si on veut la balise #CS_DECOUPE (pagination uniquement)
225if (defined('_decoupe_BALISE')) {
226        function balise_CS_DECOUPE($p) {
227                if ($p->type_requete == 'articles') {
228                        $p->code = 'cs_decoupe(propre(cs_onglets('.champ_sql('texte', $p).')), true)';
229                } else {
230                        $p->code = "''";
231                }
232                $p->interdire_scripts = true;
233                return $p;
234        }
235}
236
237?>
Note: See TracBrowser for help on using the repository browser.