source: spip-zone/_plugins_/ressource/inc/ressource.php @ 107386

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

recuperer un blocks.org/blockbuilder *en iframe* (le cas normal est géré par autoembed)

File size: 21.9 KB
Line 
1<?php
2
3/*
4 * transforme un raccourci de ressource en un joli html a embed
5 *
6 *
7 */
8
9define('_EXTRAIRE_RESSOURCES', ',' . '<"?(https?://|[\w -]+\.[\w -]+).*>'.',UimsS');
10define('_RESSOURCE_VIGNETTE_LARGEUR_DEFAUT','small');
11define('_RESSOURCE_IMAGE_LARGEUR_DEFAUT', 'large');
12include_spip('inc/filtres_images_mini');
13
14/* pipeline pour typo */
15function ressource_post_typo($t) {
16        if (strpos($t, '<') !== false) {
17                $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t);
18        }
19        return $t;
20}
21
22/* pipeline pour propre */
23function ressource_pre_liens($t) {
24        if (strpos($t, '<') !== false) {
25                $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t);
26
27                // echapper les autoliens eventuellement inseres (en une seule fois)
28                if (strpos($t,"<html>")!==false)
29                        $t = echappe_html($t);
30        }
31        return $t;
32}
33
34function traiter_ressources($r) {
35        if ($ressource = charger_fonction('ressource', 'inc', true))
36                $html = $ressource($r[0]);
37        else
38                $html = htmlspecialchars($r[0]);
39
40        return '<html>'.$html.'</html>';
41}
42
43function inc_ressource_dist($r) {
44        // $r contient tout le texte définissant la ressource :
45        // <fichier.rtf option1 option2...>
46
47        // 1. phraser le raccourci
48        $attrs = phraser_tag('<res src='.substr($r,1));
49
50        # debug :)
51        $attrs['debug'] = $r;
52
53        // 2. keywords : right => align=right, etc
54        foreach(array(
55                'right' => 'align',
56                'left' => 'align',
57                'center' => 'align',
58        ) as $k => $v) {
59                if ($attrs[$k] == $k) {
60                        $attrs[$v] = $k;
61                        unset($attrs[$k]);
62                }
63        }
64
65        // 2. title => titre, description=>descriptif.... (TODO)
66
67        // 3. constituer les meta-donnees associees a $res[src]
68        $meta = ressource_meta($attrs);
69
70        // 4. traiter les parametres d'image / logo / vignette / resize
71        // supprimera le href si necessaire
72        $image = ressource_image($attrs, $meta);
73
74        $final = array_merge($meta, $attrs);
75
76        // renvoyer le html final
77        $final = array_merge($final, $image);
78
79        $html = embed_ressource($final);
80        return $html;
81}
82
83function ressource_meta($res) {
84        $meta = $res;
85
86        // on va beaucoup travailler avec l'attribut src
87        $src = $res['src'];
88
89        // identifier la ressource
90        // s'agit-il d'un fichier decrit dans la mediathèque,
91        // d'un fichier local, d'un oembed, d'un doc distant connu, etc ?
92
93        // ressource fichier.rtf => rtf/fichier.rtf
94        if (preg_match(',^[^/]+\.([^.]+)$,', $src, $r))
95                $fichier = $r[1].'/'.$r[0];
96        else
97                $fichier = $src;
98
99        // determiner temporairement l'extension de la ressource (ca pourra changer
100        // si on en fait une copie locale et qu'elle indique un autre type mime)
101        if (preg_match(',\.(\w+)([?#].*)?$,S', $src, $r)) {
102                $meta['extension'] = strtolower($r[1]);
103
104                if ($meta['extension'] == 'jpeg')
105                        $meta['extension'] = 'jpg';
106        }
107
108        # d'abord fouiller la mediatheque
109        include_spip('base/abstract_sql');
110        if ($s = sql_fetsel('*', 'spip_documents', 'fichier='.sql_quote($fichier))) {
111                $meta = $s;
112                $meta['href'] = get_spip_doc($s['fichier']);
113                $meta['local'] = copie_locale($meta['href'], 'test');
114        }
115
116        /* un lien github */
117        if (preg_match(",^https://(github\.com)/([^/]+/[^/]+)/blob/([^/]+)/(.*\.([^.?]+))([?].*)?$,",
118        $src, $r)) {
119
120                # 1. recuperer le repo, la branche et le chemin du fichier
121                $server = $r[1];
122                $repo = $r[2];
123                $branch = $r[3];
124                $file = $r[4];
125                $ext = str_replace('jpeg', 'jpg', $r[5]);
126                $qs = $r[6];
127
128                # 2. calculer l'url avec ?raw=true pour un access https
129                #    et l'url de la copie locale
130                $src = parametre_url($src, 'raw', 'true');
131                $local = _DIR_RACINE . nom_fichier_copie_locale($src, $ext);
132
133                # 3. regarder si on a un clone en local
134                if (defined('_DIR_RESSOURCE_GIT') && (_DIR_RESSOURCE_GIT !== false)) {
135
136                        $dir = _DIR_RESSOURCE_GIT . $server . '/' . $repo;
137                        if (is_dir($dir) && is_dir($dir.'/.git')) {
138                                $_dir = escapeshellarg($dir);
139                                $_branch = escapeshellarg($branch);
140
141                                try {
142                                        # 4. se mettre dans la branche et recuperer le fichier
143                                        $cmd = "cd $_dir && git checkout $_branch";
144                                        $b = trim(`$cmd`);
145                                        spip_log("$cmd: $b", 'distant');
146
147                                        # 5. si pas de fichier, ou demande de ?var_mode=images,
148                                        #    mettre à jour le repo
149                                        if (!file_exists($dir.'/'.$file)
150                                        || (_request('var_mode') == 'images' && autoriser('reload', 'images') && (filemtime($dir.'/.git/FETCH_HEAD') < time() - 60))
151                                        ) {
152                                                $cmd = "cd $_dir && git pull && git checkout $_branch";
153                                                $b = trim(`$cmd`);
154                                                spip_log("$cmd: $b", 'distant');
155
156                                                # 6. Si ca ne marche toujours pas on est déçu
157                                                #   on regarde si on a déjà une copie locale,
158                                                #   sinon on va quand même tenter un accès https
159                                                if (!file_exists($local)
160                                                and !file_exists($dir.'/'.$file)) {
161                                                        throw new Exception('github: pas de version locale, on essaiera par https');
162                                                }
163                                        }
164
165                                        if (file_exists($dir.'/'.$file)
166                                        and ( !file_exists($local)
167                                                OR filemtime($local) < filemtime($dir.'/'.$file) )
168                                        ) {
169                                                @copy($dir.'/'.$file, $local);
170                                        }
171                                        $fichier = $src = $local;
172                                        $meta['local'] = $fichier;
173                                        $meta['href'] = $fichier;
174                                }
175                                catch (Exception $e) {
176                                        spip_log($e, 'distant');
177                                }
178                        }
179                }
180        }
181        /* fin github */
182
183        if (preg_match(',^https?://,', $src)) {
184
185                /* un document dropbox : remplacer www par dl */
186                $src = preg_replace(",^(https://)(www)(\.dropbox\.com/.*/.*/.*)$,",
187                        '\1dl\3', $src);
188
189                $meta['href'] = $src;
190
191                /* pipeline ! */
192                /* exemple : traitement par autoembed */
193                include_spip('autoembed/autoembed');
194                if (function_exists('embed_url')
195                AND $u = embed_url($src)) {
196                        $meta['embed'] = $u;
197                }
198
199                /* autre exemple de traitement avec oembed */
200                include_spip('oembed_fonctions');
201                if (function_exists('oembed')
202                        AND $u = oembed($src)
203                        AND $u != $src) 
204                {
205                        $meta['embed'] = $u;
206                }
207
208                /* recuperer un album flickr */
209                if (preg_match(',^https?://(www\.)?flickr\.com/.*/sets/(\d+),', $src, $r)) {
210                        $meta['album'] = $r[2];
211                        if (strlen($class = array_shift(explode(' ', $meta['class'])))
212                        AND $f = 'modeles/album_flickr'.'.'.$class
213                        AND find_in_path($f.'.html')
214                        AND $html = recuperer_fond($f, $meta)) {
215                                $meta['embed'] = $html;
216                        } else
217                       
218                        if ($html = recuperer_fond('modeles/album_flickr', $meta)) {
219                                $meta['embed'] = $html;
220                                unset($meta['title']); // title utilise par l'embed
221                        }
222                }
223               
224                // recuperer un blocks.org/blockbuilder *en iframe*
225                // (le cas normal est géré par autoembed)
226                else if (preg_match("/^https?\:\/\/(bl\.ocks|blockbuilder)\.org\/(\w+\/\w+)(\/\w+)?/i", $src, $regs)
227                AND $meta['iframe'] == 'iframe') {
228                        $meta['embed'] = "<iframe>";
229                        $meta['embed'] = inserer_attribut($meta['embed'], 'src', "https://cdn.rawgit.com/" . $regs[2] . "/raw" . $regs[3] . "/");
230                        $meta['embed'] = inserer_attribut($meta['embed'], 'style', "width:100%;height:70vw;border:0;" . $meta['style']);
231                        if ($meta['class']) $meta['embed'] = inserer_attribut($meta['embed'], 'class', $meta['class']);
232                        $meta['embed'] .=  sinon($meta['embed'], $src) . "</iframe>";
233                }
234
235
236                $meta = pipeline('ressource_meta',
237                        array(
238                                'args' => $res,
239                                'data' => $meta
240                        )
241                );
242               
243                /* chargement distant */
244                if (!isset($meta['html'])) {
245                        include_spip('inc/distant');
246                        if (!$local = copie_locale($src, 'test')
247                        AND !in_array($meta['extension'], array('mp3'))
248                        ) {
249                                include_spip('inc/queue');
250                                queue_add_job('copie_locale', 'copier', array($src), $file = 'inc/distant', $no_duplicate = true, $time=0, $priority=0);
251                        }
252                        if ($local = copie_locale($src, 'test')) {
253                                $meta['local'] = $local;
254                        }
255                }
256
257        }
258        // fichier dans IMG/ ?
259        else if (preg_match(',^[^/]+\.([^.]+)$,', $src, $r)
260        AND $h = _DIR_IMG.$r[1].'/'.$r[0]
261        AND @file_exists($h)
262        ) {
263                $meta['local'] = $h;
264                $meta['href'] = $h;
265        }
266
267        ##### tests pour le plugin OPUS :
268        ##### <image.jpg> correspond à opus/[article]/image.jpg
269        else if ($r
270        AND isset($GLOBALS['contexte'])
271        AND isset($GLOBALS['contexte']['id_article'])
272        AND $q = sql_fetsel('url_site', 'spip_articles', 'id_article='.sql_quote($GLOBALS['contexte']['id_article']))
273        AND $opus = $q['url_site']
274        AND $h = _DIR_RACINE.$opus.'/'.$r[0]
275        AND file_exists($h)) {
276                $meta['local'] = $h;
277                $meta['href'] = $h;
278                $meta['logodocument'] = $h;
279        }
280        ####
281
282        // si on l'a, renseigner ce qu'on peut dire du fichier
283        if (isset($meta['local'])
284        AND @file_exists($meta['local'])) {
285                $meta['extension'] = strtolower(preg_replace(',^.*\.,', '', $meta['local']));
286                $meta['taille'] = @filesize($meta['local']);
287                if ($r = getimagesize($meta['local'])) {
288                        // donnees brutes du fichier
289                        $meta['width'] = $r[0];
290                        $meta['height'] = $r[1];
291                        $meta['largeur'] = $meta['width'];
292                        $meta['hauteur'] = $meta['height'];
293                }
294
295                if ($meta['extension'] == 'html') {
296                        // choper ce qu'on peut du html
297                        ressource_html($meta);
298                }
299
300                // extraire ses donnees !
301                if (!isset($meta['extract'])
302                AND $u = ressource_extract($meta)) {
303                        $meta['fullextract'] = $u;
304                        $meta['extract'] = propre(couper($u, 500));
305                }
306        }
307
308        // recupere le type mime de la ressource
309        if (isset($meta['extension']))
310                $meta['type_document'] = ressource_mime($meta['extension']);
311
312        // demander le reload du contenu (?var_mode=images)
313        if (_request('var_mode') == 'images'
314        && preg_match(',^https?://,', $src)
315        && autoriser('reload', 'distant')) {
316                include_spip('inc/queue');
317                queue_add_job('copie_locale', 'copier', array($src, 'force'), $file = 'inc/distant', $no_duplicate = true, $time=1, $priority=0);
318        }
319
320        return $meta;
321}
322
323// choper les trucs du genre meta opengraph ; meta description etc
324function ressource_html(&$meta) {
325
326        include_spip('fonctionsale');
327        if (function_exists('sale')) {
328                $u = sale(spip_file_get_contents($meta['local']));
329
330                $meta['fullextract'] = $u;
331                $meta['extract'] = propre(couper($u, 500));
332        }
333}
334
335function ressource_mime($e) {
336        global $tables_images, $tables_sequences, $tables_documents, $tables_mime, $mime_alias;
337        include_spip('base/typedoc');
338
339
340        $mime = $tables_mime[$e];
341        if (!$t = $tables_documents[$e]
342        AND !$t = $tables_images[$e]
343        AND !$t = $tables_sequences[$e])
344                $t = $e;
345
346        return $t;
347
348}
349
350/*
351 * recoit une chaine
352 * renvoie un array
353 * les valeurs par defaut sont mappees
354 * inspire de http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/
355 */
356function phraser_tag($rr) {
357        $attribute_pattern =
358        '@
359        (
360        (?P<name>[-\w]+)                         # attribute name
361        \s*=\s*
362        (
363            (?P<quote>[\"\'])(?P<value_quoted>.*?)(?P=quote)    # a quoted value
364            |                      # or
365            (?P<value_unquoted>[^\s"\']+?)(?:\s+)          # an unquoted value
366        )
367        |(?P<auto>[-\w]+)
368        )
369        @xsiS';
370
371        // d'abord eliminer le type du tag et l'eventuelle fermeture auto
372        $res = array();
373        $rr = preg_replace(',^<[:\w]+\s+,S', '', $rr);
374        $rr = preg_replace(',\s*/?'.'>$,S', ' ', $rr);
375
376        // ensuite parser le reste des attributs
377        preg_match_all($attribute_pattern, $rr, $z, PREG_SET_ORDER);
378
379        foreach($z as $t) {
380                if (isset($t['auto'])) {
381                        if (is_numeric($t['auto'])) # 200
382                                $res['width'] = $t['auto'];
383                        elseif (preg_match(',^\d+x\d+$,', $t['auto'])) # 200x300
384                                $res['geometry'] = $t['auto'];
385                        else
386                                $res[$t['auto']] = $t['auto'];
387                }
388                elseif (isset($t['value_unquoted'])) {
389                        $res[$t['name']] = $t['value_unquoted'];
390                }
391                elseif (isset($t['value_quoted'])) {
392                        $res[$t['name']] = $t['value_quoted'];
393                }
394        }
395
396        return $res;
397}
398
399function embed_ressource($res) {
400        // si la ressource a un embed, charger le modele ressource_embed
401        // qui l'encapsule dans un <figure>, ajoute eventuellement une légende etc.
402        if (isset($res['embed'])) {
403                if (!isset($res['width'])
404                AND $w = extraire_attribut($res['embed'], 'width'))
405                        $res['width'] = $w;
406                if (!isset($res['height'])
407                AND $h = extraire_attribut($res['embed'], 'height'))
408                        $res['height'] = $h;
409                return recuperer_fond('modeles/ressource_embed', $res);
410        }
411
412        // si la ressource est un document, renvoyer <doc1>
413        if (isset($res['id_document'])) {
414#               return recuperer_fond('modeles/doc', $res);
415        }
416
417        if ($res['type_document'] == 'PDF') {
418                return
419                        recuperer_fond('modeles/application', $res);
420        }
421
422        return
423#               "<pre>".var_export($res,true)."</pre>" .
424                recuperer_fond('modeles/ressource', $res);
425}
426
427/* ici c'est flou… */
428function ressource_image($attrs, $meta) {
429        $image = array();
430
431        // creer une vignette pour le doc ; si une largeur est exigee,
432        // adapter la taille.
433        if ($attrs['largeur'] OR $attrs['hauteur']) {
434                $resize = true;
435        }
436        // size
437        else {
438                if (!$attrs['size']) {
439                        if ($attrs['image']) # ???? c'est quoi ? le mode ?
440                                $attrs['size'] = _RESSOURCE_VIGNETTE_LARGEUR_DEFAUT;
441                        else
442                                $attrs['size'] = _RESSOURCE_IMAGE_LARGEUR_DEFAUT;
443                }
444
445                if (in_array($meta['extension'], array('gif', 'png', 'jpg'))
446                AND strlen($b = image_stdsize($meta, $attrs))) {
447                        $a = $b;
448                        $resize = true;
449                }
450        }
451
452        // Verifier d'abord si le parametre 'icon' force l'icon
453# todo : icone => icon
454        if ($attrs['icon']) {
455                $f = charger_fonction('vignette','inc');
456                $img = $f($meta['extension'], false);
457                if ($resize)
458                        $a = filtrer('image_reduire', $img, $attrs['largeur'] ? $attrs['largeur'] : -1, $attrs['hauteur'] ? $attrs['hauteur'] : -1);
459                else
460                        $a = '<img src="'.$img.'" />';
461
462        }
463        // methode normale : reduire l'image si possible, sinon icon
464        else {
465                if (!$a) {
466                        $w = sinon($attrs['largeur'],500);
467                        $h = sinon($attrs['hauteur'],700);
468                        $a = vignette_automatique($meta['id_vignette'], $meta,
469                                '' /*url*/, $w, $h, null /* align */);
470                }
471        }
472
473        if ($a) $image['logodocument'] = $a;
474
475        // experimental : DEST
476        // TODO: parametre à mieux nommer ?
477        // parametre |dest=800 pour reduire l'image LIEE a 800px max
478        if ($attrs['dest']) {
479                $tmp = filtrer('image_reduire', $meta['local'], $attrs['dest']);
480                if ($tmp = extraire_attribut($tmp, 'src'))
481                        $image['href'] = $tmp;
482        }
483
484        return $image;
485}
486
487
488
489
490# s t m d z b o
491function image_stdsize($meta, $attrs) {
492
493        $s = $attrs['size'];
494        if (isset($meta['local']))
495                $img = $meta['local'];
496        else
497                $img = $attrs['src'];
498
499        # intercepter les URLs flickr pour choper les jolies reductions
500        if (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[zbo])?\.jpg$,', $img, $r)) {
501                if (in_array($s, array('s', 't', 'm', 'z', 'b') )){
502                        $img = $r[1].'_'.$s.'.jpg';
503                        return '<img src="'.$img.'" />';
504                }
505                if (in_array($s, array('d'))) {
506                        $img = $r[1].'.jpg';
507                        return '<img src="'.$img.'" />';
508                }
509        }
510        elseif (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[k])?\.jpg$,', $img, $r)) {
511                if (in_array($s, array('k') )){
512                        $img = $r[1].'_'.$s.'.jpg';
513                        return '<img src="'.$img.'" />';
514                }
515                if (in_array($s, array('d'))) {
516                        $img = $r[1].'.jpg';
517                        return '<img src="'.$img.'" />';
518                }
519        }
520        elseif (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[h])?\.jpg$,', $img, $r)) {
521                if (in_array($s, array('h') )){
522                        $img = $r[1].'_'.$s.'.jpg';
523                        return '<img src="'.$img.'" />';
524                }
525                if (in_array($s, array('d'))) {
526                        $img = $r[1].'.jpg';
527                        return '<img src="'.$img.'" />';
528                }
529        }
530
531        // IMG/jpg/truc.jpg depuis l'espace prive
532        if (_DIR_RACINE
533        AND substr(_DIR_RACINE.$img, 0, strlen(_DIR_IMG)) == _DIR_IMG)
534                $img = _DIR_RACINE.$img;
535
536        if (!is_numeric($s)) {
537        switch($s) {
538                case 'sq':
539                case 'square':
540                        # la c'est dur
541                        $d = 75;
542                        $img = filtrer('image_passe_partout', $img, $d, $d);
543                        $img = filtrer('image_recadre', $img, $d, $d);
544                        break;
545                case 't':
546                case 'thumb':
547                case 'thumbnail':
548                        $a = 100;
549                        break;
550                case 'm':
551                case 's':
552                case 'small':
553                        $a = 240;
554                        break;
555                case 'z':
556                case 'medium640':
557                        $a = 640;
558                        break;
559                case 'b':
560                case 'large':
561                        $a = 1024;
562                        break;
563                // xl = 'k' chez flickr (2048px)
564                case 'k':
565                case 'xl':
566                case 'extra':
567                case 'extralarge':
568                        $a = 2048;
569                        break;
570                case 'o':
571                case 'original':
572                        $a = 10000000;
573                        break;
574                case '-':
575                case '':
576                case 'd':
577                case 'default':
578                default:
579                        $a = 500;
580                        break;
581        }
582        }
583
584        if ($a)
585                $img = filtrer('image_reduire', $img, $a);
586        else if (is_numeric($s))
587                $img = filtrer('image_reduire', $img, $s);
588
589        return $img;
590}
591
592
593
594function ressource_extract($meta) {
595        /*
596
597        global $extracteur;
598
599        $extension = $meta['extension'];
600
601        include_spip('extract/'.$extension);
602        if (function_exists($lire = $extracteur[$extension])) {
603                $charset = 'iso-8859-1';
604                $contenu = $lire($meta['local'], $charset);
605                var_dump($lire, $contenu);
606        }
607        */
608
609        switch($meta['extension']) {
610                case 'html':
611                case 'doc':
612                case 'docx':
613                case 'rtf':
614                case 'odt':
615                        $conv = converthtml($meta['local'], $err);
616                        include_spip('fonctionsale');
617                        if (function_exists('sale')) {
618                                $conv = sale($conv);
619                        }
620                        break;
621                default:
622                        break;
623        }
624
625        return $conv;
626}
627
628/**
629* Multiple Curl Handlers
630* @author Jorge Hebrard ( jorge.hebrard@gmail.com )
631**/
632class curlNode{
633    static private $listenerList;
634    private $callback;
635    public function __construct($url){
636        $new =& self::$listenerList[];
637        $new['url'] = $url;
638        $this->callback =& $new;
639    }
640    /**
641    * Callbacks needs 3 parameters: $url, $html (data of the url), and $lag (execution time)
642    **/
643    public function addListener($callback){
644        $this->callback['callback'] = $callback;
645    }
646    /**
647    * curl_setopt() wrapper. Enjoy!
648    **/
649    public function setOpt($key,$value){
650        $this->callback['opt'][$key] = $value;
651    }
652    /**
653    * Request all the created curlNode objects, and invoke associated callbacks.
654    **/
655    static public function request(){
656   
657        //create the multiple cURL handle
658        $mh = curl_multi_init();
659       
660        $running=null;
661       
662        # Setup all curl handles
663        # Loop through each created curlNode object.
664        foreach(self::$listenerList as &$listener){
665            $url = $listener['url'];
666            $current =& $ch[];
667           
668            # Init curl and set default options.
669            # This can be improved by creating
670            $current = curl_init();
671
672            curl_setopt($current, CURLOPT_URL, $url);
673            # Since we don't want to display multiple pages in a single php file, do we?
674            curl_setopt($current, CURLOPT_HEADER, 0);
675            curl_setopt($current, CURLOPT_RETURNTRANSFER, 1);
676           
677            # Set defined options, set through curlNode->setOpt();
678            if (isset($listener['opt'])){
679                foreach($listener['opt'] as $key => $value){
680                    curl_setopt($current, $key, $value);
681                }
682            }
683           
684            curl_multi_add_handle($mh,$current);
685           
686            $listener['handle'] = $current;
687            $listener['start'] = microtime(1);
688        } unset($listener);
689
690        # Main loop execution
691        do {
692            # Exec until there's no more data in this iteration.
693            # This function has a bug, it
694            while(($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
695            if($execrun != CURLM_OK) break; # This should never happen. Optional line.
696           
697            # Get information about the handle that just finished the work.
698            while($done = curl_multi_info_read($mh)) {
699                # Call the associated listener
700                foreach(self::$listenerList as $listener){
701                    # Strict compare handles.
702                    if ($listener['handle'] === $done['handle']) {
703                        # Get content
704                        $html = curl_multi_getcontent($done['handle']);
705                        # Call the callback.
706                        call_user_func($listener['callback'],
707                        $listener['url'],
708                        $html,(microtime(1)-$listener['start']));
709                        # Remove unnecesary handle (optional, script works without it).
710                        curl_multi_remove_handle($mh, $done['handle']);
711                    }
712                }
713               
714            }
715            # Required, or else we would end up with a endless loop.
716            # Without it, even when the connections are over, this script keeps running.
717            if (!$running) break;
718           
719            # I don't know what these lines do, but they are required for the script to work.
720            while (($res = curl_multi_select($mh)) === 0);
721            if ($res === false) break; # Select error, should never happen.
722        } while (true);
723
724        # Finish out our script ;)
725        curl_multi_close($mh);
726   
727    }
728}
729
730function converthtml($f, $err) {
731        define('_CONVERT_URL', 'http://office.rezo.net/office/v1/?email=fil@rezo.net&key=1223649b375bb98e1b57141f96643cd47a3029c3');
732
733        $signature = md5_file($f);
734
735        // 1. a-t-on le fichier en local
736        $html = sous_repertoire(_DIR_TMP,'converthtml').$signature.'.html';
737        if (file_exists($html))
738                return spip_file_get_contents($html);
739
740        // 2. sinon le chercher sur le serveur office.rezo
741        if (!defined('_CONVERT_URL'))
742                return false;
743
744        $url = parametre_url(_CONVERT_URL, 'signature', $signature, '&');
745
746        include_spip('inc/queue');
747        queue_add_job('convert_html_fetch', 'convert_html_fetch('.$f.')', array($url, $f, $html), $file = 'inc/ressource', $no_duplicate = true, $time=0, $priority=0);
748        #convert_html_fetch($url, $f);
749
750        return '';
751}
752
753function convert_html_fetch($url, $f, $html=null) {
754        if (!$html) return;
755        include_spip('inc/distant');
756        if ($rep = recuperer_page($url)
757        AND $rep = json_decode($rep)
758        AND isset($rep->content)) {
759                ecrire_fichier($html, $rep->content);
760                return;
761        }
762       
763
764        // 3. si 404, l'envoyer au serveur
765        #include_spip('inc/queue');
766        #queue_add_job('convert_html_send', 'convert_html_send('.$f.')', array($url, $f), $file = 'inc/ressource', $no_duplicate = true, $time=0, $priority=0);
767        convert_html_send($url, $f);
768
769}
770
771function convert_html_send($url, $f) {
772        include_spip('inc/filtres');
773        spip_log('curl @'.$f.' '.$url.' ('.taille_en_octets(filesize($f)).')');
774        $data = array('file' => '@'.$f);
775        $ch = curl_init();
776        curl_setopt($ch, CURLOPT_VERBOSE, 1);
777        curl_setopt($ch, CURLOPT_URL, $url);
778        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
779        curl_setopt($ch, CURLOPT_POST, true);
780        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
781        $n = curl_exec($ch);
782        spip_log($n);
783        curl_close($ch);
784}
785
786
787function xconverthtml($f, &$err) {
788
789
790        $k = escapeshellarg($f);
791
792        exec("/usr/bin/textutil -convert html -stdout -noload -nostore $k", $ret, $err);
793
794        if ($err) {
795                spip_log($err);
796        } else {
797                $ret = join($ret, "\n");
798                // les notes de bas de page word sont parfois transformees en truc chelou
799                $ret = str_replace('<span class="Apple-converted-space"> </span>', '~', $ret);
800                return nettoyer_utf8($ret);
801        }
802}
803
804function nettoyer_utf8($t) {
805        if (!preg_match('!\S!u', $t))
806                $t = preg_replace_callback(',&#x([0-9a-f]+);,i', 'utf8_do', utf8_encode(utf8_decode($t)));
807        return $t;
808}
809
Note: See TracBrowser for help on using the repository browser.