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

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

documentation code

  • Property svn:eol-style set to LF
  • Property svn:keywords set to LastChangedBy LastChangedDate LastChangedRevision
File size: 16.4 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: 47064 $
8 // $LastChangedBy: paladin@quesaco.org $
9 // $LastChangedDate: 2011-04-25 17:24:52 +0000 (Mon, 25 Apr 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
309function spiplistes_sqlerror_log ($trace = '') {
310        if($trace) $trace = " ($trace) ";
311        spiplistes_log('DB ERROR'.$trace.": [" . sql_errno() . "] " . sql_error());
312        return(true);
313}
314
315// CP-20090111. log pour les apis
316function spiplistes_log_api ($msg) {
317        static $ii;
318        if($ii === null) {
319                $ii = $GLOBALS['auteur_session']['id_auteur'];
320                $ii = $ii ? "id_auteur #".$ii : "himself";
321        };
322        spiplistes_log("API: $msg by $ii");
323        return(true);
324}
325
326// CP-20090111: adresse mail de l'expediteur par defaut
327function spiplistes_email_from_default () {
328        static $default;
329        if(!$default) {
330                if(
331                        // prendre d'abord celui par defaut de SPIP-Listes
332                        ($result = email_valide($ii = trim($GLOBALS['meta']['email_defaut'])))
333                        // sinon celui du webmaster
334                        || ($result = email_valide($ii = trim($GLOBALS['meta']['email_webmaster'])))
335                ) {
336                        if($result == $ii) {
337                                //$nom = extraire_multi($GLOBALS['meta']['nom_site']);
338                                //$nom = unicode2charset(charset2unicode($nom),$GLOBALS['meta']['spiplistes_charset_envoi']);
339                                //$result = "\"$nom\" <$ii>";
340                        }
341                }
342                else {
343                        spiplistes_log('ERROR: sender email address missing');
344                }
345        }
346        return($result);
347}
348
349// PHP 4 ?
350if(!function_exists('array_combine')) {
351        function array_combine ($keys, $values) {
352                if(is_array($keys) && is_array($values) && (count($keys) == count($values))) {
353                        $keys = array_values($keys);
354                        $values = array_values($values);
355                        $result = array();
356                        foreach($keys as $key => $value) {
357                                $result[$value] = $values[$key];
358                        }
359                }
360                return($result);
361        }
362}
363
364// !(PHP 4 >= 4.3.0, PHP 5)
365if(!function_exists('html_entity_decode')) {
366        function html_entity_decode ($string, $quote_style = '', $charset = '')
367        {
368                // Remplace les entites numeriques
369                $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
370                $string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
371                // Remplace les entites
372                $trans_tbl = get_html_translation_table (HTML_ENTITIES);
373                $trans_tbl = array_flip ($trans_tbl);
374                return strtr ($string, $trans_tbl);
375        }
376}
377
378/**
379 * complete caracteres manquants dans HTML -> ISO
380 * @return la chaine transcrite
381 * @param $texte le texte a transcrire
382 * @param $charset le charset souhaite'. Normalement 'iso-8859-1' (voir page de config)
383 * @param $is_html flag. Pour ne pas transcrire completement la version html
384 * @see http://fr.wikipedia.org/wiki/ISO_8859-1
385 * @see http://www.w3.org/TR/html401/sgml/entities.html
386 */
387function spiplistes_translate_2_charset ($texte, $charset='AUTO', $is_html = false)
388{
389        $texte = charset2unicode($texte);
390       
391        $texte = unicode2charset($texte, $charset);
392       
393        if ($is_html) {
394                $texte = spiplistes_html_entity_decode ($texte, $charset);
395        }
396        if($charset != 'utf-8') {
397                $texte = spiplistes_iso2ascii ($texte, $is_html);               
398        }
399        return($texte);
400}
401
402function spiplistes_iso2ascii ($texte, $is_html = false) {
403        $remplacements = array(
404                '&#8217;' => "'"        // quote
405                , '&#8220;' => '"' // guillemets
406                , '&#8221;' => '"' // guillemets
407                )
408                ;
409        if(!$is_html) {
410                $remplacements = array_merge(
411                        $remplacements
412                        , array(
413                                                // Latin Extended
414                                  '&#255;' => chr(255) // 'ÿ' // yuml inconnu php ?
415                                , '&#338;' => 'OE'  // OElig
416                                , '&#339;' => 'oe'  // oelig
417                                , '&#352;' => 'S'  // Scaron
418                                , '&#353;' => 's'  // scaron
419                                , '&#376;' => 'Y'  // Yuml
420                                        // General Punctuation
421                                , '&#8194;' => ' ' // ensp
422                                , '&#8195;' => ' ' // emsp
423                                , '&#8201;' => ' ' // thinsp
424                                , '&#8204;' => ' ' // zwnj
425                                , '&#8205;' => ' ' // zwj
426                                , '&#8206;' => ' ' // lrm
427                                , '&#8207;' => ' ' // rlm
428                                , '&#8211;' => '-' // ndash
429                                , '&#8212;' => '--' // mdash
430                                , '&#39;' => "'" // apos
431                                , '&#8216;' => "'" // lsquo
432                                , '&#8217;' => "'" // rsquo
433                                , '&#8218;' => "'" // sbquo
434                                , '&#8220;' => '"' // ldquo
435                                , '&#8221;' => '"' // rdquo
436                                , '&#8222;' => '"' // bdquo
437                                , '&#8224;' => '+' // dagger
438                                , '&#8225;' => '++' // Dagger
439                                , '&#8240;' => '0/00' // permil
440                                , '&#8249;' => '.' // lsaquo
441                                , '&#8250;' => '.' // rsaquo
442                                        // sans oublier
443                                , '&#8364;' => 'euros'  // euro
444                        )
445                );
446        }
447        $texte = strtr($texte, $remplacements);
448       
449        return ($texte);
450}
451
452/**
453 * Extension de html_entity_decode()
454 * pour transposer les entites HTML étendues (UTF)
455 * @return string
456 */
457function spiplistes_html_entity_decode ($texte, $charset = _SPIPLISTES_CHARSET_ENVOI)
458{
459        $charset = strtoupper ($charset);
460        $texte = html_entity_decode ($texte, ENT_QUOTES, $charset);
461        return ($texte);
462}
463
464// http://fr.php.net/html_entity_decode
465        // thank to: laurynas dot butkus at gmail dot com
466function spiplistes_html_entity_decode_utf8 ($string)
467{
468         static $trans_tbl;
469       
470         // replace numeric entities
471         $string = preg_replace('~&#x([0-9a-f]+);~ei', 'spiplistes_code2utf(hexdec("\\1"))', $string);
472         $string = preg_replace('~&#([0-9]+);~e', 'spiplistes_code2utf(\\1)', $string);
473
474         // replace literal entities
475         if (!isset($trans_tbl))
476         {
477                  $trans_tbl = array();
478                 
479                  foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
480                                $trans_tbl[$key] = utf8_encode($val);
481         }
482       
483         return strtr($string, $trans_tbl);
484} // spiplistes_html_entity_decode_utf8()
485
486
487// Returns the utf string corresponding to the unicode value (from php.net, courtesy - romans@void.lv)
488// thank to: akniep at rayo dot info
489function spiplistes_code2utf($number)  {
490        static $windows_illegals_chars;
491        if($windows_illegals_chars === null) {
492                $windows_illegals_chars = array(
493                        128 => 8364
494            , 129 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
495            , 130 => 8218
496            , 131 => 402
497            , 132 => 8222
498            , 133 => 8230
499            , 134 => 8224
500            , 135 => 8225
501            , 136 => 710
502            , 137 => 8240
503            , 138 => 352
504            , 139 => 8249
505            , 140 => 338
506            , 141 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
507            , 142 => 381
508            , 143 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
509            , 144 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
510            , 145 => 8216
511            , 146 => 8217
512            , 147 => 8220
513            , 148 => 8221
514            , 149 => 8226
515            , 150 => 8211
516            , 151 => 8212
517            , 152 => 732
518            , 153 => 8482
519            , 154 => 353
520            , 155 => 8250
521            , 156 => 339
522            , 157 => 160 // (Rayo:) #129 using no relevant sign, thus, mapped to the saved-space #160
523            , 158 => 382
524            , 159 => 376
525                );
526        }
527       
528    if ($number < 0)
529        return FALSE;
530    if ($number < 128)
531        return chr($number);
532    // Removing / Replacing Windows Illegals Characters
533    if ($number < 160) {
534        $number = $windows_illegals_chars[$number];
535    }
536   
537    if ($number < 2048)
538        return chr(($number >> 6) + 192) . chr(($number & 63) + 128);
539    if ($number < 65536)
540        return chr(($number >> 12) + 224) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
541    if ($number < 2097152)
542        return chr(($number >> 18) + 240) . chr((($number >> 12) & 63) + 128) . chr((($number >> 6) & 63) + 128) . chr(($number & 63) + 128);
543   
544    return (false);
545} //spiplistes_code2utf()
546
547/**
548 * CP-20110320
549 * Version liens_absolus compatible DATA URL SHEME
550 * @return string
551 */
552function spiplistes_liens_absolus ($texte, $base='') {
553       
554        static $url_sheme = 'data:image/png;base64';
555        static $hide_sheme = '<__HIDEME__ ';
556        $switch_me = false;
557       
558        if (preg_match_all(
559                // masque = tout
560                ',(?P<masque>'
561                // tag, 'img' uniquement
562                . '<(?P<tag>img)[[:space:]]+[^<>]*'
563                // src ? data url sheme ?
564                .'(?P<attr>src=["\']?'.$url_sheme.')'
565                // tout ce qui suit jusqu'au tag fermant
566                . '(?P<right>[^>]*>)),isS', 
567                $texte, $matches, PREG_SET_ORDER
568        )) {
569                foreach ($matches as $match) {
570                       
571                        $texte = str_replace(
572                                $match['masque']
573                                , $hide_sheme.$match['right']
574                                , $texte
575                                );
576                }
577                $switch_me = true;
578        }
579       
580        $texte = liens_absolus($texte, $base);
581       
582        if ($switch_me)
583        {
584                $texte = str_replace($hide_sheme, '<img src="'.$url_sheme, $texte);
585        }
586        return ($texte);
587}
588
Note: See TracBrowser for help on using the repository browser.