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

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

documentation

  • Property svn:eol-style set to LF
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 16.5 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: 47535 $
8 // $LastChangedBy: paladin@quesaco.org $
9 // $LastChangedDate: 2011-05-07 15:46:10 +0000 (Sat, 07 May 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// CP-20080324
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;
153function spiplistes_spip_est_inferieur_193 () {
154        static $is_inf;
155        if($is_inf===NULL) {
156                $is_inf = version_compare($GLOBALS['spip_version_code'],'1.9300','<');
157        }
158        return($is_inf);
159}
160
161
162/**
163 * ecrire dans la table 'spip_meta' le champ...
164 * en general pour les preferences
165 * @return true
166 */
167function spiplistes_ecrire_metas() {
168        if(spiplistes_spip_est_inferieur_193()) { 
169                include_spip('inc/meta');
170                ecrire_metas();
171        }
172        return (true);
173}
174
175/**
176 * Lecture d'une pref (meta)
177 * @param $key string
178 * @return string or null
179 */
180function spiplistes_pref_lire ($key) {
181        $s = spiplistes_lire_key_in_serialized_meta($key, _SPIPLISTES_META_PREFERENCES);
182        return ($s);
183}
184
185/*
186 * lecture dans les metas, format serialise
187 * @return
188 * @param $meta_name Object
189 */
190function spiplistes_lire_serialized_meta ($meta_name) {
191        if(isset($GLOBALS['meta'][$meta_name])) {
192                if(!empty($GLOBALS['meta'][$meta_name])) {
193                        return(unserialize($GLOBALS['meta'][$meta_name]));
194                }
195                else spiplistes_debug_log ("erreur sur meta $meta_name (vide)");
196        }
197        return(false);
198}
199
200/*
201 * lecture d'une cle dans la meta serialisee
202 * @return
203 * @param $key Object
204 * @param $meta_name Object
205 */
206function spiplistes_lire_key_in_serialized_meta ($key, $meta_name) {
207        $result = false;
208        $s_meta = spiplistes_lire_serialized_meta($meta_name);
209        if($s_meta && isset($s_meta[$key])) {
210                $result = $s_meta[$key];
211        } 
212        return($result);
213}
214
215/*
216 * ecriture dans les metas, format serialise
217 * @return
218 * @param $key la cle meta a appliquer
219 * @param $value sa valeur
220 * @param $meta_name nom du champ meta
221 */
222function spiplistes_ecrire_key_in_serialized_meta ($key, $value, $meta_name) {
223        if(isset($GLOBALS['meta'][$meta_name])) {
224                $s_meta = unserialize($GLOBALS['meta'][$meta_name]);
225                $s_meta[$key] = $value;
226                ecrire_meta($meta_name, serialize($s_meta));
227                return(true);
228        }
229        else return(false);
230}
231
232
233/**
234 * @return la version du fichier plugin.xml
235 */
236function spiplistes_real_version_get ($prefix) {
237        static $r;
238        if($r === null) {
239                $r = spiplistes_real_tag_get($prefix, 'version');
240        }
241        return ($r);
242}
243
244/**
245 * renvoie la version_base du fichier plugin.xml
246 */
247function spiplistes_real_version_base_get ($prefix) {
248        $r = spiplistes_real_tag_get($prefix, 'version_base');
249        return ($r);
250}
251
252function spiplistes_current_version_get ($prefix) {
253        global $meta; 
254        return $meta[$prefix."_version"];
255}
256
257function spiplistes_real_tag_get ($prefix, $s) {
258        include_spip('inc/plugin');
259        $dir = spiplistes_get_meta_dir($prefix);
260        $f = _DIR_PLUGINS.$dir.'/'._FILE_PLUGIN_CONFIG;
261        if(is_readable($f) && ($c = file_get_contents($f))) {
262                $p = array("/<!--(.*?)-->/is","/<\/".$s.">.*/s","/.*<".$s.">/s");
263                $r = array("","","");
264                $r = preg_replace($p, $r, $c);
265        }
266        return(!empty($r) ? $r : false);
267}
268
269/**
270 * renvoie les infos du plugin contenues dans les metas
271 * qui contient 'dir' et 'version'
272 */
273function spiplistes_get_meta_infos ($prefix) {
274        if(isset($GLOBALS['meta']['plugin'])) {
275                $result = unserialize($GLOBALS['meta']['plugin']);
276                $prefix = strtoupper($prefix);
277                if(isset($result[$prefix])) {
278                        return($result[$prefix]);
279                }
280        }
281        return(false);
282}
283
284/**
285 * renvoie le dir du plugin present dans les metas
286 */
287function spiplistes_get_meta_dir($prefix) {
288        $result = false;
289        $info = spiplistes_get_meta_infos($prefix);
290        if(isset($info['dir'])) {
291                $result = $info['dir'];
292        }
293        return($result);
294}
295
296/**
297 * @return la version_base en cours
298 * doc: voir inc/plugin.php sur version_base (plugin.xml)
299 * qui s'appelle base_version en spip_meta %-}
300 */
301function spiplistes_current_version_base_get ($prefix) {
302        global $meta;
303        if(!($vb = $meta[$prefix."_base_version"])) {
304                $vb = spiplistes_real_version_base_get ($prefix);
305        }
306        return($vb);
307}
308
309/**
310 * Message erreur sql sur le journal du plugin
311 * @return bool TRUE
312 */
313function spiplistes_sqlerror_log ($trace = '') {
314        if($trace) $trace = " ($trace) ";
315        spiplistes_log('DB ERROR'.$trace.': [' . sql_errno() . '] ' . sql_error());
316        return(true);
317}
318
319// CP-20090111. log pour les apis
320function spiplistes_log_api ($msg) {
321        static $ii;
322        if($ii === null) {
323                $ii = $GLOBALS['auteur_session']['id_auteur'];
324                $ii = $ii ? "id_auteur #".$ii : "himself";
325        };
326        spiplistes_log("API: $msg by $ii");
327        return(true);
328}
329
330// CP-20090111: adresse mail de l'expediteur par defaut
331function spiplistes_email_from_default () {
332        static $default;
333        if(!$default) {
334                if(
335                        // prendre d'abord celui par defaut de SPIP-Listes
336                        ($result = email_valide($ii = trim($GLOBALS['meta']['email_defaut'])))
337                        // sinon celui du webmaster
338                        || ($result = email_valide($ii = trim($GLOBALS['meta']['email_webmaster'])))
339                ) {
340                        if($result == $ii) {
341                                //$nom = extraire_multi($GLOBALS['meta']['nom_site']);
342                                //$nom = unicode2charset(charset2unicode($nom),$GLOBALS['meta']['spiplistes_charset_envoi']);
343                                //$result = "\"$nom\" <$ii>";
344                        }
345                }
346                else {
347                        spiplistes_log('ERROR: sender email address missing');
348                }
349        }
350        return($result);
351}
352
353// PHP 4 ?
354if(!function_exists('array_combine')) {
355        function array_combine ($keys, $values) {
356                if(is_array($keys) && is_array($values) && (count($keys) == count($values))) {
357                        $keys = array_values($keys);
358                        $values = array_values($values);
359                        $result = array();
360                        foreach($keys as $key => $value) {
361                                $result[$value] = $values[$key];
362                        }
363                }
364                return($result);
365        }
366}
367
368// !(PHP 4 >= 4.3.0, PHP 5)
369if(!function_exists('html_entity_decode')) {
370        function html_entity_decode ($string, $quote_style = '', $charset = '')
371        {
372                // Remplace les entites numeriques
373                $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
374                $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
375                // Remplace les entites
376                $trans_tbl = get_html_translation_table (HTML_ENTITIES);
377                $trans_tbl = array_flip ($trans_tbl);
378                return strtr ($string, $trans_tbl);
379        }
380}
381
382/**
383 * complete caracteres manquants dans HTML -> ISO
384 * @param $texte le texte a transcrire
385 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
386 * @param $is_html flag. Pour ne pas transcrire completement la version html
387 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
388 * @see http://www.w3.org/TR/html401/sgml/entities.html
389 * @return string la chaine transcrite
390 */
391function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false)
392{
393        $texte = charset2unicode($texte);
394       
395        $texte = unicode2charset($texte, $charset);
396       
397        if ($is_html) {
398                $texte = spiplistes_html_entity_decode ($texte, $charset);
399        }
400        if($charset != 'utf-8') {
401                $texte = spiplistes_iso2ascii ($texte, $is_html);               
402        }
403        return($texte);
404}
405
406function spiplistes_iso2ascii ($texte, $is_html = false) {
407        $remplacements = array(
408                '&#8217;' => "'"        // quote
409                , '&#8220;' => '"' // guillemets
410                , '&#8221;' => '"' // guillemets
411                )
412                ;
413        if(!$is_html) {
414                $remplacements = array_merge(
415                        $remplacements
416                        , array(
417                                                // Latin Extended
418                                  '&#255;' => chr(255) // 'ÿ' // yuml inconnu php ?
419                                , '&#338;' => 'OE'  // OElig
420                                , '&#339;' => 'oe'  // oelig
421                                , '&#352;' => 'S'  // Scaron
422                                , '&#353;' => 's'  // scaron
423                                , '&#376;' => 'Y'  // Yuml
424                                        // General Punctuation
425                                , '&#8194;' => ' ' // ensp
426                                , '&#8195;' => ' ' // emsp
427                                , '&#8201;' => ' ' // thinsp
428                                , '&#8204;' => ' ' // zwnj
429                                , '&#8205;' => ' ' // zwj
430                                , '&#8206;' => ' ' // lrm
431                                , '&#8207;' => ' ' // rlm
432                                , '&#8211;' => '-' // ndash
433                                , '&#8212;' => '--' // mdash
434                                , '&#39;' => "'" // apos
435                                , '&#8216;' => "'" // lsquo
436                                , '&#8217;' => "'" // rsquo
437                                , '&#8218;' => "'" // sbquo
438                                , '&#8220;' => '"' // ldquo
439                                , '&#8221;' => '"' // rdquo
440                                , '&#8222;' => '"' // bdquo
441                                , '&#8224;' => '+' // dagger
442                                , '&#8225;' => '++' // Dagger
443                                , '&#8240;' => '0/00' // permil
444                                , '&#8249;' => '.' // lsaquo
445                                , '&#8250;' => '.' // rsaquo
446                                        // sans oublier
447                                , '&#8364;' => 'euros'  // euro
448                        )
449                );
450        }
451        $texte = strtr($texte, $remplacements);
452       
453        return ($texte);
454}
455
456/**
457 * Extension de html_entity_decode()
458 * pour transposer les entites HTML étendues (UTF)
459 * @return string
460 */
461function spiplistes_html_entity_decode ($texte, $charset = _SPIPLISTES_CHARSET_ENVOI)
462{
463        $charset = strtoupper ($charset);
464        $texte = html_entity_decode ($texte, ENT_QUOTES, $charset);
465        return ($texte);
466}
467
468// http://fr.php.net/html_entity_decode
469        // thank to: laurynas dot butkus at gmail dot com
470function spiplistes_html_entity_decode_utf8 ($string)
471{
472         static $trans_tbl;
473       
474         // replace numeric entities
475         $string = preg_replace('~&#x([0-9a-f]+);~ei', 'spiplistes_code2utf(hexdec("\\1"))', $string);
476         $string = preg_replace('~&#([0-9]+);~e', 'spiplistes_code2utf(\\1)', $string);
477
478         // replace literal entities
479         if (!isset($trans_tbl))
480         {
481                  $trans_tbl = array();
482                 
483                  foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
484                                $trans_tbl[$key] = utf8_encode($val);
485         }
486       
487         return strtr($string, $trans_tbl);
488} // spiplistes_html_entity_decode_utf8()
489
490
491// Returns the utf string corresponding to the unicode value (from php.net, courtesy - romans@void.lv)
492// thank to: akniep at rayo dot info
493function spiplistes_code2utf($number)  {
494        static $windows_illegals_chars;
495        if($windows_illegals_chars === null) {
496                $windows_illegals_chars = array(
497                        128 => 8364
498            , 129 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
499            , 130 => 8218
500            , 131 => 402
501            , 132 => 8222
502            , 133 => 8230
503            , 134 => 8224
504            , 135 => 8225
505            , 136 => 710
506            , 137 => 8240
507            , 138 => 352
508            , 139 => 8249
509            , 140 => 338
510            , 141 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
511            , 142 => 381
512            , 143 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
513            , 144 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
514            , 145 => 8216
515            , 146 => 8217
516            , 147 => 8220
517            , 148 => 8221
518            , 149 => 8226
519            , 150 => 8211
520            , 151 => 8212
521            , 152 => 732
522            , 153 => 8482
523            , 154 => 353
524            , 155 => 8250
525            , 156 => 339
526            , 157 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
527            , 158 => 382
528            , 159 => 376
529                );
530        }
531       
532    if ($number < 0)
533        return FALSE;
534    if ($number < 128)
535        return chr($number);
536    // Removing / Replacing Windows Illegals Characters
537    if ($number < 160) {
538        $number = $windows_illegals_chars[$number];
539    }
540   
541    if ($number < 2048)
542        return chr(($number >> 6) + 192) . chr(($number & 63) + 128);
543    if ($number < 65536)
544        return chr(($number >> 12) + 224) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
545    if ($number < 2097152)
546        return chr(($number >> 18) + 240) . chr((($number >> 12) & 63) + 128) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
547   
548    return (false);
549} //spiplistes_code2utf()
550
551/**
552 * CP-20110320
553 * Version liens_absolus compatible DATA URL SHEME
554 * @return string
555 */
556function spiplistes_liens_absolus ($texte, $base='') {
557       
558        static $url_sheme = 'data:image/png;base64';
559        static $hide_sheme = '<__HIDEME__ ';
560        $switch_me = false;
561       
562        if (preg_match_all(
563                // masque = tout
564                ',(?P<masque>'
565                // tag, 'img' uniquement
566                . '<(?P<tag>img)[[:space:]]+[^<>]*'
567                // src ? data url sheme ?
568                .'(?P<attr>src=["\']?'.$url_sheme.')'
569                // tout ce qui suit jusqu'au tag fermant
570                . '(?P<right>[^>]*>)),isS', 
571                $texte, $matches, PREG_SET_ORDER
572        )) {
573                foreach ($matches as $match) {
574                       
575                        $texte = str_replace(
576                                $match['masque']
577                                , $hide_sheme.$match['right']
578                                , $texte
579                                );
580                }
581                $switch_me = true;
582        }
583       
584        $texte = liens_absolus($texte, $base);
585       
586        if ($switch_me)
587        {
588                $texte = str_replace($hide_sheme, '<img src="'.$url_sheme, $texte);
589        }
590        return ($texte);
591}
592
Note: See TracBrowser for help on using the repository browser.