Módulo:Infobox/Funções/Pessoa

A documentação para este módulo pode ser criada na página Módulo:Infobox/Funções/Pessoa/doc

-- Funções utilizadas dentro das infobox sobre pessoas
local p = {}
local localdata = require( 'Módulo:Infobox/Localdata' )
local item = localdata.item
local wikidata = require( "Módulo:Infobox/Wikidata" )
local general = require "Módulo:Infobox/Funções"
local datemodule = require "Módulo:Data"
local complexdate = require "Módulo:Data complexa"
local linguistic = require "Módulo:Linguística"
local militaryranks = require "Módulo:Dicionário Wikidata/Graus militares"
--=== Acordo em género

-- define a variável genêro para o elemento
local function getgender(id)
    local vals = {
    ['Q6581072'] = 'f',
    ['Q6581097'] = 'm',
    default       = '?'
    }
    local gender = wikidata.formatStatements{entity = id, property = 'P21', displayformat = 'raw'}
    return vals[gender] or vals.default
end

local gender = getgender(item)

-- recuperação de rótulos genotipados da Wikidata
local function genderedlabel(id, labelgender)
    local label
    if not labelgender then
       labelgender = gender -- se o gênero não é indicado, é o da pessoa cuja infobox
    end
    if labelgender == 'f' then -- feminino: procure o texto em P2521 (texto feminino)
       label = wikidata.formatStatements{entity = id, property = 'P2521', isinlang = 'pt', numval = 1, ucfirst = '-'}
    elseif labelgender == 'm' then -- homem : procurar para o texto em P3321 (texto masculino)
           label = wikidata.formatStatements{entity = id, property = 'P3321', isinlang = 'pt', numval = 1, ucfirst = '-'}
    end
    if not label then
       label = wikidata.getLabel(id)
    end
    return label
end

-- === Gestão das datas

-- Links temáticos para datas
local datelinks = { -- link para a área apropriada de atividade
    Q483501 = 'nas artes plásticas', -- artista
    Q1028181 = 'nas artes plásticas', -- pintura
    Q1281618 = 'nas artes plásticas', -- escultura
    Q2309784 = 'no ciclismo', -- ciclista
    Q16947657 = 'nas artes plásticas', -- litografia
    Q11569986 = 'nas artes plásticas', -- gravura
    Q13365770 = 'nas artes plásticas', -- gravador de cobre
    Q21925567 = 'nas artes plásticas', -- serigrafia
    Q10862983 = 'nas artes plásticas', -- aquafortiste
}

local function getdatetopic() -- Obtém o link mais apropriado para uma data baseada na ocupação
    local claims = wikidata.stringTable{entity = item, property = 'P106', excludespecial = true, displayformat = "raw"}
    if not claims then
       return nil
    end
    for i, j in pairs(claims) do
        if datelinks[j] then
           return datelinks[j]
        end
    end
end

local linktopic = getdatetopic()


local unknowndatelabel = "data desconhecida"

local birthdate = localdata['data_nascimento'] or
    localdata['nascimento_data'] or
    wikidata.formatAndCat{
    entity = item,
    property = 'P569',
    unknownlabel = unknowndatelabel,
    minprecision = 9,
    conjtype = 'or',
    sorttype = 'chronological'
    }

local dead = wikidata.getClaims{entity = item, property = 'P570'} -- usado como um booleano que diz que se uma pessoa está morta para mudar algum elemento de exibição
local deathdate = localdata ['morte_data'] or localdata['data_morte']
local wddeathdate = wikidata.formatAndCat{
    entity = item,
    property = 'P570',
    unknownlabel = unknowndatelabel,
    minprecision = 9,
    conjtype = 'or',
    sorttype = 'chronological',
}

local function format1(event, period, predecessor, together, successor, displayformat)
    local mainstr = event
    if predecessor then
       local s = 'precedido por ' .. predecessor
       if gender == 'f' then
             s = 'precedido por ' .. predecessor
       end
       mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>'
    end
    if together then
       local s = 'com ' .. together
       mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>'
    end
    if successor then
       local s = 'sucedido por ' .. successor
       if gender == 'f' then
             s = 'sucedido por ' .. successor
       end
       mainstr = mainstr .. '<small><br />&nbsp;' .. s .. '</small>'
    end
    return {type = 'row', label = period or '', value = function() return mainstr end}
end

-----------------

local function format2(event, period, predecessor, together, successor, displayformat)
    if (not event) then
    return nil
    end
 
    local rows = {}

    local eventrow = {type = 'row1col', color = 'secondcolor', value = event }
    table.insert(rows, eventrow)

    if period then
       period = '<span style="font-weight:normal">' .. period .. '</span>'
       local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
       table.insert(rows, periodrow)
    end

    if predecessor then
       local prederow = {type = 'row', label = 'Predecessor', value = function() return predecessor end}
       table.insert(rows, prederow)
    end

    if together then
       local succrow = {type = 'row', label = 'Com', value = function() return together end}
       table.insert(rows, succrow)
    end

    if successor then
       local succrow = {type = 'row', label = 'Sucessor', value = function() return successor end}
       table.insert(rows, succrow)
    end
    return {type = 'multi', rows = rows}
end


local function format3(event, period, predecessor, together, successor, displayformat, details)
    if details then
       details = '<span style="font-weight:normal">' .. details .. '</span>'
       event = linguistic.conj({event, details}, "new line")
    end
    local mainrow =  {type = 'row1col', color = 'secondcolor', value = event }
    if period then
       period = '<span style="font-weight:normal">' .. period .. '</span>'
    end
    local periodrow = {type = 'row1col', color = '#F9F9F9', value = period }
    local successionrow = {
          style = {['background-color'] = '#F9F9F9', ['padding-bottom'] = '2%'},
          type = 'navbox',
          inner = true,
          previousval = function() return predecessor end,
          nextval = function() return successor end,
    }

    return {type = 'multi', rows = {mainrow, periodrow, successionrow}}
end


local function timeline(localparam, wdconf, timelineformat, title, singtitle, details) -- data do poster: event (assume eventos já classificados)
    local rows = {}
    local function returnTable()
    return {
           type = "table",
           title = title,
           rows = rows
    }
    end
 
    -- com dados locais
    local val = localdata[localparam]
    if val == '-' then
       return nil
    elseif val then
       table.insert(rows, {type = 'row1col', color = 'secondcolor', value = val})
    return returnTable()
    end
    -- com dados wikidata
    if not wdconf then
       return nil
    end
 
    wdconf.entity = wdconf.entity or item
    wdconf.sorttype = wdconf.sorttype or "chronological"
    wdconf.labelformat = wdconf.labelformat  or function(id) return genderedlabel(id) end
    wdconf.linktopic = wdconf.linktopic or "-"
    wdconf.stilltrue = not dead -- se a pessoa está viva, nós usamos "de" em vez de "de" (mas quando está terminado, mas a data final está faltando, ela se torna falsa) em tradução
 
    local statements = wikidata.getClaims(wdconf)
    if not statements then
       return nil
    end
    if #statements == 1 then
       title = singtitle
    end
    local displayformats = {
    A = format1,
    B = format2,
    C = format3,
    }
    local applyformat = displayformats[timelineformat] or displayformats['A']
 
    rows = {}
    for i, statement in pairs(statements) do
        local event =  linguistic.ucfirst(wikidata.formatStatement(statement, wdconf))
        local predecessor = wikidata.getFormattedQualifiers(statement, {'P155', 'P1365'})
        local together = wikidata.getFormattedQualifiers(statement, {'P1706', ''})
        local successor = wikidata.getFormattedQualifiers(statement, {'P156', 'P1366'})
        local period = wikidata.getFormattedDate(statement, {linktopic = wdconf.linktopic, stilltrue = not dead } ) -- dont pass all wdconf or else qualifiers will show up
        local detailstr 
        if type(details) == "function" then
           detailstr = details(statement)
        end
        local row = applyformat(event, period, predecessor, together, successor, wdconf, detailstr)
        if row then
           table.insert(rows, row)
        end
    end
    table.insert(rows, {type = "external text", value = function() return wikidata.addTrackingCat(wdconf.property) end})
    return returnTable()
end


local function dateandplace(thedate, theplace)
    if thedate and theplace and mw.ustring.find(thedate, "desconhecido") and mw.ustring.find(theplace, "desconhecido") then
       theplace = nil
       thedate =  mw.ustring.gsub(thedate, linguistic.ucfirst(unknowndatelabel), "Data e local desconhecido")
    end
    return linguistic.conj({thedate, theplace}, "new line")
end


--Título
function p.title(icon, style)
    return general.title(icon, style)
end

--Imagem
function p.mainimage(cat)
 
     -- pedido de ilustração apenas se a pessoa nasceu ou morreu depois de 1900, caso contrário, muitas vezes é impossível encontrar
    local defaultimage = 'Padrao 2.svg'
    local age = wikidata.stringTable{property = 'P569,P570', entity = item, displayformat = 'raw', excludespecial = true}

    if age then
       local pattern = "(%W)(%d+)%-(%d+)%-(%d+)"
       local era, year = age[1]:match(pattern)
       if (era == '-') or (tonumber(year)) < 1900 then
             defaultimage = nil
       end
    end
    return  general.mainimage(cat or '!Artigos de biografia sem imagens', defaultimage)
end

-- Nomes
function p.othernames()

    local names = {
    --{'P1477', 'Nome nativo', 'Nomes nativos', 'nome nativo'}, --nome de nascimento mesmo que P1559 
    --{'P1559', 'Nome no idioma nativo', 'Nomes nos idiomas nativos', 'nomecompleto', 'nome nativo'}, --nome de nascimento no idioma nativo
    {'P1449', 'Apelido', 'Apelidos', 'apelido'}, -- sobrenome
    {'P2001', 'Romanização revisada', 'Romanização revisada', 'romanização'},
    {'P1942', 'McCune-Reischauer', 'McCune-Reischauer', 'romanização mccune-reischauer'},
--  {'P460', 'Pseudónimo', 'Pseudónimos', 'pseudónimo'}, -- igual a P742
    {'P742', 'Pseudónimo', 'Pseudónimos', 'pseudónimo'},
    {'P1782', 'Nome de cortesia', 'Nomes de cortesias', 'nome de cortesia'},
    {'P1786', 'Nome póstumo', 'Nomes póstumos', 'nome póstumo'},
    {'P1785', 'Nome de templo', 'Nomes de templo', 'nome de templo'},
    {'P1787', 'Nome artístico', 'Nomes artísticos', 'nome artístico'},
    {'P428', 'Abreviação em botânica', 'Abreviações em botânica', 'abreviação em botânica'}, --abreviação do autor botânico
    {'P835', 'Abreviação', 'Abreviações', 'abreviação'}, -- citação de autor
    {nil, 'Outros nomes', 'Outros nomes', 'outros_nomes'},
    {nil, 'Conhecido por', 'Conhecido por', 'conhecido_por'},
    }

    local birthnamerow = { -- um pouco peculiar, tão distante
    type = "row",
    wikidata  = function()
        local s = wikidata.formatAndCat{entity = item, property = "P1559"}
        if (not s) then
              return nil
        end
        -- ver se o nome do valor se parece com o texto (tendo em conta a poluição dos marcadores de idioma
        local label = mw.ustring.lower(wikidata.getLabel(item) or "")
        local useless
        if mw.ustring.find(mw.ustring.lower(s), mw.ustring.lower(label), 0, true) then
              useless = true
        end
        if useless then
              return nil
        end
        return s
    end,
    label = 'Nome nativo',
    plurallabel = 'Nomes nativos',
    value = {'nome_completo', 'nome_nativo'},
    }
 
    local rows = {type = "multi", rows = {birthnamerow}}
    for i, j in pairs(names) do
        local query
        if j[1] and not localdata['outros nomes'] then -- quando existe um parâmetro "outros nomes", o Wikidata fica desabilitado para evitar riscos duplicados
              query = {property = j[1], showqualifiers = {'P1721'}, conjtype = 'new line'}
        end
        table.insert(rows.rows, {type = 'row', value = j[4], wikidata = query, label = j[2], plurallabel = j[3]})
    end
    return rows
end

-- NASCIMENTO E MORTE
function p.birth() -- data de nascimento na primeira linha, local do nascimento no segundo
    return {
    type = 'row',
    label = 'Nascimento',
    value =
    function()
    local thedate = datemodule.dataInfobox{args = {[1] = 'nascimento', [2] = birthdate or '', [3] = deathdate or wddeathdate or '', qualificativo = linktopic, unknownlabel = "data desconhecida"}}
    local theplace = localdata ['local_nascimento'] or localdata ['nascimento_local'] or localdata ['cidadenatal'] or wikidata.formatAndCat({entity =item, property= 'P19', rank = 'best', conjtype= ' ou ', unknownlabel = "local desconhecido"})
    return dateandplace(thedate, theplace)
    end
    }
end

function p.death() -- mesma função que a função p.birth
 
    --- de Wikidata apenas na ausência de dados locais
    local ddate = deathdate --declarado para o módulo inteiro
    if (not ddate) and (not localdata['data de desaparecimento']) then
    deathdate = wddeathdate
    end
    local thedate = datemodule.dataInfobox{args = {[1] = 'morte', [2] = birthdate or '', [3] = deathdate or '', qualificativo = linktopic, unknownlabel = "data desconhecida"}}
    local theplace = localdata['local_morte'] or wikidata.formatAndCat{entity = item, property= 'P20', rank = 'best', conjtype= ' ou ', unknownlabel = "local desconhecido"}

    local val = dateandplace(thedate, theplace)

    return
--    {type = 'row', rows = {
--    { -- desaparecimento
--    type = 'row',
--    label = 'Desaparecimento',
--    value = function() return --val end,
--    },
    { -- morte
      type = 'row',
      label = 'Morte',
      value = function() return val end,
    }
--    }}
end

function p.atividade()
    return {
           type = 'row',
           label = "Período de atividade",
           value = "período de atividade",
           wikidata = function()
           local startDate = wikidata.formatAndCat{entity = item, property = "P2031", conjtype = "or", sorttype = "chronological"}
           local endDate =    wikidata.formatAndCat{entity = item, property = "P2032", conjtype = "or", sorttype = "chronological"}
           if not (startDate or endDate) then
                 return wikidata.formatAndCat{entity = item, property = 'P1317'}
           end
           return complexdate.daterange(startDate, endDate, {precision = 11})
    end
    }
end

function p.placeofburial()
    return
    {type = 'row', label = "Sepultamento", value = "sepultamento", property = 'P119'}
end

function p.nationality()
 
    -- para melhorar as maneiras que Wikidata lida com nacionalidade: Império Alemão (1901-1918) República de Weimar (1918-1933))
    local function wdDate()
    local nation = require "Módulo:Country data".nationality
 
    -- desativação se data de nascimento antes da era contemporânea: muitas imprecisões e anacronismos
    local mindate = '1789'
 
    local birthdate = wikidata.formatStatements{entity = item, property = 'P569', displayformat = 'raw', numval = 1}
    if (not birthdate) or complexdate.before(mindate, birthdate) then
       return nil
    end
 
    return {
           property = 'P27',
           -- vals = statements, -- statments é uma variável não declarada neste módulo
           showdate = true,
           entity = item,
           conjtype = 'comma',
           removedupes = true,
           linktopic = '-',
           displayformat =
           function(snak)
           local g = gender -- tipo da pessoa, para exibição do gentio
           if g == '?' then -- se desconhecido, em masculino
                 g = 'm'
           end
           local val, success = nation(wikidata.getId(snak), g)
           if not success then
                 val = wikidata.formatSnak(snak)
           end
           return val
           end
    }
    end
 
    return {
           type = 'row',
           label = 'Cidadania',
           plurallabel = 'Cidadanias',
           value = {'nacionalidade', 'cidadania', 'país'},
           wikidata = wdDate() -- wdDate() devolve uma tabela
    }

end
--Etnia
function p.etnia()
    return
    {type = 'row', label = "[[Etnia]]", value = "etnia", property = 'P172'}
end

-- língua materna
function p.nativelanguage()
    return
    {type = 'row', label = 'Língua materna', value = 'língua materna', property = 'P103'}
end

-- Domicílios
function p.places()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Demo',
    plurallabel = 'Demos',
    value = 'demo',
    wikidata = {property = 'P2462', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
    type = 'row',
    label = 'Residência',
    plurallabel = 'Residências',
    value = {'residência', 'residencia'},
    wikidata = {property = 'P551', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
    type = 'row',
    label = 'Local de trabalho',
    plurallabel = 'Local de trabalho',
    value = 'local de trabalho',
    wikidata = {property = 'P937', sorttype= 'chronological', showdate = true, precision = 'year'},
},
    }}
end

-- carreira profissional
function p.education() -- a melhorar
    local query = {sorttype= 'chronological', property = 'P69', showdate = true, showqualifiers = 'P512', conjtype = 'new line', linktopic = '-'}
    return {
    type = 'row',
    value = {'alma mater', 'formação', 'educação', 'formaçao'},
    wikidata = query,
    label = '[[Alma mater]]',
    }
end

function p.occupation()

    local speciallabels = {
    f = {
    ['Q33999'] = '[[atriz]]',
    ['Q10798782'] = '[[atriz]]',
    ['Q10800557'] = '[[atriz]]',
    ['Q2405480'] = '[[atriz]]',
    ['Q2259451'] = '[[atriz]]',
    ['Q948329'] = '[[atriz]]'
    },
    m = {
    ['Q33999'] = '[[ator]]',
    ['Q10798782'] = '[[ator]]',
    ['Q10800557'] = '[[ator]]',
    ['Q10798782'] = '[[ator]]',
    ['Q2405480'] = '[[ator]]',
    ['Q2259451'] = '[[ator]]',
    ['Q948329'] = '[[ator]]'
    }
    }

    return {
    type = 'row',
    value = {'atividade', 'atividades', 'profissão', 'ocupação', 'desporto'},
    wikidata = {
    property = 'P106',
    defaultlink = '-',
    defaultlinkquery = {property = 'P425'},
    labelformat = function(id) return genderedlabel(id) end,
    speciallabels = speciallabels[gender] or speciallabels['m'],
    removedupes = true,
    excludevalues = { -- ocupações que não merecem ser exibidas
    'Q482980', -- autor
    --'Q15980158', "autor de não-ficção" já foi traduzido como "ensaísta"
    'Q18814623', -- autobiografia
    'Q1209498', -- jurista-poeta
    }
    },
    label = 'Atividade',
    plurallabel = 'Atividades'
    }
end

function p.employer()
    return {
        type = 'row',
        value = 'empregador',
        wikidata = {property = 'P108', showdate = true, sorttype= 'chronological'},
        label = function() return localdata['titulo empregador'] or 'Empregador' end,
    }
end

function p.victories()
    local title, singtitle = "Vitórias", "Vitória"
    local localparam = "vitoria"
    local wdconf = {property = 'P2522'}
    local displayformat = "B"
 
    return timeline(localparam, wdconf, displayformat, title, singtitle)
end


function p.officialposition()
    local title, singtitle = "Funções", "Função"
    local localparam = "função"
    local wdconf =  {
    property = 'P39',
    rank = 'valid',
    sorttype = 'inverted',
    defaultlinkquery =      {property = {'P2354', 'P2389', 'P453', 'P361', 'P108'}}, -- links padrão: lista, corpo direcionado ao corpo, "membro de", "parte de", empregador
    }
    -- em uma linha separada: jurisdição, "de", distrito eleitoral, diocese, afiliação, assembleia, partido, empregador
    local details = function(statement) return wikidata.getFormattedQualifiers(statement, {'P1001', 'P642', 'P768', 'P708', 'P1416', 'P194', 'P108', 'P937'}) end
    local displayformat = "C"
 
    return timeline(localparam, wdconf, displayformat, title, singtitle, details)
end

function p.nobilitytitle()
    local title, singtitle = "Títulos de nobreza", "Título de nobreza"
    local localparam = "titulo de nobreza"
    local wdconf = {
    property = 'P97',
    entity = item, rank = 'valid',
    showqualifiers =  {'P642'},
    defaultlinkquery =      {property = {'P2354', 'P361'}}, -- links padrão: list, body directed, "member of" e "part of"
    }
    local displayformat = "B"
 
    return timeline(localparam, wdconf, displayformat, title, singtitle)
end


function p.honorifictitle()
    local title, singtitle = "Título honoríficos", "Títulos honoríficos"
    local localparam = "titulo honorifico"
    local wdconf = {property = 'P511', entity = item, rank = 'valid'}
    local displayformat = "C"
 
    return timeline(localparam, wdconf, displayformat, title, singtitle)
end

function p.sepultura()
    return {
           type = 'images',
           imageparameters =  {'sepultura'},
           defaultimages = nil,
           defaultupright = 1,
           uprightparameter = 'upright sepultura',
           sizeparameter = 'tamanho urna', -- obsoleto
           captionparameter = 'legenda sepultura',
           defaultcaption = 'Vista da sepultura.',
           property = 'P1442',
           numval = 1,
    }
end

function p.placa()
    return {
           type = 'images',
           imageparameters =  {'placa'},
           defaultimages = nil,
           defaultupright = 1,
           uprightparameter = 'upright placa',
           sizeparameter = 'tamanho placa', -- obsoleto
           captionparameter = 'legenda placa',
           defaultcaption = 'placa comemorativa',
           property = 'P1801',
           numval = 1,
    }
end

function p.brazao()
    return {
           type = 'images',
           imageparameters =  {'brazão'},
           defaultimages = nil,
           defaultupright = 0.7,
           uprightparameter = 'upright brazão',
           sizeparameter = 'tamanho brazão', -- obsoleto
           captionparameter = 'legenda brazão',
           defaultcaption = 'brazão',
           property = 'P94',
           numval = 1,
    }
end

function p.sinete()
    return {
           type = 'images',
           imageparameters =  {'emblema'},
           defaultimages = nil,
           defaultupright = 0.7,
           uprightparameter = 'upright emblema',
           sizeparameter = 'tamanho emblema', -- obsoleto
           captionparameter = 'legenda emblema',
           defaultcaption = 'emblema',
           property = 'P158',
           numval = 1,
    }
end

function p.monogram()
    return {
           type = 'images',
           imageparameters =  {'monograma'},
           defaultimages = nil,
           defaultsize =      '100px',
           sizeparameter = 'tamanho monograma',
           captionparameter = 'legenda monograma',
           defaultcaption = 'Monograma',
           property = 'P1543',
           numval = 1,
    }
end

function p.flag()
    return {
           type = 'images',
           imageparameters =  {'bandeira'},
           defaultimages = nil,
           defaultsize =      '150px',
           sizeparameter = 'tamanho bandeira',
           captionparameter = 'legenda bandeira',
           defaultcaption = 'Bandeira',
           property = 'P41',
           numval = 1,
    }
end

function p.logo()
    return {
           type = 'images',
           imageparameters =  {'logotipo'},
           defaultimages = nil,
           defaultsize =      '150px',
           sizeparameter = 'tamanho logotipo',
           captionparameter = 'legenda logotipo',
           defaultcaption = 'Marca ou logotipo',
           property = 'P154',
           numval = 1,
    }
end

function p.politicalparty()
    return {
           type = 'row',
           value = 'partido político',
           label = 'Partido político',
           plurallabel = 'Partidos políticos',
           wikidata = { property = 'P102', sorttype= 'chronological', showdate = true, conjtype = 'new line', excludespecial = true},
    }
end

function p.memberof()
    return {type = 'multi', rows = {
{
    type = 'row',
    value = 'ordem de cavalaria',
    label = 'Ordens de Cavalarias',
    plurallabel = 'Ordens de Cavalarias',
    wikidata = {property = 'P550', sorttype= 'chronological', showdate = true},
},
{
    type = 'row',
    label = 'Membro de',
    value = {'membro de', 'filiação'},
    wikidata = {property = 'P463', sorttype= 'chronological', showdate = true, precision = 'year', textformat = 'minimum', conjtype = 'new line'},
},
    }}
end

function p.awards()
 
    local function awardsList()
    local majorawards = require "Módulo:Dicionário Wikidata/Distinções"
    local query = {
          entity = item,
          property= 'P166',
          sorttype= 'chronological',
          grouped = true,
          showqualifiers = 'P642',
          showdate= true,
          precision = 'year',
          conjtype = 'new line',
          textformat = 'minimum',
          linktopic = '-',
          defaultlinkquery = {property = {'P2354', 'P361' , 'P1027'}},
          excludevalues = 'Q15631401', -- membro da Royal Society, redundância com o campo "membro de" (P463)
          speciallabels = majorawards,
          labelformat = function(id) return genderedlabel(id) end,
    }
    local claims = wikidata.getClaims(query)
    if (not claims) then
       return nil
    end
    local str = wikidata.formatAndCat(query)
    if #claims < 4 then
       return str, #claims
    end

    --Se muitos valores, apenas exibir os importantes de [[Módulo: Dicionário Wikidata / Distinções]], e colocar os outros em um menu dobrável

    --- recuperação dos importantes
    local majorStr
    local targetvalues = {}
    for i, j in pairs(majorawards) do
        table.insert(targetvalues, i)
    end
    query.targetvalue = targetvalues
    query.value, query.claims, query.valuetable = nil, nil, nil -- aparentemente se não, por quê? BUG IMPORTANTE
    majorStr = wikidata.formatAndCat(query)

    --- dobrar dos outros
    local message = "'''Lista detalhada'''"
    local allAwardsTable = mw.html.create('div')
    :addClass("toccolours mw-collapsible mw-collapsed")
    :wikitext(message)
    :css{border = "none"}
    :tag('div')
    :addClass("mw-collapsible-content")
    :css{['line-height'] = '150%'} -- caso contrário, é realmente apertado
    :wikitext( str)
    :done()
    :allDone()

    return linguistic.conj({majorStr, tostring(allAwardsTable)}, "<br />"), #claims
    end
 
    return {
           type = 'row',
           value = {'prêmios', 'prémios', 'distincoes', 'distinções'},
           label = 'Distinções',
           singularlabel = 'Distinção',
           wikidata = function() return awardsList() end
    }
end

-- Influences
function p.influencedby()
    return {
           type = 'row',
           label =
           function(localdata, item)
           if gender == 'f' then
              return 'Influenciada por'
           elseif gender == 'f' then
               return 'Influenciado por'
           else
        return 'Influências'
           end
           end,
           value = {'influencias', 'influências'},
           wikidata = {property = 'P737'},
    }
end

function p.influenced()
    return {
    type = 'row',
    label = 'Influenciados',
    value = {'influenciados', 'influenciou'},
}
end

-- Movimentos
function p.movement()
    return
    {
    type = 'row',
        label = 'Movimento',
        value = {'movimento', 'movimentos', 'movimento(s)'},
        wikidata = {property = 'P135', sorttype= 'chronological', showdate = true, precision = 'year'},
    }
end

-- Religião
function p.religion()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Religão',
    plurallabel = 'Religiões',
    value = {'religião', 'religiao'},
    wikidata = {property = 'P140', sorttype= 'chronological', showdate = true, precision = 'year', excludevalues = 'Q7066'},
},
{
    type = 'row',
    label = 'Data de baptismo',
    value = {'data de baptismo', 'data de batismo'},
    property = 'P1636',
},
{
    type = 'row',
    label = 'Paróquia',
    plurallabel = 'Paróquias',
    value = {'paroquia', 'paróquia'},
    property = 'P1290',
},
{
    type = 'row',
    label = 'Nome em religião',
    plurallabel = 'Nomes em religião',
    value = {'nome em religiao', 'nome em religião'},
    property = 'P1635',
},
{
    type = 'row',
    label = 'Ordem religiosa',
    plurallabel = 'Ordens religiosas',
    value = 'ordem religiosa',
    property = 'P611',
},
{
    type = 'row',
    label = 'Consagramento',
    plurallabel = 'Consagramentos',
    value = 'consagramento',
    property = 'P1598',
},
{
    type = 'row',
    label =
    function(localdata, item)
        if gender == 'f' then
              return 'Venerada por'
        elseif gender == 'm' then
           return 'Venerado por'
        else
       return 'Venerada por'
        end
    end,
    value = 'venerado por',
    property = 'P1049',
},
{
    type = 'row',
    label = 'Etapa de canonização',
    value = 'etapa de canonização',
    wikidata = {
    property = 'P411',
    labelformat = function(id) return genderedlabel(id) end,
    },
},
    }}
end

-- Carreira militar
function p.military()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Exército',
    plurallabel = 'Exércitos',
    value = 'arma',
    wikidata = {property = 'P241', showdate = true, sorttype= 'chronological', precision = 'year'},
},
{
    type = 'row',
    label = 'Grau militar',
    plurallabel = 'Graus militares',
    value = 'grau militar',
    wikidata = {property = 'P410', showdate = true, sorttype= 'chronological', precision = 'year', speciallabels = militaryranks, conjtype ='new line'},
},
{
    type = 'row',
    label = 'Conflito',
    plurallabel = 'Conflitos',
    value = 'conflito',
    wikidata = {property = 'P607', conjtype = 'new line', showdate = true, sorttype= 'chronological', precision = 'year'},
},
    }}
end

-- Carreira de toureiro
function p.toureiro()
    return {type = 'multi', rows = {
{
    type = "row",
    label = "Alternativo",
    value = "alternativo",
    wikidata = function() return wikidata.keyDate("Q2840411", item) end
},
{
    type = "row",
    label = "Confirmação alternativa",
    value = "confirmacao alt",
    wikidata = function() return wikidata.keyDate("Q23308805", item) end
},
    }}
end

-- Desporto
function p.sport()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Especialidade',
    plurallabel = 'Especialidades',
    value = 'especialidade',
    wikidata = {property = 'P413',
    labelformat = function(id) return genderedlabel(id) end,
    },
},
{
    type = 'row',
    label = 'Disciplina desportiva',
    plurallabel = 'Disciplinas desportivas',
    value = {'disciplina desportiva', 'disciplina'},
    wikidata = {property = 'P2416'},
},
{
    type = 'row',
    label = 'Mão de jogo',
    value = 'mao de jogo',
    wikidata = {property = 'P741'},
},
{
    type = 'row',
    label = 'Destreza de',
    value = 'destreza',
    wikidata = {property = 'P423'},
},
{
    type = 'row',
    label = 'Repescagem por',
    plurallabel = 'Repescagens por',
    value = 'repescagem',
    wikidata = {
        property = 'P647',
        statementformat = function(statement)
        local team = wikidata.formatStatement(statement)
        local moment = wikidata.getFormattedQualifiers(statement, {'P793'}) or    wikidata.getFormattedQualifiers(statement, {'P585'})
        local rank = wikidata.getFormattedQualifiers(statement, {'P1836'})
        if rank then
              rank = require "Módulo:Name2text".ordinal(rank) .. ' escolha'
        end
        local qualifs = linguistic.conj({moment, rank}, '&nbsp;– ')
        if not qualifs then
              return team
        end
        return team .. ' <small>(' .. qualifs  .. ')</small>'
    end
 
    },
},
{
    type = 'row',
    label = 'Equipa',
    plurallabel = 'Equipas',
    value = 'equipa',
    wikidata = {
    property = 'P54',
    sorttype= 'chronological',
    conjtype = "new line",
    statementformat = function(statement)
    local str = wikidata.formatStatement(statement, {showdate = true})
    local compets = wikidata.getFormattedQualifiers(statement, {"P1350"})
    if tonumber(compets) and (tonumber(compets) > 1) then
       compets = compets .. " jogos jogados"
    elseif compets then
       compets = compets .. " jogo jogado"
    end
    local points = wikidata.getFormattedQualifiers(statement, {"P1351"})
    if tonumber(points) and (tonumber(points) > 1) then
       points = points .. " pontos marcados"
    elseif points then
       points = points     .. "ponto marcado"
    end
    local qualifiers = linguistic.conj{compets, points}
    if qualifiers then
       str= str .. " <small> – " .. qualifiers .. " </small>"
    end
    return str
    end
    }
},
{
    type = 'row',
    label = 'Jogos internationais',
    value = 'jogos',
    wikidata = {property = 'P1129', numval = 1},
},
{
    type = 'row',
    label = 'Título no xadrez',
    plurallabel = 'Títulos no xadrez',
    value = 'titulo no xadrez',
    wikidata = {property = 'P2962', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
    type = 'row',
    label = 'Classificação Elo',
    value = 'classificação elo',
    wikidata = {property = 'P1087', numval = '3', sorttype = 'inverted', conjtype = 'new line', showdate = true, precision = 'month', removedupes = true},
},
{
    type = 'row',
    label = 'Registo realizado',
    plurallabel = 'Registos realizados',
    value = {'registo realizado', 'registro realizado'},
    wikidata = {property = 'P1000', sorttype= 'chronological', showdate = true},
},
{
    type = 'row',
    label = 'Treinador',
    plurallabel = 'Treinadores',
    value = 'treinador',
    wikidata = {property = 'P286', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
    type = 'row',
    label = 'Co-piloto',
    plurallabel = 'Co-pilotos',
    value = 'co-piloto',
    wikidata = {property = 'P2095', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
    type = 'row',
    label = 'Patrocinador',
    plurallabel = 'Patrocinadores',
    value = {'patrono', 'patrocinador'},
    wikidata = {property = 'P859', sorttype= 'chronological', showdate = true, precision = 'year'},
},
    }}
end

-- Contatos
function p.contacts()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = localdata['estudante de'] or 'estudante',
    plurallabel = 'estudantes',
    value = {'estudante', 'estudantes'},
    wikidata = {property = 'P1066', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
    type = 'row',
    label = 'Orientador de doutorado',
    plurallabel = 'Orientador de doutorado',
    value = 'orientador de doutorado',
    wikidata = {property = 'P184', sorttype= 'chronological', showdate = true, precision = 'year'},
},
{
    type = 'row',
    label = 'Agente',
    label =
    function(localdata, item)
        if gender == 'f' then
              return 'Representada por'
        elseif gender == 'm' then
              return 'Representado por'
        else
       return 'Representado por'
        end
    end,
    value = 'representado por',
    wikidata = {property = 'P1875'},
},
{
    type = 'row',
    label = 'Sócio',
    plurallabel = 'Sócios',
    value = {'sócio', 'socio'},
    wikidata = {property = 'P1327'},
},
{
    type = 'row',
    label = localdata['instituto superior'] or 'Superior',
    plurallabel = 'Superiores',
    value = {'superior', 'superiores'},
    wikidata = {property = 'P802', sorttype= 'chronological', showdate = true, precision = 'year', numval = 5},
},
{
    type = 'row',
    label = 'Estudante de doutorado',
    plurallabel = 'Estudantes de doutoramento',
    value = 'estudante de doutoramento',
    wikidata = {property = 'P185', sorttype= 'chronological', showdate = true, precision = 'year', numval = 5},
},
{
    type = 'row',
    label = 'Pessoa relacionada',
    plurallabel = 'Pessoas relacionadas',
    value = 'pessoa relacionada',
    wikidata = {property = 'P3342', numval = 5, showqualifiers = 'P794'},
},
    }}
end

-- Mecenato
function p.patron()
    return {
    type = 'row',
    label = '[[Mecenato|Mecena]]',
    singularlabel = '[[Mecenato|Mecena]]',
    plurallabel = '[[Mecenato|Mecenas]]',
    value = 'mecenas',
    wikidata = {property = 'P1962', showdate = true, sorttype = 'chronological', conjtype = 'comma'},
    }
end

-- Música
function p.music()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Alcance',
    value = 'alcance',
    property = 'P412',
},
{
    type = 'row',
    label = 'Fach',
    value = 'fach',
    property = 'P1731',
},
{
    type = 'row',
    label = 'Instrumento',
    plurallabel = 'Instrumentos',
    value = 'instrumento',
    wikidata = {property = 'P1303', sorttype= 'chronological'},
},
{
    type = 'row',
    label = 'Editora discográfica',
    plurallabel = 'Editoras discográficas',
    value = {'editora discografica', 'label'},
    wikidata = {property = 'P264', sorttype= 'chronological', showdate = true, precision = 'year'},
},
    }}
end

-- Vitímas
function p.victims()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Vitímas',
    value = {'vitímas', 'vitimas'},
    wikidata = {property = 'P1345'},
},
    }}
end

-- Condenações
function p.penalties()
    return {type = 'multi', rows = {
{
    type = 'row',
    label =
    function(localdata, item)
        if gender == 'f' then
              return 'Condenada por'
        elseif gender == 'm' then
           return 'Condenado por'
        else
       return 'Condenado por'
        end
    end,
    value = 'condenado por',
    wikidata = {property = 'P1399', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
{
    type = 'row',
    label = 'Condenação',
    plurallabel = 'Condenações',
    value = {'condenacao', 'condenação'},
    wikidata = {property = 'P1596', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
{
    type = 'row',
    label = 'Ordem de detenção',
    plurallabel = 'Ordem de detenção',
    value = {'ordem de detenção', 'ordem de detencao'},
    wikidata = {property = 'P2632', showdate = true, sorttype = 'chronological', precision = 'year', conjtype = 'comma'},
},
    }}
end

-- Físico
function p.appearance()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Altura',
    value = {'tamanho', 'altura'},
    wikidata = {property = 'P2048', targetunit = 'm', rounding = '2'},
},
--[[
{
    type = 'row',
    label = 'Peso',
    value = 'peso',
    wikidata = {property = 'P2067', targetunit = 'kg', rounding = '1'},
},
]]--
{
    type = 'row',
    label = 'Cabelo',
    value = 'cabelo',
    wikidata = {property = 'P1884'},
},
{
    type = 'row',
    label = 'Olhos',
    value = 'olhos',
    wikidata = {property = 'P1340'},
},
    }}
end

-- Família
function p.family()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Família',
    plurallabels = 'Famílias',
    value = {'família', 'familia'},
    property = 'P53',
},
{
    type = 'row',
    label = 'Pai',
    value = 'pai',
    wikidata = {property = 'P22', conjtype = ' ou '},
},
{
    type = 'row',
    label = 'Mãe',
    value = {'mãe', 'mae'},
    wikidata = {property = 'P25', conjtype = ' ou '},
},
{
    type = 'row',
    label = 'Padrastro', --progenitor ?
    plurallabel = 'Padrastros',
    value = {'padrastro', 'madrastra'},
    property = 'P3448',
},
{
    type = 'row',
    label = 'Irmãos',
    value = {'irmãos', 'irmaos'},
    wikidata = {
    property = 'P3373',
    sorttype = 'chronological',
    conjtype = 'new line',
    textformat = 'long',
    precision = 'year',
    stilltrue = not dead,
    }
},
{
    type = 'row',
    label = 'Cônjuge', -- todo : adaptar a redação em genéro ?
    plurallabel = 'Cônjuges',
    value = {'cônjuge', 'conjuge'},
    wikidata = {
    property = 'P26',
    showdate = true,
    sorttype = 'chronological',
    conjtype = 'new line',
    textformat = 'long',
    precision = 'year',
    stilltrue = not dead,
    precision = 'year',
    }
},
{
    type = 'row',
    label = localdata['criança titulada'] or 'Descendentes',-- todo : adaptar a redação em genéro ?
    plurallabel = 'Descendentes',
    value = 'descendentes',
    wikidata = {
    property = 'P40',
    conjtype = 'new line',
    textformat = 'long',
    precision = 'year',
    stilltrue = (not dead),
    precision = 'year',
    }
},
{
    type = 'row',
    label = 'Parentesco',
    value = 'parentesco',
    wikidata = {
    property = 'P1038',
    excludespecial = true,
    conjtype = 'new line',
    statementformat = function(statement)
    local personid = wikidata.getMainId(statement)
    local personlabel = wikidata.formatEntity(personid)
    local persongender = getgender(personid)
    local kintype = wikidata.getFormattedQualifiers(
    statement,
    "P1039",
    {
    labelformat = function(id) return genderedlabel(id, persongender) end,
    link = "-"
    }
    )
    if kintype then
    return personlabel .. " " .. linguistic.inparentheses(kintype)
    end
    return personlabel
    end,
    }
},
    }}
end

-- Escravos
function p.slavery()
    return {type = 'multi', rows = {
{
    type = 'row',
    label = 'Estatuto',
    value = 'estatuto',
    wikidata = {property = 'P3716', defaultlinkquery = 'P425'},
},
{
    type = 'row',
    label = 'Proprietário',
    plurallabels = 'Proprietários',
    value = {'proprietário', 'proprietario'},
    property = 'P127',
},
    }}
end

-- Obras
function p.works(params)
    params = params or {}
    local title = params.title or "''''[[Magnum opus]]''''"

    local wikidata = {
          excludespecial = true,
          numval = 5,
          property = 'P800',
          defaultlink = 'image',
          showdate= true,
          labelformat = function(id) local label =  wikidata.getLabel(id) if label then return '<i>' .. label .. '</i>' end end,
    }
 
    for i, j in pairs(params) do
        wikidata[i] = j
    end
 
    return
    {type = 'table', title = title, rows = -- singulartitle = singulartitle dava erro
    {
    {type = 'row',
    value = {'obras principais', 'obras', 'magnum_opus', 'obrasdestacadas'},
    wikidata = wikidata
    }
    }
    }
end

function p.filmography()
    local title = 'Filmes notáveis'
    return
    {
    type = 'row',
    label = 'Filmes notáveis',
    value = {'filmes notáveis', 'filmes'},
    property = 'P1283'
    }
end

function p.discography()
    local title = 'Discografia'
    return
    {
    type = 'row',
    label = 'Discografia',
    value = 'discografia',
    property = 'P358'
    }
end

-- causa da morte
function p.causamorte(default)
    return {
    type = 'row',
    label = 'Causa da morte',
    value = 'causa morte',
    property = 'P509'
    }
end

-- Assinatura
function p.assinatura(default)
    local nome = localdata.nome or mw.title.getCurrentTitle().text
    local alt = 'assinatura de ' .. nome
    if mw.ustring.match( nome, '^[AEÈÉIOUY]' )        then
       alt = "assinatura de" .. nome
    end
    return {
    type = 'images',
    imageparameters =  {'assinatura'},
    defaultimage = default,
    captionparameter = 'legenda assinatura',
    defaultcaption = 'assinatura',
    uprightparameter = 'upright assinatura',
    defaultupright = 0.5,
    defaultalt = alt,
    property = 'P109',
    numval = 1
    }
end

-- Registos vocais
function p.voice()

    local function selectsound()
          -- prioridade em português
          if wikidata.getClaims{entity = item, property =  'P990', qualifier = {'P407'}, qualifiervalue  = {'Q5146'} } then
                return {property =      'P990', qualifier = {'P407'}, qualifiervalue    = {'Q5146'} }
             end
      return {property =        'P990'}
    end
    return {
       type     = 'images',
       style      = {['padding-top'] = '25px'},--{['border-width'] = '10px', ['border-style'] = 'solid'},
       label    = 'Registo vocal',
       captionparameter = 'legenda voz',
       value    = 'voz',
       wikidata      = selectsound (),
       numval     = 1,
    }
end

--== Web site
function p.website()
    return general.website()
end

return p