Módulo:Info/local
Descrição
Este módulo estende as funções do Módulo:Info, adicionando funções específicas para artigos de localidades.
Uso
Este módulo não deve ser usado diretamente, para que as funções deste módulo possam ser usadas invoque o Módulo:Info com {{#invoke:Info|local
.
Este módulo adiciona as seguintes funções:
#bandeira, #escudo, #selo ou #emblema
O campo com rótulos #bandeira, #escudo, #brasão, #selo ou #emblema adicionarão a imagem que foi preenchida com 100px de largura e legenda de acordo com a função, "bandeira" para #bandeira, "brasão de armas" para #brasão ou #escudo, "selo" para #selo, e "emblema" para #emblema. Ao se adicionar uma segunda função desse tipo na infobox a imagem ficará ao lado da primeira com largura de 60px. Então se por exemplo adicionar somente |#bandeira : {{#if:{{{bandeira|}}}|{{{bandeira}}}|#wd:P41}}
aparecerá somente a bandeira, se após a bandeira existir um campo |#escudo : {{#if:{{{brasão|}}}|{{{brasão}}}|#wd:P94}}
o escudo aparecerá ao lado da bandeira. Esta função só permite dois campos.
Coordenadas
O parâmetro |coordenadas=
ira colocar as coordenadas no topo do artigo, igual faz a {{coor dms|display=título}}
, porém em vez dos parâmetros |latd=
, |latm=
, etc, como é comum em predefinições de coordenadas, as coordenadas devem ser preenchidas todas juntas, no formato G M S [NS] G M S [LO], as marcas de graus, minutos e segundos (1° 2' 3") são opcionais, e o formato decimal também é reconhecido, por exemplo "-12.34 56,78" ou "12,34 S 56,78 L". Para importar as coordenadas do Wikidata use |coordenadas = wikidata
.
Para fazer predefinições antigas que usam os campos do tipo latd, latG ou semelhantes funcionarem e buscar as coordenadas no Wikidata quando não estiverem preenchidas localmente, preencha o parâmetro desta forma:
| coordenadas = {{#if:{{{latG|}}}|{{{latG}}} {{{latM}}} {{{latS|}}} {{{latP}}} {{{lonG}}} {{{lonM}}} {{{lonS|}}} {{{lonP}}}|wikidata}}
Mapa
Ao utilizar o rótulo #mapa em um campo, esse campo exibirá um mapa usando uma imagem de um mapa ou usando um mapa dinâmico. As coordenadas usadas para colocar a marcação no mapa é a coordenada preenchida no parâmetro coordenadas explicado acima.
Para usar uma imagem, preencha o campo com o nome da imagem seguido das coordenas em formato decimal do canto superior esquerdo da imagem seguido das coordenadas do canto inferior direito, ou seja, as bordas norte, oeste, sul e leste, nessa ordem. Essas informações podem ser encontradas nas subpredefinições da predefinição:Mapa de localização. Por exemplo, {{Mapa de localização/Alpes}} mostra que a imagem é 'Alps location map.png' e as bordas norte, oeste, sul e leste são respectivamente 48.5, 4.5, 42.75 e 17, então para usar esse mapa preencha o campo com o formato |#mapa : Alps location map.png 48.5 4.5 42.75 17
. Veja o exemplo na infobox:
Monte Branco | |
---|---|
{{#invoke:Info|local | cor = 12.1 | título = Monte Branco | coordenadas = 45° 55' 1" N 6° 51' 54" L | #mapa : Alps location map.png 48.5 4.5 42.75 17 }}
Para os mapas de países, existe banco de dados do Módulo:Países, que tem os mapas da maioria dos países, dos continentes e o mapa mundi. Se o mapa desse país estiver nesse módulo, use apenas o nome do país, por exemplo |#mapa : Alemanha
, |#mapa : Asia
ou |#mapa : Mundo
.
Para usar o mapa dinâmico, preencha |#mapa : dinâmico
, é possível também determinar o zoom no formato |#mapa : dinâmico zoom:8
, quando não informado o zoom padrão será 5.
Existe também a opção |#mapa : auto
, isso fará o módulo buscar a propriedade P17 (país) no Wikidata, se existir essa propriedade e existir um mapa para esse país no Módulo:Países, esse mapa será usado, se não existir será usado o mapa dinâmico.
Área e população
O módulo também pode inserir a área relativa e a densidade populacional, para isso o campo |#área:X;Y
deve ser colocado logo acima do primeiro campo de área, X e Y são o rótulo da área total e o rótulo da população total. Os campos após a área total que começar com número seguido de "Km²" serão considerados área parcial e será colocado a porcentagem da área total entre parênteses, "mi²" também pode ser usado e será convertido pra Km², número sem unidade será considerado Km² e terá a unidade inseria após o número.
Serão considerados campo de população os campos com número nos dados que estiverem após os campos de área e tiver o rótulo da população total ou algum rótulo igual a um rótulo de área. Após cada campo de população será inserido um campo com a densidade populacional.
Uso de #área | |
---|---|
Área | |
Total | 12000 Km² |
Urbana | 7000 |
População | |
Total | 100000 hab |
- densidade | 8,3 hab/Km² |
Urbana | 92000 hab |
{{#invoke:Info|local | cor = 9.3 | título = Uso de #área | #tópico : Área | #área : Total ; Total | Total : 12000 Km² | Urbana : 7000 | #tópico : População | Total : 100000 hab | Urbana : 92000 hab }}
Ver também
- Módulo:Info
- {{Coor dms}}
- {{Mapa de localização}}
-- Extensão do Módulo:Info para adicionar funções relacionadas a localidades
ext = {}
ext.especial = {}
-- Converte coordenada do formato G M S para fração
local gms_f = function(coor)
local quadrante = string.match(coor, '[NSLO]$')
local div = 1
local resp = 0
for n in string.gmatch(coor, '(%-?%d+)') do
n = tonumber(n)
resp = resp + n / div
div = div * 60
end
return resp * ((quadrante == 'S' or quadrante == 'O') and -1 or 1)
end
-- Converte coordenada do formato fração para G M S
local f_gms = function(coor, latorlong)
local abs = math.abs(tonumber(coor))
local grau = math.floor(abs)
local min = math.floor((abs - grau) * 60)
local seg = math.floor(((abs - grau) * 60 - min) * 60)
local hemi = tonumber(coor) >= 0 and (latorlong == 'lat' and 'N' or 'L') or (latorlong == 'lat' and 'S' or 'O')
return string.format('%02d° %02d\' %02d" %s', grau, min, seg, hemi)
end
-- Retorna coordenadas no formato G° M' S" [NS] G° M' S" [LO] aceitando vários formatos de entrada
local coordenadas = function()
local coor = params['coordenadas']
if not coor or coor == 'wikidata' or coor == 'Wikidata' then
if not wd then
require('Módulo:Info/wd')
end
if wd.props and wd.props['P625'] then
local valor = wd.props['P625'][1]['mainsnak']['datavalue']['value']
ext.coorf = {valor['latitude'], valor['longitude']}
ext.coorgms = {f_gms(valor['latitude'], 'lat'), f_gms(valor['longitude'], 'long')}
return
end
end
if not coor then
return
end
local formato, hemi, lat, long
local latn, longn
for match in string.gmatch(coor, '[%-0-9%.NSLOWE]+') do
if not formato then
if string.match(match, '^%-?%d+%.%d+$') then
formato = 'g.f'
lat = match
if string.match(match, '^%-') then
hemi = '+-'
end
elseif string.match(match, '^%d+$') then
formato = 'gms'
lat = match .. '°'
latn = 1
else
return nil
end
elseif string.match(match, '^[NSLOEW]$') then
if hemi == '+-' then
return 'erro nas coordenadas, sinal de menos junto com ' .. match
elseif formato == 'g.f' then
if not long and match == 'S' then
lat = '-' .. lat
elseif long and (match == 'O' or match == 'W') then
long = '-' .. long
end
else
if long then
long = long .. ' ' .. (match == 'W' and 'O' or match == 'E' and 'L' or match)
else
lat = lat .. ' ' .. match
end
end
hemi = 'NSLO'
elseif string.match(match, '^%d+$') then
if not long and formato == 'gms' and latn < 3 and not string.match(lat, '[NS]$') then
lat = lat .. ' ' .. match .. (latn == 1 and "'" or latn == 2 and '"')
latn = latn + 1
elseif not long and formato == 'gms' then
long = match .. '°'
longn = 1
elseif long and formato == 'gms' and longn < 3 and not string.match(long, '[LO]$') then
long = long .. ' ' .. match .. (longn == 1 and "'" or longn == 2 and '"')
longn = longn + 1
else
return 'erro nas coordenadas'
end
elseif not long and formato == 'g.f' and string.match(match, '^%-?%d+%.%d+$') then
long = match
else
return 'erro nas coordenadas: ' .. coor
end
end
if not lat or not long then
return string.format('erro nas coordenadas: coor=%s; lat=%s; latn=%s; long=%s; longn=%s; hemi=%s; formato=%s',
coor, lat or 'nil', latn or 'nil', long or 'nil', longn or 'nil', hemi or 'nil', formato or 'nil')
end
if formato == 'gms' then
if not string.match(lat, '%d%d?° %d%d?\' %d%d?" [NS]') and not string.match(lat, '%d%d?° %d%d?\' [NS]')
and not string.match(lat, '%d%d?° [NS]') then
return 'erro nas coordenadas, lat = ' .. lat
elseif not string.match(long, '%d%d?° %d%d?\' %d%d?" [LO]') and not string.match(long, '%d%d?° %d%d?\' [LO]')
and not string.match(long, '%d%d?° [LO]') then
return 'erro nas coordenadas, long = ' .. long
end
ext.coorgms = {lat, long}
ext.coorf = {gms_f(lat), gms_f(long)}
else
ext.coorf = {lat, long}
ext.coorgms = {f_gms(lat, 'lat'), f_gms(long, 'long')}
end
end
local mapa_imagem = function(mapa, lat, long)
local imagem, N, O, S, L = string.match(mapa, '^([^.]+%.%a%a%a) (%-?[%d.]+) (%-?[%d.]+) (%-?[%d.]+) (%-?[%d.]+)')
if not imagem then
local paises = mw.loadData('Módulo:Países')
mapa = paises and paises[mapa] and (type(paises[mapa]) == 'string' and paises[paises[mapa]]['mapa'] or
paises[mapa]['mapa'])
if mapa then
imagem, N, O, S, L = string.match(mapa, '([^.]+%.%a%a%a) (%-?[%d.]+) (%-?[%d.]+) (%-?[%d.]+) (%-?[%d.]+)')
if not imagem then
return nil
end
else
return nil
end
end
N, O, S, L = tonumber(N), tonumber(O), tonumber(S), tonumber(L)
local top = math.floor(100 * (N - lat) / (N - S))
local left = math.floor(100 * (long - O) / (L - O))
local ponto = '<div style="position: absolute; z-index: 2; top: ' .. top .. '%; left: ' .. left ..
'%; display: table"><div style="position: relative; left: -6px; top: -11px; line-height: 15px">[[Ficheiro:Red pog.svg|7px]]</div></div>'
return '<div style="position: relative; width: 200px; margin: auto">[[Imagem:' .. imagem .. '|200px]]' .. ponto .. '</div>'
end
-- A função ext.extra é chamada pelo Módulo:Info antes de terminar de montar a infobox,
-- o que é retornado é colocado após a infobox
ext.extra = function()
-- Coordenadas no topo do artigo --
if not ext.coorgms and params['coordenadas'] then
local erro = coordenadas()
if erro then
table.insert(debug.erros, erro)
end
end
if ext.coorgms and params['coordenadas'] then
local coor = ext.coorgms[1] .. ' ' .. ext.coorgms[2]
local pagename = '&pagename=' .. mw.uri.encode(mw.title.getCurrentTitle().fullText)
local paramcoor = string.gsub(string.gsub(string.gsub(coor, '[^0-9NSLO]+', '_'), 'O', 'W'), 'L', 'E')
local coordenadas = [=[<div id="coordinates" class="noprint plainlinks" style="padding:0.5em">[[Coordenadas geográficas|Coordenadas]]: '''[//tools.wmflabs.org/geohack/geohack.php?language=pt]=] ..
pagename .. '¶ms=' .. paramcoor ..
' <span title="Mapas, fotos aéreas e outros dados para este local">' .. coor .. "</span>]'''</div>"
return coordenadas
end
end
ext.band = {ordem={}}
ext.especial['bandeira'] = function(campo, i, tipo)
if not campo[1] or campo[1] == '' then
return nil
end
local dominio, img = string.match(campo[1], '^%[%[(%w+):([^%]%|%.\n]+%.%w%w%w%w?)[%]%|]')
if dominio then
for _, d in pairs({'Ficheiro', 'Imagem', 'File', 'Image', 'ficheiro', 'imagem', 'file', 'image'}) do
if dominio == d then
dominio = nil
break
end
end
if dominio then img = nil end
elseif string.match(campo[1], '^[^%]%|%.\n]+%.%w%w%w%w?$') then
img = campo[1]
end
if not img then
return nil
end
tipo = tipo or 'bandeira'
tipo = tipo:sub(1, 1):upper() .. tipo:sub(2)
if ext.band.tipo then
local band = '[[Ficheiro:' .. ext.band.img .. '|100px]]'
local band2 = '[[Ficheiro:' .. img .. '|60px]]'
campo['rótulo'] = nil
campo[1] = '<table style="text-align:center; width:100%"><tr><td>' .. band .. '</td><td>' ..
band2 .. '</td></tr><tr><td>' .. ext.band.tipo .. '</td><td>' .. tipo .. '</td></tr></table>'
campos[ext.band.pos] = campo
return nil
else
ext.band.tipo = tipo
ext.band.img = img
ext.band.pos = i
campo[1] = '[[Ficheiro:' .. img .. '|100px]]<br>' .. tipo
campo['rótulo'] = nil
return campo
end
end
ext.especial['escudo'] = function(campo, i)
return ext.especial['bandeira'](campo, i, 'brasão de armas')
end
ext.especial['brasão'] = function(campo, i)
return ext.especial['bandeira'](campo, i, 'brasão de armas')
end
ext.especial['selo'] = function(campo, i)
return ext.especial['bandeira'](campo, i, 'selo')
end
ext.especial['emblema'] = function(campo, i)
return ext.especial['bandeira'](campo, i, 'emblema')
end
ext.especial['mapa'] = function(campo)
local lat, long
if ext.coorf then
lat, long = ext.coorf[1], ext.coorf[2]
else
local erro = coordenadas()
if not ext.coorf then
return
elseif erro then
table.insert(debug.erros, erro)
return
end
lat, long = ext.coorf[1], ext.coorf[2]
end
local mapa = campo[1]
local auto
if mapa == 'auto' then
if not wd then
require('Módulo:Info/wd')
end
local p17 = wd.props and wd.props['P17'] -- propriedade 'país' no Wikidata
if p17 then
local qid = p17[1]['mainsnak']['datavalue']['value']['id']
local mapaimg = mapa_imagem(qid, lat, long)
if mapaimg then
return {mapaimg}
end
table.insert(debug.erros, 'não existe mapa para ' .. (qid or 'nil') .. ', usando o mapa dinâmico')
else
table.insert(debug.erros, 'não existe a propriedade P17 no Wikidata, usando o mapa dinâmico')
end
elseif string.match(mapa, '^[Dd]inâmico') == nil then
return {mapa_imagem(mapa, lat, long)}
end
lat, long = string.format('%.5f', lat), string.format('%.5f', long)
local zoom = string.match(mapa, '^[Dd]inâmico zoom:(%d%d?)') or '5'
local ponto = '{"type": "Feature", "geometry": {"type": "Point", "coordinates": [' .. long .. ', ' .. lat .. ']}}'
local mapa = '<mapframe frameless width=200 height=200 zoom=' .. zoom .. ' latitude=' .. lat .. ' longitude=' ..
long .. '>{"type": "FeatureCollection", "features": [' .. ponto .. ']}</mapframe>'
mapa = '<div style="display:table; margin:0 auto 0 auto; padding: 14px 14px 0 0">' .. mapa .. '</div>'
return {mw.getCurrentFrame():preprocess(mapa)}
end
ext.especial['área'] = function(campo, i)
local area, populacao = string.match(campo[1] or '', '^([^;]-) *; *(.+)')
local nomes = {}
local total, pop
local n = i + 1
while campos[n] do
if total and campos[n]['rótulo'] and nomes[campos[n]['rótulo']] then
pop = true
-- Densidade populacional
if campos[n]['rótulo'] and nomes[campos[n]['rótulo']] and campos[n][1] then
local num = campos[n][1]:match('^[%d ]+')
if num then
num = num:gsub(' ', '')
local dens = num / nomes[campos[n]['rótulo']]
dens = dens < 10 and math.floor(dens * 10) / 10 or math.floor(dens)
dens = string.gsub(dens, '%.', ',')
nomes[campos[n]['rótulo']] = nil
local campo = {['rótulo']=' - densidade', [1]=dens .. ' hab/Km²'}
n = n + 1
table.insert(campos, n, campo)
if next(nomes) == nil then
break
end
end
end
elseif not pop and (not total or next(nomes)) and campos[n]['rótulo'] and campos[n][1] and
campos[n][1]:match('^%d') and (area and not total and campos[n]['rótulo'] == area or not area or total) then
local num, uni = campos[n][1]:match('^([%d %.,]+)(.*)')
if num then
num = num:gsub(',', '.'):gsub(' ', '')
num = tonumber(num)
if uni:match('^[Kk]m²') or uni:match('^%[%[[^%]|]+|[Kk]m²%]%]') then
--pass
elseif uni:match('^mi²') or uni:match('^sq%. ?mi') or uni:match('^%[%[[Mm]ilha quadrada') then
num = num * 2.589988
else
table.insert(debug.erros, 'Não foi encontrada unidade Km² ou mi² em ' .. campos[n]['rótulo']
.. ' : ' .. campos[n][1])
num = nil
end
if not total then
total = num
nomes[populacao or campos[n]['rótulo']] = num
elseif num then
-- Área relativa
local porcentagem = math.floor(num * 1000 / total) / 10
porcentagem = string.gsub(porcentagem, '%.', ',')
campos[n][1] = campos[n][1] .. ' (' .. porcentagem .. ' %)'
nomes[campos[n]['rótulo']] = num
end
end
end
n = n + 1
end
end
return ext