Certified 100% clean from spyware, adware or viruses by Softpedia

Les scripts facilement...

Cette section va vous montrer par l'exemple comment les scripts peuvent améliorer d'une façon "sympathique" vos albums. Ces exemples utilisent la vaste bibliothèque de Java classes "prête à utiliser" fournie gratuitement par Sun et sont directement utilisable. Pour une meilleure compréhension et vous aider dans la rédaction de vos scripts, je vous recommande vivement de mettre dans vos favoris de base Java API from Sun et de l'utiliser pour les classes et leurs méthodes.
Si vous êtes nouveau dans la programmation, je vous recommande tutorials (guides) et de vous concentrer sur les chapitres "java.lang", "java.util" et "java.io" . Ce sont les plus utilisés.

Si vous n'avez aucune ambition de programmer vous même, c'est pas grave... Vous pouvez vous contenter de copier/coller les exemples ci-dessous dans les fichiers slide.htt et index.htt des skins que vous souhaitez améliorer.
Il y a un guide que vous pouvez consulter d'abord et qui explique comment éditer ces fichiers.

Ajouter une annotation vocale

Beaucoup d'appareils photos numérique permettent d'ajouter une annotation vocale à vos photos. L'appareil ajoute généralement un fichier .vaw portant le même nom que la photos. Avec ce script, JAlbum va rechercher si ce type de fichier est présent dans votre dossier et ajouter une commande BGSOUND dans la page de la photos.
Ajouter simplement le script suivant juste après la balise "body" de votre fichier "slide.htt".


<!-- add and play voice annotations (.wav files) if they exist -->
<%
  import se.datadosen.util.IO;
  File sound = new File(imageDirectory, label+".WAV");
  if (sound.exists()) {
    // Make a copy if needed
    String soundPath;
    if (!outputDirectory.equals(imageDirectory) && engine.isCopyOriginals()) {
      IO.copyFile(sound.getAbsolutePath(), outputDirectory, true);
      soundPath = "../" + sound.getName();
    }
    else soundPath = IO.relativePath(sound, new File(outputDirectory, "slides"));
    out.println("<BGSOUND SRC=\"" + soundPath + "\">");
  }
%>
	

Convertir la distance focale en équivalent 35mm

Certains utilisateurs préfèrent afficher la distance focale ($focalLength) en équivalent 35mm. Voici deux scripts qui vont effectuer la conversion pour vous. En théorie, la conversion est juste une multiplication par le facteur spécifique à votre appareil (voir votre documentation, ce facteur change d'un appareil à un autre), mais la variable focalLength comprend le texte "mm" et ne peut donc pas être multipliée. le script suivant tient compte de ces lettres en supprimant la partie non numérique et converti le résultat. Après cela, il n'y a plus qu'a effectuer la multiplication et à arrondir le résultat.
Placer ce scripts dans le fichier slide.htt du skin que vous souhaitez utiliser.

<%
// Strip non-numeric ending on strings and convert result to float
float numericPart(String s) {
  int i;
  for (i=0; i<s.length(); i++) {
    char c = s.charAt(i);
    if (!Character.isDigit(c) && c != '.') break;
  }
  return Float.parseFloat(s.substring(0,i));
}
%>

...et ceci est le code qui affiche la valeur convertie (exemple pour un Canon PowerShot G1 avec un facteur de conversion de 4.857).

<ja:if exists="focalLength">
35 mm equivalent: <%= (int)(numericPart(focalLength) * 4.857 + 0.5) /* PowerShot G1 */ %>
</ja:if>

Liens vers les images dans le style "Google"

Pour une navigation rapide entre images, certains préfèrent une liste de chiffres plutôt que de simples boutons "précédant" et "suivant".
Placer ce script dans le fichier slide.htt pour obtenir cet effet "Google".
Le skin "Bluepro" utilise cet effet.


<% // Produce links to all other pages, cooler than just next, previous links
  for (int i=0; i<files.length; i++) {
    Map vars = (Map)fileVariables.get(files[i]);
    if (i+1 != imageNum) out.print("<a href=\"" + vars.get("currentPage") + "\">");
    else out.print("<b>");
    out.print(" " + (i+1));
    if (i+1 != imageNum) out.print("</a>");
    else out.print("</b>");
  }
%>
	

Liens vers des dossiers parents multiples

Si vous avez un album avec de nombreux dossiers et sous-dossier du genre Animaux\mammifères\chats\noirs, il peut être intéressant d'afficher la structure de vos dossiers sur une ligne de ce type:
Animaux >> mammifères >> chats >> noirs (lorsque vous êtes dans le dossier "noirs" ) avec des liens directs vers tous les dossiers:
Copier coller les deux petits scripts ci-dessous pour obtenir cet effet. le premier est à coller dans le fichier index.htt et le second dans le fichier slide.htt: dans votre skin.


<!-- Multilevel index links for index page -->
<%
  void writePath(File dir, String prefix) {
    boolean topLevel = fileVariables.get(dir) == null;
    if (!topLevel)
      writePath(dir.getParentFile(), prefix + "../");
    if (!topLevel) out.print(" » ");
    if (prefix.length() > 0)
      out.print("<a href=\"" + prefix + engine.getIndexPageName()
       + engine.getPageExtension() + "\">");
    else out.print("<a href=\"" + indexPage + "\">");
    out.print((topLevel ? album.get("rootName") : dir.getName()) + "</a>");
  }
  if (album.get("rootName") == null) album.put("rootName", title);
  writePath(imageDirectory, "");
%>
	

<!-- Multilevel index links for slide pages -->
<%
  void writePath(File dir, String prefix) {
    boolean topLevel = fileVariables.get(dir) == null;
    if (!topLevel)
      writePath(dir.getParentFile(), prefix + "../");
    if (!topLevel) out.print(" » ");
    if (prefix.length() > 0)
      out.print("<a href=\"../" + prefix + engine.getIndexPageName()
       + engine.getPageExtension() + "\">");
    else out.print("<a href=\"../" + indexPage + "\">");
    out.print((topLevel ? album.get("rootName") : dir.getName()) + "</a>");
  }
  if (album.get("rootName") == null) album.put("rootName", title);
  writePath(imageDirectory, "");
%>
	

Lire des données/commentaires depuis des fichiers textes séparés.

Si vous souhaitez que JAlbum ajoute automatiquement le contenu d'un fichier texte (.txt) portant le même nom que l'image, il suffit d'utiliser le petit script suivant en le copiant dans le fichier "slide.htt":


<!-- Extract text from textfiles carrying the same base name as this image -->
<ja:include page="<%= new File(imageDirectory, label+".txt") %>" />
	

Lire des données/commentaires depuis un fichier texte unique

Quelques utilisateurs ont demandé s'il était possible de regrouper tous les commentaires dans un seul fichier dans chaque dossier où sont stockés les images, puis de laisser JAlbum extraire les commentaire de ce fichier plutôt que d'extraire les EXIFS.
Le contenu du fichier devrait avoir la forme suivante:
filename1=caption one
filename2=caption two
etc

Ceci est facile à réaliser avec un petit script. Voici comment procéder : Copier le petit scripts ci-dessous dans le fichier slide.htt du skin là où vous voulez insérer votre commentaire. Créer un fichier .txt avec les nom de vos images, suivi du signe égal (=) et du commentaire propre à chaque image. Placer ce fichier dans le dossier de vos images.
Créer un album avec le skin modifié et voilà...


<!-- Extract the comment from a caption.txt file where the filename is the key -->
<%
  import se.datadosen.util.*;
  File cFile = new File(imageDirectory, "captions.txt");
  if (cFile.exists()) {
    Map captions = IO.readMapFile(cFile);
    String text = (String)captions.get(fileName);
    if (text != null) out.print(text);
  }
%>
	

Mettre des vignettes à la place des icônes Dossiers

Par défaut JAlbum utilise une icône représentant un dossier pour signaler l'existence d'un sous album. (un album dans un sous dossier), mais il peut être préférable de mettre une vignette représentative du contenu de ce sous dossier.(choisie au hasard ou sélectionnée). Le script suivant fait exactement cela. Il est à placer entre les éléments ja:coliterator d'un fichier index.htt.
Le script va choisir aléatoirement une 1 image dans le dossier sauf si il y a un fichier de "meta.properties" dans ce dossier avec une ligne précisant quelle image choisir. Le format de ce fichier doit être ainsi:

folderIcon=<filename (nom du fichier) de l'image à utiliser en tant qu'icône du dossier. >

Si le dossier ne contient que des fichiers de films, l'icône dossier standard sera utilisée.

Voici le code pour faire tout cela (nécessite au moins la version 2.8 de JAlbum):


<%
  // Try to replace folder icons with prepresentative image from subdirectory
  import se.datadosen.util.*;

  if (files[imageNum-1].isDirectory()) {
    File subDir = files[imageNum-1];
    File iconFile = null;

    // If meta.properties exists and points to an icon file, use it
    File propsFile = new File(subDir, "meta.properties");
    if (propsFile.exists()) {
      Properties props = IO.readPropertyFile(propsFile);
      iconFile = new File(subDir, props.get("folderIcon"));
    }
    else {
      // Try to use the first image as folder icon
      File[] list = subDir.listFiles();
      for (int i=0; i<list.length; i++) {
        if (FileFilters.isFileSupported(list[i])) {
          iconFile = list[i];
          break;
        }
      }
    }
    if (iconFile != null) {
      // Process this image so we can extract width and height
      setAccessibility(true);  // Turn on access to private methods
      engine.registerVariables(iconFile, outputDirectory);  // Private = might change
      Map vars = fileVariables.get(iconFile);
      // Redefine variables
      iconPath = engine.encode(subDir.getName() + "/thumbs/" +
       engine.jpegName(iconFile.getName()));
      thumbWidth = vars.get("thumbWidth");
      thumbHeight = vars.get("thumbHeight");
    }
  }
%>

Il faut faire une autre petite chose, en général les fichiers index.htt file contiennent une ligne comme celle-ci:

<img src="$iconPath"...

Il faut la remplacer par la suivante:

<IMG SRC="<%=iconPath%>" WIDTH="<%=thumbWidth%>" HEIGHT="<%=thumbHeight%>" BORDER=0><BR>

La raison pour cela, c'est que les variables dollar ($iconPath etc) sont renseignées avant l'exécution du script et que ce script redéfini les variables existantes, Il nous faut donc utiliser les variables $ à la place.

1 En fait le choix n'est pas totalement aléatoire, c'est la première image du dossier choisie par le système, qui est retenue, (dépend du mode de classement des fichiers par le système).

Restaurer la date des fichiers à la date de la photos

Il arrive que des modifications de fichiers modifient aussi la date du fichier. Si l'image possède toujours ses informations EXIF, le script suivant peut restaurer la date du fichier afin qu'elle soit identique à la celle de la photo.
Placer ce script dans le fichier slide.htt et créer l'album.


<!-- Reset file dates to EXIF dates -->
<ja:if exists="originalDate">
<%
  import java.text.*;
    Date parseExifDate(String exifDate) {
        String[] patterns = {
         "yyyy:MM:dd HH:mm:ss",
         "yyyy:MM:dd HH:mm",
         "yyyy-MM-dd HH:mm:ss",
         "yyyy-MM-dd HH:mm",
         "yyyyMMdd HHmmss",
         "yyyyMMdd HHmm"
        };
        // Try these patterns. Add new to make this method even smarter
        for (int i=0; i<patterns.length; i++) {
            try {
                DateFormat parser = new SimpleDateFormat(patterns[i]);
                return parser.parse(exifDate);
            }
            catch (ParseException ex) {}
        }
        return null;  // We cannot parse
    }
%>

<%
  Date d = parseExifDate(originalDate);
  if (d != null) {
    files[imageNum-1].setLastModified(d.getTime());
    out.println("File date modified for " + files[imageNum-1]);
  }
%>
</ja:if>

Note. In JAlbum 2.8.5 and up, the parseExifDate function is built into JAlbum, then the above can be written as:


<ja:if exists="originalDate">
<%
  Date d = se.datadosen.imaging.exif.ImageInfoFormatter.parseExifDate(originalDate);
  if (d != null) {
    files[imageNum-1].setLastModified(d.getTime());
    out.println("File date modified for " + files[imageNum-1]);
  }
%>
</ja:if>