source: spip-zone/_squelettes_/escal/trunk/escal_fonctions.php @ 109380

Last change on this file since 109380 was 109380, checked in by jcvilleneuve@…, 3 years ago

Escal V4 : possibilité d'afficher le texte d'un article en 2 colonnes s'il a le mot-clé "texte2colonnes" + ajout du mot-clé dans le groupe affichage + ajout d'un formulaire pour le plugin "liens sociaux"

File size: 31.0 KB
Line 
1<?php
2
3/**
4 * Plugin Escal
5 * Licence GNU/GPL
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) return; 
9
10// =======================================================================================================================================
11// Paramétrage à l'installation d'Escal
12// Merci à Arnaud Bérard pour son aide précieuse
13// =======================================================================================================================================
14
15/**
16 * escal_configuration()
17 * teste et configure certaines options de spip pour escal
18 * penser à incrementer la valeur de schema dans paquet.xml et celle de $maj dans escal_administrations.php en cas de mise à jour des mots cles
19*/ 
20
21
22function escal_configuration(){
23    include_spip('inc/config');
24   
25    // active l'utilsation des mots clefs
26    $articles_mots = lire_config('articles_mots');
27    if($articles_mots == 'non')
28        ecrire_meta('articles_mots','oui');
29
30    // activation du descriptif sur les rubriques et article
31    if(lire_config('rubriques_descriptif') == 'non')
32        ecrire_meta('rubriques_descriptif','oui') ;
33    if(lire_config('articles_descriptif') == 'non')
34       ecrire_meta('articles_descriptif','oui') ; 
35}
36
37
38// Description du shema de groupes et mots
39function shema_escal(){
40    $schema = array(
41        'groupes' => array(
42            array(  // creation du groupe affichage
43                'titre'=>'affichage',
44                'descriptif'=> _T('escal:groupe_affichage'),
45                'tables_liees'=>'articles,rubriques,syndic',
46                'minirezo'=>'oui',
47                'comite'=>'oui'
48            ),
49            array( // creation du groupe Agenda_couleur
50                'titre'=>'Agenda_couleur',
51                'descriptif'=> _T('escal:groupe_agenda_couleur'),
52                'tables_liees'=>'evenements',
53                'minirezo'=>'oui',
54                'comite'=>'oui'
55            )   
56        ),
57        'mots'=> array(
58            // Agenda_couleur
59            array(
60                'titre'=>'Noir',
61                'descriptif'=>'#000000',
62                'type'=>'Agenda_couleur'
63                ),
64            array(
65                'titre'=>'Rouge',
66                'descriptif'=>'red',
67                'type'=>'Agenda_couleur'
68                ),
69            array(
70                'titre'=>'Vert',
71                'descriptif'=>'green',
72                'type'=>'Agenda_couleur'
73                ),
74            array(
75                'titre'=>'Violet',
76                'descriptif'=>'#FF00FF',
77                'type'=>'Agenda_couleur'
78                ),
79            array(
80                'titre'=>'Marron',
81                'descriptif'=>'#7F3D00',
82                'type'=>'Agenda_couleur'
83                ),                                                   
84            // affichage
85            array(
86                'titre'=>'acces-direct',
87                'descriptif'=> _T('escal:mot_acces_direct'),
88                'type'=>'affichage'
89            ),
90            array(
91                'titre'=>'accueil',
92                'descriptif'=> _T('escal:mot_accueil'),
93                'type'=>'affichage'
94            ),           
95            array(
96                'titre'=> 'actus',
97                'descriptif'=> _T('escal:mot_actus'),
98                'type'=>'affichage'
99            ),
100            array(
101                'titre'=>'agenda',
102                'descriptif'=> _T('escal:mot_agenda'),
103                'type'=>'affichage'
104            ),           
105            array(
106                'titre'=>'annonce',
107                'descriptif'=> _T('escal:mot_annonce'),
108                'type'=>'affichage'
109            ),
110            array(
111                'titre'=>'annonce-defilant',
112                'descriptif'=> _T('escal:mot_annonce_defilant'),
113                'type'=>'affichage'
114            ),           
115            array(
116                'titre'=>'annuaire',
117                'descriptif'=> _T('escal:mot_annuaire'),
118                'type'=>'affichage'
119            ),
120            array(
121                'titre'=>'archive',
122                'descriptif'=> _T('escal:mot_archive'),
123                'type'=>'affichage'
124            ),
125            array(
126                'titre'=>'articles-de-rubrique',
127                'descriptif'=> _T('escal:mot_articles_rubrique'),
128                'type'=>'affichage'
129            ),
130            array(
131                'titre'=>'article-libre1',
132                'descriptif'=> _T('escal:mot_article_libre1'),
133                'type'=>'affichage'
134            ),
135            array(
136                'titre'=>'article-libre2',
137                'descriptif'=> _T('escal:mot_article_libre2'),
138                'type'=>'affichage'
139            ),
140            array(
141                'titre'=>'article-libre3',
142                'descriptif'=> _T('escal:mot_article_libre3'),
143                'type'=>'affichage'
144            ),
145            array(
146                'titre'=>'article-libre4',
147                'descriptif'=> _T('escal:mot_article_libre4'),
148                'type'=>'affichage'
149            ),
150            array(
151                'titre'=>'article-libre5',
152                'descriptif'=> _T('escal:mot_article_libre5'),
153                'type'=>'affichage'
154            ),
155            array(
156                'titre'=>'article-sans-date',
157                'descriptif'=> _T('escal:mot_article_sans_date'),
158                'type'=>'affichage'
159            ),
160            array(
161                'titre'=>'chrono',
162                'descriptif'=> _T('escal:mot_chrono'),
163                'type'=>'affichage'
164            ),
165            array(
166                'titre'=>'citations',
167                'descriptif'=> _T('escal:mot_citations'),
168                'type'=>'affichage'
169            ),                       
170            array(
171                'titre'=>'edito',
172                'descriptif'=> _T('escal:mot_edito'),
173                'type'=>'affichage'
174            ),           
175            array(
176                'titre'=>'favori',
177                'descriptif'=> _T('escal:mot_favori'),
178                'type'=>'affichage'
179            ),           
180            array(
181                'titre'=>'forum',
182                'descriptif'=> _T('escal:mot_forum'),
183                'type'=>'affichage'
184            ),
185            array(
186                'titre'=>'invisible',
187                'descriptif'=> _T('escal:mot_invisible'),
188                'type'=>'affichage'
189            ),
190            array(
191                'titre'=>'mon-article',
192                'descriptif'=> _T('escal:mot_mon_article'),
193                'type'=>'affichage'
194            ),
195            array(
196                'titre'=>'mon-article2',
197                'descriptif'=> _T('escal:mot_mon_article2'),
198                'type'=>'affichage'
199            ),
200            array(
201                'titre'=>'mon-article3',
202                'descriptif'=> _T('escal:mot_mon_article3'),
203                'type'=>'affichage'
204            ),
205            array(
206                'titre'=>'pas-a-decouvrir',
207                'descriptif'=> _T('escal:mot_pas_decouvrir'),
208                'type'=>'affichage'
209            ),
210            array(
211                'titre'=>'pas-a-la-une',
212                'descriptif'=> _T('escal:mot_pas_une'),
213                'type'=>'affichage'
214            ),
215            array(
216                'titre'=>'pas-au-menu',
217                'descriptif'=> _T('escal:mot_pas_menu'),
218                'type'=>'affichage'
219            ),
220            array(
221                'titre'=>'pas-au-menu-vertical',
222                'descriptif'=> _T('escal:mot_pas_menu_vertical'),
223                'type'=>'affichage'
224            ),
225            array(
226                'titre'=>'pas-au-plan',
227                'descriptif'=> _T('escal:mot_pas_plan'),
228                'type'=>'affichage'
229            ),
230            array(
231                'titre'=>'photo-une',
232                'descriptif'=> _T('escal:mot_photo_une'),
233                'type'=>'affichage'
234            ),
235            array(
236                'titre'=>'pleinepage',
237                'descriptif'=> _T('escal:mot_pleine_page'),
238                'type'=>'affichage'
239            ),
240            array(
241                'titre'=>'RubriqueOnglet',
242                'descriptif'=> _T('escal:mot_rubrique_onglet'),
243                'type'=>'affichage'
244            ),
245            array(
246                'titre'=>'RubriqueOnglet2',
247                'descriptif'=> _T('escal:mot_rubrique_onglet2'),
248                'type'=>'affichage'
249            ),
250            array(
251                'titre'=>'RubriqueOnglet3',
252                'descriptif'=> _T('escal:mot_rubrique_onglet3'),
253                'type'=>'affichage'
254            ),
255            array(
256                'titre'=>'RubriqueOnglet4',
257                'descriptif'=> _T('escal:mot_rubrique_onglet4'),
258                'type'=>'affichage'
259            ),
260            array(
261                'titre'=>'RubriqueOnglet5',
262                'descriptif'=> _T('escal:mot_rubrique_onglet5'),
263                'type'=>'affichage'
264            ),
265            array(
266                'titre'=>'site-exclu',
267                'descriptif'=> _T('escal:mot_site_exclu'),
268                'type'=>'affichage'
269            ),
270            array(
271                'titre'=>'special',
272                'descriptif'=> _T('escal:mot_special'),
273                'type'=>'affichage'
274            ),
275            array(
276                'titre'=>'texte2colonnes',
277                'descriptif'=> _T('escal:mot_texte2colonnes'),
278                'type'=>'affichage'
279            ),           
280            array(
281                'titre'=>'video-une',
282                'descriptif'=> _T('escal:mot_video_une'),
283                'type'=>'affichage'
284            )           
285        )
286    );
287   
288    return $schema;
289}
290
291// Fonction de mise a jour du schema
292function update_groupe_mots(){
293    include_spip('action/editer_objet');
294   
295    // chargement du array des groupe et mots
296    $schema = shema_escal();
297   
298    // en qu'elle version de escal est on ?
299    // si on a une meta escal_base_version, c'est qu'on est sur une version avec instalation auto
300    $meta = lire_config('escal_base_version');
301   
302    // si la meta est présente
303    if($meta!=''){
304        // Maj des groupes
305        for ($i= 0 , $nbr_grp = count($schema['groupes']) ; $i < $nbr_grp ; ++$i){
306            // test si le groupe existe
307            $grp_titre = $schema['groupes'][$i]['titre'];
308            $id_grp = sql_getfetsel("id_groupe","spip_groupes_mots","titre='$grp_titre'");
309            // si pas d'id retournée on inssère
310            if($id_grp!=''){
311                //echo "Update le groupe existe déja : ".$id_grp."=> ".$grp_titre."\n";
312                sql_updateq('spip_groupes_mots', $schema['groupes'][$i], "id_groupe='$id_grp'");
313            }//sinon on met a jour
314            else{
315                //echo "Insert Le groupe n'éxiste pas => ".$grp_titre."\n";
316                $id = sql_insertq('spip_groupes_mots',$schema['groupes'][$i]);
317            }
318           
319        }   
320       
321        //Maj des mots : on boucle sur le tableau mots
322        for ($i= 0 , $nbr_mot = count($schema['mots']) ; $i < $nbr_mot ; ++$i){
323            // test la présence du mot sur le champ titre
324            $titre = $schema['mots'][$i]['titre'];
325            $id_mot = sql_getfetsel("id_mot","spip_mots","titre='$titre'");
326            // le titre du mot est déjà présent
327            if($id_mot!=''){
328                // echo "Update le mot clef existe déja : ".$id_mot."=> ".$titre."\n";
329                $test = sql_updateq('spip_mots', $schema['mots'][$i], "titre='$titre'");
330                objet_modifier('mot',$id_mot,$schema['mots'][$i]);
331            }else{
332                // echo "Insert Le mot clef n'éxiste pas => ".$titre."\n";
333                // on extrait du array le groupe dont dépend le mot
334                $grp_titre = $schema['mots'][$i]['type'];
335                $id_grp = sql_getfetsel("id_groupe","spip_groupes_mots","titre='$grp_titre'");
336                $id_mot = objet_inserer('mot',$id_grp);
337                objet_modifier('mot',$id_mot,$schema['mots'][$i]);
338            }
339        }
340    }//si pas de meta_base on est sur une install plus ancienne
341    else{
342       // on verra plus tard ;-)
343    }
344}
345
346
347/*
348 * function install_groupe_mot
349 * installe les groupes de mots techniques et leurs mots clefs
350 */
351function install_groupe_mots() {
352    include_spip('action/editer_objet');
353    // chargement du array des groupe et mots
354    $schema = shema_escal();
355    // installation des groupes
356    for ($i= 0 , $nbr_mot = count($schema['groupes']) ; $i < $nbr_mot ; ++$i){
357        $id = sql_insertq('spip_groupes_mots',$schema['groupes'][$i]);
358    }
359   
360    // installation des mots
361    for ($i= 0 , $nbr_mot = count($schema['mots']) ; $i < $nbr_mot ; ++$i){
362        // on extrait du array le groupe dont dépend le mot
363        $grp_titre = $schema['mots'][$i]['type'];
364        $id_grp = sql_getfetsel("id_groupe","spip_groupes_mots","titre='$grp_titre'");
365        if($id_grp!=''){
366           $id_mot = objet_inserer('mot',$id_grp);
367            objet_modifier('mot',$id_mot,$schema['mots'][$i]);
368        }
369    }
370   
371}
372
373// Fonction de désinstalation des groupes et mots de Escal
374function uninstal_escal(){
375    // chargement du array des groupe et mots
376    $schema = shema_escal();
377    $id_grp = array();
378    // recuperer les id des groupes
379    for ($i= 0 , $nbr_mot = count($schema['groupes']) ; $i < $nbr_mot ; ++$i){
380        $grp_titre = $schema['groupes'][$i]['titre'];
381        $id_grp = sql_getfetsel("id_groupe","spip_groupes_mots","titre='$grp_titre'");
382        // désinstaller les mots correspondant a ce groupe
383        sql_delete("spip_mots","id_groupe='$id_grp'");
384        sql_delete("spip_groupes_mots","id_groupe='$id_grp'");
385    }
386}
387
388// =======================================================================================================================================
389   // pour gerer les classes des differents liens dans les articles
390   // Un grand merci a l'auteur : bobof
391// =======================================================================================================================================
392if (!function_exists('inc_lien')){
393function inc_lien($lien, $texte='', $class='', $title='', $hlang='', $rel='', $connect='')
394{
395        $mode = ($texte AND $class) ? 'url' : 'tout';
396        $lien = calculer_url($lien, $texte, $mode, $connect);
397        if ($mode === 'tout') {
398                $texte = $lien['titre'];
399                if (!$class AND isset($lien['class'])) $class = $lien['class'];
400                $lang = isset($lien['lang']) ?$lien['lang'] : '';
401                $lien = $lien['url'];
402        }
403        if (substr($lien,0,1) == '#')  # spip_ancre pour liens de type ->#ancre
404                $class = 'spip_ancre';
405        elseif (preg_match('/^\s*spip.php\?page\=/', $lien)) # spip_in pour liens de type ->rubXX, ->artXX, ->breXX et ->spip.php?page=XYZ
406                $class = "spip_in";
407        elseif (preg_match('/^\s*mailto:/',$lien)) # spip_mail pour liens de type ->mailto:
408                $class = "spip_mail";
409        elseif (preg_match(',s*('._SITE.'),Ui', $lien)) # spip_site pour liens de type ->http://mon_site.tld/repertoire/fichier.html
410                $class = "spip_site";
411        elseif (preg_match(',('._DOMAINE_SITE.'),Ui', $lien)) # spip_dom pour liens de type ->http://www.domaine.tld ou ->http://sous-domaine.domaine.tld
412                $class = "spip_dom";
413        elseif (preg_match('/^<html>/',$lien)) # spip_url, spip_out pour les autres cas de figures
414                $class = "spip_url spip_out";
415        elseif (!$class) $class = "spip_out"; # spip_out pour les liens externes
416return inc_lien_dist($lien, $texte, $class, $title, $hlang, $rel, $connect);
417}
418}
419// balises issues da la contrib  "Balises de comptage" de Franck
420// http://contrib.spip.net/Balises-de-comptage
421// =======================================================================================================================================
422// balise #TOTAL_VISITES
423// =======================================================================================================================================
424function vst_total_visites() {
425        $query = "SELECT SUM(visites) AS total_abs FROM spip_visites";
426        $result = spip_query($query);
427        if ($row = spip_fetch_array($result))
428                { return $row['total_abs']; }
429        else { return "0";}
430}
431function balise_TOTAL_VISITES($p) {
432        $p->code = "vst_total_visites()";
433        $p->statut = 'php';
434        return $p;
435}
436// =======================================================================================================================================
437// balise #NBPAGES_VISITEES
438// =======================================================================================================================================
439function vst_total_pages_visitees() {
440        $query = "SELECT SUM(visites) AS nbPages FROM spip_visites_articles";
441        $result = spip_query($query);
442        if ($row = spip_fetch_array($result))
443                { return $row['nbPages']; }
444        else { return "0";}
445}
446function balise_NBPAGES_VISITEES($p) {
447        $p->code = "vst_total_pages_visitees()";
448        $p->statut = 'php';
449        return $p;
450}
451
452// =======================================================================================================================================
453// balise #MOY_VISITES
454// =======================================================================================================================================
455function moyenne_visites_par_jour() {
456// calcul de la moyenne de visites
457// Période d'analyse couverte (nb de jours avant aujourd'hui)
458$periode = lire_config('escal/config/periodevisites', '365') ;
459
460// Sur tout le site, nombre de visites pendant la période
461$query="SELECT UNIX_TIMESTAMP(date) AS date_unix, visites FROM spip_visites ".
462                "WHERE 1 AND date > DATE_SUB(NOW(),INTERVAL $periode DAY) ORDER BY date";
463        $result=spip_query($query);
464        $i=0 ;
465        $total_absolu=0;
466        while ($row = spip_fetch_array($result)) {
467                $total_absolu = $total_absolu + $row['visites'];
468                $i++;
469        }
470// Nombre moyen de visites par jour sur la période
471        $moyenne =  round($total_absolu / $periode );
472        return $moyenne;
473}
474function balise_MOY_VISITES($p) {
475        $p->code = "moyenne_visites_par_jour()";
476        $p->statut = 'php';
477        return $p;
478}
479// =======================================================================================================================================
480// fonction pour l'affichage du nombre de visiteurs connectes
481// =======================================================================================================================================
482// issue du plugin "Nombre de visiteurs connectées"
483// http://contrib.spip.net/Nombres-de-visiteurs-connectes
484// corrections par Vincent de la liste Spip
485function escal_visiteurs_connectes_compter(){
486         return count(preg_files(_DIR_TMP.'visites/','.'));
487     }
488
489// =======================================================================================================================================
490// Balise : #JOUR_MAX_VISITES & #VAL_MAX_VISITES
491// =======================================================================================================================================
492
493  function generer_jour_val_max_visites($arg) {
494        $qv = spip_query("SELECT MAX(visites) as maxvi FROM spip_visites");
495        $rv = spip_fetch_array($qv);
496        $valmaxi = $rv['maxvi'];
497
498        if($arg=="date") {
499                $qd = spip_query("SELECT date FROM spip_visites WHERE visites = $valmaxi");
500                $rd = spip_fetch_array($qd);
501                $jourmaxi = $rd['date'];
502        }
503        if($arg=="date") { $a = $jourmaxi; }
504        if($arg=="val") { $a = $valmaxi; }
505        return $a;
506}
507function balise_JOUR_MAX_VISITES($p) {
508        $arg="date";
509        $p->code = "generer_jour_val_max_visites($arg)";
510        $p->interdire_scripts = false;
511        return $p;
512}
513function balise_VAL_MAX_VISITES($p) {
514        $arg="val";
515        $p->code = "generer_jour_val_max_visites($arg)";
516        $p->interdire_scripts = false;
517        return $p;
518}
519
520// =======================================================================================================================================
521// fonction pour les citations du pied de page
522// =======================================================================================================================================
523
524function citations($txt){
525$BDDArray = $txt;// Lecture de l'article
526$BDDArray = explode('<p>', $BDDArray); // couper à la  rencontre un p
527$BDDArray = array_map('rtrim', $BDDArray); // Suppression des fins de lignes de chaque élément
528$BDDArray = array_filter($BDDArray); // Suppression de TOUTES les entrées vides
529
530$citation = $BDDArray[array_rand($BDDArray)]; // une phrase au hasard dans le tableau
531if(strlen($citation)<200) //on ne veut pas dépasser 200 caractères
532return strip_tags($citation); //on vire les tags html
533else citations($txt);
534}
535
536/*   +----------------------------------+
537 *    Nom du Filtre :    tuer les lettres!
538 *   +----------------------------------+
539 *    Date : lundi 11 mai 2005
540 *    Auteur :  Posted by cerdic
541 *   +-------------------------------------+
542 *    Fonctions de ce filtre :
543 *   remplacement des caractères accentués
544 *    exemple trouvé là:
545 *    http://be.php.net/manual/fr/function.strtr.php#52098
546 *   +-------------------------------------+
547 * 
548*/
549
550
551function lettre1($texte) {
552        $texte = $texte{0}; // première lettre
553                $texte = 
554strtr($texte, "\xA1\xAA\xBA\xBF\xC0\xC1\xC2\xC3\xC5\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD8\xD9\xDA\xDB\xDD\xE0\xE1\xE2\xE3\xE5\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF8\xF9\xFA\xFB\xFD\xFF", "!ao?AAAAACEEEEIIIIDNOOOOOUUUYaaaaaceeeeiiiidnooooouuuyy");
555        $texte = strtr($texte, 
556array("\xC4"=>"Ae", "\xC6"=>"AE", "\xD6"=>"Oe", "\xDC"=>"Ue", "\xDE"=>"TH", "\xDF"=>"ss", "\xE4"=>"ae", "\xE6"=>"ae", "\xF6"=>"oe", "\xFC"=>"ue", "\xFE"=>"th"));
557        $texte = strtoupper($texte); // tout en majuscules
558        return $texte;
559}
560// =======================================================================================================================================
561// Ajout de  nofollow sur les liens (pas mal à utiliser  sur les commentaires pour éviter le spam)
562// =======================================================================================================================================
563
564function nofollow($texte){
565   $texte=str_replace("<a href","<a rel='nofollow' href",$texte);
566   return $texte;
567}
568
569// =======================================================================================================================================
570// paramètres pour le plugin diapo
571// =======================================================================================================================================
572
573//nombre de vignettes par page
574$GLOBALS['diapo_vignettes']=15;
575
576//largeur et hauteur maxi des vignettes :
577$GLOBALS['diapo_vignette']=60;
578
579//largeur maxi de la grande image avec vignettes en haut :
580$GLOBALS['diapo_grand']=400;
581
582//largeur maxi de la grande image avec vignettes sur les côtés:
583$GLOBALS['diapo_petit']=300; 
584//hauteur maxi de la grande image avec vignettes sur les côtés :
585$GLOBALS['diapo_petit_h']=300;
586
587//diaporama : temps de pause en millisecondes :
588$GLOBALS['diapo_temps']=3000;
589
590
591
592// =======================================================================================================================================
593// fonction couperpropre
594// =======================================================================================================================================
595
596/*
597* Coupe une chaine en gardant le formatage HTML
598* @param string $text Texte a couper
599* @param integer $length Longueur a garder
600* @param string $ending Caracteres a ajouter a la fin
601* @param boolean $exact Coupure exacte
602* @return string
603*/
604
605function couperpropre($text, $length, $ending = '...', $exact = false) {
606if(strlen(preg_replace('/<.*?>/', '', $text)) <= $length) {
607        return $text;
608}
609        preg_match_all('/(<.+?>)?([^<>]*)/is', $text, $matches, PREG_SET_ORDER);
610        $total_length = 0;
611        $arr_elements = array();
612        $truncate = '';
613foreach($matches as $element) {
614if(!empty($element[1])) {
615if(preg_match('/^<\s*.+?\/\s*>$/s', $element[1])) {
616}
617else if(preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $element[1], $element2)) {
618        $pos = array_search($element2[1], $arr_elements);
619if($pos !== false) {
620        unset($arr_elements[$pos]);
621}
622}
623else if(preg_match('/^<\s*([^\s>!]+).*?>$/s', $element[1], $element2)) {
624        array_unshift($arr_elements,    strtolower($element2[1]));
625}
626        $truncate .= $element[1];
627}
628$content_length = strlen(preg_replace('/(&[a-z] {
629        1,6
630}
631        ;
632        |&#[0-9]+;
633        )/i', ' ', $element[2]));
634if($total_length >= $length) {
635        break;
636}
637elseif ($total_length+$content_length > $length) {
638        $left = $total_length>$length?$total_length-$length: $length-$total_length;
639        $entities_length = 0;
640if(preg_match_all('/&[a-z] {
641        1,6
642}
643        ;
644        |&#[0-9]+;
645/i', $element[2], $element3, PREG_OFFSET_CAPTURE)) {
646foreach($element3[0] as $entity) {
647if($entity[1]+1-$entities_length <= $left) {
648        $left--;
649        $entities_length += strlen($entity[0]);
650}
651        else break;
652}
653}
654        $truncate .= substr($element[2], 0, $left+$entities_length);
655        break;
656}
657else {
658        $truncate .= $element[2];
659        $total_length += $content_length;
660}
661}
662if(!$exact) {
663        $spacepos = strrpos($truncate, ' ');
664if(isset($spacepos)) {
665        $truncate = substr($truncate, 0, $spacepos);
666}
667}
668        $truncate .= $ending;
669foreach($arr_elements as $element) {
670        $truncate .= '</' . $element . '>';
671}
672        return $truncate;
673}
674   
675// =======================================================================================================================================
676// traitement json
677// =======================================================================================================================================
678
679if (!function_exists('json_decode')) {
680    function json_decode($content, $assoc=false) {
681        require_once 'classes/JSON.php';
682        if ($assoc) {
683            $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE);
684        }
685        else {
686            $json = new Services_JSON;
687        }
688        return $json->decode($content);
689    }
690}
691 
692if (!function_exists('json_encode')) {
693    function json_encode($content) {
694        require_once 'classes/JSON.php';
695        $json = new Services_JSON;
696        return $json->encode($content);
697    }
698} 
699
700
701
702/*######
703#
704# Filtre SPIP 'decouper_en_XD_parties'
705# 4 Alexandra By Apsulis
706# 14 janvier 2007
707#
708# OBJET :
709# -------
710# Pour decouper un contenu texte en X parties egale avec cesure mot entier.
711# Retourne la partie Y demandee.
712#
713# USAGE :
714# -------
715# Dans le squelette :
716# [(#TEXTE*|decouper_en_XD_parties{X,Y}|propre)]
717#
718# Dans le fichier mes_fonctions.php (a ranger par exemple dans votre dossier de squelettes) :
719# placer la fonction qui suit depuis "function decouper"... jusqu'a "return $partie_isolee; }"
720#
721#
722# Remarque :
723# ----------
724# - Fonctionne avec n'importe quel contenu texte : #INTRO, #TEXTE, #DESCRIPTIF, #PS, etc...
725# - Pour remplir X colonnes, dans le cadre d'une boucle (ou pas, vous faites ce que vous voulez),
726# utiliser X fois le filtre en changeant la partie Y demandee.
727#
728#######*/
729
730
731
732function decouper_en_XD_parties($texte,$nb_parties,$partie_a_retourner){
733
734        /* On traite les erreurs positives et negatives au cas ou */
735        if($partie_a_retourner > $nb_parties){
736                $partie_a_retourner = $nb_parties;
737        }
738        if($partie_a_retourner == 0){
739                $partie_a_retourner = 1;
740        }
741
742       
743//var_dump($nb_parties);
744        $longueur = strlen($texte);                                                                 // Longueur totale de la chaine de caractere
745        $partie = $longueur/$nb_parties;                                        // Taille en caracteres d'une partie
746        $decoupe = str_word_count($texte, 2, '.&<|>');                        // On decoupe le texte par mot pour savoir a quels mots couper les parties
747
748//print_r(str_word_count($texte, 2, '.&'));
749
750        $mots_cesure[0] = 0;                                                                                        // Premiere borne = 0
751        $j = 1;
752
753       
754                        while($j < $nb_parties){                                                                        // On recherche la fin du dernier mot de la partie pour ne pas le couper (=cesure)
755                $i = $partie*($j);                                                                                        // On debute la recherche a partie, et ensuite on incremente de la taille d'une partie pour trouver le mot suivant                         
756                while(!isset($decoupe[$i])){                                                // On part du caractere ou on devrait couper,
757                        $i++;                                                                                                                                        // et on avance jusqu'a trouver la fin du mot
758                }
759        /*###
760        # CORRECTIF par Pierre
761        # Pour eviter de couper les colonnes au milieu d'une ligne (par exemple une ligne de un ou deux mots)
762        # La coupure se fait  la fin d'une phrase, aprs le point.
763        # (ligne 49)"$decoupe = str_word_count($texte, 2, '.&');" ici le troisime parametre est l'ensemble des caracteres autorises dans un mot dont le point ce qui permet la coupure.
764        ###*/
765                while(!preg_match('`\.$`',"$decoupe[$i]")){   //tant que le mot ne se termine pas par un point...
766                        $i++;                                                                                                                                                                //incrementation d'un caractere
767                        while(!isset($decoupe[$i])){                                               
768                        $i++;                                                                                                                               
769                        }
770                }
771                $i++;
772                        while(!isset($decoupe[$i])){                                               
773                        $i++;                                                                                                                               
774                        }
775        //echo $decoupe[$i];
776               
777        /*### FIN DU CORRECTIF ###*/       
778               
779               
780                $mots_cesure[$j] = $i;                                                                        // On range la valeur en caractere du mot clef pour la cesure
781                $j++;                                                                                                                                                // On passe a la partie suivante
782        }
783        $mots_cesure[$j] = $longueur;                                                        // Derniere borne = fin du texte
784
785        // On isole la partie qu'on renvoi pour affichage par SPIP
786        $partie_isolee = substr($texte, $mots_cesure[$partie_a_retourner-1], $mots_cesure[$partie_a_retourner]-$mots_cesure[$partie_a_retourner-1]);
787
788        return propre($partie_isolee);
789}
790?>
Note: See TracBrowser for help on using the repository browser.