source: spip-zone/_core_/plugins/medias/inc/documents.php

Last change on this file was 113294, checked in by spip.franck@…, 4 months ago

Il parait que le futur c'est maintenant :-D

File size: 7.5 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2019                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined('_ECRIRE_INC_VERSION')) {
14        return;
15}
16
17// inclure les fonctions bases du core
18include_once _DIR_RESTREINT . 'inc/documents.php';
19
20include_spip('inc/actions'); // *action_auteur et determine_upload
21
22// Constante indiquant le charset probable des documents non utf-8 joints
23
24if (!defined('CHARSET_JOINT')) {
25        define('CHARSET_JOINT', 'iso-8859-1');
26}
27
28// Filtre pour #FICHIER permettant d'incruster le contenu d'un document
29// Si 2e arg fourni, conversion dans le charset du site si possible
30
31// https://code.spip.net/@contenu_document
32function contenu_document($arg, $charset = '') {
33        include_spip('inc/distant');
34        if (is_numeric($arg)) {
35                $r = sql_fetsel('fichier,distant', 'spip_documents', 'id_document=' . intval($arg));
36                if (!$r) {
37                        return '';
38                }
39                $f = $r['fichier'];
40                $f = ($r['distant'] == 'oui') ? _DIR_RACINE . copie_locale($f) : get_spip_doc($f);
41        } else {
42                if (!@file_exists($f = $arg)) {
43                        if (!$f = copie_locale($f)) {
44                                return '';
45                        }
46                        $f = _DIR_RACINE . $f;
47                }
48        }
49
50        $r = spip_file_get_contents($f);
51
52        if ($charset) {
53                include_spip('inc/charsets');
54                if ($charset !== 'auto') {
55                        $r = importer_charset($r, $charset);
56                } elseif ($GLOBALS['meta']['charset'] == 'utf-8' and !is_utf8($r)) {
57                        $r = importer_charset($r, CHARSET_JOINT);
58                }
59        }
60
61        return $r;
62}
63
64// https://code.spip.net/@generer_url_document_dist
65function generer_url_document_dist($id_document, $args = '', $ancre = '') {
66
67        include_spip('inc/autoriser');
68        if (!autoriser('voir', 'document', $id_document)) {
69                return '';
70        }
71
72        $r = sql_fetsel('fichier,distant', 'spip_documents', 'id_document=' . intval($id_document));
73
74        if (!$r) {
75                return '';
76        }
77
78        $f = $r['fichier'];
79
80        if ($r['distant'] == 'oui') {
81                return $f;
82        }
83
84        // Si droit de voir tous les docs, pas seulement celui-ci
85        // il est inutilement couteux de rajouter une protection
86        $r = (autoriser('voir', 'document'));
87        if (($r and $r !== 'htaccess')) {
88                return get_spip_doc($f);
89        }
90
91        include_spip('inc/securiser_action');
92
93        // cette action doit etre publique !
94        return generer_url_action(
95                'acceder_document',
96                $args . ($args ? '&' : '')
97                        . 'arg=' . $id_document
98                        . ($ancre ? "&ancre=$ancre" : '')
99                        . '&cle=' . calculer_cle_action($id_document . ',' . $f)
100                        . '&file=' . rawurlencode($f),
101                true,
102                true
103        );
104}
105
106//
107// Affiche le document avec sa vignette par defaut
108//
109// Attention : en mode 'doc', si c'est un fichier graphique on prefere
110// afficher une vue reduite, quand c'est possible (presque toujours, donc)
111// En mode 'image', l'image conserve sa taille
112//
113// A noter : dans le portfolio prive on pousse le vice jusqu'a reduire la taille
114// de la vignette -> c'est a ca que sert la variable $portfolio
115function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $class = null, $connect = null) {
116        include_spip('inc/distant');
117        include_spip('inc/texte');
118        include_spip('inc/filtres_images_mini');
119        if (is_null($class)) {
120                $class = 'spip_logo spip_logos';
121        }
122        $e = $doc['extension'];
123        if (!$img) {
124                if ($img = image_du_document($doc, $connect)) {
125                        if (!$x and !$y) {
126                                // eviter une double reduction
127                                $img = image_reduire($img);
128                        }
129                } else {
130                        $f = charger_fonction('vignette', 'inc');
131                        $img = $f($e, false);
132                        $size = @getimagesize($img);
133                        $img = "<img src='$img' " . $size[3] . ' />';
134                }
135        } else {
136                $size = @getimagesize($img);
137                $img = "<img src='$img' " . $size[3] . ' />';
138        }
139        // on appelle image_reduire independamment de la presence ou non
140        // des librairies graphiques
141        // la fonction sait se debrouiller et faire de son mieux dans tous les cas
142        if ($x or $y) {
143                $img = image_reduire($img, $x, $y);
144        }
145        $img = inserer_attribut($img, 'alt', '');
146        $img = inserer_attribut($img, 'class', $class);
147        if ($align) {
148                $img = inserer_attribut($img, 'align', $align);
149        }
150
151        if (!$lien) {
152                return $img;
153        }
154
155        $titre = supprimer_tags(typo($doc['titre']));
156        $titre = ' - ' . taille_en_octets($doc['taille'])
157                . ($titre ? " - $titre" : '');
158
159        $type = sql_fetsel('titre, mime_type', 'spip_types_documents', 'extension = ' . sql_quote($e));
160
161        $mime = $type['mime_type'];
162        $titre = attribut_html(couper($type['titre'] . $titre, 80));
163
164        return "<a href='$lien' type='$mime' title='$titre'>$img</a>";
165}
166
167/**
168 * Trouve une image caractéristique d'un document.
169 *
170 * Si celui-ci est une image et que les outils graphiques sont dispos,
171 * retourner le document (en exploitant sa copie locale s'il est distant).
172 *
173 * Si on a un connecteur externe, on utilise l’URL externe.
174 *
175 * Autrement retourner la vignette fournie par SPIP pour ce type MIME
176 *
177 * @param array $document
178 * @param null|string $connect
179 * @return string Chemin de l’image
180 */
181function image_du_document($document, $connect = null) {
182        if ($e = $document['extension']
183                and isset($GLOBALS['meta']['formats_graphiques'])
184                and (strpos($GLOBALS['meta']['formats_graphiques'], $e) !== false)
185                and (!test_espace_prive() or $GLOBALS['meta']['creer_preview'] == 'oui')
186                and $document['fichier']
187        ) {
188                include_spip('inc/quete');
189                if ($document['distant'] == 'oui') {
190                        $image = _DIR_RACINE . copie_locale($document['fichier']);
191                } elseif ($image = document_spip_externe($document['fichier'], $connect)) {
192                        return $image;
193                } else {
194                        $image = get_spip_doc($document['fichier']);
195                }
196                if (@file_exists($image)) {
197                        return $image;
198                }
199        }
200
201        return '';
202}
203
204/**
205 * Afficher un document dans la colonne de gauche
206 *
207 * @deprecated
208 *     Utiliser l'inclusion prévue ou une véritable
209 *     déclaration d'objet éditorial (la colonne document
210 *     est alors affichée automatiquement sur la page d'édition de l'objet)
211 *
212 * @param int $id
213 *     Identifiant de l'objet, ou id_auteur négatif pour un nouvel objet
214 * @param string $type
215 *     Type d'objet
216 * @param null $script
217 *     ??
218 * @return string
219 *     Code HTML permettant de gérer des documents
220 */
221function afficher_documents_colonne($id, $type = 'article', $script = null) {
222        return recuperer_fond('prive/objets/editer/colonne_document', array('objet' => $type, 'id_objet' => $id));
223}
224
225
226/**
227 * Affiche le code d'un raccourcis de document, tel que <doc123|left>
228 *
229 * Affiche un code de raccourcis de document, et l'insère
230 * dans le textarea principal de l'objet (champ 'texte') sur un double-clic
231 *
232 * @param string $doc
233 *    Type de raccourcis : doc,img,emb...
234 * @param int $id
235 *    Identifiant du document
236 * @param string $align
237 *    Alignement du document : left,center,right
238 *
239 * @return string
240 *    Texte du raccourcis
241 **/
242function affiche_raccourci_doc($doc, $id, $align) {
243        static $num = 0;
244        $pipe = $onclick = '';
245
246        if ($align) {
247                $pipe = "|$align";
248                $onclick = "\nondblclick=\"barre_inserer('\\x3C$doc$id$pipe&gt;', $('textarea[name=texte]')[0]);\"\ntitle=\"" .
249                        str_replace(
250                                '&amp;',
251                                '&',
252                                entites_html(_T('medias:double_clic_inserer_doc'))
253                        ) . '"';
254        } else {
255                $align = 'center';
256        }
257
258        return "\n<div style='text-align: $align'$onclick>&lt;$doc$id$pipe&gt;</div>\n";
259}
Note: See TracBrowser for help on using the repository browser.