Newer
Older

cedric@yterium.com
a validé
<?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet *

cedric@yterium.com
a validé
* *
* Copyright © avec tendresse depuis 2001 *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *

cedric@yterium.com
a validé
* *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. *
* Pour plus de détails voir le fichier COPYING.txt ou l'aide en ligne. *

cedric@yterium.com
a validé
\***************************************************************************/

marcimat@rezo.net
a validé
/**
* Fonctions utiles pour les squelettes et déclarations de boucle
* pour le compilateur
*
* @package SPIP\Medias\Fonctions

cedric@yterium.com
a validé
**/

cedric@yterium.com
a validé

marcimat@rezo.net
a validé
// sécurité

cedric@yterium.com
a validé
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
// nettoyer les zip abandonnes par l'utilisateur
if (isset($GLOBALS['visiteur_session']['zip_to_clean'])

marcimat@rezo.net
a validé
and test_espace_prive()
and isset($_SERVER['REQUEST_METHOD'])
and $_SERVER['REQUEST_METHOD'] !== 'POST'

cedric@yterium.com
a validé
) {

cedric@yterium.com
a validé
$zip_to_clean = unserialize($GLOBALS['visiteur_session']['zip_to_clean']);

cedric@yterium.com
a validé
if ($zip_to_clean) {
foreach ($zip_to_clean as $zip) {
if (@file_exists($zip)) {

cedric@yterium.com
a validé
@unlink($zip);

cedric@yterium.com
a validé
}

cedric@yterium.com
a validé
}
}
session_set('zip_to_clean');
}

cedric@yterium.com
a validé
// capturer un formulaire POST plus grand que post_max_size

cedric@yterium.com
a validé
// on genere un minipres car on ne peut rien faire de mieux

marcimat@rezo.net
a validé
and $_SERVER['REQUEST_METHOD'] == 'POST'
and empty($_POST)

marcimat@rezo.net
a validé
and strlen($_SERVER['CONTENT_TYPE']) > 0
and strncmp($_SERVER['CONTENT_TYPE'], 'multipart/form-data', 19) == 0
and $_SERVER['CONTENT_LENGTH'] > medias_inigetoctets('post_max_size')

cedric@yterium.com
a validé
) {

cedric@yterium.com
a validé
include_spip('inc/minipres');

cedric@yterium.com
a validé
echo minipres(_T('medias:upload_limit', array('max' => ini_get('post_max_size'))));

cedric@yterium.com
a validé
exit;
}
/**
* Styliser le modele media : reroute les <img> <doc> <emb> vers <image>, <audio>, <video>, <file> selon le media du document
* si le document n'est pas trouve c'est <file> qui s'applique
* @param $modele
* @param $id
* @return string
*/
function medias_modeles_styliser($modele, $id) {
if (defined('_COMPORTEMENT_HISTORIQUE_IMG_DOC_EMB') and _COMPORTEMENT_HISTORIQUE_IMG_DOC_EMB) {

cedric@yterium.com
a validé
return $modele;
}
switch($modele) {
case 'img':
case 'doc':
case 'emb':
$m = 'file';
if ($doc = sql_fetsel('id_document,media', 'spip_documents', 'id_document='.intval($id))) {
$m = $doc['media']; // image, audio, video, file
}
if (trouve_modele("{$m}_{$modele}")) {
// on peut decliner file_emb qui sera utilisable soit par <docXX|emb> soit par <embXX>
// permet d'embed explicitement des fichiers exotiques qui sinon seraient de simples liens a telecharger
// tels que text/csv, text/html, text
$m = "{$m}_{$modele}";
}
$modele = $m;
break;
}
return $modele;
}

cedric@yterium.com
a validé
* Retourne la taille en octet d'une valeur de configuration php
*
* @param string $var
* Clé de configuration ; valeur récupérée par `ini_get()`. Exemple `post_max_size`
* @return int|string
* Taille en octet, sinon chaine vide.

cedric@yterium.com
a validé
**/
function medias_inigetoctets($var) {

cedric@yterium.com
a validé
$last = '';
$val = trim(@ini_get($var));

marcimat@rezo.net
a validé
if (is_numeric($val)) {
return $val;
}
// en octet si "32M"

cedric@yterium.com
a validé
if ($val != '') {

marcimat@rezo.net
a validé
$last = strtolower($val[strlen($val) - 1]);

marcimat@rezo.net
a validé
$val = substr($val, 0, -1);

cedric@yterium.com
a validé
}
switch ($last) { // The 'G' modifier is available since PHP 5.1.0

cedric@yterium.com
a validé
case 'g':

cedric@yterium.com
a validé
case 'm':

cedric@yterium.com
a validé
case 'k':
$val *= 1024;

cedric@yterium.com
a validé
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
return $val;
}

cedric@yterium.com
a validé
/**
* Afficher la puce de statut pour les documents
*
* @param int $id_document
* Identifiant du document
* @param string $statut
* Statut du document
* @return string
* Code HTML de l'image de puce

cedric@yterium.com
a validé
*/

cedric@yterium.com
a validé
function medias_puce_statut_document($id_document, $statut) {
if ($statut == 'publie') {
$puce = 'puce-verte.gif';
} else {
if ($statut == 'prepa') {

cedric@yterium.com
a validé
$puce = 'puce-blanche.gif';
} else {
if ($statut == 'poubelle') {

cedric@yterium.com
a validé
$puce = 'puce-poubelle.gif';
} else {
$puce = 'puce-blanche.gif';
}
}

cedric@yterium.com
a validé
}
return http_img_pack($puce, $statut, "class='puce'");
}

marcimat@rezo.net
a validé
/**
* Compile la boucle `DOCUMENTS` qui retourne une liste de documents multimédia

cedric@yterium.com
a validé
*

marcimat@rezo.net
a validé
* `<BOUCLE(DOCUMENTS)>`
*
* @param string $id_boucle
* Identifiant de la boucle
* @param array $boucles
* AST du squelette
* @return string
* Code PHP compilé de la boucle

cedric@yterium.com
a validé
**/

cedric@yterium.com
a validé
function boucle_DOCUMENTS($id_boucle, &$boucles) {

cedric@yterium.com
a validé
$boucle = &$boucles[$id_boucle];
$id_table = $boucle->id_table;
// on ne veut pas des fichiers de taille nulle,
// sauf s'ils sont distants (taille inconnue)

cedric@yterium.com
a validé
array_unshift($boucle->where, array("'($id_table.taille > 0 OR $id_table.distant=\\'oui\\')'"));

cedric@yterium.com
a validé

kent1@arscenic.info
a validé
/**
* N'afficher que les modes de documents que l'on accepte
* Utiliser le "pipeline medias_documents_visibles" pour en ajouter
*/

cedric@yterium.com
a validé
if (!isset($boucle->modificateur['criteres']['mode'])

marcimat@rezo.net
a validé
and !isset($boucle->modificateur['tout'])

cedric@yterium.com
a validé
) {
$modes = pipeline('medias_documents_visibles', array('image', 'document'));
$f = sql_serveur('quote', $boucle->sql_serveur, true);

kent1@arscenic.info
a validé
$modes = addslashes(join(',', array_map($f, array_unique($modes))));

cedric@yterium.com
a validé
array_unshift($boucle->where, array("'IN'", "'$id_table.mode'", "'($modes)'"));

cedric@yterium.com
a validé
}
return calculer_boucle($id_boucle, $boucles);
}

cedric@yterium.com
a validé
/**
* critere {orphelins} selectionne les documents sans liens avec un objet editorial
*
* @param string $idb
* @param object $boucles
* @param object $crit
*/

cedric@yterium.com
a validé
function critere_DOCUMENTS_orphelins_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$cond = $crit->cond;
$not = $crit->not ? '' : 'NOT';

cedric@yterium.com
a validé
$select = sql_get_select('DISTINCT id_document', 'spip_documents_liens as oooo');

cedric@yterium.com
a validé
$where = "'" . $boucle->id_table . ".id_document $not IN ($select)'";
if ($cond) {

cedric@yterium.com
a validé
$_quoi = '@$Pile[0]["orphelins"]';
$where = "($_quoi)?$where:''";
}

cedric@yterium.com
a validé

cedric@yterium.com
a validé
$boucle->where[] = $where;

cedric@yterium.com
a validé
}

cedric@yterium.com
a validé
/**
* critere {portrait} qui selectionne
* - les documents dont les dimensions sont connues
* - les documents dont la hauteur est superieure a la largeur
*
* {!portrait} exclus ces documents
*
* @param string $idb
* @param object $boucles
* @param object $crit
*/
function critere_DOCUMENTS_portrait_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$table = $boucle->id_table;
$not = ($crit->not ? 'NOT ' : '');

cedric@yterium.com
a validé
$boucle->where[] = "'$not($table.largeur>0 AND $table.hauteur > $table.largeur)'";
}
/**
* critere {paysage} qui selectionne
* - les documents dont les dimensions sont connues
* - les documents dont la hauteur est inferieure a la largeur
*
* {!paysage} exclus ces documents
*
* @param string $idb
* @param object $boucles
* @param object $crit
*/
function critere_DOCUMENTS_paysage_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$table = $boucle->id_table;
$not = ($crit->not ? 'NOT ' : '');

cedric@yterium.com
a validé
$boucle->where[] = "'$not($table.largeur>0 AND $table.largeur > $table.hauteur)'";
}
/**
* critere {carre} qui selectionne
* - les documents dont les dimensions sont connues
* - les documents dont la hauteur est egale a la largeur
*
* {!carre} exclus ces documents
*
* @param string $idb
* @param object $boucles
* @param object $crit
*/
function critere_DOCUMENTS_carre_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$table = $boucle->id_table;
$not = ($crit->not ? 'NOT ' : '');

cedric@yterium.com
a validé
$boucle->where[] = "'$not($table.largeur>0 AND $table.largeur = $table.hauteur)'";
}

marcimat@rezo.net
a validé
/**
* Calcule la vignette d'une extension (l'image du type de fichier)
*
* Utile dans une boucle DOCUMENTS pour afficher une vignette du type
* du document (balise `#EXTENSION`) alors que ce document a déjà une vignette
* personnalisée (affichable par `#LOGO_DOCUMENT`).

cedric@yterium.com
a validé
*

marcimat@rezo.net
a validé
* @example
* `[(#EXTENSION|vignette)]` produit une balise `<img ... />`
* `[(#EXTENSION|vignette{true})]` retourne le chemin de l'image

marcimat@rezo.net
a validé
*
* @param string $extension
* L'extension du fichier, exemple : png ou pdf
* @param bool $get_chemin
* false pour obtenir une balise img de l'image,
* true pour obtenir seulement le chemin du fichier
* @return string
* Balise HTML <img...> ou chemin du fichier

cedric@yterium.com
a validé
**/

gilles.vincent@gmail.com
a validé
function filtre_vignette_dist($extension = 'defaut', $get_chemin = false) {

marcimat@rezo.net
a validé
static $vignette = false;
static $balise_img = false;
if (!$vignette) {
$vignette = charger_fonction('vignette', 'inc');
$balise_img = charger_filtre('balise_img');
}
$fichier = $vignette($extension, false);
// retourne simplement le chemin du fichier
if ($get_chemin) {
return $fichier;
}

cedric@yterium.com
a validé

marcimat@rezo.net
a validé
// retourne une balise <img ... />
return $balise_img($fichier);
}
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
/**
* Determiner les methodes upload en fonction du env de inc-upload_document
*
* @param string|array $env
* @return array
*/
function medias_lister_methodes_upload($env) {
if (is_string($env)) {
$env = unserialize($env);
}
$methodes = array();
// méthodes d'upload disponibles
$methodes = array();
$methodes['upload'] = array('label_lien'=>_T('medias:bouton_download_local'),'label_bouton'=>_T('bouton_upload'));
if((isset($env['mediatheque']) and $env['mediatheque'])){
$methodes['mediatheque'] = array('label_lien'=>_T('medias:bouton_download_par_mediatheque'),'label_bouton'=>_T('medias:bouton_attacher_document'));
}
if((isset($env['proposer_ftp']) and $env['proposer_ftp'])){
$methodes['ftp'] = array('label_lien'=>_T('medias:bouton_download_par_ftp'),'label_bouton'=>_T('bouton_choisir'));
}
$methodes['distant'] = array('label_lien'=>_T('medias:bouton_download_sur_le_web'),'label_bouton'=>_T('bouton_choisir'));
// pipeline pour les méthodes d'upload

marcimat@rezo.net
a validé
$objet = isset($env['objet']) ? $env['objet'] : '';
$id_objet = isset($env['id_objet']) ? $env['id_objet'] : '';
$methodes = pipeline('medias_methodes_upload',
array(

marcimat@rezo.net
a validé
'args' => array('objet' => $objet, 'id_objet' => $id_objet),
'data' => $methodes
)
);
return $methodes;

cedric@yterium.com
a validé
}
function duree_en_secondes($duree, $precis = false) {
$out = "";
$heures = $minutes = 0;
if ($duree>3600) {
$heures = intval(floor($duree/3600));
$duree -= $heures * 3600;
}
if ($duree>60) {
$minutes = intval(floor($duree/60));
$duree -= $minutes * 60;
}
if ($heures>0 or $minutes>0) {
$out = _T('date_fmt_heures_minutes', array('h' => $heures, 'm' => $minutes));
if (!$heures) {
$out = preg_replace(',^0[^\d]+,Uims', '', $out);
}
}
if (!$heures or $precis) {
$out .= intval($duree).'s';
}
return $out;
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
}
/**
* Trouver le fond pour embarquer un document
* - avec une extension
* - avec un mime_type donne
*
* => modeles/{modele_base}_emb_html.html si il existe
* => modeles/{modele_base}_text_html.html si il existe,
* => modeles/{modele_base}_text.html si il existe,
* => modeles/{modele_base}.html sinon
*
* @param $extension
* @param $mime_type
* @return mixed
*/
function medias_trouver_modele_emb($extension, $mime_type, $modele_base='file') {
if ($extension and trouve_modele($fond = $modele_base . '_emb_' . $extension)) {
return $fond;
}
$fond = $modele_base . '_emb_' . preg_replace(',\W,', '_', $mime_type);
if (trouve_modele($fond)) {
return $fond;
}
$fond = $modele_base . '_emb_' . preg_replace(',\W.*$,', '', $mime_type);
if (trouve_modele($fond)) {
return $fond;
}
return $modele_base;
}
marcimat
a validé
/**
* Liste les classes standards des modèles de documents SPIP.
*
* @note
* le nomage au pluriel est historique.
* préférer au singulier pour toute nouvelle classe.
*
* @param int $id_document
* @param string $media
* @param array $env
* @param array $get
* @return string
*/
function filtre_medias_modele_document_standard_classes_dist($Pile, $id_document, $media) {
$env = $Pile[0];
$var = $Pile['vars'] ?? [];
$classes = [];
$classes[] = "spip_document_$id_document";
cerdic
a validé
$classes[] = 'spip_document';
marcimat
a validé
$classes[] = 'spip_documents';
$classes[] = "spip_document_$media";
marcimat
a validé
if (!empty($env['align'])) {
$classes[] = 'spip_documents_' . $env['align'];
cerdic
a validé
$classes[] = 'spip_document_' . $env['align'];
marcimat
a validé
} elseif ($media === 'image') {
$classes[] = 'spip_documents_center';
cerdic
a validé
$classes[] = 'spip_document_center';
marcimat
a validé
}
if (!empty($var['legende'])) {
$classes[] = "spip_document_avec_legende";
marcimat
a validé
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
}
if (!empty($env['class'])) {
$classes[] = $env['class'];
}
return implode(" ", $classes);
}
/**
* Liste les attributs data standards des modèles de documents SPIP.
*
* @param int $id_document
* @param string $media
* @param array $env
* @param array $get
* @return string
*/
function filtre_medias_modele_document_standard_attributs_dist($Pile, $id_document, $media) {
$var = $Pile['vars'] ?? [];
$attrs = [];
if (!empty($var['legende'])) {
$len = spip_strlen(textebrut($var['legende']));
// des x. "x" = 32 caratères, "xx" => 64, "xxx" => 128, etc...
$lenx = medias_str_repeat_log($len, 2, "x", 4);
$attrs['data-legende-len'] = $len;
$attrs['data-legende-lenx'] = $lenx;
}
$res = "";
foreach($attrs as $attr => $value) {
$res .= "$attr=\"" . attribut_html($value) . "\"";
};
return $res;
}
/**
* Retourne une chaine répétée d'autant de fois le logarithme
*
* @example medias_str_repeat_log(124, 2)
*
* Avec $base = 2 et $remove = 0
*
* 0 =>
* 2 => x
* 4 => xx
* 8 => xxx
* 16 => xxxx
* 32 => xxxxx
* 64 => xxxxxx
*
* @example medias_str_repeat_log(124, 2, "x", 4)
*
* Avec $base = 2 et $remove = 4
*
* 0 =>
* 2 =>
* 4 =>
* 8 =>
* 16 =>
* 32 => x
* 64 => xx
*
* @note
* L'inverse (nb caractères => valeur) est donc `pow($base, $nb_char)`
*
* En partant du nombre de "x" on retrouve la fourchette du nombre de départ.
* Si $base = 2 et $remove = 4 :
*
* - "xxx" = 2 ^ (strlen("xxx") + 4) = 2 ^ (3 + 4) = 128
* - "xxxxx" = 2 ^ (5 + 4) = 512
* x = 32,
* xx = 64
* xxx = 128
* xxxx = 256
* xxxxx = 512
* ...
*
* Ce qui veut dire que "xxx" provient d'une valeur entre 128 et 255.
*
* @note
* C'est surtout utile pour une sélection en CSS (car CSS ne permet pas de sélecteur "lower than" ou "greater than") :
*
* ```spip
* <div class='demo' data-demo-lenx='[(#TEXTE|textebrut|spip_strlen|medias_str_repeat_log{2,x,4})]'>...</div>`
marcimat
a validé
* ```
*
* ```css
marcimat
a validé
* // le contenu fait au moins 256 caractères
* }
marcimat
a validé
* // le contenu fait au moins 256 caractères
* }
* ```
*
* @param float $num
* @param float $log
* @param string $pad_string
* @param int $remove : Nombre de caractères à enlever.
*
* @return string Des x
*/
function medias_str_repeat_log($num, $base = 2, $string = "x", $remove = 0) {
$pad = str_repeat($string, (int)log($num, $base));
return substr($pad, $remove);
}