@ -2,6 +2,14 @@
$GLOBALS['sprites'] = false;
/**
* @param $img image à intégrer au sprite
* @param $nom nom du fichier sprite
* @return string|void source de la balise < img > dont le src est vide
* et dont le background du style fait référence au sprite, avec le bon offset
* et un marqueur pour le timestamp
*/
function sprite($img, $nom) {
// Extraire le nom du fichier, soit directement soit dans < img src >
if (@file_exists($img)) {
@ -15,29 +23,36 @@ function sprite($img, $nom) {
}
}
$GLOBALS['sprites'][" $nom" ]['fichiers'][] = $src;
$GLOBALS['sprites'][$nom]['fichiers'][] = $src;
$largeur = largeur($img);
$hauteur = hauteur($img);
if ($largeur > $GLOBALS['sprites'][" $nom" ]['largeur']) {
$GLOBALS['sprites'][" $nom" ]['largeur'] = $largeur;
if ($largeur > $GLOBALS['sprites'][$nom]['largeur']) {
$GLOBALS['sprites'][$nom]['largeur'] = $largeur;
}
$hauteur_old = max(0, $GLOBALS['sprites'][" $nom" ]['hauteur']);
$GLOBALS['sprites'][" $nom" ]['hauteur'] += $hauteur;
$hauteur_old = max(0, $GLOBALS['sprites'][$nom]['hauteur']);
$GLOBALS['sprites'][$nom]['hauteur'] += $hauteur;
$alt = extraire_attribut($img, 'alt');
$class = extraire_attribut($img, 'class');
$fichier = sous_repertoire(_DIR_VAR, 'cache-sprites').$nom;
//$fichier .= "?m=spiprempdate[$fichier]";
// On pose un marqueur pour le timestamp du futur fichier sprite
// qui garantira le raffraîchissement de l'affichage en cas de mise à jour du sprite
$fichier .= "?m=spiprempdate[$fichier]";
$date_src = @filemtime($src);
if ($date_src > $GLOBALS['sprites']["$nom"]['date']) {
$GLOBALS['sprites'][" $nom" ]['date'] = $date_src;
if ($date_src > $GLOBALS['sprites'][$nom]['date']) {
$GLOBALS['sprites'][$nom]['date'] = $date_src;
}
return "< img src = '".find_in_path(' rien . gif ' ) . " ' width = '".$largeur."px' height = '".$hauteur."px' style = 'width: ".$largeur.' px ; height: ' . $ hauteur . " px ; background: url ( $ fichier ) 0px - " . $ hauteur_old . " px ; ' alt = '$alt' class = '$class' / > ";
}
/**
* @param string $fichier un nom de fichier gif jpg ou png
* @return bool|mixed l'extension du fichier, ou false si l'extension n'est pas gif jpg ou png
*/
function creer_sprites_terminaison_fichier_image($fichier) {
if (preg_match(',^(?>.*)(?< =\.(gif|jpg|png)),', $fichier, $regs)) {
$terminaison = $regs[1];
@ -47,36 +62,56 @@ function creer_sprites_terminaison_fichier_image($fichier) {
}
}
/**
* @param array $flux
* @return mixed
*
* Inutile désormais, gardé pour compatibilité si jamais c'était utilisé dans un code perso
*/
function creer_sprites($flux) {
$sprites = $GLOBALS['sprites'];
$page = $flux['data']['texte'];
if ($sprites) {
$flux['data']['texte'] = filtre_creer_sprites($flux['data']['texte']);
return $flux;
}
/**
* @param string $page
* @return string la page modifiée
*
* Crée les fichiers sprites à partir de toutes les informations collectées
* et remplace les marqueurs de datage par le timestamp du fichier sprite
*
* Appelé par défaut le pipeline affichage_final
* Peut aussi être appelé par un #FILTRE si on veut forcer au niveau d'un squelette
*/
function filtre_creer_sprites($page) {
if ($sprites = $GLOBALS['sprites']) {
foreach ($sprites as $key => $sprite) {
$fichier_sprite = sous_repertoire(_DIR_VAR, 'cache-sprites').$key;
$ext = creer_sprites_terminaison_fichier_image($fichier_sprite);
$nom_fichier_sprite = substr($fichier_sprite, 0, strlen($fichier_sprite) - 4);
$date_max = $sprite['date'];
$date_src = @filemtime($fichier_sprite);
$largeur = $sprite['largeur'];
$hauteur = $sprite['hauteur'];
$creer = false;
// On recalcule le sprite si l'un des fichiers qui le compose est plus récent que le sprite
if ($date_src < $date_max) {
$creer = true;
}
if ($largeur != largeur($fichier_sprite) || $hauteur != hauteur($fichier_sprite)) {
$creer = true;
}
if (!empty($_GET['var_mode'])
and in_array($_GET['var_mode'], array('recalcul', 'debug'))) {
$creer = true;
}
if ($creer) {
include_spip('inc/filtres_images');
$im = imagecreatetruecolor($largeur, $hauteur);
imagepalettetotruecolor($im);
@imagealphablending($im, false);
@ -89,14 +124,14 @@ function creer_sprites($flux) {
$f = 'imagecreatefrom'.str_replace('jpg', 'jpeg', creer_sprites_terminaison_fichier_image($img));
$im_tmp = $f($img);
@imagepalettetotruecolor($im_tmp);
$x = imagesx($im_tmp);
$y = imagesy($im_tmp);
@ImageCopy($im, $im_tmp, 0, $y_total, 0, 0, $x, $y);
$y_total += $y;
}
_image_imagepng($im, "$nom_fichier_sprite.png");
$ext = creer_sprites_terminaison_fichier_image($fichier_sprite);
@ -109,32 +144,36 @@ function creer_sprites($flux) {
}
}
}
// Mettre les dates des fichiers en variable de chaque appel
$page = preg_replace_callback(',spiprempdate\[([^\]]*)\],', 'creer_sprites_remplacer_date', $page);
$flux['data']['texte'] = $page;
$GLOBALS['sprites'] = false;
return $flux;
}
return $page;
}
/**
* @param array $regs tableau dont l'élément d'index 1 est un chemin de fichier
* @return string mixed timestamp de la création du fichier
*/
function creer_sprites_remplacer_date($regs) {
static $date_fichier=array();
$fichier = $regs[1];
if ($date_fichier["$fichier"] > 0) {
return $date_fichier[" $fichier" ];
if ($date_fichier[$fichier] > 0) {
return $date_fichier[$fichier];
} else {
$date_fichier[" $fichier" ] = @filemtime($fichier);
return $date_fichier[" $fichier" ];
$date_fichier[$fichier] = @filemtime($fichier);
return $date_fichier[$fichier];
}
}
function creer_sprites_recuperer_fond($flux) {
if (isset($flux['args']['fond'])
and ($flux['args']['fond'] == 'modeles/logo'
or ($flux['args']['fond'] == 'modeles/lesauteurs'))) {
return $flux;
}
return creer_sprites($flux);
/**
* @param $page
* @return string
*
* Pipeline pour calculer les sprites et les timestamp
*/
function creer_sprites_affichage_final($page) {
return filtre_creer_sprites($page);
}