source: spip-zone/_plugins_/spip-listes/spip-listes_1_9_3/inc/spiplistes_api_globales.php @ 50496

Last change on this file since 50496 was 50496, checked in by paladin@…, 8 years ago

documentation code

  • Property svn:eol-style set to LF
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 17.9 KB
Line 
1<?php
2/**
3 * Les fonctions qui doivent etre chargees par tous les scripts sauf inc/spiplistes_api*
4 *
5 * @package spiplistes
6 */
7 // $LastChangedRevision: 50496 $
8 // $LastChangedBy: paladin@quesaco.org $
9 // $LastChangedDate: 2011-08-16 06:39:07 +0000 (Tue, 16 Aug 2011) $
10
11/******************************************************************************************/
12/* SPIP-Listes est un systeme de gestion de listes d'abonnes et d'envoi d'information     */
13/* par email pour SPIP. http://bloog.net/spip-listes                                      */
14/* Copyright (C) 2004 Vincent CARON  v.caron<at>laposte.net                               */
15/*                                                                                        */
16/* Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes */
17/* de la Licence Publique Generale GNU publiee par la Free Software Foundation            */
18/* (version 2).                                                                           */
19/*                                                                                        */
20/* Ce programme est distribue car potentiellement utile, mais SANS AUCUNE GARANTIE,       */
21/* ni explicite ni implicite, y compris les garanties de commercialisation ou             */
22/* d'adaptation dans un but specifique. Reportez-vous a la Licence Publique Generale GNU  */
23/* pour plus de details.                                                                  */
24/*                                                                                        */
25/* Vous devez avoir recu une copie de la Licence Publique Generale GNU                    */
26/* en meme temps que ce programme ; si ce n'est pas le cas, ecrivez a la                  */
27/* Free Software Foundation,                                                              */
28/* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, Etats-Unis.                   */
29/******************************************************************************************/
30
31if(!defined('_ECRIRE_INC_VERSION')) return;
32
33// Certains hebergeurs ont desactive l'acces a syslog (free,...)
34// Recreer les constantes pour trier les journaux
35if(!defined('LOG_WARNING')) {
36        define('LOG_WARNING', 4);
37        define('LOG_DEBUG', 7);
38}
39
40function spiplistes_log ($texte, $level = LOG_WARNING) {
41       
42        static $lan, $syslog, $debug;
43       
44        $texte = trim ($texte);
45       
46        if (empty ($texte)) { return (false); }
47       
48        if ($syslog === null)
49        {
50                $lan = spiplistes_server_rezo_local();
51               
52                $syslog = (spiplistes_pref_lire('opt_console_syslog') == 'oui');
53                $debug = (spiplistes_pref_lire('opt_console_debug') == 'oui');
54        }
55        if ($debug || $lan)
56        {
57                if ($syslog)
58                {
59                        $tag = '_';
60                        if (empty($tag))
61                        { 
62                                $tag = basename ($_SERVER['PHP_SELF']); 
63                        }
64                        else if ($level == LOG_DEBUG)
65                        {
66                                $tag = 'DEBUG: ' . $tag; 
67                        }
68                        return (
69                                openlog ($tag, LOG_PID | LOG_CONS, LOG_USER) 
70                                        && syslog ($level, $texte) 
71                                        &&      closelog()
72                        );
73                }
74                else {
75                        spip_log ($texte, _SPIPLISTES_PREFIX);
76                }
77               
78        }
79        else if($level <= LOG_WARNING)
80        {
81                // Taille du log SPIP trop courte en 192
82                // Ne pas envoyer si DEBUG sinon tronque sans cesse
83                // En SPIP 193, modifier globale $taille_des_logs pour la rotation
84                spip_log ($texte, _SPIPLISTES_PREFIX);
85        }
86        return (true);
87}
88
89/**
90 * CP-20110311
91 * Envoyer un message dans la console (debug)
92 * Le mode debug doit etre selectionne' dans la page de configuration
93 * @return bool
94 */
95function spiplistes_debug_log ($msg = '')
96{
97        static $debug;
98               
99        if ($debug === null)
100        {
101                $debug = (spiplistes_pref_lire('opt_console_debug') == 'oui');
102        }
103        $msg = trim ($msg);
104        if ($debug && !empty($msg))
105        {
106                spiplistes_log ($msg, LOG_DEBUG);
107        }
108       
109        return ($debug);
110}
111
112/**
113 * CP-20110322
114 * alias pour récupérer le mode debug
115 * @return bool
116 */
117function spiplistes_debug_mode () {
118        return (spiplistes_debug_log () );
119}
120
121/**
122 * CP-20110311
123 * Détecter si reseau local
124 * @return boolean
125 */
126function spiplistes_server_rezo_local () {
127       
128        static $islan;
129       
130        if ($islan === null)
131        {
132                $adr = $_SERVER['SERVER_ADDR'];
133               
134                $islan =
135                        ($adr && (
136                                          $adr == '127.0.0.1'
137                                   || (substr ($adr, 0, 8) == '192.168.')
138                                   || (substr ($adr, 0, 4) == '172.')
139                                   || (substr ($adr, 0, 3) == '10.')
140                                   )
141                        );
142        }
143        return ($islan);
144}
145
146/**
147 * SPIP 1.9.2e: $spip_version_branche = null; $spip_version_affichee = '1.9.2e'; $spip_version_code = 1.9208;
148 * SPIP 1.9.2f: $spip_version_branche = null; $spip_version_affichee = '1.9.2f'; $spip_version_code = 1.9208;
149 * SPIP 1.9.2g: $spip_version_branche = null; $spip_version_affichee = '1.9.2g'; $spip_version_code = 1.9208;
150 * SPIP 2.0.0: $spip_version_branche = "2.0.0"; $spip_version_affichee = "$spip_version_branche"; $spip_version_code = 12691;
151 * SPIP 2.0.1: $spip_version_branche = "2.0.1"; $spip_version_affichee = "$spip_version_branche"; $spip_version_code = 12691;
152 * SPIP 2.0.2: $spip_version_branche = "2.0.2"; $spip_version_affichee = "$spip_version_branche"; $spip_version_code = 12691;
153 * @version CP-20080324
154 * @staticvar $is_inf
155 * @global $GLOBALS['spip_version_code']
156 * @see http://www.spip.net/fr_article4449.html
157 * @return bool
158 */
159function spiplistes_spip_est_inferieur_193 () {
160        static $is_inf;
161        if($is_inf===NULL) {
162                $is_inf = version_compare($GLOBALS['spip_version_code'],'1.9300','<');
163        }
164        return($is_inf);
165}
166
167/**
168 * La composition de la globale spip_version_code est
169 *  différente en SPIP 3
170 * La fonction spip_version_compare() apparaît en SPIP 2.
171 * S'en servir pour détecter la version 3.
172 * @version CP-20110515
173 * @staticvar $is_inf
174 * @global $GLOBALS['spip_version_branche']
175 * @return bool
176 */
177function spiplistes_spip_est_inferieur_3 ()
178{
179        static $is_inf;
180        if ($is_inf === NULL)
181        {
182                include_spip('inc/plugin');
183                $is_inf = (
184                        function_exists('spip_version_compare')
185                        && isset($GLOBALS['spip_version_branche'])
186                        && spip_version_compare(
187                                $GLOBALS['spip_version_branche']
188                                , '3.0.0-dev'
189                                , '<'
190                                )
191                );
192        }
193        return ($is_inf);
194}
195
196
197/**
198 * ecrire dans la table 'spip_meta' le champ...
199 * en general pour les preferences
200 * @return true
201 */
202function spiplistes_ecrire_metas() {
203        if(spiplistes_spip_est_inferieur_193()) { 
204                include_spip('inc/meta');
205                ecrire_metas();
206        }
207        return (true);
208}
209
210/**
211 * Lecture d'une pref (meta)
212 * @param $key string
213 * @return string or null
214 */
215function spiplistes_pref_lire ($key) {
216        $s = spiplistes_lire_key_in_serialized_meta($key, _SPIPLISTES_META_PREFERENCES);
217        return ($s);
218}
219
220/*
221 * lecture dans les metas, format serialise
222 * @return
223 * @param $meta_name
224 */
225function spiplistes_lire_serialized_meta ($meta_name) {
226        if(isset($GLOBALS['meta'][$meta_name])) {
227                if(!empty($GLOBALS['meta'][$meta_name])) {
228                        return(unserialize($GLOBALS['meta'][$meta_name]));
229                }
230                else spiplistes_debug_log ("erreur sur meta $meta_name (vide)");
231        }
232        return(false);
233}
234
235/*
236 * lecture d'une cle dans la meta serialisee
237 * @return
238 * @param $key
239 * @param $meta_name
240 */
241function spiplistes_lire_key_in_serialized_meta ($key, $meta_name) {
242        $result = false;
243        $s_meta = spiplistes_lire_serialized_meta($meta_name);
244        if($s_meta && isset($s_meta[$key])) {
245                $result = $s_meta[$key];
246        } 
247        return($result);
248}
249
250/*
251 * ecriture dans les metas, format serialise
252 * @return
253 * @param $key la cle meta a appliquer
254 * @param $value sa valeur
255 * @param $meta_name nom du champ meta
256 */
257function spiplistes_ecrire_key_in_serialized_meta ($key, $value, $meta_name) {
258        if(isset($GLOBALS['meta'][$meta_name])) {
259                $s_meta = unserialize($GLOBALS['meta'][$meta_name]);
260                $s_meta[$key] = $value;
261                ecrire_meta($meta_name, serialize($s_meta));
262                return(true);
263        }
264        else return(false);
265}
266
267
268/**
269 * @return la version du fichier plugin.xml
270 */
271function spiplistes_real_version_get ($prefix) {
272        static $r;
273        if($r === null) {
274                $r = spiplistes_real_tag_get($prefix, 'version');
275        }
276        return ($r);
277}
278
279/**
280 * renvoie la version_base du fichier plugin.xml
281 */
282function spiplistes_real_version_base_get ($prefix) {
283        $r = spiplistes_real_tag_get($prefix, 'version_base');
284        return ($r);
285}
286
287function spiplistes_current_version_get ($prefix) {
288        global $meta; 
289        return $meta[$prefix."_version"];
290}
291
292function spiplistes_real_tag_get ($prefix, $s) {
293        include_spip('inc/plugin');
294        $dir = spiplistes_get_meta_dir($prefix);
295        $f = _DIR_PLUGINS.$dir.'/'._FILE_PLUGIN_CONFIG;
296        if(is_readable($f) && ($c = file_get_contents($f))) {
297                $p = array("/<!--(.*?)-->/is","/<\/".$s.">.*/s","/.*<".$s.">/s");
298                $r = array("","","");
299                $r = preg_replace($p, $r, $c);
300        }
301        return(!empty($r) ? $r : false);
302}
303
304/**
305 * renvoie les infos du plugin contenues dans les metas
306 * qui contient 'dir' et 'version'
307 */
308function spiplistes_get_meta_infos ($prefix) {
309        if(isset($GLOBALS['meta']['plugin'])) {
310                $result = unserialize($GLOBALS['meta']['plugin']);
311                $prefix = strtoupper($prefix);
312                if(isset($result[$prefix])) {
313                        return($result[$prefix]);
314                }
315        }
316        return(false);
317}
318
319/**
320 * renvoie le dir du plugin present dans les metas
321 */
322function spiplistes_get_meta_dir($prefix) {
323        $result = false;
324        $info = spiplistes_get_meta_infos($prefix);
325        if(isset($info['dir'])) {
326                $result = $info['dir'];
327        }
328        return($result);
329}
330
331/**
332 * @return la version_base en cours
333 * doc: voir inc/plugin.php sur version_base (plugin.xml)
334 * qui s'appelle base_version en spip_meta %-}
335 */
336function spiplistes_current_version_base_get ($prefix) {
337        global $meta;
338        if(!($vb = $meta[$prefix."_base_version"])) {
339                $vb = spiplistes_real_version_base_get ($prefix);
340        }
341        return($vb);
342}
343
344/**
345 * Message erreur sql sur le journal du plugin
346 * @return bool TRUE
347 */
348function spiplistes_sqlerror_log ($trace = '') {
349        if($trace) $trace = " ($trace) ";
350        spiplistes_log('DB ERROR'.$trace.': [' . sql_errno() . '] ' . sql_error());
351        return(true);
352}
353
354// CP-20090111. log pour les apis
355function spiplistes_log_api ($msg) {
356        static $ii;
357        if($ii === null) {
358                $ii = $GLOBALS['auteur_session']['id_auteur'];
359                $ii = $ii ? "id_auteur #".$ii : "himself";
360        };
361        spiplistes_log("API: $msg by $ii");
362        return(true);
363}
364
365// CP-20090111: adresse mail de l'expediteur par defaut
366function spiplistes_email_from_default () {
367        static $default;
368        if(!$default) {
369                if(
370                        // prendre d'abord celui par defaut de SPIP-Listes
371                        ($result = email_valide($ii = trim($GLOBALS['meta']['email_defaut'])))
372                        // sinon celui du webmaster
373                        || ($result = email_valide($ii = trim($GLOBALS['meta']['email_webmaster'])))
374                ) {
375                        if($result == $ii) {
376                                //$nom = extraire_multi($GLOBALS['meta']['nom_site']);
377                                //$nom = unicode2charset(charset2unicode($nom),$GLOBALS['meta']['spiplistes_charset_envoi']);
378                                //$result = "\"$nom\" <$ii>";
379                        }
380                }
381                else {
382                        spiplistes_log('ERROR: sender email address missing');
383                }
384        }
385        return($result);
386}
387
388// PHP 4 ?
389if(!function_exists('array_combine')) {
390        function array_combine ($keys, $values) {
391                if(is_array($keys) && is_array($values) && (count($keys) == count($values))) {
392                        $keys = array_values($keys);
393                        $values = array_values($values);
394                        $result = array();
395                        foreach($keys as $key => $value) {
396                                $result[$value] = $values[$key];
397                        }
398                }
399                return($result);
400        }
401}
402
403// !(PHP 4 >= 4.3.0, PHP 5)
404if(!function_exists('html_entity_decode')) {
405        function html_entity_decode ($string, $quote_style = '', $charset = '')
406        {
407                // Remplace les entites numeriques
408                $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
409                $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
410                // Remplace les entites
411                $trans_tbl = get_html_translation_table (HTML_ENTITIES);
412                $trans_tbl = array_flip ($trans_tbl);
413                return strtr ($string, $trans_tbl);
414        }
415}
416
417/**
418 * complete caracteres manquants dans HTML -> ISO
419 * @param $texte le texte a transcrire
420 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
421 * @param $is_html flag. Pour ne pas transcrire completement la version html
422 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
423 * @see http://www.w3.org/TR/html401/sgml/entities.html
424 * @return string la chaine transcrite
425 */
426function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false)
427{
428        $texte = trim($texte);
429        if ( empty($texte) ) { return ($texte); }
430       
431        /**
432         * En entités unicode
433         */
434        $texte = charset2unicode ($texte);
435       
436        /**
437         * Convertir dans le charset demandé
438         * (mais ne traite pas les entités)
439         */
440        $texte = unicode2charset ($texte, $charset);
441       
442        /**
443         * Complète pour les attributs utf-8 étendus
444         */
445        if (
446                ($GLOBALS['meta']['charset'] == 'utf-8')
447                && ($charset != 'utf-8')
448        )
449        {
450                $texte = spiplistes_utf2iso ($texte, $is_html);
451        }
452       
453        if ($is_html) {
454                $texte = spiplistes_html_entity_decode ($texte, $charset);
455        }
456       
457        return($texte);
458}
459
460/**
461 * @return string
462 */
463function spiplistes_utf2iso ($texte, $is_html = false) {
464        $remplacements = array(
465                '&#8217;' => "'"        // quote
466                , '&#8220;' => '"' // guillemets
467                , '&#8221;' => '"' // guillemets
468                // versions diacritiques rencontrées parfois
469                // voir http://fr.wikipedia.org/wiki/Table_des_caract%C3%A8res_Unicode_%280000-0FFF%29#Sous-ensembles
470                , 'a&#768;' => chr(224) // à
471                , 'e&#768;' => chr(232) // è
472                , 'e&#769;' => chr(233) // é
473                )
474                ;
475        if(!$is_html) {
476                $remplacements = array_merge(
477                        $remplacements
478                        , array(
479                                                // Latin Extended
480                                  '&#255;' => chr(255) // 'ÿ' // yuml inconnu php ?
481                                , '&#338;' => 'OE'  // OElig
482                                , '&#339;' => 'oe'  // oelig
483                                , '&#352;' => 'S'  // Scaron
484                                , '&#353;' => 's'  // scaron
485                                , '&#376;' => 'Y'  // Yuml
486                                        // General Punctuation
487                                , '&#8194;' => ' ' // ensp
488                                , '&#8195;' => ' ' // emsp
489                                , '&#8201;' => ' ' // thinsp
490                                , '&#8204;' => ' ' // zwnj
491                                , '&#8205;' => ' ' // zwj
492                                , '&#8206;' => ' ' // lrm
493                                , '&#8207;' => ' ' // rlm
494                                , '&#8211;' => '-' // ndash
495                                , '&#8212;' => '--' // mdash
496                                , '&#39;' => "'" // apos
497                                , '&#8216;' => "'" // lsquo
498                                , '&#8217;' => "'" // rsquo
499                                , '&#8218;' => "'" // sbquo
500                                , '&#8220;' => '"' // ldquo
501                                , '&#8221;' => '"' // rdquo
502                                , '&#8222;' => '"' // bdquo
503                                , '&#8224;' => '+' // dagger
504                                , '&#8225;' => '++' // Dagger
505                                , '&#8240;' => '0/00' // permil
506                                , '&#8249;' => '.' // lsaquo
507                                , '&#8250;' => '.' // rsaquo
508                                        // sans oublier
509                                , '&#8364;' => 'euros'  // euro
510                        )
511                );
512        }
513        $texte = strtr($texte, $remplacements);
514       
515        return ($texte);
516}
517
518/**
519 * Extension de html_entity_decode()
520 * pour transposer les entites HTML étendues
521 * @return string
522 */
523function spiplistes_html_entity_decode ($texte, $charset = _SPIPLISTES_CHARSET_ENVOI)
524{
525        $charset = strtoupper ($charset);
526        $texte = html_entity_decode ($texte, ENT_QUOTES, $charset);
527        return ($texte);
528}
529
530/**
531 * @see http://fr.php.net/html_entity_decode
532 *      thank to: laurynas dot butkus at gmail dot com
533 * @return string
534 */
535 
536function spiplistes_html_entity_decode_utf8 ($string)
537{
538         static $trans_tbl;
539       
540         // replace numeric entities
541         $string = preg_replace('~&#x([0-9a-f]+);~ei', 'spiplistes_code2utf(hexdec("\\1"))', $string);
542         $string = preg_replace('~&#([0-9]+);~e', 'spiplistes_code2utf(\\1)', $string);
543
544         // replace literal entities
545         if (!isset($trans_tbl))
546         {
547                  $trans_tbl = array();
548                 
549                  foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
550                                $trans_tbl[$key] = utf8_encode($val);
551         }
552       
553         return strtr($string, $trans_tbl);
554} // spiplistes_html_entity_decode_utf8()
555
556
557/**
558 * Returns the utf string corresponding to the unicode value
559 *      (from php.net, courtesy - romans@void.lv)
560 *      thank to: akniep at rayo dot info
561 * @staticvar array $windows_illegals_chars
562 */
563function spiplistes_code2utf($number)
564{
565        static $windows_illegals_chars;
566        if($windows_illegals_chars === null) {
567                $windows_illegals_chars = array(
568                        128 => 8364
569            , 129 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
570            , 130 => 8218
571            , 131 => 402
572            , 132 => 8222
573            , 133 => 8230
574            , 134 => 8224
575            , 135 => 8225
576            , 136 => 710
577            , 137 => 8240
578            , 138 => 352
579            , 139 => 8249
580            , 140 => 338
581            , 141 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
582            , 142 => 381
583            , 143 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
584            , 144 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
585            , 145 => 8216
586            , 146 => 8217
587            , 147 => 8220
588            , 148 => 8221
589            , 149 => 8226
590            , 150 => 8211
591            , 151 => 8212
592            , 152 => 732
593            , 153 => 8482
594            , 154 => 353
595            , 155 => 8250
596            , 156 => 339
597            , 157 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
598            , 158 => 382
599            , 159 => 376
600                );
601        }
602       
603    if ($number < 0)
604        return FALSE;
605    if ($number < 128)
606        return chr($number);
607    // Removing / Replacing Windows Illegals Characters
608    if ($number < 160) {
609        $number = $windows_illegals_chars[$number];
610    }
611   
612    if ($number < 2048)
613        return chr(($number >> 6) + 192) . chr(($number & 63) + 128);
614    if ($number < 65536)
615        return chr(($number >> 12) + 224) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
616    if ($number < 2097152)
617        return chr(($number >> 18) + 240) . chr((($number >> 12) & 63) + 128) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
618   
619    return (false);
620} //spiplistes_code2utf()
621
622/**
623 * CP-20110320
624 * Version liens_absolus compatible DATA URL SHEME
625 * @return string
626 */
627function spiplistes_liens_absolus ($texte, $base='') {
628       
629        static $url_sheme = 'data:image/png;base64';
630        static $hide_sheme = '<__HIDEME__ ';
631        $switch_me = false;
632       
633        if (preg_match_all(
634                // masque = tout
635                ',(?P<masque>'
636                // tag, 'img' uniquement
637                . '<(?P<tag>img)[[:space:]]+[^<>]*'
638                // src ? data url sheme ?
639                .'(?P<attr>src=["\']?'.$url_sheme.')'
640                // tout ce qui suit jusqu'au tag fermant
641                . '(?P<right>[^>]*>)),isS', 
642                $texte, $matches, PREG_SET_ORDER
643        )) {
644                foreach ($matches as $match) {
645                       
646                        $texte = str_replace(
647                                $match['masque']
648                                , $hide_sheme.$match['right']
649                                , $texte
650                                );
651                }
652                $switch_me = true;
653        }
654       
655        $texte = liens_absolus($texte, $base);
656       
657        if ($switch_me)
658        {
659                $texte = str_replace($hide_sheme, '<img src="'.$url_sheme, $texte);
660        }
661        return ($texte);
662}
663
Note: See TracBrowser for help on using the repository browser.