Das erste Beispiel zeigte uns die Grundlagen von Lua und erlaubte uns zu überprüfen, ob alles richtig funktioniert. Lass uns nun etwas Komplizierteres machen. Versuchen wir, eine Liste der Bilder auszudrucken, die mit einem roten Etikett versehen sind. Aber zunächst einmal, was ist ein Bild?

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

Das Ausführen des obigen Codes erzeugt eine Menge Output. Wir werden es uns gleich anschauen, aber zuerst schauen wir uns den Code selbst an.

Wir wissen, über require Ansel. Hier benötigen wir separat require Ansel.debug, was ein optionaler Abschnitt der API ist, der Hilfsfunktionen zur Verfügung stellt, um Lua-Skripte zu debuggen.

Ansel.database ist eine von der API bereitgestellte Tabelle, die alle Bilder in der Datenbank enthält. Jeder Eintrag in der Datenbank ist ein Bildobjekt. Bildobjekte sind komplexe Objekte, die es Ihnen ermöglichen, Ihr Bild auf verschiedene Weise zu manipulieren (im Abschnitt types_dt_lua_image_t des API-Handbuchs dokumentiert). Um unsere Bilder anzuzeigen, verwenden wir Ansel.debug.dump, eine Funktion, die alles als Parameter nimmt und den Inhalt rekursiv ausgibt. Da es sich bei Bildern um komplexe Objekte handelt, die indirekt auf andere komplexe Objekte verweisen, ist das Ergebnis enorm. Unten sehen Sie ein Beispiel für die Ausgabe.

 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

Wie wir sehen können, hat ein Bild eine große Anzahl von Feldern, welche alle möglichen Informationen darüber liefern. Wir interessieren uns für das rote Etikett. Dieses Feld ist ein boolesches Feld, und die Dokumentation sagt uns, dass es geschrieben werden kann. Jetzt müssen wir nur noch alle Bilder mit diesem Feld finden und ausdrucken.:

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

Dieser Code sollte an dieser Stelle recht einfach zu verstehen sein, aber er enthält ein paar interessante Aspekte über Lua, die es wert sind, hervorgehoben zu werden:

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