source: spip-zone/_plugins_/oembed/oembed_pipelines.php @ 99158

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

Notice PHP en moins lors de l'appel à copie_locale()

File size: 8.5 KB
Line 
1<?php
2/**
3 * Plugin oEmbed
4 * Licence GPL3
5 *
6 */
7
8if (!defined('_ECRIRE_INC_VERSION')) {
9        return;
10}
11
12/**
13 * Inserer une CSS pour le contenu embed
14 * @param $head
15 * @return string
16 */
17function oembed_insert_head_css($head) {
18        $head .= '<link rel="stylesheet" type="text/css" href="'.find_in_path('css/oembed.css').'" />'."\n";
19        return $head;
20}
21
22/**
23 * annoncer le service oembed dans le head des pages publiques
24 *
25 * @param string $head
26 * @return string
27 */
28function oembed_insert_head($head) {
29        $service = 'oembed.api/';
30
31        $ins = '<link rel="alternate" type="application/json+oembed" href="<?php include_spip(\'inc/filtres_mini\');echo parametre_url(url_absolue("'.parametre_url($service, 'format', 'json').'"), "url", url_absolue(self()));?>" />'."\n";
32        /*
33        $ins .= '<link rel="alternate" type="text/xml+oembed" href="<?php echo parametre_url(url_absolue("'.parametre_url($service,'format','xml').'"),"url",url_absolue(self()));?>" />'."\n";
34        */
35        $ins = "<?php if (!in_array(_request(_SPIP_PAGE),array('login')) AND strpos(\$_SERVER['REQUEST_URI'],'debut_')===false){?>$ins<?php } ?>";
36
37        return $head.$ins;
38}
39
40/**
41 * Generer un apercu pour les oembed sur le formulaire d'edition document
42 * @param $flux
43 * @return
44 */
45function oembed_formulaire_charger($flux) {
46        if ($flux['args']['form']=='editer_document') {
47                if ($flux['data']['oembed']
48                        and !isset($flux['data']['apercu'])) {
49                        $flux['data']['_inclus'] = 'embed';
50                }
51        }
52        return $flux;
53}
54
55/**
56 * Inserer une explication dans le form d'upload
57 * @param $flux
58 * @return array
59 */
60function oembed_recuperer_fond($flux) {
61        if ($flux['args']['fond'] == 'formulaires/inc-upload_document') {
62                include_spip('inc/oembed');
63                $providers = oembed_lister_providers();
64                $hosts = array();
65                foreach ($providers as $scheme => $endpoint) {
66                        $h = parse_url($scheme, PHP_URL_HOST);
67                        $hosts[trim(preg_replace(',^(\*|www)\.,i', '', $h))] = true;
68                }
69                $hosts = implode(', ', array_keys($hosts));
70                $i = _T('oembed:explication_upload_url', array('hosts' => $hosts));
71                $i = "<p class='explication small'>$i</p>";
72                $flux['data'] = str_replace($t = '<!--editer_url-->', $t. $i, $flux['data']);
73        }
74        return $flux;
75}
76
77/**
78 * insertion des traitements oembed dans l'ajout des documents distants
79 * reconnaitre une URL oembed (car provider declare ou decouverte automatique active)
80 * et la pre-traiter pour recuperer le vrai document a partir de l'url concernee
81 *
82 * @param array $flux
83 * @return array
84 */
85function oembed_renseigner_document_distant($flux) {
86        $medias = array('photo' => 'image','video' => 'video', 'sound'=>'audio');
87        include_spip('inc/config');
88        include_spip('inc/oembed');
89        // on tente de récupérer les données oembed
90        if ($data = oembed_recuperer_data($flux['source'])) {
91                // si on a recupere une URL c'est direct un doc distant
92                if (isset($data['url'])
93                        and $data['type'] !== 'rich'
94                        // on recupere les infos du document distant
95                        and $doc = recuperer_infos_distantes($data['url'])) {
96                        unset($doc['body']);
97                        $doc['distant'] = 'oui';
98                        $doc['mode'] = 'document';
99                        $doc['fichier'] = set_spip_doc($data['url']);
100                        // et on complète par les infos oembed
101                        $doc['oembed'] = $flux['source'];
102                        $doc['titre'] = $data['title'];
103                        $doc['credits'] = $data['author_name'];
104                        if (isset($data['media'])) {
105                                $doc['media'] = $data['media'];
106                        } elseif (isset($medias[$data['type']])) {
107                                $doc['media'] = $medias[$data['type']];
108                        }
109                        return $doc;
110                } elseif (isset($data['html']) or $data['type'] == 'link') {
111                        if ($data['type']=='link') {
112                                $data['html'] = '<a href="' . $flux['source'] . '">' . sinon($data['title'], $flux['source']) . '</a>';
113                        }
114                        // créer une copie locale du contenu html
115                        // cf recuperer_infos_distantes()
116                        // generer un nom de fichier unique : on l'index sur l'id du prochain document + uniqid
117                        $id = sql_getfetsel('id_document', 'spip_documents', '', '', 'id_document DESC', '0,1');
118                        include_spip('inc/acces');
119                        $id = "id$id-".creer_uniqid();
120                        $id = substr(md5($id), 0, 7);
121                        $doc['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($flux['source'], 'html');
122                        $doc['fichier'] = preg_replace(',\.html$,i', "-$id.html", $doc['fichier']);
123                        ecrire_fichier($doc['fichier'], $data['html']);
124                        // set_spip_doc() pour récupérer le chemin du fichier relatif a _DIR_IMG
125                        $doc['fichier'] = set_spip_doc($doc['fichier']);
126                        $doc['extension'] = 'html';
127                        $doc['taille'] = strlen($data['html']); # a peu pres
128                        $doc['distant'] = 'non';
129                        $doc['mode'] = 'document';
130                        $doc['oembed'] = $flux['source'];
131                        $doc['titre'] = $data['title'];
132                        $doc['credits'] = $data['author_name'];
133                        if (isset($data['media'])) {
134                                $doc['media'] = $data['media'];
135                        } elseif (isset($medias[$data['type']])) {
136                                $doc['media'] = $medias[$data['type']];
137                        }
138                        return $doc;
139                }
140        }
141        return $flux;
142}
143
144/**
145 * attacher la vignette si disponible pour les documents oembed
146 * on les reconnait via la presence d'un oembed non vide
147 * on relance un appel a oembed_recuperer_data qui a garde la requete precendente en cache
148 *
149 * @param array $flux
150 * @return array
151 */
152function oembed_post_edition($flux) {
153        if (
154                isset($flux['args']['action'])
155                and $flux['args']['action'] == 'ajouter_document' 
156                and !empty($flux['data']['oembed'])
157        ) {
158                $id_document = $flux['args']['id_objet'];
159                if ($data = oembed_recuperer_data($flux['data']['oembed'])) {
160                        // vignette disponible ? la recupérer et l'associer au document
161                        if ((isset($data['thumbnail_url']) and $v = $data['thumbnail_url'])
162                                or (isset($data['image']) and $v = $data['image'])
163                        ) {
164                                spip_log('ajout de la vignette '.$v.' pour '.$flux['data']['oembed'], 'oembed.'._LOG_DEBUG);
165                                // cf formulaires_illustrer_document_traiter_dist()
166                                $ajouter_documents = charger_fonction('ajouter_documents', 'action');
167                                $files = false;
168                                if (preg_match(',^(\w+:)?//,', $v)) {
169                                        $files = array(
170                                                array(
171                                                        'name' => basename($v),
172                                                        'tmp_name' => $v,
173                                                        'distant' => true,
174                                                )
175                                        );
176                                } elseif (file_exists($v)) {
177                                        $files = array(array(
178                                                'name' => basename($v),
179                                                'tmp_name' => $v
180                                        ));
181                                }
182                                if ($files
183                                        and $ajoute = action_ajouter_documents_dist('new', $files, '', 0, 'vignette')
184                                        and intval(reset($ajoute))) {
185                                        $id_vignette = reset($ajoute);
186                                        include_spip('action/editer_document');
187                                        document_modifier($id_document, array('id_vignette' => $id_vignette));
188                                }
189                        } else {
190                                spip_log('pas de vignette pour '.$flux['data']['oembed'], 'oembed.'._LOG_DEBUG);
191                        }
192                }
193        }
194        return $flux;
195}
196
197/**
198 * Transformation auto des liens vers contenu oembed correspondant : trop la classe
199 *
200 * @param string $texte
201 * @return mixed
202 */
203function oembed_pre_propre($texte) {
204        include_spip('inc/config');
205
206        // si oembed/embed_auto==oui on oembed les liens qui sont tous seuls sur une ligne
207        // (mais jamais les liens inline dans le texte car ca casse trop l'ancien contenu)
208        if (stripos($texte, '<a') !== false
209                and stripos($texte, 'auto') !== false
210                and stripos($texte, 'spip_out') !== false
211                and lire_config('oembed/embed_auto', 'oui') != 'non'
212                and strpos($texte, "\n") !== false) {
213                preg_match_all(",(^|(?:\r?\n\r?\n)) *(<a\b[^>]*>[^\r\n]*</a>) *((?:\r?\n\r?\n)|$),Uims", trim($texte), $matches, PREG_SET_ORDER);
214                if (count($matches)) {
215                        $replace = array();
216                        include_spip('inc/oembed');
217                        foreach ($matches as $match) {
218                                if (!isset($replace[$match[0]])
219                                        and preg_match(',\bauto\b,', extraire_attribut($match[2], 'class'))
220                                        and !is_null($emb = oembed_embarquer_lien($match[2]))) {
221                                        if ($wrap_embed_html = charger_fonction('wrap_embed_html', 'inc', true)) {
222                                                $emb = $wrap_embed_html($match[2],$emb);
223                                        }
224                                        $replace[$match[0]] = $match[1] . echappe_html("<html>$emb</html>") . $match[3];
225                                }
226                        }
227                        if (count($replace)) {
228                                $texte = str_replace(array_keys($replace), array_values($replace), $texte);
229                        }
230                }
231        }
232        return $texte;
233}
234
235
236/**
237 * pipeline pour typo
238 * pour traitement des ressources en SPIP 3.1
239 * @param $t
240 * @return mixed
241 */
242function oembed_post_typo($t) {
243        if (strpos($t, '<') !== false) {
244                $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t);
245        }
246        return $t;
247}
248
249/**
250 * pipeline pour propre
251 * pour traitement des ressources en SPIP 3.1
252 * @param $t
253 * @return mixed
254 */
255function oembed_pre_liens($t) {
256        if (strpos($t, '<') !== false) {
257                $t = preg_replace_callback(_EXTRAIRE_RESSOURCES, 'traiter_ressources', $t);
258
259                // echapper les autoliens eventuellement inseres (en une seule fois)
260                if (strpos($t, '<html>') !== false) {
261                        $t = echappe_html($t);
262                }
263        }
264        return $t;
265}
266
267
268
269include_spip('inc/config');
270if (!function_exists('lire_config')) {
271        function lire_config($a = null, $b = null) {
272                return $b;
273        }
274}
Note: See TracBrowser for help on using the repository browser.