Le premier exemple nous a montré les bases mêmes de Lua et nous a permis de vérifier que tout fonctionnait correctement. Faisons maintenant quelque chose d’un peu plus complexe. Essayons d’imprimer la liste des images auxquelles est attachée l’étiquette « rouge ». Mais avant tout, qu’est-ce qu’une image ?

1local Ansel = require "Ansel"
2local debug = require "Ansel.debug"
3print(Ansel.debug.dump(Ansel.database[1]))

L’exécution du code ci-dessus produit beaucoup de données. Nous l’examinerons dans un instant, mais regardons d’abord le code lui-même.

Nous connaissons require Ansel. Ici, nous devons ajouter require Ansel.debug qui est une section facultative de l’API qui fournit des fonctions d’assistance pour aider à déboguer les scripts Lua.

Ansel.database est une table fournie par l’API qui contient toutes les images de la base de données de la bibliothèque. Chaque entrée de la base de données est un objet image. Les objets image sont des objets complexes qui vous permettent de manipuler votre image de différentes manières (toutes documentées dans la section types_dt_lua_image_t du manuel de l’API). Pour afficher nos images, nous utilisons Ansel.debug.dump qui est une fonction qui accepte n’importe quel paramètre et en imprime le contenu. Étant donné que les images sont des objets complexes qui font indirectement référence à d’autres objets complexes, la sortie est énorme. Vous trouverez ci-dessous un exemple réduit de la sortie.

 1toplevel (userdata,dt_lua_image_t) : /images/100.JPG
 2   publisher (string) : ""
 3   path (string) : "/images"
 4   move (function)
 5   exif_aperture (number) : 2.7999999523163
 6   rights (string) : ""
 7   make_group_leader (function)
 8   exif_crop (number) : 0
 9   duplicate_index (number) : 0
10   is_raw (boolean) : false
11   exif_iso (number) : 200
12   is_ldr (boolean) : true
13   rating (number) : 1
14   description (string) : ""
15   red (boolean) : false
16   get_tags (function)
17   duplicate (function)
18   creator (string) : ""
19   latitude (nil)
20   blue (boolean) : false
21   exif_datetime_taken (string) : "2014:04:27 14:10:27"
22   exif_maker (string) : "Panasonic"
23   drop_cache (function)
24   title (string) : ""
25   reset (function)
26   create_style (function)
27   apply_style (function)
28   film (userdata,dt_lua_film_t) : /images
29      1 (userdata,dt_lua_image_t): .toplevel
30      [......]
31   exif_exposure (number) : 0.0062500000931323
32   exif_lens (string) : ""
33   detach_tag (function): toplevel.film.2.detach_tag
34   exif_focal_length (number) : 4.5
35   get_group_members (function): toplevel.film.2.get_group_members
36   id (number) : 1
37   group_with (function): toplevel.film.2.group_with
38   delete (function): toplevel.film.2.delete
39   purple (boolean) : false
40   is_hdr (boolean) : false
41   exif_model (string) : "DMC-FZ200"
42   green (boolean) : false
43   yellow (boolean) : false
44   longitude (nil)
45   filename (string) : "100.JPG"
46   width (number) : 945
47   attach_tag (function): toplevel.film.2.attach_tag
48   exif_focus_distance (number) : 0
49   height (number) : 648
50   local_copy (boolean) : false
51   copy (function): toplevel.film.2.copy
52   group_leader (userdata,dt_lua_image_t): .toplevel

Comme on peut le voir, une image a un grand nombre de champs qui fournissent toutes sortes d’informations à son sujet. Ici, on s’intéresse au label « rouge (red) ». Ce champ est un booléen, et la documentation nous dit qu’il peut être écrit. Il ne nous reste plus qu’à trouver toutes les images avec ce champ et les imprimer :

1Ansel = require "Ansel"
2for _,v in ipairs(Ansel.database) do
3  if v.red then
4    print(tostring(v))
5  end
6end

Ce code devrait être assez simple à comprendre à ce stade, mais il contient des aspects intéressants de Lua qui méritent d’être soulignés :

  • ipairs is a standard lua function that will iterate through all numeric indices of a table. We use it here because Ansel’s database has non-numeric indices which are functions to manipulate the database itself (adding or deleting images, for example).

  • Iterating through a table will return both the key and the value used. It is conventional in lua to use a variable named “_” to store values that we don’t care about.

  • Note that we use the standard lua function tostring here and not the Ansel-specific Ansel.debug.dump. The standard function will return a name for the object whereas the debug function will print the content. The debug function would be too verbose here. Once again, it is a great debug tool but it should not be used for anything else.