Browse Source

Les sprites sont désormais calculés une seule fois par page, via affichage_final. Les timestamps, qui avaient été retirés par erreur surement par r92857, sont restaurés. On peut au besoin forcer le calcul des sprites au niveau de chaque fichier en utilisant #FILTRE{creer_sprite}. Fixes plugin/creer_sprites_css#1

master
jluc@no-log.org 3 years ago
parent
commit
3938117547
  1. 107
      creer_sprites_fonctions.php
  2. 5
      paquet.xml

107
creer_sprites_fonctions.php

@ -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);
}

5
paquet.xml

@ -1,7 +1,7 @@
<paquet
prefix="creer_sprites"
categorie="multimedia"
version="1.4.1"
version="1.4.2"
etat="dev"
compatibilite="[3.2.0;3.3.*]"
documentation="http://www.paris-beyrouth.org/tutoriaux-spip/article/plugin-creer-sprites-css"
@ -12,6 +12,5 @@
<auteur>ARNO*</auteur>
<licence lien="http://www.gnu.org/licenses/gpl-2.0.html">GPL</licence>
<pipeline nom="recuperer_fond" inclure="creer_sprites_fonctions.php" />
<pipeline nom="affichage_final" inclure="creer_sprites_fonctions.php" />
</paquet>

Loading…
Cancel
Save