Moduł:mapa lokalizacyjna

Z Wikisłownika – wolnego słownika wielojęzycznego

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&params=' ..
				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