Il primo esempio ci ha mostrato i rudimenti di lua e ci ha permesso di verificare che tutto funzionasse. Facciamo adesso qualcosa di leggermente più complesso. Proviamo a stampare una lista di immagini che hanno allegata un’etichetta “rossa”. Ma, innanzitutto, cos’è un’immagine?
Lanciare il codice qui sopra produrrà un sacco di output. Ci guarderemo fra un attimo, ma prima guardiamo al codice stesso.
Sappiamo già riguardo a require Ansel
. Qui abbiamo bisogno di richiamare separatamente require Ansel.debug
che è un’importante sezione delle API che fornisce funzioni d’aiuto a debuggare gli script lua.
Ansel.database
è una tabella fornita dalle API che contiene tutte le immagini nella libreria. Ciascun elemento nel database è un oggetto immagine. Gli oggetti Image sono oggetti complessi che ti permettono di manipolare la tua immagine in varie maniera (tutte documentate nella sezione types_dt_lua_image_t
del manuale API). Per mostrare le tue immagini, usiamo Ansel.debug.dump
che è una funzione che prende qualsiasi cosa come suo parametro e ricorsivamente fa il dump del suo contenuto. Siccome le immagini sono oggetti complessi che indirettamente referenziano altri oggetti complessi, l’output risultante è massivo. Qui sotto un estratto di esempio dell’output.
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
Come possiamo vedere, un’immagine ha un gran numero di campi che forniscono qualsiasi sorta di informazione sull’immagine. Qui siamo interessati all’etichetta “rosso”. Questo campo è un booleano, e la documentazione ci dice che può essere scritto. Ora abbiamo solo bisogno di trovare tutte le immagini con quel campo e di stamparle:
Questo codice dovrebbe essere abbastanza semplice da capire a questo punto, ma contiene alcuni aspetti interessanti di lua che valgono la pena di essere evidenziati:
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.