documents.php 6.9 KB

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