Permanently protected module

Módulo:Infobox/Localidade

Origem: Wikipédia, a enciclopédia livre.
Saltar para a navegação Saltar para a pesquisa
Documentação do módulo[ver] [editar] [histórico] [purgar]

Descrição

Este módulo tem funções auxiliares para criar infocaixas.

Uso

Outra documentação:

local localdata = require 'Módulo:Infobox/Localdata'
local general = require "Módulo:Infobox/Funções"
local wikidata = require "Módulo:Infobox/Wikidata"
local linguistic = require "Módulo:Linguística"
local convert = require "Módulo:Conversão"
local country = wikidata.stringTable{entity = localdata.item, property = "P17", displayformat = 'raw'}
local countryid
if country then
    countryid = country[1]
end

local defaultlinks = { -- versão da Wikipedia para usar links na ausência de artigos portugueses
    Q29 = 'eswiki', -- Espanha
    Q142 = 'frwiki', -- França
    Q182 = 'dewiki', -- Alemanha
    Q40 = 'dewiki',    -- Áustria
    Q38 = 'itwiki', -- Itália
}
local defaultlink = {'enwiki'}
if defaultlinks[countryid] then
    table.insert(defaultlink, defaultlinks[countryid])
end


local function getVal(addargs) -- para uma dada propriedade, retorna o melhor valor, assim como sua data, sua referência, e se vem da Wikidata ou não
    local args = {numval = 1, entity = localdata.item, showunit = '-', displayformat = 'raw', precision = 'year'}
    for i, j in pairs(addargs or {}) do
        args[i] = j
    end
    local statements = wikidata.getClaims(args)
    if not statements then
        return nil
    end
    local val = statements[1]
    local v = wikidata.formatStatement(val, args)
    local period = wikidata.getFormattedDate(val, args)
    local ref = nil -- TODO : funções no Módulo:Infobox/Wikidata para mostrar as refs
  
     return v, period, ref, args.property
end



-- Funções de recuperação de dados válidas em vários campos (e chamadas várias vezes)

local pop, popdate, popref, popprop = localdata['população'], localdata['ano pop'], localdata['população notas'], nil
if not pop then
    pop, popdate, popref, popprop = getVal({property = 'P1082', sorttype='inverted'})
end

local area, areadate, arearef, areaprop = localdata['área'], localdata['ano área'], localdata['área notas'], nil
if not area then
    area, areadate, arearef, areaprop = getVal({property = 'P2046', targetunit = 'square kilometer', sorttype='inverted'})
end

if pop then pop = tonumber(pop) end
if area then area = tonumber(area) end

-- Funções de formatação

local function formatVal(val, period, ref, prop)
    local s = tostring(val)
    if period then
        s = s .. '<small>' .. linguistic.inparentheses(period) .. '</small>'
    end
    if ref then
        s = s .. '<ref>' .. ref .. '</ref>'
    end
 
    if prop then
        s = wikidata.formatAndCat{entity = localdata.item, property = prop, value = s} -- permite colocar o trackback no final
    end
    return s
end

local function formatPop()
    if not pop then
        return nil
    end
 
    local popstr = convert.displayvalue(pop)
    popstr = string.gsub(popstr, '+', '') -- deve ser feito a montante
    popstr = popstr .. ' hab.'
 
    return formatVal(popstr, popdate, popref, popprop)
end

local function formatArea()
    if not area then
        return nil
    end

    -- arredondar
    local rounding = 2
    if area < 1 then
        rounding = 2
    end
 
    -- conversão para hectares se for muito pequena ?
 
    local areastr = convert.displayvalue(area, 'square kilometer', {showunit = true, rounding = rounding})
    return formatVal(areastr, areadate, arearef, areaprop)
end

local function density()
    -- TODO : verificar se a data da população corresponde à da área, para alguns casos de mudança de fronteira

    if not (pop and area) then
        return nil
    end
    local density = pop / area
    local rounding = 1
    if density < 0.1 then
        rounding = 2
    end
    local s = convert.displayvalue(density, nil, {rounding = rounding})
    s = s .. ' hab./km<sup>2</sup>'
 
    return formatVal(s, popdate)
end

-- divisões administrativas

--- por parâmetros locais
local function localDivRows() -- lista de linhas de divisão administrativa com base em dados locais
    local rows = {}
    local hasrows = false -- torna-se verdadeiro se um valor não for nulo
    for i = 1, 10 do
        i = tostring(i)
        if i == '1' then
            i = ''
        end
        local param, labelparam = 'região' .. i, 'nome região' .. i --'nome de divisão ou região' .. i
        if localdata[param] then
            hasrows = true
            local label = localdata[labelparam] or 'Departamento' -- ou localidade subdivisao
            table.insert(rows, {type = 'row', label = label, value = function() return localdata[param] end})
        end
    end
    if hasrows then
        return rows
    end
end

--- por Wikidata
local function wikidataDivRows()  -- lista de linhas de divisão administrativa com base nos dados do Wikidata
    if not localdata.item then
        return nil
    end
    -- recuperação dos valores
    local list = wikidata.transitiveVals(localdata.item, {property = 'P131', atdate = 'today', excludespecial = true}, 3, 5, countryid)
    if not list then
        return nil
    end

    -- criação das colunas
    local rows = {}
    for i, div in pairs(list) do
        if (div == countryid) then
            break
        end
        local rowlabel, rowlabelid, rowlabeltext, rowlabellink, rowvalue
        rowlabelid = wikidata.formatStatements{entity= div, property = 'P31', numval = 1, displayformat = 'raw', excludespecial = true}
        rowlabeltext = wikidata.getLabel(rowlabelid, 'pt', function(id)
            local str = wikidata.getLabel(id)
            if str then
                return linguistic.ucfirst(linguistic.removecomplement(str))  -- imposta pela formulação não muito lógica do Wikidata do tipo 'cantão da Suíça' em vez de 'cantão'        else
            end
                return ''
            end
        )
        if (not rowlabeltext) then
            rowlabeltext = 'Departamento' -- ou departamento
        end
        rowlabellink = wikidata.siteLink(rowlabelid, {defaultlink = '-', defaultlinkquery= {property = 'P2354'}} ) -- se não houver link, link para a página da lista, por exemplo, lista de estados da Califórnia

        if rowlabellink then
            rowlabel = '[[' .. rowlabellink .. '|' .. rowlabeltext .. ']]'
        else
            rowlabel = rowlabeltext
        end
        rowvalue = wikidata.formatEntity(div, {labelformat = function(id)
            local str = wikidata.getLabel(id) or ''
            if mw.ustring.match(rowlabel, str) then
                str = linguistic.keepcomplement(str)-- se o nome da divisão administrativa exibida estiver presente, não o repita
            end
            return str
            end})
     
        table.insert(rows, 1, {type = 'row', label = rowlabel, value = function() return rowvalue end})
    end
    return rows
end

--========================================

return
    {
    maincolor = 'DDFFDD',
    parts =
        {
            general.title( 'mapa'),
            {
            type = 'images',
            imageparameters =  {'brazão', 'bandeira', 'escudo'},
            wikidata = {property = {'P94', 'P41'}},
            numval = 2,
            defaultupright = '0.8'
            }, 
            general.logo(),
            general.mainimage{
                cat = '!Subdivisão administrativa ilustrada por padrao.svg',
                defaultimage = 'Padrao 2.svg',
                wikidata = {property = {'P2716', 'P18', 'P1766'}, numval = 1}
            },
            {type = 'table', rows = {
                {type = 'row', label = 'Nome oficial', plurallabel = 'Nome oficiais', value = 'nome oficial', wikidata = {property = 'P1448', showlang = true, showdate = true, precision = 'year', sorttype = 'chronological', conjtype = 'new line'} },
                {type = 'row', label = 'Nome local', plurallabel = 'Nomes locais', value = {'nome local', 'nome'}, wikidata = {property = 'P1705', showlang = true} },
                {type = 'row', label = 'Outro nome', plurallabel = 'Outros nomes', value = 'outro nome', property = 'P1449'}, -- outros nomes
                }
            },
            {type = 'table', title = 'Geografia', rows = {
                {type = 'row', label = 'Astro', value = 'astro', wikidata = { property = 'P376', excludevalue = 'Q2' }}, -- corpo astronômico onde o lugar é mencionado (útil para lugares fictícios)
                {type = 'row', label = 'Continente', plurallabel = 'Continentes', value = 'continente', property = 'P30'},
                general.country(),
                {type = 'multi', rows = localDivRows() or wikidataDivRows() or {}}, 
                {type = 'row', label = 'Ilha', value = 'ilha', property = 'P5130'},
                {type = 'row', label = 'Localização geográfica', value = 'localização geográfica', property = 'P706'},
                {type = 'row', label = 'Parte de', value = 'parte de', property = 'P361'},
                {type = 'row', label = 'Sede', value = {'sede de concelho', 'sede'}, property = 'P36'},
                {type = 'row', label = 'Capital de', value = 'capital de', property = 'P1376'},
                {type = 'row', label = 'Exclave de', value = 'exclave de', property = 'P500'},
                {type = 'row', label = 'Enclave em', value = 'enclave em', property = 'P501'},
                {type = 'row', label = 'Reivindicado por', value = 'reivindicado por', property = 'P1336'},
                {type = 'row', label = 'Banhado por', value = 'banhado por', property = 'P206'},
                {type = 'row', label = 'Clima', plurallabel = 'Climas', value = 'clima', property = 'P2564'},
                {type = 'row', label = 'Área', value = function() return formatArea() end },
                {type = 'row', label = 'Área da água', value = 'área da água', property = 'P2927'},
                {type = 'row', label = 'Departamento', plurallabel = 'Departamentos', value = 'departamento', wikidata =
                    function(item)
                    local vals = wikidata.getClaims{entity = item, property = 'P150', atdate = 'today'}
                    if (not vals) or (#vals > 5) then -- se muitas subdivisões, é necessário colocar-me no corpo do texto, não é legível na infobox
                        return nil
                    end
                    return wikidata.formatAndCat{claims = vals, property = 'P150', defaultlink = defaultlink, conjtype = 'new line'}, #vals
                    end
                },
                {type = 'row', label = 'Ponto mais baixo', plurallabel = 'Pontos mais baixos', value = 'ponto mais baixo', property = 'P1589'},
                {type = 'row', label = 'Ponto culminante', plurallabel = 'Pontos culminantes', value = 'ponto culminante', property = 'P610'},
                {type = 'row', label = 'Altitude', value = 'altitude', wikidata = {property = 'P2044', targetunit = 'metro', rounding = '0'} },
                {type = 'row', label = 'Área protegida', plurallabel = 'Áreas protegidas', value = 'área protegida', property = 'P3018'},
                {type = 'row', label = 'Geografia', value = 'geografia', property = 'P2633'},
                general.coordenadas(),
                }
            },
            general.locationmap(),
            {type = 'table', title = 'Demografia', rows = {
                {type = 'row', label = 'População', value = function() return formatPop() end },
                {type = 'row', label = 'Número de habitações', value = 'número de habitações', wikidata = {property = 'P1538', showqualifiers = {'P585'} , sorttype='inverted', numval = 1}},
                {type = 'row', label = 'Densidade', value = function() return density() end},
                {type = 'row', label = 'Gentílico', value = 'gentílico', property = 'P1549'},
                {type = 'row', label = 'Taxa de desemprego', value = 'taxa de desemprego', property = 'P1198'},
                {type = 'row', label = 'Eleitorado', value = 'eleitorado', property = 'P1831'},
                }
            },
            {type = 'table', title = 'Funcionamento', rows = {
                {type = 'row', label = 'Estatuto', value = 'estatuto', wikidata = {property = 'P31', excludevalues = {'Q515', 'Q532', 'Q486972', 'Q123705', 'Q3957', 'Q3257686', 'Q23413'}, defaultlinkquery = {property = 'P2354'}, showdate = true}}, -- exclui valores que não correspondem a um status administrativo
                {type = 'row', label = 'Constituição', value = 'constituição'},
                {type = 'row', label = localdata['rótulo presidente'] or 'Presidente', value = {'prefeito', 'presidente'}, wikidata = {property = 'P6', showdate = true, textformat='long', sorttype = 'inverted', numval = 1}}, -- para o rótulo utilizar P1313 posto ocupado pelo chefe executivo
                {type = 'row', label = 'Assembleia deliberante', value = 'assembleia', wikidata = {property = 'P194', defaultlink = defaultlink}},
                {type = 'row', label = 'Moeda', plurallabel = 'Moedas', value = 'moeda', property = 'P38'},
                {type = 'row', label = 'Equipamento', plurallabel = 'Equipamentos', value = 'equipamento', property = 'P912'},
                {type = 'row', label = 'Empregados', value = 'empregados', property = 'P1128'},
                {type = 'row', label = 'Diocese', value = 'diocese', property = 'P708'},
                {type = 'row', label = 'Estatudo patrimonial', value = 'estatuto patrimonial', wikidata = {property = 'P1435', showdate = true}},
                {type = 'row', label = 'Contem a localidade', plurallabel = 'Contem as localidades', value = 'contem a localidade', wikidata = {property = 'P1383', showdate = true}},
                {type = 'row', label = 'Membro de', value = 'membro de', property = 'P463'},
                {type = 'row', label = 'Geminação', plurallabel = 'Geminações', value = 'geminação', property = 'P190'},
                }
            },
            {type = 'table', title = 'História', rows = {
                {type = 'row', label = 'Origem do nome', value = 'origem do nome', property = 'P138'},
                {type = 'row', label = 'Designer', plurallabel = 'Designers', value = 'designer', property = 'P287'},
                {type = 'row', label = 'Fundação', value = 'fundação', property = 'P571'},
                {type = 'row', label = 'Fundador', plurallabel = 'Fundadores', value = 'fundador', property = 'P112'},
                {type = 'row', label = 'Arquiteto', plurallabel = 'Arquitetos', value = {'arquiteto', 'arquitecto'}, property = 'P84'},
                {type = 'row', label = 'Substitui', value = 'substitui', property = 'P1365'},
                {type = 'row', label = 'Evento chave', plurallabel = 'Eventos chaves', value = 'evento chave', property = 'P793'},
                {type = 'row', label = 'História', value = 'história', wikidata = {property = 'P2184', withlink = 'ptwiki', numval = '1'}},
                {type = 'row', label = 'Extinção', value = 'extinção', property = 'P576'},
                }
            },
            {type = 'table', title = 'identidade', rows = {
                {type = 'row', label = 'Língua oficial', plurallabel = 'Línguas oficiais', value = 'língua oficial', property = 'P37'},
                {type = 'row', label = 'Divisa', value = 'divisa', property = 'P1451'},
                {type = 'row', label = 'Brasão', value = 'brasão', property = 'P237'},
                {type = 'row', label = 'Bandeira', value = 'descrição bandeira', property = 'P163'},
                {type = 'row', label = 'Hino', plurallabel = 'Hinos', value = 'hino', property = 'P85'},
                {type = 'row', label = 'Símbolo', plurallabel = 'Símbolos', value = 'símbolo', property = 'P2238'},
                {type = 'row', label = 'Festa', plurallabel = 'Festas', value = 'festa', property = 'P841'},
                {type = 'row', label = 'Santo padroeiro', plurallabel = 'Santos padroeiros', value = 'santo padroeiro', property = 'P417'},
                {type = 'row', label = 'Prato tradicional', plurallabel = 'Pratos tradicionais', value = 'prato tradicional', property = 'P868'},
                }
            },
            {type = 'table', title = 'Identificadores', rows = {
                {type = 'row', label = 'Código postal', value = 'código postal', property = 'P281'},
                {type = 'row', label = '[[Federal Information Processing Standard|Code FIPS]]', value = 'FIPS', property = 'P774'},
                {type = 'row', label = '[[Geographic Names Information System|GNIS]]', value = 'GNIS', wikidata = {property = 'P590', urlpattern= 'https://geonames.usgs.gov/pls/gnispublic/f?p=gnispq:3:::NO::P3_FID:$1'}},
                {type = 'row', label = '[[Código Insee|INSEE]]', value = {'INSEE', 'insee'}, property = 'P374'},
                {type = 'row', label = '[[OKATO]]', value = 'OKATO', property = 'P721'},
                {type = 'row', label = '[[Instituto Nacional de Estatística (Espanha)|INE]]', value = 'INE municipalidades', property = 'P772'},
                {type = 'row', label = '[[Istituto nazionale di statistica|ISTAT]]', value = 'ISTAT', property = 'P635'},
                {type = 'row', label = '[[Oficinal Federal de Estatística da Alemanha|AGS]]', value = 'AGS', property = 'P439'},
                {type = 'row', label = '[[Office for National Statistics|Code ONS]]', value = 'ONS'},
         {type = 'row', label = "TGN", value = "TGN", wikidata = {property = "P1667", urlpattern= "http://vocab.getty.edu/page/tgn/$1"}},
                {type = 'row', label = '[[Prefixo telefônico]]', value = 'Prefixo telefônico', property = 'P473'},
                general.website(),
                {type = 'row', label = 'Representado por', value = 'representado por', property = 'P1875'},
                {type = 'row', label = 'Distinção', plurallabel = 'Distinções', value = 'distinção', property = 'P166'},
                }
            },
            general.geoloc({marker = 'village'}),
	    general.prononciation(),
    }
}