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 ?
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 :
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-specificAnsel.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.