Skip to content
Extraits de code Groupes Projets

Comparer les révisions

Les modifications sont affichées comme si la révision source était fusionnée avec la révision cible. En savoir plus sur la comparaison des révisions.

Source

Sélectionner le projet cible
No results found

Cible

Sélectionner le projet cible
  • spip/medias
  • pierre.laszczak/medias
  • cy.altern/medias
  • MathieuAlphamosa/medias
  • taffit/medias
  • RealET/medias
  • johan/medias
  • Yohooo/medias
  • pierretux/medias
  • placido/medias
  • JLuc/medias
11 résultats
Afficher les modifications
Affichage de
avec 817 ajouts et 1097 suppressions
<?php
/**
* Tache de nettoyages du répertoire tmp/upload
*
* @plugin Medias
* @licence GNU/GPL
* @package SPIP\Medias\Genie
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Enlève les fichiers trop vieux du répertoire tmp/upload
*
* @param int $last
* @return int
**/
function genie_medias_nettoyer_repertoire_upload_dist($last) {
include_spip('inc/invalideur');
purger_repertoire(_DIR_TMP . 'upload', [
'mtime' => time() - 180 * 24 * 3600,
'subdir' => true,
]);
return 1;
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Gestion des modes de documents
*
* @package SPIP\Medias\Mime_type
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function inc_calculer_mime_type_application_mp4_dist(int $id_document, string $extension, string $mime_type) {
$media = sql_getfetsel('media', 'spip_documents', 'id_document=' . intval($id_document));
if (in_array($media, ['audio', 'video'])) {
$mime_type = str_replace('application/', $media . '/', $mime_type);
return $mime_type;
}
return null;
}
<?php
/**
* SPIP, Système de publication pour l'internet
*
* Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
*
* Ce programme est un logiciel libre distribué sous licence GNU/GPL.
*/
/**
* Recherche de logo
*
* @package SPIP\Core\Logos
*/
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* Cherche le logo d'un élément d'objet
*
* @param int $id
* Identifiant de l'objet
* @param string $_id_objet
* Nom de la clé primaire de l'objet
* @param string $mode
* Mode de survol du logo désiré (on ou off)
* @param bool $compat_old_logos (unused) @deprecated 5.0
* @return array
* - Liste (chemin complet du fichier, répertoire de logos, nom du logo, extension du logo, date de modification[, doc])
* - array vide aucun logo trouvé.
*/
function inc_chercher_logo_dist(
int $id,
string $_id_objet,
string $mode = 'on',
bool $compat_old_logos = false
): array {
$mode = preg_replace(',\W,', '', $mode);
if ($mode) {
// chercher dans la base
$mode_document = 'logo' . $mode;
$objet = objet_type($_id_objet);
$doc = sql_fetsel(
'D.*',
'spip_documents AS D JOIN spip_documents_liens AS L ON L.id_document=D.id_document',
'D.mode=' . sql_quote($mode_document) . ' AND L.objet=' . sql_quote($objet) . ' AND id_objet=' . $id
);
if ($doc) {
include_spip('inc/documents');
$d = get_spip_doc($doc['fichier']);
return [$d, _DIR_IMG, basename($d), $doc['extension'], @filemtime($d), $doc];
}
}
# coherence de type pour servir comme filtre (formulaire_login)
return [];
}
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Gestion des modes de documents * Gestion des modes de documents
...@@ -34,16 +33,15 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -34,16 +33,15 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function inc_choisir_mode_document($infos, $type_inclus_image, $objet) { function inc_choisir_mode_document($infos, $type_inclus_image, $objet) {
// si ce n'est pas une image, c'est forcement un document // si ce n'est pas une image, c'est forcement un document
if (!$infos['type_image'] or !$type_inclus_image) { if (!$infos['type_image'] || !$type_inclus_image) {
return 'document'; return 'document';
} }
// si on a pas le droit d'ajouter de document a l'objet, c'est donc un mode image // si on a pas le droit d'ajouter de document a l'objet, c'est donc un mode image
if ($objet and isset($GLOBALS['meta']["documents_$objet"]) and ($GLOBALS['meta']["documents_$objet"] == 'non')) { if ($objet && isset($GLOBALS['meta']["documents_$objet"]) && $GLOBALS['meta']["documents_$objet"] == 'non') {
return 'image'; return 'image';
} }
// _INTERFACE_DOCUMENTS // _INTERFACE_DOCUMENTS
// en fonction de la taille de l'image // en fonction de la taille de l'image
// par defaut l'affectation en fonction de la largeur de l'image // par defaut l'affectation en fonction de la largeur de l'image
...@@ -57,11 +55,11 @@ function inc_choisir_mode_document($infos, $type_inclus_image, $objet) { ...@@ -57,11 +55,11 @@ function inc_choisir_mode_document($infos, $type_inclus_image, $objet) {
return 'image'; return 'image';
} }
if ($infos['largeur'] > 0 if (
and $infos['largeur'] < _LARGEUR_MODE_IMAGE $infos['largeur'] > 0 && $infos['largeur'] < _LARGEUR_MODE_IMAGE
) { ) {
return 'image'; return 'image';
} else {
return 'document';
} }
return 'document';
} }
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Gestion des modes de documents * Gestion des modes de documents
...@@ -42,34 +41,32 @@ function inc_determiner_statut_document($id_document, $statut_ancien, $date_publ ...@@ -42,34 +41,32 @@ function inc_determiner_statut_document($id_document, $statut_ancien, $date_publ
while ($row = sql_fetch($res)) { while ($row = sql_fetch($res)) {
if ( if (
// si ce n'est pas un logo // si ce n'est pas un logo
!in_array($row['mode'], array('logoon','logooff')) !in_array($row['mode'], ['logoon', 'logooff']) && ($row['objet'] == 'rubrique' || objet_test_si_publie(
and ( $row['objet'],
// cas particulier des rubriques qui sont publiees des qu'elles contiennent un document ! $row['id_objet']
$row['objet'] == 'rubrique' ))
// ou si objet publie selon sa declaration
or objet_test_si_publie($row['objet'], $row['id_objet'])
)
) { ) {
$statut = 'publie'; $statut = 'publie';
$date_publication = 0; $date_publication = 0;
continue; continue;
} // si pas publie, et article, il faut checker la date de post-publi eventuelle } // si pas publie, et article, il faut checker la date de post-publi eventuelle
elseif ($row['objet'] == 'article' elseif (
and $row2 = sql_fetsel( $row['objet'] == 'article'
&& ($row2 = sql_fetsel(
'date', 'date',
'spip_articles', 'spip_articles',
'id_article=' . intval($row['id_objet']) . " AND statut='publie'" 'id_article=' . intval($row['id_objet']) . " AND statut='publie'"
) ))
) { ) {
$statut = 'publie'; $statut = 'publie';
$date_publication = min($date_publication, strtotime($row2['date'])); $date_publication = min($date_publication, strtotime((string) $row2['date']));
} }
} }
$date_publication = date('Y-m-d H:i:s', $date_publication); $date_publication = date('Y-m-d H:i:s', $date_publication);
if ($statut == 'publie' and $statut_ancien == 'publie' and $date_publication == $date_publication_ancienne) { if ($statut == 'publie' && $statut_ancien == 'publie' && $date_publication == $date_publication_ancienne) {
return false; return false;
} }
if ($statut != 'publie' and $statut_ancien != 'publie' and $statut_ancien != '0') { if ($statut != 'publie' && $statut_ancien != 'publie' && $statut_ancien != '0') {
return false; return false;
} }
......
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Calcul du portfolio / liste de documents de l'espace privé * Calcul du portfolio / liste de documents de l'espace privé
* *
* @package SPIP\Medias\Fonctions * @package SPIP\Medias\Fonctions
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -31,7 +29,7 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -31,7 +29,7 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @param int $id Identifiant de l'objet * @param int $id Identifiant de l'objet
* @param string $type Type d'objet * @param string $type Type d'objet
* @return string code HTML * @return string code HTML
**/ */
function inc_documenter_objet_dist($id, $type) { function inc_documenter_objet_dist($id, $type) {
$serveur = ''; $serveur = '';
...@@ -39,12 +37,16 @@ function inc_documenter_objet_dist($id, $type) { ...@@ -39,12 +37,16 @@ function inc_documenter_objet_dist($id, $type) {
$spip_table_objet = table_objet_sql($type); $spip_table_objet = table_objet_sql($type);
$table_objet = table_objet($type); $table_objet = table_objet($type);
$id_table_objet = id_table_objet($type, $serveur); $id_table_objet = id_table_objet($type, $serveur);
$champs = sql_fetsel('*', $spip_table_objet, addslashes($id_table_objet) . '=' . intval($id)); $champs = sql_fetsel('*', $spip_table_objet, addslashes((string) $id_table_objet) . '=' . intval($id));
$marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc'); $marquer_doublons_doc = charger_fonction('marquer_doublons_doc', 'inc');
$marquer_doublons_doc($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur); $marquer_doublons_doc($champs, $id, $type, $id_table_objet, $table_objet, $spip_table_objet, '', $serveur);
$contexte = array('objet' => $type, 'id_objet' => $id); $contexte = [
'objet' => $type,
'id_objet' => $id,
'espace_prive' => test_espace_prive(),
];
return recuperer_fond('prive/objets/contenu/portfolio_document', array_merge($_GET, $contexte)); return recuperer_fond('prive/objets/contenu/portfolio_document', array_merge($_GET, $contexte));
} }
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -25,10 +24,137 @@ if (!defined('CHARSET_JOINT')) { ...@@ -25,10 +24,137 @@ if (!defined('CHARSET_JOINT')) {
define('CHARSET_JOINT', 'iso-8859-1'); define('CHARSET_JOINT', 'iso-8859-1');
} }
/**
* Donne le chemin du fichier relatif à `_DIR_IMG`
* pour stockage 'tel quel' dans la base de données
*
* @uses _DIR_IMG
*/
function set_spip_doc(?string $fichier): string {
if ($fichier && str_starts_with($fichier, (string) _DIR_IMG)) {
return substr($fichier, strlen((string) _DIR_IMG));
}
// ex: fichier distant
return $fichier ?? '';
}
/**
* Donne le chemin complet du fichier
*
* @uses _DIR_IMG
*
* @return bool|string
*/
function get_spip_doc(?string $fichier) {
$fichier_demande = $fichier;
if ($fichier === null) {
return false;
}
// fichier distant
if (tester_url_absolue($fichier)) {
return $fichier;
}
// gestion d'erreurs, fichier=''
if (!strlen($fichier)) {
return false;
}
if (!str_starts_with($fichier, (string) _DIR_IMG)) {
$fichier = _DIR_IMG . $fichier;
}
$fichier = pipeline('get_spip_doc', [
'args' => [
'fichier' => $fichier_demande,
],
'data' => $fichier,
]);
// fichier normal
return $fichier;
}
/**
* Copier un document `$source`
* dans un dossier `IMG/$ext/$orig.$ext` ou `IMG/$subdir/$orig.$ext` si `$subdir` est fourni
* en numérotant éventuellement si un fichier de même nom existe déjà
*
* @param string $ext
* @param string $orig
* @param string $source
* @param string $subdir
* @return bool|mixed|string
*/
function copier_document($ext, $orig, $source, $subdir = null) {
$orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc
$dir = creer_repertoire_documents($subdir ?: $ext);
$dest = preg_replace('/<[^>]*>/', '', basename($orig));
$dest = preg_replace('/\.([^.]+)$/', '', $dest);
$dest = translitteration($dest);
$dest = preg_replace('/[^.=\w-]+/', '_', (string) $dest);
// ne pas accepter de noms de la forme -r90.jpg qui sont reserves
// pour les images transformees par rotation (action/documenter)
$dest = preg_replace(',-r(90|180|270)$,', '', $dest);
while (preg_match(',\.(\w+)$,', $dest, $m)) {
if (
!function_exists('verifier_upload_autorise')
|| !($r = verifier_upload_autorise($dest))
|| !empty($r['autozip'])
) {
$dest = substr($dest, 0, -strlen($m[0])) . '_' . $m[1];
break;
}
$dest = substr($dest, 0, -strlen($m[0]));
$ext = $m[1] . '.' . $ext;
}
// Si le document "source" est deja au bon endroit, ne rien faire
if ($source == ($dir . $dest . '.' . $ext)) {
return $source;
}
// sinon tourner jusqu'a trouver un numero correct
$n = 0;
while (@file_exists($newFile = $dir . $dest . ($n++ ? ('-' . $n) : '') . '.' . $ext)) {
}
return deplacer_fichier_upload($source, $newFile);
}
/**
* Efface le répertoire de manière récursive !
*
* @param string $nom
*/
function effacer_repertoire_temporaire($nom) {
if ($d = opendir($nom)) {
while (($f = readdir($d)) !== false) {
if (is_file("$nom/$f")) {
spip_unlink("$nom/$f");
} else {
if ($f != '.' && $f != '..' && is_dir("$nom/$f")) {
effacer_repertoire_temporaire("$nom/$f");
}
}
}
}
closedir($d);
@rmdir($nom);
}
// Filtre pour #FICHIER permettant d'incruster le contenu d'un document // Filtre pour #FICHIER permettant d'incruster le contenu d'un document
// Si 2e arg fourni, conversion dans le charset du site si possible // Si 2e arg fourni, conversion dans le charset du site si possible
// https://code.spip.net/@contenu_document
function contenu_document($arg, $charset = '') { function contenu_document($arg, $charset = '') {
include_spip('inc/distant'); include_spip('inc/distant');
if (is_numeric($arg)) { if (is_numeric($arg)) {
...@@ -53,7 +179,7 @@ function contenu_document($arg, $charset = '') { ...@@ -53,7 +179,7 @@ function contenu_document($arg, $charset = '') {
include_spip('inc/charsets'); include_spip('inc/charsets');
if ($charset !== 'auto') { if ($charset !== 'auto') {
$r = importer_charset($r, $charset); $r = importer_charset($r, $charset);
} elseif ($GLOBALS['meta']['charset'] == 'utf-8' and !is_utf8($r)) { } elseif ($GLOBALS['meta']['charset'] == 'utf-8' && !is_utf8($r)) {
$r = importer_charset($r, CHARSET_JOINT); $r = importer_charset($r, CHARSET_JOINT);
} }
} }
...@@ -61,11 +187,11 @@ function contenu_document($arg, $charset = '') { ...@@ -61,11 +187,11 @@ function contenu_document($arg, $charset = '') {
return $r; return $r;
} }
// https://code.spip.net/@generer_url_document_dist
function generer_url_document_dist($id_document, $args = '', $ancre = '') { function generer_url_document_dist($id_document, $args = '', $ancre = '') {
include_spip('inc/autoriser'); include_spip('inc/autoriser');
if (!autoriser('voir', 'document', $id_document)) { // si on a pas le droit de voir le document, meme via le htaccess
if (!autoriser('voir', 'document', $id_document, null, ['htaccess' => true])) {
return ''; return '';
} }
...@@ -81,10 +207,9 @@ function generer_url_document_dist($id_document, $args = '', $ancre = '') { ...@@ -81,10 +207,9 @@ function generer_url_document_dist($id_document, $args = '', $ancre = '') {
return $f; return $f;
} }
// Si droit de voir tous les docs, pas seulement celui-ci // Si droit de voir tous les docs, sans htaccess, pas seulement celui-ci
// il est inutilement couteux de rajouter une protection // il est inutilement couteux de rajouter une protection
$r = (autoriser('voir', 'document')); if (autoriser('voir', 'document')) {
if (($r and $r !== 'htaccess')) {
return get_spip_doc($f); return get_spip_doc($f);
} }
...@@ -97,7 +222,7 @@ function generer_url_document_dist($id_document, $args = '', $ancre = '') { ...@@ -97,7 +222,7 @@ function generer_url_document_dist($id_document, $args = '', $ancre = '') {
. 'arg=' . $id_document . 'arg=' . $id_document
. ($ancre ? "&ancre=$ancre" : '') . ($ancre ? "&ancre=$ancre" : '')
. '&cle=' . calculer_cle_action($id_document . ',' . $f) . '&cle=' . calculer_cle_action($id_document . ',' . $f)
. '&file=' . rawurlencode($f), . '&file=' . rawurlencode((string) $f),
true, true,
true true
); );
...@@ -116,38 +241,32 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c ...@@ -116,38 +241,32 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c
include_spip('inc/distant'); include_spip('inc/distant');
include_spip('inc/texte'); include_spip('inc/texte');
include_spip('inc/filtres_images_mini'); include_spip('inc/filtres_images_mini');
if (is_null($class)) { if ($class === null) {
$class = 'spip_logo spip_logos'; $class = 'spip_logo spip_logos';
} }
$e = $doc['extension']; $e = $doc['extension'] ?? null;
if (!$img) { if (!$img) {
if ($img = image_du_document($doc, $connect)) { $img = image_du_document($doc, $connect);
if (!$x and !$y) { }
// eviter une double reduction if (!$img) {
$img = image_reduire($img); $f = charger_fonction('vignette', 'inc');
} $img = $f($e, $doc['media'] ?? '');
} else { $class .= ' spip_document_icone';
$f = charger_fonction('vignette', 'inc');
$img = $f($e, false);
$size = @spip_getimagesize($img);
$img = "<img src='$img' " . $size[3] . ' />';
$class .= " spip_document_icone";
}
} else {
$size = @spip_getimagesize($img);
$img = "<img src='$img' " . $size[3] . ' />';
} }
$size = @spip_getimagesize($img);
$img = "<img src='$img' " . ($size[3] ?? '') . ' />';
// on appelle image_reduire independamment de la presence ou non // on appelle image_reduire independamment de la presence ou non
// des librairies graphiques // des librairies graphiques
// la fonction sait se debrouiller et faire de son mieux dans tous les cas // la fonction sait se debrouiller et faire de son mieux dans tous les cas
if ($x or $y) { if ($x || $y) {
$img = image_reduire($img, $x, $y); $img = image_reduire($img, $x, $y);
} }
$img = inserer_attribut($img, 'alt', ''); $img = inserer_attribut($img, 'alt', '');
$img = inserer_attribut($img, 'class', trim($class));
if ($align) { if ($align) {
$img = inserer_attribut($img, 'align', $align); $class .= " spip_logo_$align";
} }
$img = inserer_attribut($img, 'class', trim((string) $class));
if (!$lien) { if (!$lien) {
return $img; return $img;
...@@ -180,12 +299,13 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c ...@@ -180,12 +299,13 @@ function vignette_automatique($img, $doc, $lien, $x = 0, $y = 0, $align = '', $c
* @return string Chemin de l’image * @return string Chemin de l’image
*/ */
function image_du_document($document, $connect = null) { function image_du_document($document, $connect = null) {
if ($e = $document['extension'] if (
and in_array($e, formats_image_acceptables()) ($e = $document['extension'] ?? null)
and (!test_espace_prive() or $GLOBALS['meta']['creer_preview'] == 'oui') && in_array($e, formats_image_acceptables())
and $document['fichier'] && (!test_espace_prive() || $GLOBALS['meta']['creer_preview'] == 'oui')
&& $document['fichier']
) { ) {
include_spip('inc/quete'); include_spip('public/quete_document');
if ($document['distant'] == 'oui') { if ($document['distant'] == 'oui') {
$image = _DIR_RACINE . copie_locale($document['fichier']); $image = _DIR_RACINE . copie_locale($document['fichier']);
} elseif ($image = document_spip_externe($document['fichier'], $connect)) { } elseif ($image = document_spip_externe($document['fichier'], $connect)) {
...@@ -218,27 +338,27 @@ function image_du_document($document, $connect = null) { ...@@ -218,27 +338,27 @@ function image_du_document($document, $connect = null) {
* *
* @return string * @return string
* Texte du raccourcis * Texte du raccourcis
**/ */
function affiche_raccourci_doc($doc, $id, $align = '', $short = false) { function affiche_raccourci_doc($doc, $id, $align = '', $short = false) {
$pipe = ''; $pipe = '';
if ($align) { if ($align) {
$pipe = "|$align"; $pipe = "|$align";
} }
$model = "&lt;$doc$id$pipe&gt;"; $model = "&lt;$doc$id$pipe&gt;";
$text = $model; $text = $model;
if ($short) { if ($short) {
$text = $align ? $align : $model; $text = $align ?: $model;
} }
$classes = "btn btn_link btn_mini"; $classes = 'btn btn_link btn_mini';
$classes = " class=\"$classes\""; $classes = " class=\"$classes\"";
$styles = ''; $styles = '';
if ($align && !$short) { if ($align && !$short) {
// a priori ne sert plus de toutes façons… // a priori ne sert plus de toutes façons…
$styles = "text-align: " . ($align ?: 'center') . ";"; $styles = 'text-align: ' . ($align ?: 'center') . ';';
$styles = " style=\"$styles\""; $styles = " style=\"$styles\"";
} }
...@@ -247,6 +367,6 @@ function affiche_raccourci_doc($doc, $id, $align = '', $short = false) { ...@@ -247,6 +367,6 @@ function affiche_raccourci_doc($doc, $id, $align = '', $short = false) {
$title = attribut_html(_T('medias:inserer_raccourci')); $title = attribut_html(_T('medias:inserer_raccourci'));
$title = " title=\"$title\""; $title = " title=\"$title\"";
return "\n<button{$classes}{$styles}{$js}{$title}>$text</button>\n"; return "\n<button{$classes}{$styles}{$js}{$title}>$text</button>\n";
} }
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Gère un cas d'upload trop gros * Gère un cas d'upload trop gros
...@@ -17,7 +16,7 @@ ...@@ -17,7 +16,7 @@
* Mais fonction utilisée encore dans medias_detecter_fond_par_defaut() * Mais fonction utilisée encore dans medias_detecter_fond_par_defaut()
* *
* @package SPIP\Medias\Upload * @package SPIP\Medias\Upload
**/ */
# #
# Fichier obsolete, a supprimer # Fichier obsolete, a supprimer
...@@ -32,7 +31,6 @@ include_once _DIR_RESTREINT . 'inc/documents.php'; ...@@ -32,7 +31,6 @@ include_once _DIR_RESTREINT . 'inc/documents.php';
include_spip('inc/minipres'); include_spip('inc/minipres');
/** /**
* Traite l'erreur d'un upload trop gros * Traite l'erreur d'un upload trop gros
* *
...@@ -40,8 +38,8 @@ include_spip('inc/minipres'); ...@@ -40,8 +38,8 @@ include_spip('inc/minipres');
* et affiche un minipres avec la taille limite de documents possibles * et affiche un minipres avec la taille limite de documents possibles
* *
* @see minipres() * @see minipres()
**/ */
function erreur_upload_trop_gros() { function erreur_upload_trop_gros(): never {
include_spip('inc/filtres'); include_spip('inc/filtres');
$msg = '<p>' $msg = '<p>'
...@@ -49,7 +47,7 @@ function erreur_upload_trop_gros() { ...@@ -49,7 +47,7 @@ function erreur_upload_trop_gros() {
. '<br />' . '<br />'
. _T( . _T(
'medias:upload_limit', 'medias:upload_limit',
array('max' => ini_get('upload_max_filesize')) ['max' => ini_get('upload_max_filesize')]
) )
. '</p>'; . '</p>';
......
<?php <?php
use Spip\Archiver\SpipArchiver;
/***************************************************************************\ /***************************************************************************\
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet *
* * * *
...@@ -7,136 +9,115 @@ ...@@ -7,136 +9,115 @@
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James *
* * * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. *
\***************************************************************************/ \***************************************************************************/
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
/** /**
* Recuperer le nom du fichier selon le mode d'upload choisi * Recuperer le nom du fichier selon le mode d'upload choisi
* et mettre cela au format $_FILES * et mettre cela au format $_FILES
* *
* Renvoie une liste de fichier ou un message en cas d'erreur * Renvoie une liste de fichier ou un message en cas d'erreur
* *
* @return string/array * @return string|array
*/ */
function joindre_trouver_fichier_envoye() { function joindre_trouver_fichier_envoye() {
static $files = array(); static $files = [];
// on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif // on est appele deux fois dans un hit, resservir ce qu'on a trouve a la verif
// lorsqu'on est appelle au traitement // lorsqu'on est appelle au traitement
if (count($files)) { if (is_countable($files) ? count($files) : 0) {
return $files; return $files;
} }
if (_request('joindre_upload')) { if (_request('joindre_upload')) {
$post = isset($_FILES) ? $_FILES : $GLOBALS['HTTP_POST_FILES']; $files = joindre_trouver_http_post_files();
$files = array(); // erreur ?
if (is_array($post)) { if (is_string($files)) {
include_spip('action/ajouter_documents'); return $files;
foreach ($post as $file) { }
if (is_array($file['name'])) { // rien envoye ?
while (count($file['name'])) { if (!count($files)) {
$test = array( return _T('medias:erreur_indiquez_un_fichier');
'error' => array_shift($file['error']), }
'name' => array_shift($file['name']), // verifions les types de fichier envoyes
'tmp_name' => array_shift($file['tmp_name']), include_spip('action/ajouter_documents');
'type' => array_shift($file['type']), foreach ($files as $file) {
); if (!is_array(verifier_upload_autorise($file['name']))) {
if (!($test['error'] == 4)) { return _T('medias:erreur_upload_type_interdit', ['nom' => $file['name']]);
if (is_string($err = joindre_upload_error($test['error']))) {
return $err;
} // un erreur upload
if (!is_array(verifier_upload_autorise($test['name']))) {
return _T('medias:erreur_upload_type_interdit', array('nom' => $test['name']));
}
$files[] = $test;
}
}
} else {
//UPLOAD_ERR_NO_FILE
if (!($file['error'] == 4)) {
if (is_string($err = joindre_upload_error($file['error']))) {
return $err;
} // un erreur upload
if (!is_array(verifier_upload_autorise($file['name']))) {
return _T('medias:erreur_upload_type_interdit', array('nom' => $file['name']));
}
$files[] = $file;
}
}
}
if (!count($files)) {
return _T('medias:erreur_indiquez_un_fichier');
} }
} }
return $files; return $files;
} elseif (_request('joindre_distant')) { } elseif (_request('joindre_distant')) {
$path = _request('url'); $path = _request('url');
if (!strlen($path) or $path == 'http://') { if (!strlen((string) $path) || $path == 'http://') {
return _T('medias:erreur_indiquez_un_fichier'); return _T('medias:erreur_indiquez_un_fichier');
} }
include_spip('inc/distant'); include_spip('inc/distant');
if (!valider_url_distante($path)) { if (!valider_url_distante($path)) {
return _T('medias:erreur_upload_type_interdit', array('nom' => $path)); return _T('medias:erreur_upload_type_interdit', ['nom' => $path]);
} }
include_spip('action/ajouter_documents'); include_spip('action/ajouter_documents');
$infos = renseigner_source_distante($path); $infos = renseigner_source_distante($path, 'valider_url_distante');
if (!is_array($infos)) { if (!is_array($infos)) {
return $infos; return $infos;
} // message d'erreur } // message d'erreur
else {
return array( return [
array( [
'name' => basename($path), 'name' => basename((string) $path),
'tmp_name' => $path, 'tmp_name' => $path,
'distant' => true, 'distant' => true,
) ],
); ];
}
} elseif (_request('joindre_ftp')) { } elseif (_request('joindre_ftp')) {
$path = _request('cheminftp'); $path = _request('cheminftp');
if (!$path || strstr($path, '..')) { if (!$path || strstr((string) $path, '..')) {
return _T('medias:erreur_indiquez_un_fichier'); return _T('medias:erreur_indiquez_un_fichier');
} }
include_spip('inc/documents'); include_spip('inc/documents');
include_spip('inc/actions'); include_spip('inc/actions');
$upload = determine_upload(); $upload = determine_upload();
if ($path != '/' and $path != './') { if ($path != '/' && $path != './') {
$upload .= $path; $upload .= $path;
} }
if (!is_dir($upload)) { if (!is_dir($upload)) {
// seul un fichier est demande // seul un fichier est demande
return array( return [
array( [
'name' => basename($upload), 'name' => basename($upload),
'tmp_name' => $upload 'tmp_name' => $upload,
) ],
); ];
} else { }
// on upload tout un repertoire // on upload tout un repertoire
$files = array(); $files = [];
foreach (preg_files($upload) as $fichier) { foreach (preg_files($upload) as $fichier) {
$files[] = array( $files[] = [
'name' => basename($fichier), 'name' => basename($fichier),
'tmp_name' => $fichier 'tmp_name' => $fichier,
); ];
}
return $files;
} }
} elseif (_request('joindre_zip') and $token_zip = _request('chemin_zip')) {
return $files;
} elseif (
_request('joindre_zip')
&& ($token_zip = _request('chemin_zip'))
) {
$zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ? $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ?
unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array()); unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : []);
if (!$zip_to_clean if (
or !isset($zip_to_clean[$token_zip]) !$zip_to_clean
or !$path = $zip_to_clean[$token_zip]) { || !isset($zip_to_clean[$token_zip])
|| !($path = $zip_to_clean[$token_zip])
) {
return _T('avis_operation_impossible'); return _T('avis_operation_impossible');
} }
...@@ -147,24 +128,73 @@ function joindre_trouver_fichier_envoye() { ...@@ -147,24 +128,73 @@ function joindre_trouver_fichier_envoye() {
return _T('avis_operation_impossible'); return _T('avis_operation_impossible');
} }
$files = array(); $files = [];
if (_request('options_upload_zip') == 'deballe') { if (_request('options_upload_zip') == 'deballe') {
$files = joindre_deballer_lister_zip($path, _TMP_DIR); $files = joindre_deballer_lister_zip($path, _TMP_DIR);
} }
// si le zip doit aussi etre conserve, l'ajouter // si le zip doit aussi etre conserve, l'ajouter
if (_request('options_upload_zip') == 'upload' or _request('options_deballe_zip_conserver')) { if (_request('options_upload_zip') == 'upload' || _request('options_deballe_zip_conserver')) {
$files[] = array( $files[] = [
'name' => basename($path), 'name' => basename((string) $path),
'tmp_name' => $path, 'tmp_name' => $path,
); ];
} }
return $files; return $files;
} }
return array(); return [];
} }
/**
* Récupérer et mettre en forme la liste des fichiers postes
* que ce soit via plusieurs input file ou via un input file multiple
* @param $name : nom de l'input qu'on veut recuperer si on ne veut pas tous les fichiers
* @return array|string
* string en cas d'erreur
*/
function joindre_trouver_http_post_files($name = null) {
$post = $_FILES;
$files = [];
if (is_array($post)) {
foreach ($post as $input_name => $file) {
if ($name && $input_name !== $name) {
continue;
}
if (is_array($file['name'])) {
while (is_countable($file['name']) ? count($file['name']) : 0) {
$test = [
'input_name' => $input_name,
'error' => array_shift($file['error']),
'name' => array_shift($file['name']),
'tmp_name' => array_shift($file['tmp_name']),
'type' => array_shift($file['type']),
];
//UPLOAD_ERR_NO_FILE
if (!($test['error'] == 4)) {
// un erreur upload
if (is_string($err = joindre_upload_error($test['error']))) {
return $err;
}
$files[] = $test;
}
}
} else {
//UPLOAD_ERR_NO_FILE
if (!($file['error'] == 4)) {
// un erreur upload
if (is_string($err = joindre_upload_error($file['error']))) {
return $err;
}
$file['input_name'] = $input_name;
$files[] = $file;
}
}
}
}
return $files;
}
// Erreurs d'upload // Erreurs d'upload
// renvoie false si pas d'erreur // renvoie false si pas d'erreur
...@@ -172,6 +202,7 @@ function joindre_trouver_fichier_envoye() { ...@@ -172,6 +202,7 @@ function joindre_trouver_fichier_envoye() {
// pour les autres erreurs renvoie le message d'erreur // pour les autres erreurs renvoie le message d'erreur
function joindre_upload_error($error) { function joindre_upload_error($error) {
$msg = null;
if (!$error) { if (!$error) {
return false; return false;
} }
...@@ -180,23 +211,23 @@ function joindre_upload_error($error) { ...@@ -180,23 +211,23 @@ function joindre_upload_error($error) {
case 4: /* UPLOAD_ERR_NO_FILE */ case 4: /* UPLOAD_ERR_NO_FILE */
return true; return true;
# on peut affiner les differents messages d'erreur # on peut affiner les differents messages d'erreur
case 1: /* UPLOAD_ERR_INI_SIZE */ case 1: /* UPLOAD_ERR_INI_SIZE */
$msg = _T( $msg = _T(
'medias:upload_limit', 'medias:upload_limit',
array('max' => ini_get('upload_max_filesize')) ['max' => ini_get('upload_max_filesize')]
); );
break; break;
case 2: /* UPLOAD_ERR_FORM_SIZE */ case 2: /* UPLOAD_ERR_FORM_SIZE */
$msg = _T( $msg = _T(
'medias:upload_limit', 'medias:upload_limit',
array('max' => ini_get('upload_max_filesize')) ['max' => ini_get('upload_max_filesize')]
); );
break; break;
case 3: /* UPLOAD_ERR_PARTIAL */ case 3: /* UPLOAD_ERR_PARTIAL */
$msg = _T( $msg = _T(
'medias:upload_limit', 'medias:upload_limit',
array('max' => ini_get('upload_max_filesize')) ['max' => ini_get('upload_max_filesize')]
); );
break; break;
case 6: /* UPLOAD_ERR_NO_TMP_DIR */ case 6: /* UPLOAD_ERR_NO_TMP_DIR */
...@@ -220,39 +251,39 @@ function joindre_upload_error($error) { ...@@ -220,39 +251,39 @@ function joindre_upload_error($error) {
* Verifier si le fichier poste est un zip * Verifier si le fichier poste est un zip
* Si on sait le deballer, proposer les options necessaires * Si on sait le deballer, proposer les options necessaires
* *
* Retourne [liste des fichiers, liste des erreurs, chemin du zip]
*
* @param array $files * @param array $files
* @return string * @return false|array<array<string,array>, array<int,string>, string>
*/ */
function joindre_verifier_zip($files) { function joindre_verifier_zip($files) {
if (function_exists('gzopen') if (
and (count($files) == 1) function_exists('gzopen')
and !isset($files[0]['distant']) && (count($files) == 1)
and && !isset($files[0]['distant'])
(preg_match('/\.zip$/i', $files[0]['name']) && (
or (isset($files[0]['type']) and $files[0]['type'] == 'application/zip')) preg_match('/\.zip$/i', (string) $files[0]['name'])
|| (isset($files[0]['type']) && $files[0]['type'] == 'application/zip')
)
) { ) {
// on pose le fichier dans le repertoire zip // on pose le fichier dans le repertoire zip
// (nota : copier_document n'ecrase pas un fichier avec lui-meme // (nota : copier_document n'ecrase pas un fichier avec lui-meme
// ca autorise a boucler) // ca autorise a boucler)
include_spip('inc/getdocument'); include_spip('inc/getdocument');
$desc = $files[0]; $desc = $files[0];
$zip = copier_document( $zip = copier_document('zip', $desc['name'], $desc['tmp_name']);
'zip',
$desc['name'],
$desc['tmp_name']
);
// Est-ce qu'on sait le lire ? // Est-ce qu'on sait le lire ?
include_spip('inc/archives'); if (
if ($zip $zip
and $archive = new Spip\Archives\SpipArchives($zip) && ($archive = new SpipArchiver($zip))
and $infos = $archive->informer() && ($infos = $archive->informer())
and $contenu = joindre_decrire_contenu_zip($infos) && ($contenu = joindre_decrire_contenu_zip($infos))
and $tmp = sous_repertoire(_DIR_TMP, 'zip') && ($tmp = sous_repertoire(_DIR_TMP, 'zip'))
and rename($zip, $tmp = $tmp . basename($zip)) && rename($zip, $tmp = $tmp . basename($zip))
) { ) {
$zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ? $zip_to_clean = (isset($GLOBALS['visiteur_session']['zip_to_clean']) ?
unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : array()); unserialize($GLOBALS['visiteur_session']['zip_to_clean']) : []);
$zip_to_clean[md5($tmp)] = $tmp; $zip_to_clean[md5($tmp)] = $tmp;
session_set('zip_to_clean', serialize($zip_to_clean)); session_set('zip_to_clean', serialize($zip_to_clean));
$contenu[] = $tmp; $contenu[] = $tmp;
...@@ -270,8 +301,7 @@ function joindre_verifier_zip($files) { ...@@ -270,8 +301,7 @@ function joindre_verifier_zip($files) {
* - une liste des noms de fichiers ajoutables * - une liste des noms de fichiers ajoutables
* - une liste des erreurs (fichiers refuses) * - une liste des erreurs (fichiers refuses)
* *
* @param object $zip * @return false|array<array<string,array>, array<int,string>>
* @return array
*/ */
function joindre_decrire_contenu_zip($infos) { function joindre_decrire_contenu_zip($infos) {
include_spip('action/ajouter_documents'); include_spip('action/ajouter_documents');
...@@ -281,15 +311,14 @@ function joindre_decrire_contenu_zip($infos) { ...@@ -281,15 +311,14 @@ function joindre_decrire_contenu_zip($infos) {
} }
// Verifier si le contenu peut etre uploade (verif extension) // Verifier si le contenu peut etre uploade (verif extension)
$fichiers = array(); $fichiers = [];
$erreurs = array(); $erreurs = [];
foreach ($infos['fichiers'] as $file) { foreach ($infos['fichiers'] as $file) {
if (accepte_fichier_upload($f = $file['filename'])) { if (accepte_fichier_upload($f = $file['filename'])) {
$fichiers[$f] = $file; $fichiers[$f] = $file;
} else // pas de message pour les dossiers et fichiers caches } else { // pas de message pour les dossiers et fichiers caches
{ if (!str_ends_with((string) $f, '/') && !str_starts_with(basename((string) $f), '.')) {
if (substr($f, -1) !== '/' and substr(basename($f), 0, 1) !== '.') { $erreurs[] = _T('medias:erreur_upload_type_interdit', ['nom' => $f]);
$erreurs[] = _T('medias:erreur_upload_type_interdit', array('nom' => $f));
} }
} }
} }
...@@ -301,29 +330,27 @@ function joindre_decrire_contenu_zip($infos) { ...@@ -301,29 +330,27 @@ function joindre_decrire_contenu_zip($infos) {
ksort($fichiers); ksort($fichiers);
return array($fichiers, $erreurs); return [$fichiers, $erreurs];
} }
// https://code.spip.net/@joindre_deballes
function joindre_deballer_lister_zip($path, $tmp_dir) { function joindre_deballer_lister_zip($path, $tmp_dir) {
include_spip('inc/archives'); $archive = new SpipArchiver($path);
$archive = new Spip\Archives\SpipArchives($path);
if ($infos = $archive->informer() if (
and $contenu = joindre_decrire_contenu_zip($infos)) { ($infos = $archive->informer()) && ($contenu = joindre_decrire_contenu_zip($infos))
) {
$fichiers = reset($contenu); $fichiers = reset($contenu);
$fichiers = array_column($fichiers, 'filename'); $fichiers = array_column($fichiers, 'filename');
if ($archive->deballer($tmp_dir, $fichiers)) { if ($archive->deballer($tmp_dir, $fichiers)) {
$files = []; $files = [];
foreach ($fichiers as $fichier) { foreach ($fichiers as $fichier) {
$f = basename($fichier); $f = basename($fichier);
$files[] = array( $files[] = [
'tmp_name' => $tmp_dir . $fichier, 'tmp_name' => $tmp_dir . $fichier,
'name' => $f, 'name' => $f,
'titrer' => _request('options_deballe_zip_titrer'), 'titrer' => _request('options_deballe_zip_titrer'),
'mode' => null 'mode' => null,
); ];
} }
return $files; return $files;
} }
...@@ -338,19 +365,18 @@ if (!function_exists('fixer_extension_document')) { ...@@ -338,19 +365,18 @@ if (!function_exists('fixer_extension_document')) {
* et corrige le nom du fichier ; retourne array(extension, nom corrige) * et corrige le nom du fichier ; retourne array(extension, nom corrige)
* s'il ne trouve pas, retourne '' et le nom inchange * s'il ne trouve pas, retourne '' et le nom inchange
* *
* @param array $doc * @param array{name:string,type:string} $doc
* @return array * @return string[]
*/ */
// https://code.spip.net/@fixer_extension_document
function fixer_extension_document($doc) { function fixer_extension_document($doc) {
$extension = ''; $extension = '';
$name = $doc['name']; $name = $doc['name'];
if (preg_match(',\.([^.]+)$,', $name, $r) if (
and $t = sql_fetsel( preg_match(',\.([^.]+)$,', $name, $r) && ($t = sql_fetsel(
'extension', 'extension',
'spip_types_documents', 'spip_types_documents',
'extension=' . sql_quote(corriger_extension($r[1])) 'extension=' . sql_quote(corriger_extension($r[1]))
) ))
) { ) {
$extension = $t['extension']; $extension = $t['extension'];
$name = preg_replace(',\.[^.]*$,', '', $doc['name']) . '.' . $extension; $name = preg_replace(',\.[^.]*$,', '', $doc['name']) . '.' . $extension;
...@@ -361,28 +387,25 @@ if (!function_exists('fixer_extension_document')) { ...@@ -361,28 +387,25 @@ if (!function_exists('fixer_extension_document')) {
} }
} }
return array($extension, $name); return [$extension, $name];
} }
} }
/** /**
* Gestion des fichiers ZIP * Gestion des fichiers ZIP
* https://code.spip.net/@accepte_fichier_upload
* *
* @param sring $f * @param string $f
* @return bool|int * @return bool|int
*/ */
function accepte_fichier_upload($f) { function accepte_fichier_upload($f) {
if (!preg_match(',.*__MACOSX/,', $f) if (
and !preg_match(',^\.,', basename($f)) !preg_match(',.*__MACOSX/,', $f) && !preg_match(',^\.,', basename($f))
) { ) {
include_spip('action/ajouter_documents'); include_spip('action/ajouter_documents');
$ext = corriger_extension((strtolower(substr(strrchr($f, '.'), 1)))); $ext = corriger_extension((strtolower(substr(strrchr($f, '.'), 1))));
return sql_countsel( return sql_countsel('spip_types_documents', 'extension=' . sql_quote($ext) . " AND upload='oui'");
'spip_types_documents',
'extension=' . sql_quote($ext) . " AND upload='oui'"
);
} }
}
return false;
}
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Analyse des textes pour trouver et marquer comme vu les documents utilisés dedans * Analyse des textes pour trouver et marquer comme vu les documents utilisés dedans
* *
* @package SPIP\Medias\Fonctions * @package SPIP\Medias\Fonctions
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -58,7 +56,7 @@ $GLOBALS['medias_liste_champs'][] = 'chapo'; ...@@ -58,7 +56,7 @@ $GLOBALS['medias_liste_champs'][] = 'chapo';
* @param string $serveur * @param string $serveur
* Serveur sql utilisé. * Serveur sql utilisé.
* @return void|null * @return void|null
**/ */
function inc_marquer_doublons_doc_dist( function inc_marquer_doublons_doc_dist(
$champs, $champs,
$id, $id,
...@@ -66,7 +64,7 @@ function inc_marquer_doublons_doc_dist( ...@@ -66,7 +64,7 @@ function inc_marquer_doublons_doc_dist(
$id_table_objet, $id_table_objet,
$table_objet, $table_objet,
$spip_table_objet, $spip_table_objet,
$desc = array(), $desc = [],
$serveur = '' $serveur = ''
) { ) {
...@@ -84,11 +82,11 @@ function inc_marquer_doublons_doc_dist( ...@@ -84,11 +82,11 @@ function inc_marquer_doublons_doc_dist(
// Il faut récupérer toutes les données qui impactent les liens de documents vus // Il faut récupérer toutes les données qui impactent les liens de documents vus
// afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec // afin de savoir lesquels sont présents dans les textes, et pouvoir actualiser avec
// les liens actuellement enregistrés. // les liens actuellement enregistrés.
$absents = array(); $absents = [];
// Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque // Récupérer chaque champ impactant qui existe dans la table de l'objet et qui nous manque
foreach ($GLOBALS['medias_liste_champs'] as $champ) { foreach ($GLOBALS['medias_liste_champs'] as $champ) {
if (isset($desc['field'][$champ]) and !isset($champs[$champ])) { if (isset($desc['field'][$champ]) && !isset($champs[$champ])) {
$absents[] = $champ; $absents[] = $champ;
} }
} }
...@@ -111,24 +109,24 @@ function inc_marquer_doublons_doc_dist( ...@@ -111,24 +109,24 @@ function inc_marquer_doublons_doc_dist(
$modeles = $modeles['modeles']; $modeles = $modeles['modeles'];
// liste d'id_documents trouvés dans les textes // liste d'id_documents trouvés dans les textes
$GLOBALS['doublons_documents_inclus'] = array(); $GLOBALS['doublons_documents_inclus'] = [];
// detecter les doublons dans ces textes // detecter les doublons dans ces textes
traiter_modeles(implode(' ', $champs), array('documents' => $modeles), '', '', null, array( traiter_modeles(implode(' ', $champs), ['documents' => $modeles], '', '', null, [
'objet' => $type, 'objet' => $type,
'id_objet' => $id, 'id_objet' => $id,
$id_table_objet => $id $id_table_objet => $id,
)); ]);
$texte_documents_vus = $GLOBALS['doublons_documents_inclus']; $texte_documents_vus = $GLOBALS['doublons_documents_inclus'];
// on ne modifie les liaisons que si c'est nécessaire // on ne modifie les liaisons que si c'est nécessaire
$bdd_documents_vus = array( $bdd_documents_vus = [
'oui' => array(), 'oui' => [],
'non' => array() 'non' => [],
); ];
$liaisons = objet_trouver_liens(array('document' => '*'), array($type => $id)); $liaisons = objet_trouver_liens(['document' => '*'], [$type => $id]);
foreach ($liaisons as $l) { foreach ($liaisons as $l) {
$bdd_documents_vus[$l['vu']][] = $l['id_document']; $bdd_documents_vus[$l['vu']][] = $l['id_document'];
} }
...@@ -145,12 +143,12 @@ function inc_marquer_doublons_doc_dist( ...@@ -145,12 +143,12 @@ function inc_marquer_doublons_doc_dist(
$ids = array_column($ids, 'id_document'); $ids = array_column($ids, 'id_document');
if ($ids) { if ($ids) {
// Creer le lien s'il n'existe pas déjà // Creer le lien s'il n'existe pas déjà
objet_associer(array('document' => $ids), array($type => $id), array('vu' => 'oui')); objet_associer(['document' => $ids], [$type => $id], ['vu' => 'oui']);
objet_qualifier_liens(array('document' => $ids), array($type => $id), array('vu' => 'oui')); objet_qualifier_liens(['document' => $ids], [$type => $id], ['vu' => 'oui']);
} }
} }
if ($anciens) { if ($anciens) {
objet_qualifier_liens(array('document' => $anciens), array($type => $id), array('vu' => 'non')); objet_qualifier_liens(['document' => $anciens], [$type => $id], ['vu' => 'non']);
} }
} }
<?php <?php
/***************************************************************************\ /**
* SPIP, Système de publication pour l'internet * * SPIP, Système de publication pour l'internet
* * *
* Copyright © avec tendresse depuis 2001 * * Copyright © avec tendresse depuis 2001
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* * *
* Ce programme est un logiciel libre distribué sous licence GNU/GPL. * * 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. * */
\***************************************************************************/
/** /**
* Fonctions pour compléter les informations connues d'un document * Fonctions pour compléter les informations connues d'un document
* *
* @package SPIP\Medias\Renseigner * @package SPIP\Medias\Renseigner
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -44,8 +42,8 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -44,8 +42,8 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* - mode : Mode d'inclusion * - mode : Mode d'inclusion
* - fichier : Chemin local du fichier s'il a été recopié * - fichier : Chemin local du fichier s'il a été recopié
*/ */
function renseigner_source_distante($source) { function renseigner_source_distante($source, $callback_valider_url = '') {
static $infos = array(); static $infos = [];
if (isset($infos[$source])) { if (isset($infos[$source])) {
return $infos[$source]; return $infos[$source];
} }
...@@ -55,19 +53,30 @@ function renseigner_source_distante($source) { ...@@ -55,19 +53,30 @@ function renseigner_source_distante($source) {
// qui est capable de renseigner complete // qui est capable de renseigner complete
// fichier et mode + tous les autres champs a son gout // fichier et mode + tous les autres champs a son gout
// ex : oembed // ex : oembed
$a = pipeline('renseigner_document_distant', array('source' => $source)); $a = pipeline('renseigner_document_distant', ['source' => $source]);
// Si un plugin a renvoyé un message d'erreur non vide, c'est ce résultat en priorité
if (isset($a['message_erreur']) && is_string($a['message_erreur']) && $a['message_erreur']) {
$a = $a['message_erreur'];
}
// si la source est encore la, en revenir a la // si la source est encore là et que ce n'est pas déjà une erreur, en revenir à la
// methode traditionnelle : chargement de l'url puis analyse // méthode traditionnelle : chargement de l'url puis analyse
if (!isset($a['fichier']) or !isset($a['mode'])) { if (
if (!$a = recuperer_infos_distantes($a['source'])) { !is_string($a)
return _T('medias:erreur_chemin_distant', array('nom' => $source)); && (!isset($a['fichier']) || !isset($a['mode']))
) {
if (!$a = recuperer_infos_distantes($a['source'], ['callback_valider_url' => $callback_valider_url])) {
return _T('medias:erreur_chemin_distant', ['nom' => $source]);
} }
# NB: dans les bonnes conditions (fichier autorise et pas trop gros) # NB: dans les bonnes conditions (fichier autorise et pas trop gros)
# $a['fichier'] est une copie locale du fichier # $a['fichier'] est une copie locale du fichier
unset($a['body']); unset($a['body']);
$a['distant'] = 'oui'; $a['distant'] = 'oui';
$a['mode'] = 'document'; $a['mode'] = 'document';
if (!empty($a['fichier'])) {
$a['copie_locale'] = $a['fichier'];
}
$a['fichier'] = set_spip_doc($source); $a['fichier'] = set_spip_doc($source);
} }
...@@ -93,25 +102,23 @@ function renseigner_source_distante($source) { ...@@ -93,25 +102,23 @@ function renseigner_source_distante($source) {
* L'extension du fichier à examiner * L'extension du fichier à examiner
* @param bool $distant * @param bool $distant
* Indique que le fichier peut etre distant, on essaiera alors d'en recuperer un bout pour en lire les meta infos * Indique que le fichier peut etre distant, on essaiera alors d'en recuperer un bout pour en lire les meta infos
* @return array|string $infos * @return array|string
* *
* - Si c'est une chaîne, c'est une erreur * - Si c'est une chaîne, c'est une erreur
* - Si c'est un tableau, l'ensemble des informations récupérées du fichier * - Si c'est un tableau, l'ensemble des informations récupérées du fichier
*/ */
function renseigner_taille_dimension_image($fichier, $ext, $distant = false) { function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
$infos = array( $infos = [
'largeur' => 0, 'largeur' => 0,
'hauteur' => 0, 'hauteur' => 0,
'type_image' => '', 'type_image' => '',
'taille' => 0 'taille' => 0,
); ];
// Quelques infos sur le fichier // Quelques infos sur le fichier
if ( if (
!$fichier !$fichier || !@file_exists($fichier) || !($infos['taille'] = @intval(filesize($fichier)))
or !@file_exists($fichier)
or !$infos['taille'] = @intval(filesize($fichier))
) { ) {
if ($distant) { if ($distant) {
// on ne saura pas la taille // on ne saura pas la taille
...@@ -119,22 +126,22 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) { ...@@ -119,22 +126,22 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
// recuperer un debut de fichier 512ko semblent suffire // recuperer un debut de fichier 512ko semblent suffire
$tmp = _DIR_TMP . md5($fichier); $tmp = _DIR_TMP . md5($fichier);
$res = recuperer_url($fichier, array('file' => $tmp, 'taille_max' => 512 * 1024)); $res = recuperer_url($fichier, ['file' => $tmp, 'taille_max' => 512 * 1024]);
if (!$res) { if (!$res) {
spip_log("Echec copie du fichier $fichier", 'medias'); spip_log("Echec copie du fichier $fichier", 'medias');
return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); return _T('medias:erreur_copie_fichier', ['nom' => $fichier]);
} }
$fichier = $tmp; $fichier = $tmp;
} else { } else {
spip_log("Echec copie du fichier $fichier", 'medias'); spip_log("Echec copie du fichier $fichier", 'medias');
return _T('medias:erreur_copie_fichier', array('nom' => $fichier)); return _T('medias:erreur_copie_fichier', ['nom' => $fichier]);
} }
} }
// chercher une fonction de description // chercher une fonction de description
$meta = array(); $meta = [];
if ($metadata = charger_fonction($ext, 'metadata', true)) { if ($metadata = charger_fonction($ext, 'metadata', true)) {
$meta = $metadata($fichier); $meta = $metadata($fichier);
} else { } else {
...@@ -146,13 +153,13 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) { ...@@ -146,13 +153,13 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
$meta = pipeline( $meta = pipeline(
'renseigner_document', 'renseigner_document',
array('args' => array('extension' => $ext, 'fichier' => $fichier), 'data' => $meta) ['args' => ['extension' => $ext, 'fichier' => $fichier], 'data' => $meta]
); );
include_spip('inc/filtres'); # pour objet_info() include_spip('inc/filtres'); # pour objet_info()
$editables = objet_info('document', 'champs_editables'); $editables = objet_info('document', 'champs_editables');
foreach ($meta as $m => $v) { foreach ($meta as $m => $v) {
if (isset($infos[$m]) or in_array($m, $editables)) { if (isset($infos[$m]) || in_array($m, $editables)) {
$infos[$m] = $v; $infos[$m] = $v;
} }
} }
...@@ -168,13 +175,13 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) { ...@@ -168,13 +175,13 @@ function renseigner_taille_dimension_image($fichier, $ext, $distant = false) {
function sanitizer_document($fichier, $ext) { function sanitizer_document($fichier, $ext) {
// verifier que le fichier existe, sinon on ne peut rien faire // verifier que le fichier existe, sinon on ne peut rien faire
if ( if (
!$fichier !$fichier || !@file_exists($fichier)
or !@file_exists($fichier)) { ) {
return false; return false;
} }
if ($sanitizer = charger_fonction($ext, 'sanitizer', true)){ if ($sanitizer = charger_fonction($ext, 'sanitizer', true)) {
return $sanitizer($fichier); return $sanitizer($fichier);
} }
return false; return false;
} }
\ No newline at end of file
<?php <?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet * /**
* * * SPIP, Système de publication pour l'internet
* Copyright © avec tendresse depuis 2001 * *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Copyright © avec tendresse depuis 2001
* * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* 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. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
\***************************************************************************/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -17,12 +17,12 @@ function inc_verifier_document_mode_image_dist($infos) { ...@@ -17,12 +17,12 @@ function inc_verifier_document_mode_image_dist($infos) {
// Si on veut uploader une image, il faut qu'elle ait ete bien lue // Si on veut uploader une image, il faut qu'elle ait ete bien lue
if ($infos['inclus'] != 'image') { if ($infos['inclus'] != 'image') {
return _T('medias:erreur_format_fichier_image', array('nom' => $infos['fichier'])); return _T('medias:erreur_format_fichier_image', ['nom' => $infos['fichier']]);
} }
if (isset($infos['largeur']) and isset($infos['hauteur'])) { if (isset($infos['largeur']) && isset($infos['hauteur'])) {
if (!($infos['largeur'] or $infos['hauteur'])) { if (!($infos['largeur'] || $infos['hauteur'])) {
return _T('medias:erreur_upload_vignette', array('nom' => $infos['fichier'])); return _T('medias:erreur_upload_vignette', ['nom' => $infos['fichier']]);
} }
} }
......
<?php <?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet * /**
* * * SPIP, Système de publication pour l'internet
* Copyright © avec tendresse depuis 2001 * *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Copyright © avec tendresse depuis 2001
* * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* 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. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
\***************************************************************************/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
...@@ -17,12 +17,12 @@ function inc_verifier_document_mode_vignette_dist($infos) { ...@@ -17,12 +17,12 @@ function inc_verifier_document_mode_vignette_dist($infos) {
// Si on veut uploader une vignette, il faut qu'elle ait ete bien lue // Si on veut uploader une vignette, il faut qu'elle ait ete bien lue
if ($infos['inclus'] != 'image') { if ($infos['inclus'] != 'image') {
return _T('medias:erreur_format_fichier_image', array('nom' => $infos['fichier'])); return _T('medias:erreur_format_fichier_image', ['nom' => $infos['fichier']]);
} }
if (isset($infos['largeur']) and isset($infos['hauteur'])) { if (isset($infos['largeur']) && isset($infos['hauteur'])) {
if (!($infos['largeur'] or $infos['hauteur'])) { if (!($infos['largeur'] || $infos['hauteur'])) {
return _T('medias:erreur_upload_vignette', array('nom' => $infos['fichier'])); return _T('medias:erreur_upload_vignette', ['nom' => $infos['fichier']]);
} }
} }
......
<?php <?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet * /**
* * * SPIP, Système de publication pour l'internet
* Copyright © avec tendresse depuis 2001 * *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Copyright © avec tendresse depuis 2001
* * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* 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. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
\***************************************************************************/ */
/** /**
* Gestion des vignettes de types de fichier * Gestion des vignettes de types de fichier
* *
* @package SPIP\Medias\Vignette * @package SPIP\Medias\Vignette
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
/** /**
* Verifier si le fichier respecte les contraintes de tailles * Verifier si le fichier respecte les contraintes de tailles
* *
...@@ -31,36 +29,37 @@ function inc_verifier_taille_document_acceptable_dist(&$infos, $is_logo = false) ...@@ -31,36 +29,37 @@ function inc_verifier_taille_document_acceptable_dist(&$infos, $is_logo = false)
// si ce n'est pas une image // si ce n'est pas une image
if (!$infos['type_image']) { if (!$infos['type_image']) {
$max_size = (defined('_DOC_MAX_SIZE') and _DOC_MAX_SIZE) ? _DOC_MAX_SIZE : null; $max_size = (defined('_DOC_MAX_SIZE') && _DOC_MAX_SIZE) ? _DOC_MAX_SIZE : null;
$res = medias_verifier_poids_fichier($infos, $max_size, false); $res = medias_verifier_poids_fichier($infos, $max_size, false);
if ($res !== true) { if ($res !== true) {
return $res; return $res;
} }
} // si c'est une image } // si c'est une image
else { else {
if ($is_logo) { // Ne pas contraindre les dimensions des images vectorielles, ça n'a pas de sens
$max_width = (defined('_LOGO_MAX_WIDTH') and _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : null; if ($infos['type_image'] !== 'svg') {
$max_height = (defined('_LOGO_MAX_HEIGHT') and _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : null; if ($is_logo) {
$min_width = (defined('_LOGO_MIN_WIDTH') and _LOGO_MIN_WIDTH) ? _LOGO_MIN_WIDTH : null; $max_width = (defined('_LOGO_MAX_WIDTH') && _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : null;
$min_height = (defined('_LOGO_MIN_HEIGHT') and _LOGO_MIN_HEIGHT) ? _LOGO_MIN_HEIGHT : null; $max_height = (defined('_LOGO_MAX_HEIGHT') && _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : null;
} $min_width = (defined('_LOGO_MIN_WIDTH') && _LOGO_MIN_WIDTH) ? _LOGO_MIN_WIDTH : null;
else { $min_height = (defined('_LOGO_MIN_HEIGHT') && _LOGO_MIN_HEIGHT) ? _LOGO_MIN_HEIGHT : null;
$max_width = (defined('_IMG_MAX_WIDTH') and _IMG_MAX_WIDTH) ? _IMG_MAX_WIDTH : null; } else {
$max_height = (defined('_IMG_MAX_HEIGHT') and _IMG_MAX_HEIGHT) ? _IMG_MAX_HEIGHT : null; $max_width = (defined('_IMG_MAX_WIDTH') && _IMG_MAX_WIDTH) ? _IMG_MAX_WIDTH : null;
$min_width = (defined('_IMG_MIN_WIDTH') and _IMG_MIN_WIDTH) ? _IMG_MIN_WIDTH : null; $max_height = (defined('_IMG_MAX_HEIGHT') && _IMG_MAX_HEIGHT) ? _IMG_MAX_HEIGHT : null;
$min_height = (defined('_IMG_MIN_HEIGHT') and _IMG_MIN_HEIGHT) ? _IMG_MIN_HEIGHT : null; $min_width = (defined('_IMG_MIN_WIDTH') && _IMG_MIN_WIDTH) ? _IMG_MIN_WIDTH : null;
} $min_height = (defined('_IMG_MIN_HEIGHT') && _IMG_MIN_HEIGHT) ? _IMG_MIN_HEIGHT : null;
}
$res = medias_verifier_largeur_hauteur_image($infos, $max_width, $max_height, $min_width, $min_height); $res = medias_verifier_largeur_hauteur_image($infos, $max_width, $max_height, $min_width, $min_height);
if ($res !== true) { if ($res !== true) {
return $res; return $res;
}
} }
if ($is_logo){ if ($is_logo) {
$max_size = (defined('_IMG_MAX_SIZE') and _IMG_MAX_SIZE) ? _IMG_MAX_SIZE : null; $max_size = (defined('_LOGO_MAX_SIZE') && _LOGO_MAX_SIZE) ? _LOGO_MAX_SIZE : null;
} } else {
else { $max_size = (defined('_IMG_MAX_SIZE') && _IMG_MAX_SIZE) ? _IMG_MAX_SIZE : null;
$max_size = (defined('_LOGO_MAX_SIZE') and _LOGO_MAX_SIZE) ? _LOGO_MAX_SIZE : null;
} }
$res = medias_verifier_poids_fichier($infos, $max_size, true); $res = medias_verifier_poids_fichier($infos, $max_size, true);
...@@ -82,89 +81,100 @@ function inc_verifier_taille_document_acceptable_dist(&$infos, $is_logo = false) ...@@ -82,89 +81,100 @@ function inc_verifier_taille_document_acceptable_dist(&$infos, $is_logo = false)
* @param null|int $min_height * @param null|int $min_height
* @return bool|string * @return bool|string
*/ */
function medias_verifier_largeur_hauteur_image($infos, $max_width = null, $max_height = null, $min_width = null, $min_height = null) { function medias_verifier_largeur_hauteur_image(
&$infos,
if (($max_width and $infos['largeur'] > $max_width) $max_width = null,
or ($max_height and $infos['hauteur'] > $max_height) $max_height = null,
$min_width = null,
$min_height = null
) {
if (
$max_width && $infos['largeur'] > $max_width || $max_height && $infos['hauteur'] > $max_height
) { ) {
// pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures // pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures
// on met directement a la taille maxi a la volee // on met directement a la taille maxi a la volee
if (isset($GLOBALS['meta']['creer_preview']) and $GLOBALS['meta']['creer_preview'] == 'oui') { if (isset($GLOBALS['meta']['creer_preview']) && $GLOBALS['meta']['creer_preview'] == 'oui') {
include_spip('inc/filtres'); include_spip('inc/filtres');
$img = filtrer('image_reduire', $infos['fichier'], $max_width ? $max_width : '*', $max_height ? $max_height : '*'); $img = filtrer('image_reduire', $infos['fichier'], $max_width ?: '*', $max_height ?: '*');
$img = extraire_attribut($img, 'src'); $img = extraire_attribut($img, 'src');
$img = supprimer_timestamp($img); $img = supprimer_timestamp($img);
if (@file_exists($img) and $img !== $infos['fichier']) { if (@file_exists($img) && $img !== $infos['fichier']) {
spip_unlink($infos['fichier']); spip_unlink($infos['fichier']);
@rename($img, $infos['fichier']); @rename($img, $infos['fichier']);
list($h, $w) = taille_image($infos['fichier'], true); [$h, $w] = taille_image($infos['fichier'], true);
$infos['largeur'] = $w; $infos['largeur'] = $w;
$infos['hauteur'] = $h; $infos['hauteur'] = $h;
$infos['taille'] = @filesize($infos['fichier']); $infos['taille'] = @filesize($infos['fichier']);
} }
} }
if (($max_width and $infos['largeur'] > $max_width) if (
or ($max_height and $infos['hauteur'] > $max_height) $max_width && $infos['largeur'] > $max_width || $max_height && $infos['hauteur'] > $max_height
) { ) {
return _T( return _T(
'medias:info_image_max_taille', 'medias:info_image_max_taille',
array( [
'maxi' => 'maxi' =>
_T( _T(
'info_largeur_vignette', 'info_largeur_vignette',
array( [
'largeur_vignette' => $max_width, 'largeur_vignette' => $max_width ?? '∞',
'hauteur_vignette' => $max_height 'hauteur_vignette' => $max_height ?? '∞',
) ]
), ),
'actuel' => 'actuel' =>
_T( _T(
'info_largeur_vignette', 'info_largeur_vignette',
array( [
'largeur_vignette' => $infos['largeur'], 'largeur_vignette' => $infos['largeur'],
'hauteur_vignette' => $infos['hauteur'] 'hauteur_vignette' => $infos['hauteur'],
) ]
) ),
) ]
); );
} }
} }
if (($min_width and $infos['largeur'] < $min_width) if (
or ($min_height and $infos['hauteur'] < $min_height) $min_width && $infos['largeur'] < $min_width || $min_height && $infos['hauteur'] < $min_height
) { ) {
if ($min_width and $max_width and $min_width>$max_width){ if ($min_width && $max_width && $min_width > $max_width) {
spip_log('Constantes invalides détectées, modifiez votre fichier de configuration (_IMG_MIN_WIDTH > _IMG_MAX_WIDTH)', 'medias' . _LOG_INFO_IMPORTANTE); spip_log(
'Constantes invalides détectées, modifiez votre fichier de configuration (_IMG_MIN_WIDTH > _IMG_MAX_WIDTH)',
'medias' . _LOG_INFO_IMPORTANTE
);
} }
if ($min_height and $max_height and $min_height>$max_height){ if ($min_height && $max_height && $min_height > $max_height) {
spip_log('Constantes invalides détectées, modifiez votre fichier de configuration (_IMG_MIN_HEIGHT > _IMG_MAX_HEIGHT)', 'medias' . _LOG_INFO_IMPORTANTE); spip_log(
'Constantes invalides détectées, modifiez votre fichier de configuration (_IMG_MIN_HEIGHT > _IMG_MAX_HEIGHT)',
'medias' . _LOG_INFO_IMPORTANTE
);
} }
return _T( return _T(
'medias:info_image_min_taille', 'medias:info_image_min_taille',
array( [
'mini' => 'mini' =>
_T( _T(
'info_largeur_vignette', 'info_largeur_vignette',
array( [
'largeur_vignette' => $min_width, 'largeur_vignette' => $min_width ?? '0',
'hauteur_vignette' => $min_height 'hauteur_vignette' => $min_height ?? '0',
) ]
), ),
'actuel' => 'actuel' =>
_T( _T(
'info_largeur_vignette', 'info_largeur_vignette',
array( [
'largeur_vignette' => $infos['largeur'], 'largeur_vignette' => $infos['largeur'],
'hauteur_vignette' => $infos['hauteur'] 'hauteur_vignette' => $infos['hauteur'],
) ]
) ),
) ]
); );
} }
return true; return true;
} }
...@@ -175,13 +185,13 @@ function medias_verifier_largeur_hauteur_image($infos, $max_width = null, $max_h ...@@ -175,13 +185,13 @@ function medias_verifier_largeur_hauteur_image($infos, $max_width = null, $max_h
* @return bool|string * @return bool|string
*/ */
function medias_verifier_poids_fichier($infos, $max_size = null, $is_image = false) { function medias_verifier_poids_fichier($infos, $max_size = null, $is_image = false) {
if ($max_size and $infos['taille'] > $max_size * 1024) { if ($max_size && $infos['taille'] > $max_size * 1024) {
return _T( return _T(
$is_image ? 'medias:info_image_max_poids' : 'medias:info_doc_max_poids', $is_image ? 'medias:info_image_max_poids' : 'medias:info_doc_max_poids',
array( [
'maxi' => taille_en_octets($max_size * 1024), 'maxi' => taille_en_octets($max_size * 1024),
'actuel' => taille_en_octets($infos['taille']) 'actuel' => taille_en_octets($infos['taille']),
) ]
); );
} }
......
<?php <?php
/***************************************************************************\
* SPIP, Système de publication pour l'internet * /**
* * * SPIP, Système de publication pour l'internet
* Copyright © avec tendresse depuis 2001 * *
* Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James * * Copyright © avec tendresse depuis 2001
* * * Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
* 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. * * Ce programme est un logiciel libre distribué sous licence GNU/GPL.
\***************************************************************************/ */
/** /**
* Gestion des vignettes de types de fichier * Gestion des vignettes de types de fichier
* *
* @package SPIP\Medias\Vignette * @package SPIP\Medias\Vignette
**/ */
if (!defined('_ECRIRE_INC_VERSION')) { if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
...@@ -22,23 +21,40 @@ if (!defined('_ECRIRE_INC_VERSION')) { ...@@ -22,23 +21,40 @@ if (!defined('_ECRIRE_INC_VERSION')) {
/** /**
* Vignette pour une extension de document * Vignette pour une extension de document
* *
* Recherche les fichiers d'icones au format png pour l'extension demandée. * Recherche les fichiers d'icones au format SVG pour l'extension demandée.
* On cherche prive/vignettes/ext.png dans le path. * On cherche prive/vignettes/ext.svg dans le path.
* *
* @param string $ext * @param string $ext
* Extension du fichier. Exemple : png * Extension du fichier. Exemple : png
* @param bool $size * @param string $media
* true pour retourner un tableau avec les tailles de la vignette * Permet de retourner une variante de la vignette adaptee au media
* false pour retourner uniquement le chemin du fichier * cas des mp4 par exemple que l'on decline quand c'est un audio
* @param bool $loop * @param bool $loop
* Autoriser la fonction à s'appeler sur elle-même * Autoriser la fonction à s'appeler sur elle-même
* (paramètre interne). * (paramètre interne).
* @return array|bool|string * @return ?string
* False si l'image n'est pas trouvée * null si l'image n'est pas trouvée
* Chaîne (chemin vers l'image) si on ne demande pas de taille * Chaîne (chemin vers l'image) si on ne demande pas de taille
* Tableau (chemin, largeur, hauteur) si on demande avec la taille.
*/ */
function inc_vignette_dist($ext, $size = true, $loop = true) { function inc_vignette_dist($ext, $media = '', $loop = true) {
// deprecated signature avec second argument true pour récuperer un tableau avec size
if ($media === true) {
trigger_deprecation(
'medias',
'2.0',
'Using "%s" is deprecated',
'vignette($ext, true)'
);
$v = inc_vignette_dist($ext, '', $loop);
$largeur = $hauteur = 0;
if ($v && ($size = @spip_getimagesize($v))) {
$largeur = $size[0];
$hauteur = $size[1];
}
return [$v, $largeur, $hauteur];
}
if (!$ext) { if (!$ext) {
$ext = 'txt'; $ext = 'txt';
...@@ -46,27 +62,18 @@ function inc_vignette_dist($ext, $size = true, $loop = true) { ...@@ -46,27 +62,18 @@ function inc_vignette_dist($ext, $size = true, $loop = true) {
// Chercher la vignette correspondant a ce type de document // Chercher la vignette correspondant a ce type de document
// dans les vignettes persos, ou dans les vignettes standard // dans les vignettes persos, ou dans les vignettes standard
if ( # installation dans un dossier /vignettes personnel, par exemple /squelettes/vignettes
# installation dans un dossier /vignettes personnel, par exemple /squelettes/vignettes if (!$media || !($v = find_in_path('prive/vignettes/' . $ext . '-' . $media . '.svg'))) {
!$v = find_in_path('prive/vignettes/' . $ext . '.svg') $v = find_in_path('prive/vignettes/' . $ext . '.svg');
) { }
if (!$v) {
if ($loop) { if ($loop) {
$f = charger_fonction('vignette', 'inc'); $f = charger_fonction('vignette', 'inc');
$v = $f('defaut', false, $loop = false); $v = $f('defaut', $media, false);
} else { } else {
$v = false; $v = false;
} }
} # pas trouve l'icone de base } # pas trouve l'icone de base
if (!$size) { return $v ?: null;
return $v;
}
$largeur = $hauteur = 0;
if ($v and $size = @spip_getimagesize($v)) {
$largeur = $size[0];
$hauteur = $size[1];
}
return array($v, $largeur, $hauteur);
} }
/*
### jQuery Multiple File Upload Plugin v1.48 - 2013-02-19 ###
* Home: http://www.fyneworks.com/jquery/multiple-file-upload/
* Code: http://code.google.com/p/jquery-multifile-plugin/
*
* Licensed under http://en.wikipedia.org/wiki/MIT_License
###
*/
/*# AVOID COLLISIONS #*/
;if(window.jQuery) (function($){
/*# AVOID COLLISIONS #*/
// plugin initialization
$.fn.MultiFile = function(options){
if(this.length==0) return this; // quick fail
// Handle API methods
if(typeof arguments[0]=='string'){
// Perform API methods on individual elements
if(this.length>1){
var args = arguments;
return this.each(function(){
$.fn.MultiFile.apply($(this), args);
});
};
// Invoke API method handler
$.fn.MultiFile[arguments[0]].apply(this, $.makeArray(arguments).slice(1) || []);
// Quick exit...
return this;
};
// Initialize options for this call
var options = $.extend(
{}/* new object */,
$.fn.MultiFile.options/* default options */,
options || {} /* just-in-time options */
);
// Empty Element Fix!!!
// this code will automatically intercept native form submissions
// and disable empty file elements
$('form')
.not('MultiFile-intercepted')
.addClass('MultiFile-intercepted')
.submit($.fn.MultiFile.disableEmpty);
//### http://plugins.jquery.com/node/1363
// utility method to integrate this plugin with others...
if($.fn.MultiFile.options.autoIntercept){
$.fn.MultiFile.intercept( $.fn.MultiFile.options.autoIntercept /* array of methods to intercept */ );
$.fn.MultiFile.options.autoIntercept = null; /* only run this once */
};
// loop through each matched element
this
.not('.MultiFile-applied')
.addClass('MultiFile-applied')
.each(function(){
//#####################################################################
// MAIN PLUGIN FUNCTIONALITY - START
//#####################################################################
// BUG 1251 FIX: http://plugins.jquery.com/project/comments/add/1251
// variable group_count would repeat itself on multiple calls to the plugin.
// this would cause a conflict with multiple elements
// changes scope of variable to global so id will be unique over n calls
window.MultiFile = (window.MultiFile || 0) + 1;
var group_count = window.MultiFile;
// Copy parent attributes - Thanks to Jonas Wagner
// we will use this one to create new input elements
var MultiFile = {e:this, E:$(this), clone:$(this).clone()};
//===
//# USE CONFIGURATION
if(typeof options=='number') options = {max:options};
var o = $.extend({},
$.fn.MultiFile.options,
options || {},
($.metadata? MultiFile.E.metadata(): ($.meta?MultiFile.E.data():null)) || {}, /* metadata options */
{} /* internals */
);
// limit number of files that can be selected?
if(!(o.max>0) /*IsNull(MultiFile.max)*/){
o.max = MultiFile.E.attr('maxlength');
};
if(!(o.max>0) /*IsNull(MultiFile.max)*/){
o.max = (String(MultiFile.e.className.match(/\b(max|limit)\-([0-9]+)\b/gi) || ['']).match(/[0-9]+/gi) || [''])[0];
if(!(o.max>0)) o.max = -1;
else o.max = String(o.max).match(/[0-9]+/gi)[0];
}
o.max = new Number(o.max);
// limit extensions?
o.accept = o.accept || MultiFile.E.attr('accept') || '';
if(!o.accept){
o.accept = (MultiFile.e.className.match(/\b(accept\-[\w\|]+)\b/gi)) || '';
o.accept = new String(o.accept).replace(/^(accept|ext)\-/i,'');
};
//===
// APPLY CONFIGURATION
$.extend(MultiFile, o || {});
MultiFile.STRING = $.extend({},$.fn.MultiFile.options.STRING,MultiFile.STRING);
//===
//#########################################
// PRIVATE PROPERTIES/METHODS
$.extend(MultiFile, {
n: 0, // How many elements are currently selected?
slaves: [], files: [],
instanceKey: MultiFile.e.id || 'MultiFile'+String(group_count), // Instance Key?
generateID: function(z){ return MultiFile.instanceKey + (z>0 ?'_F'+String(z):''); },
trigger: function(event, element){
var handler = MultiFile[event], value = $(element).attr('value');
if(handler){
var returnValue = handler(element, value, MultiFile);
if( returnValue!=null ) return returnValue;
}
return true;
}
});
//===
// Setup dynamic regular expression for extension validation
// - thanks to John-Paul Bader: http://smyck.de/2006/08/11/javascript-dynamic-regular-expresions/
if(String(MultiFile.accept).length>1){
MultiFile.accept = MultiFile.accept.replace(/\W+/g,'|').replace(/^\W|\W$/g,'');
MultiFile.rxAccept = new RegExp('\\.('+(MultiFile.accept?MultiFile.accept:'')+')$','gi');
};
//===
// Create wrapper to hold our file list
MultiFile.wrapID = MultiFile.instanceKey+'_wrap'; // Wrapper ID?
MultiFile.E.wrap('<div class="MultiFile-wrap" id="'+MultiFile.wrapID+'"></div>');
MultiFile.wrapper = $('#'+MultiFile.wrapID+'');
//===
// MultiFile MUST have a name - default: file1[], file2[], file3[]
MultiFile.e.name = MultiFile.e.name || 'file'+ group_count +'[]';
//===
if(!MultiFile.list){
// Create a wrapper for the list
// * OPERA BUG: NO_MODIFICATION_ALLOWED_ERR ('list' is a read-only property)
// this change allows us to keep the files in the order they were selected
MultiFile.wrapper.append( '<div class="MultiFile-list" id="'+MultiFile.wrapID+'_list"></div>' );
MultiFile.list = $('#'+MultiFile.wrapID+'_list');
};
MultiFile.list = $(MultiFile.list);
//===
// Bind a new element
MultiFile.addSlave = function( slave, slave_count ){
//if(window.console) console.log('MultiFile.addSlave',slave_count);
// Keep track of how many elements have been displayed
MultiFile.n++;
// Add reference to master element
slave.MultiFile = MultiFile;
// BUG FIX: http://plugins.jquery.com/node/1495
// Clear identifying properties from clones
if(slave_count>0) slave.id = slave.name = '';
// Define element's ID and name (upload components need this!)
//slave.id = slave.id || MultiFile.generateID(slave_count);
if(slave_count>0) slave.id = MultiFile.generateID(slave_count);
//FIX for: http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=23
// 2008-Apr-29: New customizable naming convention (see url below)
// http://groups.google.com/group/jquery-dev/browse_frm/thread/765c73e41b34f924#
slave.name = String(MultiFile.namePattern
/*master name*/.replace(/\$name/gi,$(MultiFile.clone).attr('name'))
/*master id */.replace(/\$id/gi, $(MultiFile.clone).attr('id'))
/*group count*/.replace(/\$g/gi, group_count)//(group_count>0?group_count:''))
/*slave count*/.replace(/\$i/gi, slave_count)//(slave_count>0?slave_count:''))
);
// If we've reached maximum number, disable input slave
if( (MultiFile.max > 0) && ((MultiFile.n-1) > (MultiFile.max)) )//{ // MultiFile.n Starts at 1, so subtract 1 to find true count
slave.disabled = true;
//};
// Remember most recent slave
MultiFile.current = MultiFile.slaves[slave_count] = slave;
// We'll use jQuery from now on
slave = $(slave);
// Clear value
slave.val('').attr('value','')[0].value = '';
// Stop plugin initializing on slaves
slave.addClass('MultiFile-applied');
// Triggered when a file is selected
slave.change(function(){
//if(window.console) console.log('MultiFile.slave.change',slave_count);
// Lose focus to stop IE7 firing onchange again
$(this).blur();
//# Trigger Event! onFileSelect
if(!MultiFile.trigger('onFileSelect', this, MultiFile)) return false;
//# End Event!
//# Retrive value of selected file from element
var ERROR = '', v = String(this.value || ''/*.attr('value)*/);
// check extension
if(MultiFile.accept && v && !v.match(MultiFile.rxAccept))//{
ERROR = MultiFile.STRING.denied.replace('$ext', String(v.match(/\.\w{1,4}$/gi)));
//}
//};
// Disallow duplicates
for(var f in MultiFile.slaves)//{
if(MultiFile.slaves[f] && MultiFile.slaves[f]!=this)//{
//console.log(MultiFile.slaves[f],MultiFile.slaves[f].value);
if(MultiFile.slaves[f].value==v)//{
ERROR = MultiFile.STRING.duplicate.replace('$file', v.match(/[^\/\\]+$/gi));
//};
//};
//};
// Create a new file input element
var newEle = $(MultiFile.clone).clone();// Copy parent attributes - Thanks to Jonas Wagner
//# Let's remember which input we've generated so
// we can disable the empty ones before submission
// See: http://plugins.jquery.com/node/1495
newEle.addClass('MultiFile');
// Handle error
if(ERROR!=''){
// Handle error
MultiFile.error(ERROR);
// 2007-06-24: BUG FIX - Thanks to Adrian Wrbel <adrian [dot] wrobel [at] gmail.com>
// Ditch the trouble maker and add a fresh new element
MultiFile.n--;
MultiFile.addSlave(newEle[0], slave_count);
slave.parent().prepend(newEle);
slave.remove();
return false;
};
// Hide this element (NB: display:none is evil!)
$(this).css({ position:'absolute', top: '-3000px' });
// Add new element to the form
slave.after(newEle);
// Update list
MultiFile.addToList( this, slave_count );
// Bind functionality
MultiFile.addSlave( newEle[0], slave_count+1 );
//# Trigger Event! afterFileSelect
if(!MultiFile.trigger('afterFileSelect', this, MultiFile)) return false;
//# End Event!
}); // slave.change()
// Save control to element
$(slave).data('MultiFile', MultiFile);
};// MultiFile.addSlave
// Bind a new element
// Add a new file to the list
MultiFile.addToList = function( slave, slave_count ){
//if(window.console) console.log('MultiFile.addToList',slave_count);
//# Trigger Event! onFileAppend
if(!MultiFile.trigger('onFileAppend', slave, MultiFile)) return false;
//# End Event!
// Create label elements
var
r = $('<div class="MultiFile-label"></div>'),
v = String(slave.value || ''/*.attr('value)*/),
a = $('<span class="MultiFile-title" title="'+MultiFile.STRING.selected.replace('$file', v)+'">'+MultiFile.STRING.file.replace('$file', v.match(/[^\/\\]+$/gi)[0])+'</span>'),
b = $('<a class="MultiFile-remove" href="#'+MultiFile.wrapID+'">'+MultiFile.STRING.remove+'</a>');
// Insert label
MultiFile.list.append(
r.append(b, ' ', a)
);
b
.click(function(){
//# Trigger Event! onFileRemove
if(!MultiFile.trigger('onFileRemove', slave, MultiFile)) return false;
//# End Event!
MultiFile.n--;
MultiFile.current.disabled = false;
// Remove element, remove label, point to current
MultiFile.slaves[slave_count] = null;
$(slave).remove();
$(this).parent().remove();
// Show most current element again (move into view) and clear selection
$(MultiFile.current).css({ position:'', top: '' });
$(MultiFile.current).reset().val('').attr('value', '')[0].value = '';
//# Trigger Event! afterFileRemove
if(!MultiFile.trigger('afterFileRemove', slave, MultiFile)) return false;
//# End Event!
return false;
});
//# Trigger Event! afterFileAppend
if(!MultiFile.trigger('afterFileAppend', slave, MultiFile)) return false;
//# End Event!
}; // MultiFile.addToList
// Add element to selected files list
// Bind functionality to the first element
if(!MultiFile.MultiFile) MultiFile.addSlave(MultiFile.e, 0);
// Increment control count
//MultiFile.I++; // using window.MultiFile
MultiFile.n++;
// Save control to element
MultiFile.E.data('MultiFile', MultiFile);
//#####################################################################
// MAIN PLUGIN FUNCTIONALITY - END
//#####################################################################
}); // each element
};
/*--------------------------------------------------------*/
/*
### Core functionality and API ###
*/
$.extend($.fn.MultiFile, {
/**
* This method removes all selected files
*
* Returns a jQuery collection of all affected elements.
*
* @name reset
* @type jQuery
* @cat Plugins/MultiFile
* @author Diego A. (http://www.fyneworks.com/)
*
* @example $.fn.MultiFile.reset();
*/
reset: function(){
var settings = $(this).data('MultiFile');
//if(settings) settings.wrapper.find('a.MultiFile-remove').click();
if(settings) settings.list.find('a.MultiFile-remove').click();
return $(this);
},
/**
* This utility makes it easy to disable all 'empty' file elements in the document before submitting a form.
* It marks the affected elements so they can be easily re-enabled after the form submission or validation.
*
* Returns a jQuery collection of all affected elements.
*
* @name disableEmpty
* @type jQuery
* @cat Plugins/MultiFile
* @author Diego A. (http://www.fyneworks.com/)
*
* @example $.fn.MultiFile.disableEmpty();
* @param String class (optional) A string specifying a class to be applied to all affected elements - Default: 'mfD'.
*/
disableEmpty: function(klass){ klass = (typeof(klass)=='string'?klass:'')||'mfD';
var o = [];
$('input:file.MultiFile').each(function(){ if($(this).val()=='') o[o.length] = this; });
return $(o).each(function(){ this.disabled = true }).addClass(klass);
},
/**
* This method re-enables 'empty' file elements that were disabled (and marked) with the $.fn.MultiFile.disableEmpty method.
*
* Returns a jQuery collection of all affected elements.
*
* @name reEnableEmpty
* @type jQuery
* @cat Plugins/MultiFile
* @author Diego A. (http://www.fyneworks.com/)
*
* @example $.fn.MultiFile.reEnableEmpty();
* @param String klass (optional) A string specifying the class that was used to mark affected elements - Default: 'mfD'.
*/
reEnableEmpty: function(klass){ klass = (typeof(klass)=='string'?klass:'')||'mfD';
return $('input:file.'+klass).removeClass(klass).each(function(){ this.disabled = false });
},
/**
* This method will intercept other jQuery plugins and disable empty file input elements prior to form submission
*
* @name intercept
* @cat Plugins/MultiFile
* @author Diego A. (http://www.fyneworks.com/)
*
* @example $.fn.MultiFile.intercept();
* @param Array methods (optional) Array of method names to be intercepted
*/
intercepted: {},
intercept: function(methods, context, args){
var method, value; args = args || [];
if(args.constructor.toString().indexOf("Array")<0) args = [ args ];
if(typeof(methods)=='function'){
$.fn.MultiFile.disableEmpty();
value = methods.apply(context || window, args);
//SEE-http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=27
setTimeout(function(){ $.fn.MultiFile.reEnableEmpty() },1000);
return value;
};
if(methods.constructor.toString().indexOf("Array")<0) methods = [methods];
for(var i=0;i<methods.length;i++){
method = methods[i]+''; // make sure that we have a STRING
if(method) (function(method){ // make sure that method is ISOLATED for the interception
$.fn.MultiFile.intercepted[method] = $.fn[method] || function(){};
$.fn[method] = function(){
$.fn.MultiFile.disableEmpty();
value = $.fn.MultiFile.intercepted[method].apply(this, arguments);
//SEE http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=27
setTimeout(function(){ $.fn.MultiFile.reEnableEmpty() },1000);
return value;
}; // interception
})(method); // MAKE SURE THAT method IS ISOLATED for the interception
};// for each method
} // $.fn.MultiFile.intercept
});
/*--------------------------------------------------------*/
/*
### Default Settings ###
eg.: You can override default control like this:
$.fn.MultiFile.options.accept = 'gif|jpg';
*/
$.fn.MultiFile.options = { //$.extend($.fn.MultiFile, { options: {
accept: '', // accepted file extensions
max: -1, // maximum number of selectable files
// name to use for newly created elements
namePattern: '$name', // same name by default (which creates an array)
/*master name*/ // use $name
/*master id */ // use $id
/*group count*/ // use $g
/*slave count*/ // use $i
/*other */ // use any combination of he above, eg.: $name_file$i
// STRING: collection lets you show messages in different languages
STRING: {
remove:'x',
denied:'You cannot select a $ext file.\nTry again...',
file:'$file',
selected:'File selected: $file',
duplicate:'This file has already been selected:\n$file'
},
// name of methods that should be automcatically intercepted so the plugin can disable
// extra file elements that are empty before execution and automatically re-enable them afterwards
autoIntercept: [ 'submit', 'ajaxSubmit', 'ajaxForm', 'validate', 'valid' /* array of methods to intercept */ ],
// error handling function
error: function(s){
/*
ERROR! blockUI is not currently working in IE
if($.blockUI){
$.blockUI({
message: s.replace(/\n/gi,'<br/>'),
css: {
border:'none', padding:'15px', size:'12.0pt',
backgroundColor:'#900', color:'#fff',
opacity:'.8','-webkit-border-radius': '10px','-moz-border-radius': '10px'
}
});
window.setTimeout($.unblockUI, 2000);
}
else//{// save a byte!
*/
alert(s);
//}// save a byte!
}
}; //} });
/*--------------------------------------------------------*/
/*
### Additional Methods ###
Required functionality outside the plugin's scope
*/
// Native input reset method - because this alone doesn't always work: $(element).val('').attr('value', '')[0].value = '';
$.fn.reset = function(){ return this.each(function(){ try{ this.reset(); }catch(e){} }); };
/*--------------------------------------------------------*/
/*
### Default implementation ###
The plugin will attach itself to file inputs
with the class 'multi' when the page loads
*/
$(function(){
//$("input:file.multi").MultiFile();
$("input[type=file].multi").MultiFile();
});
/*# AVOID COLLISIONS #*/
})(jQuery);
/*# AVOID COLLISIONS #*/
function editbox_init(){
jQuery('a.editbox:not(.nobox)')
.attr("onclick","").addClass('nobox').click(function(){
var casedoc = jQuery(this).parents('div.item').eq(0);
jQuery(casedoc).animateLoading();
jQuery.modalboxload(parametre_url(parametre_url(jQuery(this).attr('href'),'popin','oui'),'var_zajax','contenu'),{
onClose: function (dialog) {jQuery(casedoc).ajaxReload();}
});
return false;
});
}
var editbox_initialized;
if (!editbox_initialized){
if (window.jQuery){
editbox_initialized = true;
(function($){if(typeof onAjaxLoad == "function") onAjaxLoad(editbox_init);
$(editbox_init);
})(jQuery);
}
}
\ No newline at end of file
...@@ -5,133 +5,141 @@ ...@@ -5,133 +5,141 @@
url="https://trad.spip.net" url="https://trad.spip.net"
source="https://git.spip.net/spip/medias.git" source="https://git.spip.net/spip/medias.git"
reference="fr"> reference="fr">
<langue code="ar" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ar" total="177" traduits="177" relire="0" modifs="0" nouveaux="0" pourcent="100.00"> <langue code="ar" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ar" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" /> <traducteur nom="George" lien="https://trad.spip.net/auteur/george" />
</langue> </langue>
<langue code="ast" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ast" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51"> <langue code="ast" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ast" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42">
<traducteur nom="Xuacu" lien="https://trad.spip.net/auteur/xuacu" /> <traducteur nom="Xuacu" lien="https://trad.spip.net/auteur/xuacu" />
</langue> </langue>
<langue code="ay" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ay" total="177" traduits="17" relire="0" modifs="0" nouveaux="160" pourcent="9.60" /> <langue code="ay" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ay" total="178" traduits="17" relire="0" modifs="0" nouveaux="161" pourcent="9.55" />
<langue code="bg" url="https://trad.spip.net/tradlang_module/medias?lang_cible=bg" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="bg" url="https://trad.spip.net/tradlang_module/medias?lang_cible=bg" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="br" url="https://trad.spip.net/tradlang_module/medias?lang_cible=br" total="177" traduits="138" relire="0" modifs="6" nouveaux="33" pourcent="77.97"> <langue code="br" url="https://trad.spip.net/tradlang_module/medias?lang_cible=br" total="178" traduits="137" relire="0" modifs="7" nouveaux="34" pourcent="76.97">
<traducteur nom="nonobreizh" lien="https://trad.spip.net/auteur/nonobreizh" /> <traducteur nom="nonobreizh" lien="https://trad.spip.net/auteur/nonobreizh" />
</langue> </langue>
<langue code="bs" url="https://trad.spip.net/tradlang_module/medias?lang_cible=bs" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="bs" url="https://trad.spip.net/tradlang_module/medias?lang_cible=bs" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="ca" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ca" total="177" traduits="72" relire="0" modifs="15" nouveaux="90" pourcent="40.68"> <langue code="ca" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ca" total="178" traduits="71" relire="0" modifs="16" nouveaux="91" pourcent="39.89">
<traducteur nom="merce" lien="https://trad.spip.net/auteur/merce" /> <traducteur nom="merce" lien="https://trad.spip.net/auteur/merce" />
</langue> </langue>
<langue code="co" url="https://trad.spip.net/tradlang_module/medias?lang_cible=co" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51" /> <langue code="co" url="https://trad.spip.net/tradlang_module/medias?lang_cible=co" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42" />
<langue code="cpf" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cpf" total="177" traduits="25" relire="0" modifs="4" nouveaux="148" pourcent="14.12" /> <langue code="cpf" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cpf" total="178" traduits="25" relire="0" modifs="4" nouveaux="149" pourcent="14.04" />
<langue code="cpf_hat" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cpf_hat" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="cpf_hat" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cpf_hat" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="cs" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cs" total="177" traduits="27" relire="0" modifs="2" nouveaux="148" pourcent="15.25" /> <langue code="cs" url="https://trad.spip.net/tradlang_module/medias?lang_cible=cs" total="178" traduits="27" relire="0" modifs="2" nouveaux="149" pourcent="15.17" />
<langue code="da" url="https://trad.spip.net/tradlang_module/medias?lang_cible=da" total="177" traduits="11" relire="0" modifs="3" nouveaux="163" pourcent="6.21" /> <langue code="da" url="https://trad.spip.net/tradlang_module/medias?lang_cible=da" total="178" traduits="11" relire="0" modifs="3" nouveaux="164" pourcent="6.18" />
<langue code="de" url="https://trad.spip.net/tradlang_module/medias?lang_cible=de" total="177" traduits="176" relire="0" modifs="0" nouveaux="1" pourcent="99.44"> <langue code="de" url="https://trad.spip.net/tradlang_module/medias?lang_cible=de" total="178" traduits="177" relire="0" modifs="1" nouveaux="0" pourcent="99.44">
<traducteur nom="kennethkeen" lien="https://trad.spip.net/auteur/kennethkeen" /> <traducteur nom="kennethkeen" lien="https://trad.spip.net/auteur/kennethkeen" />
<traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" /> <traducteur nom="klaus++" lien="https://trad.spip.net/auteur/klaus" />
<traducteur nom="Rainer Müller" lien="https://trad.spip.net/auteur/rainer-muller" /> <traducteur nom="Rainer Müller" lien="https://trad.spip.net/auteur/rainer-muller" />
<traducteur nom="Torsten Willmann" lien="https://trad.spip.net/auteur/torsten-willmann" /> <traducteur nom="Torsten Willmann" lien="https://trad.spip.net/auteur/torsten-willmann" />
</langue> </langue>
<langue code="el" url="https://trad.spip.net/tradlang_module/medias?lang_cible=el" total="177" traduits="14" relire="0" modifs="3" nouveaux="160" pourcent="7.91" /> <langue code="el" url="https://trad.spip.net/tradlang_module/medias?lang_cible=el" total="178" traduits="14" relire="0" modifs="3" nouveaux="161" pourcent="7.87" />
<langue code="en" url="https://trad.spip.net/tradlang_module/medias?lang_cible=en" total="177" traduits="177" relire="0" modifs="0" nouveaux="0" pourcent="100.00"> <langue code="en" url="https://trad.spip.net/tradlang_module/medias?lang_cible=en" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="George" lien="https://trad.spip.net/auteur/جورج-قندلفت" /> <traducteur nom="comcinco" lien="https://trad.spip.net/auteur/comcinco-7293" />
<traducteur nom="George" lien="https://trad.spip.net/auteur/george" />
<traducteur nom="Gilles" lien="https://trad.spip.net/auteur/gilles" /> <traducteur nom="Gilles" lien="https://trad.spip.net/auteur/gilles" />
<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" /> <traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" /> <traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
<traducteur nom="raphael" lien="https://trad.spip.net/auteur/raphael-7042" /> <traducteur nom="raphael" lien="https://trad.spip.net/auteur/raphael-7042" />
<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
<traducteur nom="sQuonk" lien="https://trad.spip.net/auteur/squonk" /> <traducteur nom="sQuonk" lien="https://trad.spip.net/auteur/squonk" />
</langue> </langue>
<langue code="en_hx" url="https://trad.spip.net/tradlang_module/medias?lang_cible=en_hx" total="177" traduits="9" relire="0" modifs="4" nouveaux="164" pourcent="5.08" /> <langue code="en_hx" url="https://trad.spip.net/tradlang_module/medias?lang_cible=en_hx" total="178" traduits="9" relire="0" modifs="4" nouveaux="165" pourcent="5.06" />
<langue code="eo" url="https://trad.spip.net/tradlang_module/medias?lang_cible=eo" total="177" traduits="169" relire="0" modifs="3" nouveaux="5" pourcent="95.48"> <langue code="eo" url="https://trad.spip.net/tradlang_module/medias?lang_cible=eo" total="178" traduits="168" relire="0" modifs="4" nouveaux="6" pourcent="94.38">
<traducteur nom="gpl" lien="https://trad.spip.net/auteur/gpl" /> <traducteur nom="gpl" lien="https://trad.spip.net/auteur/gpl" />
<traducteur nom="Matthieu Marcillaud" lien="https://trad.spip.net/auteur/matthieu-marcillaud" /> <traducteur nom="Matthieu Marcillaud" lien="https://trad.spip.net/auteur/matthieu-marcillaud" />
</langue> </langue>
<langue code="es" url="https://trad.spip.net/tradlang_module/medias?lang_cible=es" total="177" traduits="164" relire="0" modifs="2" nouveaux="11" pourcent="92.66"> <langue code="es" url="https://trad.spip.net/tradlang_module/medias?lang_cible=es" total="178" traduits="177" relire="0" modifs="1" nouveaux="0" pourcent="99.44">
<traducteur nom="b_b" lien="https://trad.spip.net/auteur/b_b" /> <traducteur nom="b_b" lien="https://trad.spip.net/auteur/b_b" />
<traducteur nom="comcinco" lien="https://trad.spip.net/auteur/comcinco-7293" />
<traducteur nom="dani" lien="https://trad.spip.net/auteur/dani" /> <traducteur nom="dani" lien="https://trad.spip.net/auteur/dani" />
<traducteur nom="juanalbglz" lien="https://trad.spip.net/auteur/juanalbglz" /> <traducteur nom="juanalbglz" lien="https://trad.spip.net/auteur/juanalbglz" />
<traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" /> <traducteur nom="kent1" lien="https://trad.spip.net/auteur/kent1" />
</langue> </langue>
<langue code="eu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=eu" total="177" traduits="30" relire="0" modifs="2" nouveaux="145" pourcent="16.95" /> <langue code="eu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=eu" total="178" traduits="30" relire="0" modifs="2" nouveaux="146" pourcent="16.85" />
<langue code="fa" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fa" total="177" traduits="151" relire="0" modifs="3" nouveaux="23" pourcent="85.31"> <langue code="fa" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fa" total="178" traduits="150" relire="0" modifs="4" nouveaux="24" pourcent="84.27">
<traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" /> <traducteur nom="Davood Hossein" lien="https://trad.spip.net/auteur/davood-hossein" />
</langue> </langue>
<langue code="fon" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fon" total="177" traduits="22" relire="0" modifs="4" nouveaux="151" pourcent="12.43" /> <langue code="fon" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fon" total="178" traduits="22" relire="0" modifs="4" nouveaux="152" pourcent="12.36" />
<langue code="fr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr" total="177" traduits="177" relire="0" modifs="0" nouveaux="0" pourcent="100.00" /> <langue code="fr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00" />
<langue code="fr_fem" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr_fem" total="177" traduits="173" relire="0" modifs="0" nouveaux="4" pourcent="97.74"> <langue code="fr_fem" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr_fem" total="178" traduits="177" relire="0" modifs="1" nouveaux="0" pourcent="99.44">
<traducteur nom="b_b" lien="https://trad.spip.net/auteur/b_b" /> <traducteur nom="b_b" lien="https://trad.spip.net/auteur/b_b" />
<traducteur nom="denisb" lien="https://trad.spip.net/auteur/denisb" /> <traducteur nom="denisb" lien="https://trad.spip.net/auteur/denisb" />
</langue> </langue>
<langue code="fr_tu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr_tu" total="177" traduits="171" relire="0" modifs="2" nouveaux="4" pourcent="96.61"> <langue code="fr_tu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=fr_tu" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="beatnick" lien="https://trad.spip.net/auteur/beatnick" /> <traducteur nom="beatnick" lien="https://trad.spip.net/auteur/beatnick" />
<traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" /> <traducteur nom="RealET" lien="https://trad.spip.net/auteur/realet" />
</langue> </langue>
<langue code="gl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=gl" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51" /> <langue code="gl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=gl" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42" />
<langue code="hac" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hac" total="177" traduits="18" relire="0" modifs="0" nouveaux="159" pourcent="10.17" /> <langue code="hac" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hac" total="178" traduits="18" relire="0" modifs="0" nouveaux="160" pourcent="10.11" />
<langue code="he" url="https://trad.spip.net/tradlang_module/medias?lang_cible=he" total="177" traduits="25" relire="0" modifs="1" nouveaux="151" pourcent="14.12" /> <langue code="he" url="https://trad.spip.net/tradlang_module/medias?lang_cible=he" total="178" traduits="25" relire="0" modifs="1" nouveaux="152" pourcent="14.04" />
<langue code="hr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hr" total="177" traduits="24" relire="0" modifs="3" nouveaux="150" pourcent="13.56" /> <langue code="hr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hr" total="178" traduits="24" relire="0" modifs="3" nouveaux="151" pourcent="13.48" />
<langue code="hu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hu" total="177" traduits="25" relire="0" modifs="4" nouveaux="148" pourcent="14.12" /> <langue code="hu" url="https://trad.spip.net/tradlang_module/medias?lang_cible=hu" total="178" traduits="25" relire="0" modifs="4" nouveaux="149" pourcent="14.04" />
<langue code="id" url="https://trad.spip.net/tradlang_module/medias?lang_cible=id" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="id" url="https://trad.spip.net/tradlang_module/medias?lang_cible=id" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="is" url="https://trad.spip.net/tradlang_module/medias?lang_cible=is" total="177" traduits="7" relire="0" modifs="2" nouveaux="168" pourcent="3.95" /> <langue code="is" url="https://trad.spip.net/tradlang_module/medias?lang_cible=is" total="178" traduits="7" relire="0" modifs="2" nouveaux="169" pourcent="3.93" />
<langue code="it" url="https://trad.spip.net/tradlang_module/medias?lang_cible=it" total="177" traduits="153" relire="0" modifs="3" nouveaux="21" pourcent="86.44"> <langue code="it" url="https://trad.spip.net/tradlang_module/medias?lang_cible=it" total="178" traduits="177" relire="0" modifs="1" nouveaux="0" pourcent="99.44">
<traducteur nom="Alberto" lien="https://trad.spip.net/auteur/alberto" />
<traducteur nom="Julia14" lien="https://trad.spip.net/auteur/julia14" /> <traducteur nom="Julia14" lien="https://trad.spip.net/auteur/julia14" />
<traducteur nom="phante" lien="https://trad.spip.net/auteur/phante" /> <traducteur nom="phante" lien="https://trad.spip.net/auteur/phante" />
</langue> </langue>
<langue code="it_fem" url="https://trad.spip.net/tradlang_module/medias?lang_cible=it_fem" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51" /> <langue code="it_fem" url="https://trad.spip.net/tradlang_module/medias?lang_cible=it_fem" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42" />
<langue code="ja" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ja" total="177" traduits="169" relire="0" modifs="3" nouveaux="5" pourcent="95.48"> <langue code="ja" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ja" total="178" traduits="168" relire="0" modifs="4" nouveaux="6" pourcent="94.38">
<traducteur nom="origenius" lien="https://trad.spip.net/auteur/origenius" /> <traducteur nom="origenius" lien="https://trad.spip.net/auteur/origenius" />
</langue> </langue>
<langue code="km" url="https://trad.spip.net/tradlang_module/medias?lang_cible=km" total="177" traduits="28" relire="0" modifs="2" nouveaux="147" pourcent="15.82" /> <langue code="km" url="https://trad.spip.net/tradlang_module/medias?lang_cible=km" total="178" traduits="28" relire="0" modifs="2" nouveaux="148" pourcent="15.73" />
<langue code="la" url="https://trad.spip.net/tradlang_module/medias?lang_cible=la" total="177" traduits="13" relire="0" modifs="3" nouveaux="161" pourcent="7.34" /> <langue code="la" url="https://trad.spip.net/tradlang_module/medias?lang_cible=la" total="178" traduits="13" relire="0" modifs="3" nouveaux="162" pourcent="7.30" />
<langue code="lb" url="https://trad.spip.net/tradlang_module/medias?lang_cible=lb" total="177" traduits="151" relire="0" modifs="3" nouveaux="23" pourcent="85.31"> <langue code="lb" url="https://trad.spip.net/tradlang_module/medias?lang_cible=lb" total="178" traduits="150" relire="0" modifs="4" nouveaux="24" pourcent="84.27">
<traducteur nom="Jim Wanderscheid" lien="https://trad.spip.net/auteur/jwander" /> <traducteur nom="Jim Wanderscheid" lien="https://trad.spip.net/auteur/jwander" />
</langue> </langue>
<langue code="lt" url="https://trad.spip.net/tradlang_module/medias?lang_cible=lt" total="177" traduits="13" relire="0" modifs="3" nouveaux="161" pourcent="7.34" /> <langue code="lt" url="https://trad.spip.net/tradlang_module/medias?lang_cible=lt" total="178" traduits="13" relire="0" modifs="3" nouveaux="162" pourcent="7.30" />
<langue code="my" url="https://trad.spip.net/tradlang_module/medias?lang_cible=my" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="mg" url="https://trad.spip.net/tradlang_module/medias?lang_cible=mg" total="178" traduits="59" relire="0" modifs="0" nouveaux="119" pourcent="33.15">
<langue code="nap" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nap" total="177" traduits="21" relire="0" modifs="3" nouveaux="153" pourcent="11.86" /> <traducteur nom="iBesorongola" lien="https://trad.spip.net/auteur/ibesorongola" />
<langue code="nb" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nb" total="177" traduits="16" relire="0" modifs="3" nouveaux="158" pourcent="9.04" /> </langue>
<langue code="ne" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ne" total="177" traduits="18" relire="0" modifs="1" nouveaux="158" pourcent="10.17" /> <langue code="my" url="https://trad.spip.net/tradlang_module/medias?lang_cible=my" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="nl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nl" total="177" traduits="169" relire="0" modifs="3" nouveaux="5" pourcent="95.48"> <langue code="nap" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nap" total="178" traduits="21" relire="0" modifs="3" nouveaux="154" pourcent="11.80" />
<langue code="nb" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nb" total="178" traduits="16" relire="0" modifs="3" nouveaux="159" pourcent="8.99" />
<langue code="ne" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ne" total="178" traduits="18" relire="0" modifs="1" nouveaux="159" pourcent="10.11" />
<langue code="nl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=nl" total="178" traduits="168" relire="0" modifs="4" nouveaux="6" pourcent="94.38">
<traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" /> <traducteur nom="Hanjo" lien="https://trad.spip.net/auteur/hanjo" />
<traducteur nom="Suske" lien="https://trad.spip.net/auteur/suske" /> <traducteur nom="Suske" lien="https://trad.spip.net/auteur/suske" />
</langue> </langue>
<langue code="oc_auv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_auv" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_auv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_auv" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="oc_gsc" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_gsc" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_gsc" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_gsc" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="oc_lms" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_lms" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_lms" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_lms" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="oc_lnc" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_lnc" total="177" traduits="25" relire="0" modifs="4" nouveaux="148" pourcent="14.12" /> <langue code="oc_lnc" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_lnc" total="178" traduits="25" relire="0" modifs="4" nouveaux="149" pourcent="14.04" />
<langue code="oc_ni" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni" total="177" traduits="27" relire="0" modifs="2" nouveaux="148" pourcent="15.25" /> <langue code="oc_ni" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni" total="178" traduits="27" relire="0" modifs="2" nouveaux="149" pourcent="15.17" />
<langue code="oc_ni_la" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni_la" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_ni_la" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni_la" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="oc_ni_mis" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni_mis" total="177" traduits="153" relire="0" modifs="3" nouveaux="21" pourcent="86.44"> <langue code="oc_ni_mis" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_ni_mis" total="178" traduits="152" relire="0" modifs="4" nouveaux="22" pourcent="85.39">
<traducteur nom="sylvain" lien="https://trad.spip.net/auteur/sylvain" /> <traducteur nom="sylvain" lien="https://trad.spip.net/auteur/sylvain" />
</langue> </langue>
<langue code="oc_prv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_prv" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_prv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_prv" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="oc_va" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_va" total="177" traduits="24" relire="0" modifs="4" nouveaux="149" pourcent="13.56" /> <langue code="oc_va" url="https://trad.spip.net/tradlang_module/medias?lang_cible=oc_va" total="178" traduits="24" relire="0" modifs="4" nouveaux="150" pourcent="13.48" />
<langue code="pl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pl" total="177" traduits="25" relire="0" modifs="4" nouveaux="148" pourcent="14.12" /> <langue code="pl" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pl" total="178" traduits="25" relire="0" modifs="4" nouveaux="149" pourcent="14.04" />
<langue code="pt" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pt" total="177" traduits="151" relire="0" modifs="3" nouveaux="23" pourcent="85.31"> <langue code="pt" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pt" total="178" traduits="150" relire="0" modifs="4" nouveaux="24" pourcent="84.27">
<traducteur nom="Cláudia Anjos Lopes" lien="https://trad.spip.net/auteur/claudia_a_lopes" /> <traducteur nom="Cláudia Anjos Lopes" lien="https://trad.spip.net/auteur/claudia_a_lopes" />
</langue> </langue>
<langue code="pt_br" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pt_br" total="177" traduits="176" relire="0" modifs="0" nouveaux="1" pourcent="99.44"> <langue code="pt_br" url="https://trad.spip.net/tradlang_module/medias?lang_cible=pt_br" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="placido" lien="https://trad.spip.net/auteur/placido" /> <traducteur nom="placido" lien="https://trad.spip.net/auteur/placido" />
<traducteur nom="quijaua" lien="https://trad.spip.net/auteur/quijaua" /> <traducteur nom="quijaua" lien="https://trad.spip.net/auteur/quijaua" />
<traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" /> <traducteur nom="Ricardo Porto" lien="https://trad.spip.net/auteur/ricardo-porto" />
<traducteur nom="telopa" lien="https://trad.spip.net/auteur/telopa" /> <traducteur nom="telopa" lien="https://trad.spip.net/auteur/telopa" />
</langue> </langue>
<langue code="ro" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ro" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51" /> <langue code="ro" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ro" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42" />
<langue code="roa" url="https://trad.spip.net/tradlang_module/medias?lang_cible=roa" total="177" traduits="20" relire="0" modifs="3" nouveaux="154" pourcent="11.30" /> <langue code="roa" url="https://trad.spip.net/tradlang_module/medias?lang_cible=roa" total="178" traduits="20" relire="0" modifs="3" nouveaux="155" pourcent="11.24" />
<langue code="ru" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ru" total="177" traduits="153" relire="0" modifs="3" nouveaux="21" pourcent="86.44"> <langue code="ru" url="https://trad.spip.net/tradlang_module/medias?lang_cible=ru" total="178" traduits="152" relire="0" modifs="4" nouveaux="22" pourcent="85.39">
<traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" /> <traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" />
<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" /> <traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
</langue> </langue>
<langue code="sk" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sk" total="177" traduits="167" relire="0" modifs="3" nouveaux="7" pourcent="94.35"> <langue code="sk" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sk" total="178" traduits="166" relire="0" modifs="4" nouveaux="8" pourcent="93.26">
<traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" /> <traducteur nom="jaro" lien="https://trad.spip.net/auteur/jaro" />
</langue> </langue>
<langue code="sq" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sq" total="177" traduits="20" relire="0" modifs="5" nouveaux="152" pourcent="11.30" /> <langue code="sq" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sq" total="178" traduits="20" relire="0" modifs="5" nouveaux="153" pourcent="11.24" />
<langue code="sv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sv" total="177" traduits="38" relire="0" modifs="2" nouveaux="137" pourcent="21.47" /> <langue code="sv" url="https://trad.spip.net/tradlang_module/medias?lang_cible=sv" total="178" traduits="37" relire="0" modifs="3" nouveaux="138" pourcent="20.79" />
<langue code="tr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=tr" total="177" traduits="31" relire="0" modifs="3" nouveaux="143" pourcent="17.51" /> <langue code="tr" url="https://trad.spip.net/tradlang_module/medias?lang_cible=tr" total="178" traduits="31" relire="0" modifs="3" nouveaux="144" pourcent="17.42" />
<langue code="uk" url="https://trad.spip.net/tradlang_module/medias?lang_cible=uk" total="177" traduits="165" relire="0" modifs="3" nouveaux="9" pourcent="93.22"> <langue code="uk" url="https://trad.spip.net/tradlang_module/medias?lang_cible=uk" total="178" traduits="178" relire="0" modifs="0" nouveaux="0" pourcent="100.00">
<traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" /> <traducteur nom="olly" lien="https://trad.spip.net/auteur/olly" />
<traducteur nom="Retenodus" lien="https://trad.spip.net/auteur/retenodus" /> <traducteur nom="Retenodus" lien="https://trad.spip.net/auteur/retenodus" />
<traducteur nom="Serge Markitanenko" lien="https://trad.spip.net/auteur/serge-markitanenko" />
</langue> </langue>
<langue code="vi" url="https://trad.spip.net/tradlang_module/medias?lang_cible=vi" total="177" traduits="25" relire="0" modifs="4" nouveaux="148" pourcent="14.12" /> <langue code="vi" url="https://trad.spip.net/tradlang_module/medias?lang_cible=vi" total="178" traduits="25" relire="0" modifs="4" nouveaux="149" pourcent="14.04" />
<langue code="wo" url="https://trad.spip.net/tradlang_module/medias?lang_cible=wo" total="177" traduits="18" relire="0" modifs="3" nouveaux="156" pourcent="10.17" /> <langue code="wo" url="https://trad.spip.net/tradlang_module/medias?lang_cible=wo" total="178" traduits="18" relire="0" modifs="3" nouveaux="157" pourcent="10.11" />
<langue code="zh" url="https://trad.spip.net/tradlang_module/medias?lang_cible=zh" total="177" traduits="22" relire="0" modifs="5" nouveaux="150" pourcent="12.43" /> <langue code="zh" url="https://trad.spip.net/tradlang_module/medias?lang_cible=zh" total="178" traduits="22" relire="0" modifs="5" nouveaux="151" pourcent="12.36" />
</traduction> </traduction>
...@@ -3,11 +3,7 @@ ...@@ -3,11 +3,7 @@
// extrait automatiquement de https://trad.spip.net/tradlang_module/medias?lang_cible=ar // extrait automatiquement de https://trad.spip.net/tradlang_module/medias?lang_cible=ar
// ** ne pas modifier le fichier ** // ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) { return [
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A // A
'affichage_documents_en_cases' => 'عرض في خانات', 'affichage_documents_en_cases' => 'عرض في خانات',
...@@ -152,6 +148,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( ...@@ -152,6 +148,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'label_paginer_par' => 'تصفح حسب:', 'label_paginer_par' => 'تصفح حسب:',
'label_parents' => 'هذا المستند مرتبط بـ', 'label_parents' => 'هذا المستند مرتبط بـ',
'label_refdoc_joindre' => 'مستند رقم', 'label_refdoc_joindre' => 'مستند رقم',
'label_titre_mimetype' => 'نوع الملفات',
'lien_tout_desordonner' => 'إعادة تأصيل الترتيب', 'lien_tout_desordonner' => 'إعادة تأصيل الترتيب',
'lien_tout_desordonner_verif' => 'سيتم إعادة تأصيل ترتيب هذه اللائحة. هل تؤكدون ذلك؟', 'lien_tout_desordonner_verif' => 'سيتم إعادة تأصيل ترتيب هذه اللائحة. هل تؤكدون ذلك؟',
'lien_tout_enlever' => 'فك ربط الكل', 'lien_tout_enlever' => 'فك ربط الكل',
...@@ -213,5 +210,5 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( ...@@ -213,5 +210,5 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// V // V
'verifier_documents_brises' => 'التدقيق في الملفات المفقودة', 'verifier_documents_brises' => 'التدقيق في الملفات المفقودة',
'verifier_documents_inutilises' => 'التدقيق في روابط المستندات', 'verifier_documents_inutilises' => 'التدقيق في روابط المستندات',
'vignette_supprimee' => 'تم حذف المصغر' 'vignette_supprimee' => 'تم حذف المصغر',
); ];
...@@ -3,11 +3,7 @@ ...@@ -3,11 +3,7 @@
// extrait automatiquement de https://trad.spip.net/tradlang_module/medias?lang_cible=ast // extrait automatiquement de https://trad.spip.net/tradlang_module/medias?lang_cible=ast
// ** ne pas modifier le fichier ** // ** ne pas modifier le fichier **
if (!defined('_ECRIRE_INC_VERSION')) { return [
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// B // B
'bouton_ajouter_document' => 'Amestar un documentu', 'bouton_ajouter_document' => 'Amestar un documentu',
...@@ -56,5 +52,5 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( ...@@ -56,5 +52,5 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'upload_zip_conserver' => 'Conservar l’archivu tres de la estraición', # MODIF 'upload_zip_conserver' => 'Conservar l’archivu tres de la estraición', # MODIF
'upload_zip_decompacter' => 'descomprimíu y caún de los elementos que contien instalarase nel sitiu. Los archivos que van instalase nel sitiu son:', 'upload_zip_decompacter' => 'descomprimíu y caún de los elementos que contien instalarase nel sitiu. Los archivos que van instalase nel sitiu son:',
'upload_zip_telquel' => 'instaláu tal cual, como archivu Zip comprimíu;', 'upload_zip_telquel' => 'instaláu tal cual, como archivu Zip comprimíu;',
'upload_zip_titrer' => 'Titular según el nome de los archivos' 'upload_zip_titrer' => 'Titular según el nome de los archivos',
); ];