Het eerste voorbeeld liet ons de basis van lua zien en stelde ons in staat om te controleren of alles goed werkte. Laten we nu iets ingewikkelders doen. Laten we proberen een lijst met afbeeldingen af te drukken waaraan een “rood” label is bevestigd. Maar allereerst, wat is een beeld?

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

Het uitvoeren van de bovenstaande code zal veel output produceren. We zullen er zo naar kijken, maar laten we eerst naar de code zelf kijken.

We weten over require Ansel. Hier moeten we afzonderlijk `Ansel.debug’ vereisen, wat een optioneel gedeelte van de API is dat hulpfuncties biedt om lua-scripts te debuggen.

Ansel.database is een tabel die wordt geleverd door de API en die alle afbeeldingen in de bibliotheekdatabase bevat. Elk item in de database is een afbeeldingsobject. Afbeeldingsobjecten zijn complexe objecten waarmee je jouw afbeelding op verschillende manieren kan manipuleren (allemaal gedocumenteerd in de sectie types_dt_lua_image_t van de API-handleiding). Om onze afbeeldingen weer te geven, gebruiken we Ansel.debug.dump, een functie die alles als parameter neemt en de inhoud recursief dumpt. Omdat afbeeldingen complexe objecten zijn die indirect verwijzen naar andere complexe objecten, is de resulterende output enorm. Hieronder is een verkleind voorbeeld van de 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

Zoals we kunnen zien, heeft een afbeelding een groot aantal velden die er allerlei informatie over geven. Hier zijn we geïnteresseerd in het “rode” label. Dit veld is een boolean en de documentatie vertelt ons dat het kan worden geschreven. We hoeven nu alleen nog maar alle afbeeldingen met dat veld te vinden en ze uit te printen:

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

Deze code zou op dit moment vrij eenvoudig te begrijpen moeten zijn, maar het bevat een paar interessante aspecten van lua die de moeite waard zijn om te benadrukken:

  • 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.