O primeiro exemplo nos mostrou os conceitos básicos de Lua e permitiu que nos certificássemos de que tudo está funcionando corretamente. Agora vamos fazer algo um pouco mais complexo. Vamos tentar imprimir uma lista de imagens que possuam a etiqueta “vermelho” adicionada. Mas primeiramente o que é uma imagem?
Executar o código acima produzirá uma grande quantidade de resultados. Vamos dar uma olhada nesses resultados daqui a pouco, mas primeiro vejamos o código em si.
Já sabemos sobre require Ansel
. Aqui, precisamos require Ansel.debug
em separado, que é uma seção opcional da API que fornece funções auxiliares para ajudar a depurar scripts lua.
O Ansel.database
é uma tabela fornecida pela API que contém todas as imagens da base de dados da biblioteca. Cada entrada na base de dados é um objeto de imagem. Objetos de imagem são objetos complexos que permitem que você manipule sua imagem de diversos modos (todos eles documentados na seção types_dt_lua_image_t
do manual da API). Para exibir nossas imagens, usamos o Ansel.debug.dump
, que é uma função que recebe qualquer coisa como parâmetro e devolve recursivamente seu conteúdo. Uma vez que as imagens são objetos complexos que indiretamente referenciam outros objetos complexos, a saída resultante é imensa. Abaixo é mostrado um exemplo reduzido da saída.
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
Como podemos ver, uma imagem possui um grande número de campos que fornece todo tipo de informação sobre ela. Aqui, estamos interessados na etiqueta “vermelho”. Este campo é booleano e a documentação nos informa que pode ser editado. Nós agora apenas precisamos encontrar todas as imagens com este campo e imprimi-las:
Este código deveria ser simples de entender neste ponto, mas contém alguns aspectos interessantes de lua que merecem destaque.
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.