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?

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

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:

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

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