Moduł:mapa lokalizacyjna
Moduł wykorzystywany przez szablon {{mapa lokalizacyjna}}. Zobacz też: /dane.
local Koordynaty = require 'Moduł:koordynaty'
local data = require 'Moduł:mapa lokalizacyjna/dane'
local p = {}
local function buildMap( opts )
local innerDiv1 = mw.html.create( 'div' )
:css{
position = 'relative',
[ 'text-align' ] = 'center',
left = '-' .. string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) .. 'px',
top = '-' .. string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) .. 'px',
width = opts[ 'rozmiar znaku' ] .. 'px',
[ 'font-size' ] = opts[ 'rozmiar znaku' ] .. 'px',
[ 'line-height' ] = opts[ 'rozmiar znaku' ] .. 'px'
}
:wikitext(
'[[Plik:' .. opts.znak .. '|' ..
opts[ 'rozmiar znaku' ] .. 'x' .. opts[ 'rozmiar znaku' ] .. 'px' .. '|' ..
'link=https://tools.wmflabs.org/geohack/geohack.php?language=pl¶ms=' ..
opts[ 'szerokość' ] .. '_N_' .. opts[ 'długość' ] .. '_E]]'
)
local innerDiv2 = mw.html.create( 'div' )
:css{
[ 'font-size' ] = '90%',
[ 'line-height' ] = '110%',
[ 'z-index' ] = 90,
position = 'relative',
width = '10em'
}
if opts.pozycja == 'right' then
innerDiv2:css( 'top', '-1.1em' )
innerDiv2:css( 'left', ( tonumber( string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) ) + 2 ) .. 'px' )
innerDiv2:css( 'text-align', 'left' )
innerDiv2:css( 'float', 'left' )
elseif opts.pozycja == 'left' then
innerDiv2:css( 'top', '-1.1em' )
innerDiv2:css( 'left', ( tonumber( '-' .. string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) ) - 2 ) .. 'px' )
innerDiv2:css( 'text-align', 'right' )
innerDiv2:css( 'float', 'right' )
elseif opts.pozycja == 'top' then
innerDiv2:css( 'top', '-2.0em' )
innerDiv2:css( 'left', '-5em' )
innerDiv2:css( 'text-align', 'center' )
innerDiv2:css( 'float', 'center' )
elseif opts.pozycja == 'bottom' then
innerDiv2:css( 'top', '-0.1em' )
innerDiv2:css( 'left', '-5em' )
innerDiv2:css( 'text-align', 'center' )
innerDiv2:css( 'float', 'center' )
else
if opts.pos.top < 10 then
innerDiv2:css( 'top', '-0.85em' )
else
innerDiv2:css( 'top', '-1.5em' )
end
if opts.pos.left < 50 then
innerDiv2:css( 'left', ( tonumber( string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) ) + 2 ) .. 'px' )
innerDiv2:css( 'text-align', 'left' )
innerDiv2:css( 'float', 'left' )
else
innerDiv2:css( 'left', ( tonumber( '-' .. string.format(
'%.0f',
opts[ 'rozmiar znaku' ] / 2
) ) - 2 ) .. 'px' )
innerDiv2:css( 'text-align', 'right' )
innerDiv2:css( 'float', 'right' )
end
end
innerDiv2:tag( 'span' )
:css( 'padding', '1px' )
:wikitext( opts.opis )
local outerDiv = mw.html.create( 'div' )
:css{
position = 'absolute',
[ 'z-index' ] = 2,
top = opts.pos.top .. '%',
left = opts.pos.left .. '%',
height = 0,
width = 0,
margin = 0,
padding = 0
}
local container = mw.html.create( 'div' )
:css{
position = 'relative',
border = '0px solid #aaa',
padding = '0px',
width = opts.rozmiar .. 'px'
}
:wikitext( '[[Plik:' .. opts.mapa .. '|' .. opts.rozmiar .. 'px]]' )
:node( outerDiv
:node( innerDiv1 )
:node( opts.opis and innerDiv2 or '' )
)
local output = mw.html.create( '' )
if opts[ 1 ] == 'tabelka' then
output
:tag( 'div' )
:node( container )
else
output
:tag( 'div' )
:addClass( 'thumb tright' )
:tag( 'div' )
:addClass( 'thumbinner' )
:css( 'width', ( opts.rozmiar + 2 ) .. 'px' )
:tag( 'div' )
:css( 'border', '1px solid #ccc' )
:node( container )
:done()
:tag( 'div' )
:addClass( 'thumbcaption' )
:tag( 'div' )
:addClass( 'magnify' )
:wikitext( '[[Plik:magnify-clip.png|link=Plik:' .. opts.mapa .. ']]' )
:done()
:wikitext( opts.podpis )
end
return tostring( output )
end
p.main = function( frame )
local opts = frame:getParent().args
assert(
opts[ 1 ] == 'thumb' or opts[ 1 ] == 'tabelka',
'niepoprawny pierwszy parametr; wybierz „thumb” lub „tabelka”'
)
opts.data = data[ opts[ 2 ] ]
assert(
opts.data,
'brak drugiego parametru lub nierozpoznany region'
)
local dummy = {
args = {
opts[ 3 ] or
( opts[ 'szerokość' ] or '' ) .. ' ' .. ( opts[ 'długość' ] or '' ) or
''
}
}
opts[ 'szerokość' ], opts[ 'długość' ] =
Koordynaty[ 'szerokość' ]( dummy ) or '',
Koordynaty[ 'długość' ] ( dummy ) or ''
assert(
opts[ 'szerokość' ] ~= '' and opts[ 'długość' ] ~= '',
'brak trzeciego parametru lub nieprawidłowy format koordynat'
)
opts.pos = {}
opts.pos.top =
( opts.data[ 'y-' .. ( opts[ 'wariant' ] or '' ) ]
and opts.data[ 'y-' .. ( opts[ 'wariant' ] or '' ) ](
opts[ 'szerokość' ],
opts[ 'długość' ]
)
or nil
) or
( opts.data.y
and opts.data.y( opts[ 'szerokość' ], opts[ 'długość' ] )
or nil
) or
100 * (
( opts.data[ 'top-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.top ) -
opts[ 'szerokość' ]
) / (
( opts.data[ 'top-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.top ) -
( opts.data[ 'bottom-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.bottom )
)
opts.pos.left =
( opts.data[ 'x-' .. ( opts[ 'wariant' ] or '' ) ]
and opts.data[ 'x-' .. ( opts[ 'wariant' ] or '' ) ](
opts[ 'szerokość' ],
opts[ 'długość' ]
)
or nil
) or
( opts.data.x
and opts.data.x( opts[ 'szerokość' ], opts[ 'długość' ] )
or nil
) or
100 * (
( (
( opts.data[ 'right-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.right ) -
( opts.data[ 'left-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.left )
) < 0 and 1 or 0 ) * (
opts[ 'długość' ] < 0 and 1 or 0
) * 360 +
opts[ 'długość' ] -
( opts.data[ 'left-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.left )
) / (
( (
( opts.data[ 'right-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.right ) -
( opts.data[ 'left-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.left )
) < 0 and 1 or 0 ) * 360 +
( opts.data[ 'right-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.right ) -
( opts.data[ 'left-' .. ( opts[ 'wariant' ] or '' ) ] or opts.data.left )
)
opts.pos.top, opts.pos.left =
tonumber( string.format( '%.1f', opts.pos.top ) ),
tonumber( string.format( '%.1f', opts.pos.left ) )
assert(
math.abs( opts.pos.top - 50 ) <= 50 and
math.abs( opts.pos.left - 50 ) <= 50,
'współrzędne spoza mapy „' .. opts[ 2 ] .. '”: ' ..
opts[ 'szerokość' ] .. '/' .. opts[ 'długość' ]
)
opts.znak = opts.znak or 'Red pog.svg'
opts[ 'rozmiar znaku' ] = opts[ 'rozmiar znaku' ] or 6
opts.rozmiar = opts.rozmiar or 220
opts.opis = opts.opis or nil
opts.podpis = opts.podpis or opts[ 4 ] or opts[ 2 ]
opts.mapa = opts.data[ 'mapa-' .. ( opts.wariant or '' ) ] or opts.data.mapa
return buildMap( opts )
end
return p