Carnet Wiki

BaliseEXIF

Version 2 — Novembre 2004 — mortimer

Voici un autre exemple de ce que l’on peut faire avec le nouveau compilateur. Cet exemple montre comment utiliser les paramètres passés à la fonction balise_UNEBALISE.._ Cette page devrait devenir une contrib quand la syntaxe sera devenue stable ;)

Page passée en contrib : Balsie EXIF : récuperer les informations stoquer dans les images.

But

Comme on l’a déjà dit, avec le nouveau compilo, on peut créer des balises personnalisées. Sur la liste des utilisateurs, il y a eu une demande pour intégrer la lecture des metadata EXIF dans les fichiers jpg. Ces données permettent d’obtenir des informations sur le fichiers jpg (souvent annotée par les appareils photo digitaux) comme l’heure de prise de la photo, des commentaires, un copyright, etc...

[Erreur...5]

function verifier_JPG_TIFF($id_document) {
  	if ($id_document > ) {
		$query = "SELECT id_type FROM spip_documents WHERE id_document = $id_document";
		$result = spip_query($query);
		if ($row = spip_fetch_array($result)) {
			$id_type = $row['id_type'];
		}
	}
	return (($id_type==1) || ($id_type==6));
}


function tag_exif($url_document,$section=0,$tag=0) {
  $to_ret = '';


$exif = exif_read_data($url_document, , true);
  if($exif) {
	if(($section) && ($tag)) {
	  $to_ret = $exif[$section][$tag];
	} else if($section) {
	  if($exif[$section]) {
		foreach ($exif[$section] as $name => $val) {
		  $to_ret .= "<B>$section.$name</B>: $val<br />\n";
		}
	  }
	} else {
	  foreach ($exif as $key => $section) {
		foreach ($section as $name => $val) {
		  $to_ret .= "<B>$key.$name</B>: $val<br />\n";
		}
	  }
	}
  }
  return $to_ret;
}

-  La première fonction teste si un fichier peut contenir des tags EXIF (à la base, si c’est un fichier jpg ou tiff)
-  La deuxième retourne un champ dans les metadata. On y accède en passant une section et un tag qui nous intéresse dans cette section. Si on ne donne pas de section et de tag, alors la fonction retourne une liste de tous les tags existant dans le fichier.

La balise

On va donc déclarer une nouvelle balise #EXIF qui retourne les metadata. Commençons par une version simple de cette balise :

function balise_EXIF($params) {


$id_doc = champ_sql('id_document', $params);


$params->code = "(verifier_JPG_TIFF($id_doc))?(tag_exif(generer_url_document($id_doc),'$section','$tag')):''";
  $params->type = 'php';


return $params;
}

[Erreur...16][Erreur...17][Erreur...18][Erreur...19]Le code que l’on veut exécuter pour cette balise ne doit pas être exécuté maintenant, mais dans le cache. Il faut donc retourner une chaîne contenant le code que l’on veut exécuter : "(verifier_JPG_TIFF($id_doc))?(tag_exif(generer_url_document($id_doc))):''"

Il faut aussi specifier à spip qu’on retourne du code php à executer — contrairement à du code html brut — en mettant : $params->type = 'php';

Passer des paramètres

[Erreur...23]SPIP n’est pas vraiment fait pour passer des paramètres à une balise. Seul la balise EXPOSER accepte des paramètres actuellement, il faut les passer comme un filtre : #EXPOSER|on,off

Nous allons utiliser la même méthode pour passer les deux paramètres à notre balise EXIF, on pourra alors faire : #EXIF|FILE,[->FileName] <code>#EXIF|FILE,FileName ou # EXIF|IFD0|DateTime&lt;/code > par exemple . ou #EXIF|IFD0|[->DateTime] par exemple.

Voici le nouveau code :

function balise_EXIF($params) {


$tag = ;
  $section = ;


[Erreur...28]  $id_doc = champ_sql('id_document', $params);


$params->code = "(verifier_JPG_TIFF($id_doc))?(tag_exif(generer_url_document($id_doc),'$section','$tag')):''";
  $params->type = 'php';
  
  return $params;
}

Il n’y pas beaucoup de différence dans le code retourné. Par contre, on va récupérer, si ils sont donnés, les paramètres $section et $tag pour les passer à tag_exif.

[Erreur...32]

Une balise LOGO

[Erreur...34][Erreur...35]

function generer_url_logo_EXIF($filename) {


$thumbname = substr($filename,0,-4).".exif.jpg";


if(file_exists($thumbname)) {
	return $thumbname;
  }


[Erreur...39]}


function generer_html_logo_EXIF($url_doc,$code_lien='',$align='') {
   if(!$url_doc)
            return '';
  if($code_lien) {
	$code = "<a href=\"$code_lien\">";
  }


$code .= "<IMG src=\"$url_doc\"".(($align)?"align=$align":'').">";
  if($code_lien) {
	$code .= "</a>";
  }


return $code;
}

Regardons maintenant comment faire pour gérer un LOGO. Le plus gros problème est en fait la gestion des filtres spéciaux d’alignement etc...

[Erreur...45]La première partie du code étudie les filtres contenus dans le tableau $p->fonctions.
Ensuite, on regarde si on a besoin de générer du code pour le lien, c’est là qu’il y a un intérêt : on peut passer comme lien, une autre balise (par exemple : [(#LOGO_EXIF|#URL_DOCUMENT)]).

[Erreur...47]

function balise_LOGO_EXIF($p) {


[Erreur...49]  $id_doc = champ_sql('id_document', $p);
  $code_lien = '';


$url_doc = "(verifier_JPG_TIFF($id_doc))?(generer_url_logo_EXIF(generer_url_document($id_doc))):''";


[Erreur...52]		$code_lien = "'".texte_script(trim($lien))."'";
		while (ereg("^([^#]*)#([A-Za-z_]+)(.*)$", $code_lien, $match)) {
			$c = calculer_champ(array(), $match[2], $p->id_boucle, $p->boucles, $p->id_mere);
			$code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien);
		}
		// supprimer les '' disgracieux
		$code_lien = ereg_replace("^''\.|\.''$", "", $code_lien);
	}


[Erreur...54]  if(!$code_lien)
	$code_lien = "''";


if(!$align)
	$align = "''";


$p->code = "generer_html_logo_EXIF($url_doc,$code_lien,$align)";
  $p->type = 'php';
  return $p;
}