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