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

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

inclure inc/filtres_images_mini pour avoir image_reduire

File size: 21.3 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                $meta = pipeline('ressource_meta',
225                        array(
226                                'args' => $res,
227                                'data' => $meta
228                        )
229                );
230               
231                /* chargement distant */
232                if (!isset($meta['html'])) {
233                        include_spip('inc/distant');
234                        if (!$local = copie_locale($src, 'test')
235                        AND !in_array($meta['extension'], array('mp3'))
236                        ) {
237                                include_spip('inc/queue');
238                                queue_add_job('copie_locale', 'copier', array($src), $file = 'inc/distant', $no_duplicate = true, $time=0, $priority=0);
239                        }
240                        if ($local = copie_locale($src, 'test')) {
241                                $meta['local'] = $local;
242                        }
243                }
244
245        }
246        // fichier dans IMG/ ?
247        else if (preg_match(',^[^/]+\.([^.]+)$,', $src, $r)
248        AND $h = _DIR_IMG.$r[1].'/'.$r[0]
249        AND @file_exists($h)
250        ) {
251                $meta['local'] = $h;
252                $meta['href'] = $h;
253        }
254
255        ##### tests pour le plugin OPUS :
256        ##### <image.jpg> correspond à opus/[article]/image.jpg
257        else if ($r
258        AND isset($GLOBALS['contexte'])
259        AND isset($GLOBALS['contexte']['id_article'])
260        AND $q = sql_fetsel('url_site', 'spip_articles', 'id_article='.sql_quote($GLOBALS['contexte']['id_article']))
261        AND $opus = $q['url_site']
262        AND $h = _DIR_RACINE.$opus.'/'.$r[0]
263        AND file_exists($h)) {
264                $meta['local'] = $h;
265                $meta['href'] = $h;
266                $meta['logodocument'] = $h;
267        }
268        ####
269
270        // si on l'a, renseigner ce qu'on peut dire du fichier
271        if (isset($meta['local'])
272        AND @file_exists($meta['local'])) {
273                $meta['extension'] = strtolower(preg_replace(',^.*\.,', '', $meta['local']));
274                $meta['taille'] = @filesize($meta['local']);
275                if ($r = getimagesize($meta['local'])) {
276                        // donnees brutes du fichier
277                        $meta['width'] = $r[0];
278                        $meta['height'] = $r[1];
279                        $meta['largeur'] = $meta['width'];
280                        $meta['hauteur'] = $meta['height'];
281                }
282
283                if ($meta['extension'] == 'html') {
284                        // choper ce qu'on peut du html
285                        ressource_html($meta);
286                }
287
288                // extraire ses donnees !
289                if (!isset($meta['extract'])
290                AND $u = ressource_extract($meta)) {
291                        $meta['fullextract'] = $u;
292                        $meta['extract'] = propre(couper($u, 500));
293                }
294        }
295
296        // recupere le type mime de la ressource
297        if (isset($meta['extension']))
298                $meta['type_document'] = ressource_mime($meta['extension']);
299
300        // demander le reload du contenu (?var_mode=images)
301        if (_request('var_mode') == 'images'
302        && preg_match(',^https?://,', $src)
303        && autoriser('reload', 'distant')) {
304                include_spip('inc/queue');
305                queue_add_job('copie_locale', 'copier', array($src, 'force'), $file = 'inc/distant', $no_duplicate = true, $time=1, $priority=0);
306        }
307
308        return $meta;
309}
310
311// choper les trucs du genre meta opengraph ; meta description etc
312function ressource_html(&$meta) {
313
314        include_spip('fonctionsale');
315        if (function_exists('sale')) {
316                $u = sale(spip_file_get_contents($meta['local']));
317
318                $meta['fullextract'] = $u;
319                $meta['extract'] = propre(couper($u, 500));
320        }
321}
322
323function ressource_mime($e) {
324        global $tables_images, $tables_sequences, $tables_documents, $tables_mime, $mime_alias;
325        include_spip('base/typedoc');
326
327
328        $mime = $tables_mime[$e];
329        if (!$t = $tables_documents[$e]
330        AND !$t = $tables_images[$e]
331        AND !$t = $tables_sequences[$e])
332                $t = $e;
333
334        return $t;
335
336}
337
338/*
339 * recoit une chaine
340 * renvoie un array
341 * les valeurs par defaut sont mappees
342 * inspire de http://w-shadow.com/blog/2009/10/20/how-to-extract-html-tags-and-their-attributes-with-php/
343 */
344function phraser_tag($rr) {
345        $attribute_pattern =
346        '@
347        (
348        (?P<name>[-\w]+)                         # attribute name
349        \s*=\s*
350        (
351            (?P<quote>[\"\'])(?P<value_quoted>.*?)(?P=quote)    # a quoted value
352            |                      # or
353            (?P<value_unquoted>[^\s"\']+?)(?:\s+)          # an unquoted value
354        )
355        |(?P<auto>[-\w]+)
356        )
357        @xsiS';
358
359        // d'abord eliminer le type du tag et l'eventuelle fermeture auto
360        $res = array();
361        $rr = preg_replace(',^<[:\w]+\s+,S', '', $rr);
362        $rr = preg_replace(',\s*/?'.'>$,S', ' ', $rr);
363
364        // ensuite parser le reste des attributs
365        preg_match_all($attribute_pattern, $rr, $z, PREG_SET_ORDER);
366
367        foreach($z as $t) {
368                if (isset($t['auto'])) {
369                        if (is_numeric($t['auto'])) # 200
370                                $res['width'] = $t['auto'];
371                        elseif (preg_match(',^\d+x\d+$,', $t['auto'])) # 200x300
372                                $res['geometry'] = $t['auto'];
373                        else
374                                $res[$t['auto']] = $t['auto'];
375                }
376                elseif (isset($t['value_unquoted'])) {
377                        $res[$t['name']] = $t['value_unquoted'];
378                }
379                elseif (isset($t['value_quoted'])) {
380                        $res[$t['name']] = $t['value_quoted'];
381                }
382        }
383
384        return $res;
385}
386
387function embed_ressource($res) {
388        // si la ressource a un embed, charger le modele ressource_embed
389        // qui l'encapsule dans un <figure>, ajoute eventuellement une légende etc.
390        if (isset($res['embed'])) {
391                if (!isset($res['width'])
392                AND $w = extraire_attribut($res['embed'], 'width'))
393                        $res['width'] = $w;
394                if (!isset($res['height'])
395                AND $h = extraire_attribut($res['embed'], 'height'))
396                        $res['height'] = $h;
397                return recuperer_fond('modeles/ressource_embed', $res);
398        }
399
400        // si la ressource est un document, renvoyer <doc1>
401        if (isset($res['id_document'])) {
402#               return recuperer_fond('modeles/doc', $res);
403        }
404
405        if ($res['type_document'] == 'PDF') {
406                return
407                        recuperer_fond('modeles/application', $res);
408        }
409
410        return
411#               "<pre>".var_export($res,true)."</pre>" .
412                recuperer_fond('modeles/ressource', $res);
413}
414
415/* ici c'est flou… */
416function ressource_image($attrs, $meta) {
417        $image = array();
418
419        // creer une vignette pour le doc ; si une largeur est exigee,
420        // adapter la taille.
421        if ($attrs['largeur'] OR $attrs['hauteur']) {
422                $resize = true;
423        }
424        // size
425        else {
426                if (!$attrs['size']) {
427                        if ($attrs['image']) # ???? c'est quoi ? le mode ?
428                                $attrs['size'] = _RESSOURCE_VIGNETTE_LARGEUR_DEFAUT;
429                        else
430                                $attrs['size'] = _RESSOURCE_IMAGE_LARGEUR_DEFAUT;
431                }
432
433                if (in_array($meta['extension'], array('gif', 'png', 'jpg'))
434                AND strlen($b = image_stdsize($meta, $attrs))) {
435                        $a = $b;
436                        $resize = true;
437                }
438        }
439
440        // Verifier d'abord si le parametre 'icon' force l'icon
441# todo : icone => icon
442        if ($attrs['icon']) {
443                $f = charger_fonction('vignette','inc');
444                $img = $f($meta['extension'], false);
445                if ($resize)
446                        $a = filtrer('image_reduire', $img, $attrs['largeur'] ? $attrs['largeur'] : -1, $attrs['hauteur'] ? $attrs['hauteur'] : -1);
447                else
448                        $a = '<img src="'.$img.'" />';
449
450        }
451        // methode normale : reduire l'image si possible, sinon icon
452        else {
453                if (!$a) {
454                        $w = sinon($attrs['largeur'],500);
455                        $h = sinon($attrs['hauteur'],700);
456                        $a = vignette_automatique($meta['id_vignette'], $meta,
457                                '' /*url*/, $w, $h, null /* align */);
458                }
459        }
460
461        if ($a) $image['logodocument'] = $a;
462
463        // experimental : DEST
464        // TODO: parametre à mieux nommer ?
465        // parametre |dest=800 pour reduire l'image LIEE a 800px max
466        if ($attrs['dest']) {
467                $tmp = filtrer('image_reduire', $meta['local'], $attrs['dest']);
468                if ($tmp = extraire_attribut($tmp, 'src'))
469                        $image['href'] = $tmp;
470        }
471
472        return $image;
473}
474
475
476
477
478# s t m d z b o
479function image_stdsize($meta, $attrs) {
480
481        $s = $attrs['size'];
482        if (isset($meta['local']))
483                $img = $meta['local'];
484        else
485                $img = $attrs['src'];
486
487        # intercepter les URLs flickr pour choper les jolies reductions
488        if (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[zbo])?\.jpg$,', $img, $r)) {
489                if (in_array($s, array('s', 't', 'm', 'z', 'b') )){
490                        $img = $r[1].'_'.$s.'.jpg';
491                        return '<img src="'.$img.'" />';
492                }
493                if (in_array($s, array('d'))) {
494                        $img = $r[1].'.jpg';
495                        return '<img src="'.$img.'" />';
496                }
497        }
498        elseif (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[k])?\.jpg$,', $img, $r)) {
499                if (in_array($s, array('k') )){
500                        $img = $r[1].'_'.$s.'.jpg';
501                        return '<img src="'.$img.'" />';
502                }
503                if (in_array($s, array('d'))) {
504                        $img = $r[1].'.jpg';
505                        return '<img src="'.$img.'" />';
506                }
507        }
508        elseif (preg_match(',^(http://farm.*.staticflickr.com/(\d+/[0-9a-z_]+?))(_[h])?\.jpg$,', $img, $r)) {
509                if (in_array($s, array('h') )){
510                        $img = $r[1].'_'.$s.'.jpg';
511                        return '<img src="'.$img.'" />';
512                }
513                if (in_array($s, array('d'))) {
514                        $img = $r[1].'.jpg';
515                        return '<img src="'.$img.'" />';
516                }
517        }
518
519        // IMG/jpg/truc.jpg depuis l'espace prive
520        if (_DIR_RACINE
521        AND substr(_DIR_RACINE.$img, 0, strlen(_DIR_IMG)) == _DIR_IMG)
522                $img = _DIR_RACINE.$img;
523
524        if (!is_numeric($s)) {
525        switch($s) {
526                case 'sq':
527                case 'square':
528                        # la c'est dur
529                        $d = 75;
530                        $img = filtrer('image_passe_partout', $img, $d, $d);
531                        $img = filtrer('image_recadre', $img, $d, $d);
532                        break;
533                case 't':
534                case 'thumb':
535                case 'thumbnail':
536                        $a = 100;
537                        break;
538                case 'm':
539                case 's':
540                case 'small':
541                        $a = 240;
542                        break;
543                case 'z':
544                case 'medium640':
545                        $a = 640;
546                        break;
547                case 'b':
548                case 'large':
549                        $a = 1024;
550                        break;
551                // xl = 'k' chez flickr (2048px)
552                case 'k':
553                case 'xl':
554                case 'extra':
555                case 'extralarge':
556                        $a = 2048;
557                        break;
558                case 'o':
559                case 'original':
560                        $a = 10000000;
561                        break;
562                case '-':
563                case '':
564                case 'd':
565                case 'default':
566                default:
567                        $a = 500;
568                        break;
569        }
570        }
571
572        if ($a)
573                $img = filtrer('image_reduire', $img, $a);
574        else if (is_numeric($s))
575                $img = filtrer('image_reduire', $img, $s);
576
577        return $img;
578}
579
580
581
582function ressource_extract($meta) {
583        /*
584
585        global $extracteur;
586
587        $extension = $meta['extension'];
588
589        include_spip('extract/'.$extension);
590        if (function_exists($lire = $extracteur[$extension])) {
591                $charset = 'iso-8859-1';
592                $contenu = $lire($meta['local'], $charset);
593                var_dump($lire, $contenu);
594        }
595        */
596
597        switch($meta['extension']) {
598                case 'html':
599                case 'doc':
600                case 'docx':
601                case 'rtf':
602                case 'odt':
603                        $conv = converthtml($meta['local'], $err);
604                        include_spip('fonctionsale');
605                        if (function_exists('sale')) {
606                                $conv = sale($conv);
607                        }
608                        break;
609                default:
610                        break;
611        }
612
613        return $conv;
614}
615
616/**
617* Multiple Curl Handlers
618* @author Jorge Hebrard ( jorge.hebrard@gmail.com )
619**/
620class curlNode{
621    static private $listenerList;
622    private $callback;
623    public function __construct($url){
624        $new =& self::$listenerList[];
625        $new['url'] = $url;
626        $this->callback =& $new;
627    }
628    /**
629    * Callbacks needs 3 parameters: $url, $html (data of the url), and $lag (execution time)
630    **/
631    public function addListener($callback){
632        $this->callback['callback'] = $callback;
633    }
634    /**
635    * curl_setopt() wrapper. Enjoy!
636    **/
637    public function setOpt($key,$value){
638        $this->callback['opt'][$key] = $value;
639    }
640    /**
641    * Request all the created curlNode objects, and invoke associated callbacks.
642    **/
643    static public function request(){
644   
645        //create the multiple cURL handle
646        $mh = curl_multi_init();
647       
648        $running=null;
649       
650        # Setup all curl handles
651        # Loop through each created curlNode object.
652        foreach(self::$listenerList as &$listener){
653            $url = $listener['url'];
654            $current =& $ch[];
655           
656            # Init curl and set default options.
657            # This can be improved by creating
658            $current = curl_init();
659
660            curl_setopt($current, CURLOPT_URL, $url);
661            # Since we don't want to display multiple pages in a single php file, do we?
662            curl_setopt($current, CURLOPT_HEADER, 0);
663            curl_setopt($current, CURLOPT_RETURNTRANSFER, 1);
664           
665            # Set defined options, set through curlNode->setOpt();
666            if (isset($listener['opt'])){
667                foreach($listener['opt'] as $key => $value){
668                    curl_setopt($current, $key, $value);
669                }
670            }
671           
672            curl_multi_add_handle($mh,$current);
673           
674            $listener['handle'] = $current;
675            $listener['start'] = microtime(1);
676        } unset($listener);
677
678        # Main loop execution
679        do {
680            # Exec until there's no more data in this iteration.
681            # This function has a bug, it
682            while(($execrun = curl_multi_exec($mh, $running)) == CURLM_CALL_MULTI_PERFORM);
683            if($execrun != CURLM_OK) break; # This should never happen. Optional line.
684           
685            # Get information about the handle that just finished the work.
686            while($done = curl_multi_info_read($mh)) {
687                # Call the associated listener
688                foreach(self::$listenerList as $listener){
689                    # Strict compare handles.
690                    if ($listener['handle'] === $done['handle']) {
691                        # Get content
692                        $html = curl_multi_getcontent($done['handle']);
693                        # Call the callback.
694                        call_user_func($listener['callback'],
695                        $listener['url'],
696                        $html,(microtime(1)-$listener['start']));
697                        # Remove unnecesary handle (optional, script works without it).
698                        curl_multi_remove_handle($mh, $done['handle']);
699                    }
700                }
701               
702            }
703            # Required, or else we would end up with a endless loop.
704            # Without it, even when the connections are over, this script keeps running.
705            if (!$running) break;
706           
707            # I don't know what these lines do, but they are required for the script to work.
708            while (($res = curl_multi_select($mh)) === 0);
709            if ($res === false) break; # Select error, should never happen.
710        } while (true);
711
712        # Finish out our script ;)
713        curl_multi_close($mh);
714   
715    }
716}
717
718function converthtml($f, $err) {
719        define('_CONVERT_URL', 'http://office.rezo.net/office/v1/?email=fil@rezo.net&key=1223649b375bb98e1b57141f96643cd47a3029c3');
720
721        $signature = md5_file($f);
722
723        // 1. a-t-on le fichier en local
724        $html = sous_repertoire(_DIR_TMP,'converthtml').$signature.'.html';
725        if (file_exists($html))
726                return spip_file_get_contents($html);
727
728        // 2. sinon le chercher sur le serveur office.rezo
729        if (!defined('_CONVERT_URL'))
730                return false;
731
732        $url = parametre_url(_CONVERT_URL, 'signature', $signature, '&');
733
734        include_spip('inc/queue');
735        queue_add_job('convert_html_fetch', 'convert_html_fetch('.$f.')', array($url, $f, $html), $file = 'inc/ressource', $no_duplicate = true, $time=0, $priority=0);
736        #convert_html_fetch($url, $f);
737
738        return '';
739}
740
741function convert_html_fetch($url, $f, $html=null) {
742        if (!$html) return;
743        include_spip('inc/distant');
744        if ($rep = recuperer_page($url)
745        AND $rep = json_decode($rep)
746        AND isset($rep->content)) {
747                ecrire_fichier($html, $rep->content);
748                return;
749        }
750       
751
752        // 3. si 404, l'envoyer au serveur
753        #include_spip('inc/queue');
754        #queue_add_job('convert_html_send', 'convert_html_send('.$f.')', array($url, $f), $file = 'inc/ressource', $no_duplicate = true, $time=0, $priority=0);
755        convert_html_send($url, $f);
756
757}
758
759function convert_html_send($url, $f) {
760        include_spip('inc/filtres');
761        spip_log('curl @'.$f.' '.$url.' ('.taille_en_octets(filesize($f)).')');
762        $data = array('file' => '@'.$f);
763        $ch = curl_init();
764        curl_setopt($ch, CURLOPT_VERBOSE, 1);
765        curl_setopt($ch, CURLOPT_URL, $url);
766        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
767        curl_setopt($ch, CURLOPT_POST, true);
768        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
769        $n = curl_exec($ch);
770        spip_log($n);
771        curl_close($ch);
772}
773
774
775function xconverthtml($f, &$err) {
776
777
778        $k = escapeshellarg($f);
779
780        exec("/usr/bin/textutil -convert html -stdout -noload -nostore $k", $ret, $err);
781
782        if ($err) {
783                spip_log($err);
784        } else {
785                $ret = join($ret, "\n");
786                // les notes de bas de page word sont parfois transformees en truc chelou
787                $ret = str_replace('<span class="Apple-converted-space"> </span>', '~', $ret);
788                return nettoyer_utf8($ret);
789        }
790}
791
792function nettoyer_utf8($t) {
793        if (!preg_match('!\S!u', $t))
794                $t = preg_replace_callback(',&#x([0-9a-f]+);,i', 'utf8_do', utf8_encode(utf8_decode($t)));
795        return $t;
796}
797
Note: See TracBrowser for help on using the repository browser.