drukowanie oznakowanych zdjęć

Pierwszy przykład pokazał podstawy lua i pozwolił sprawdzić, czy wszystko działa poprawnie. Zróbmy teraz coś bardziej skomplikowanego. Spróbujmy wydrukować listę zdjęć, mających dołączoną “czerwoną” (ang. red) etykietę. Ale… co to jest zdjęcie?

local darktable = require "darktable"
local debug = require "darktable.debug"
print(darktable.debug.dump(darktable.database[1]))

Uruchomienie tego kodu wygeneruje wiele komunikatów. Przyjrzymy się im za chwilę, na razie przeanalizujmy sam kod:

Poznaliśmy require darktable. Nadszedł czas na require darktable.debug, będące opcjonalną sekcją API, dostarczającą funkcji pomocniczych do debugowania skryptów lua.

darktable.database jest tablicą, dostarczaną przez API, zawierającą wszystkie zdjęcia z bazy danych. Każdy zapis w bazie jest obiektem zdjęcia. Obiekty zdjęć są złożone i pozwalają na edycję w różnorakie sposoby (wszystkie opisane szczegółowo w sekcji types_dt_lua_image_t podręcznika API). W celu wyświetlenia zdjęć skorzystamy z darktable.debug.dump, będącym funkcją przyjmującą jako parametr dowolny argument i rekursywnie zwracającą jego wartość. Ponieważ zdjęcia to złożone obiekty, pośrednio odwołujące się do innych złożonych obiektów, wynik bywa duży. Poniżej skrócony przykład wyjścia polecenia.

toplevel (userdata,dt_lua_image_t) : /images/100.JPG
   publisher (string) : ""
   path (string) : "/images"
   move (function)
   exif_aperture (number) : 2.7999999523163
   rights (string) : ""
   make_group_leader (function)
   exif_crop (number) : 0
   duplicate_index (number) : 0
   is_raw (boolean) : false
   exif_iso (number) : 200
   is_ldr (boolean) : true
   rating (number) : 1
   description (string) : ""
   red (boolean) : false
   get_tags (function)
   duplicate (function)
   creator (string) : ""
   latitude (nil)
   blue (boolean) : false
   exif_datetime_taken (string) : "2014:04:27 14:10:27"
   exif_maker (string) : "Panasonic"
   drop_cache (function)
   title (string) : ""
   reset (function)
   create_style (function)
   apply_style (function)
   film (userdata,dt_lua_film_t) : /images
      1 (userdata,dt_lua_image_t): .toplevel
      [......]
   exif_exposure (number) : 0.0062500000931323
   exif_lens (string) : ""
   detach_tag (function): toplevel.film.2.detach_tag
   exif_focal_length (number) : 4.5
   get_group_members (function): toplevel.film.2.get_group_members
   id (number) : 1
   group_with (function): toplevel.film.2.group_with
   delete (function): toplevel.film.2.delete
   purple (boolean) : false
   is_hdr (boolean) : false
   exif_model (string) : "DMC-FZ200"
   green (boolean) : false
   yellow (boolean) : false
   longitude (nil)
   filename (string) : "100.JPG"
   width (number) : 945
   attach_tag (function): toplevel.film.2.attach_tag
   exif_focus_distance (number) : 0
   height (number) : 648
   local_copy (boolean) : false
   copy (function): toplevel.film.2.copy
   group_leader (userdata,dt_lua_image_t): .toplevel

Jak widać, obraz ma wiele pól, opisujących wszystkie jego cechy. W tym przykładzie interesuje nas etykieta “red” (ang. czerwony). To pole jest typu logicznego, a dokumentacja mówi nam, że może być ono do zapisu. Teraz potrzebujemy tylko znaleźć wszystkie zdjęcia z tym polem i wydrukować je.

darktable = require "darktable"
for _,v in ipairs(darktable.database) do
  if v.red then
    print(tostring(v))
  end
end

Kod powinien być łatwy do zrozumienia, ale zawiera też kilka aspektów lua, nad którymi warto się zatrzymać.

  • ipars to standardowa funkcja lua, iterująca po wszystkich numerycznych indeksach tablicy. Używamy jej, ponieważ baza darktable posiada indeksy nienumeryczne, będące funkcjami do manipulacji samą bazą (na przykład takie jak dodawanie bądź usuwanie zdjęć).

  • Iteracja po tablicy zwróci klucz i użytą wartość. W lua możemy używać zmiennej “_” do przechowania wartości, na których nam nie zależy.

  • Zauważ, że zamiast zdefiniowanej dla darktable funkcji darktable.debug.dump użyliśmy tutaj standardowej funkcji lua tostring. Funkcja standardowa zwróci nazwę obiektu, podczas gdy funkcja debug wypisałaby jego zawartość. Byłaby ona tutaj po prostu zbyt gadatliwa. Funkcja debug jest naprawdę pożyteczna, ale nie powinna być używana do niczego innego.

translations