Модуль:Вікізьвесткі/лік

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі

Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:Вікізьвесткі/лік/Дакумэнтацыя

local p = {}


function p.formatVisualMagnitude ( context, options )
	if ( not context ) then error( 'кантэкст не пазначаны' ); end;
	if ( not options ) then error( 'парамэтры не пазначаныя' ); end;
	
	min = context.selectClaims( options, 'P1215[P1227:Q76596947][rank:normal,rank:preferred]' )
	max = context.selectClaims( options, 'P1215[P1227:Q76596417][rank:normal,rank:preferred]' )
	if ( not min or not max) then -- паказваем як звычайна
		return context.formatPropertyDefault( context, options )
	end

	-- паказваем Vmin-Vmax для зьменнай зоркі
	local lang = mw.language.getContentLanguage();
	for _, claim1 in ipairs(min) do
		for _, claim2 in ipairs(max) do
			return	lang:formatNum(tonumber(claim1.mainsnak.datavalue.value.amount))
					.. ' − ' .. 
					lang:formatNum(tonumber(claim2.mainsnak.datavalue.value.amount)) 
		end
	end
end

function p.formatColorIndex( context, options )
	if ( not context ) then error( 'кантэкст не пазначаны' ); end;
	if ( not options ) then error( 'парамэтры не пазначаныя' ); end;
	
	if ( options.property ) then 
		-- Атрымліваем усе сьцьверджаньні незалежна ад рангу
		claims = context.selectClaims( options, options.property .. '[rank:normal,rank:preferred]' );
	end
	if ( claims ) then
		return context.formatPropertyDefault( context, options )
	end
	-- Вылічваем B-V альбо U-B з P1215
	b = context.selectClaims( options, 'P1215[P1227:Q6746395][rank:normal,rank:preferred]' )
	if ( not b ) then return end
	if string.find( options.property, 'Q17773035' ) then
		m1 = context.selectClaims( options, 'P1215[P1227:Q15977921][rank:normal,rank:preferred]' )
		m2 = b
		if ( not m1 ) then return end
	else
		m1 = b
		m2 = context.selectClaims( options, 'P1215[P1227:Q4892529][rank:normal,rank:preferred]' )
		if ( not m2 ) then return end
	end
	for _, claim1 in ipairs(m1) do
		for _, claim2 in ipairs(m2) do
			newClaim = { mainsnak = { snaktype = 'value', datavalue = { type = 'quantity', 
				value = { unit = '1', amount = claim1.mainsnak.datavalue.value.amount - 
				claim2.mainsnak.datavalue.value.amount }}}}
			return context.formatStatementDefault( context, options, newClaim )
		end
	end
end

function p.formatPropertyWithMostRecentClaimAndIndicator( context, options )
	if ( not context ) then error( 'не зададзены кантэкст' ); end;
	if ( not options ) then error( 'не зададзеныя опцыі' ); end;
	if ( not options.entity ) then error( 'адсутнічае options.entity' ); end;

	local claims;
	if options.property then 
		-- Бярэм усе claims незалежна ад рангу
		claims = context.selectClaims( options, options.property .. '[rank:normal,rank:preferred]' );
	end
	if claims == nil then
		return ''
	end

	-- Шукаем claim з максымальным значэньнем P585 і фарматуем яго ў out
	local maxTimestamp = nil;
	local mostRecentClaim;
	for i, claim in ipairs(claims) do
		if (claim.qualifiers and claim.qualifiers.P585) then -- апрацоўваем толькі claims з пазначаным P585
			local timestamp = context.parseTimeFromSnak( claim.qualifiers.P585[1] );
			if timestamp ~= nil and ( maxTimestamp == nil or maxTimestamp < timestamp ) then
				maxTimestamp = timestamp;
				mostRecentClaim = claim
			end
		end
	end
	if (not mostRecentClaim) then -- няма ніводнага сьцьверджаньня з пазначаным P585
		return context.formatPropertyDefault( context, options )
	end

	local out = context.formatStatement( options, mostRecentClaim )
	if out ~= '' then
		-- Шукаем сьцьверджаньне са значэньнем P585 адразу пасьля максымальнага і запамінаем яго ў secondMostRecentValue
		local secondMostRecentTimestamp = 0;
		local secondMostRecentValue = 0;
		for i, claim in ipairs(claims) do
			if (claim.qualifiers and claim.qualifiers.P585) then -- апрацоўваем толькі сьцьверджаньні з пазначаным P585
				local timestamp = context.parseTimeFromSnak( claim.qualifiers.P585[1] )
				if (timestamp ~= nil and secondMostRecentTimestamp < timestamp and maxTimestamp > timestamp) then
					secondMostRecentTimestamp = timestamp
					secondMostRecentValue = tonumber( claim.mainsnak.datavalue.value.amount )
				end
			end
		end
		if (secondMostRecentValue ~= 0) then -- калі папярэдняе значэньне знайшлося
			if (secondMostRecentValue < tonumber( mostRecentClaim.mainsnak.datavalue.value.amount )) then
				out = '<span style="color: #0c0; font-size: larger;">▲</span>' .. out
			else
				out = '<span style="color: red; font-size: larger;">▼</span>' .. out
			end
		end
		if options.before then
			out = options.before .. out
		end
		if options.after then
			out = out .. options.after
		end
	end

	return out
end

function p.formatQuantityWithDateClaim( context, options, statement )
	local snak = context.formatSnak( options, statement.mainsnak )
	if not snak then return '' end

    --Дата
    if ( statement.qualifiers and statement.qualifiers.P585 ) then
        snak = snak .. ' (' .. context.formatSnak( options, statement.qualifiers.P585[1] ) .. ')'
    end

	--Крыніцы
	if ( options.references ) then
    	snak = snak .. context.formatRefs( options, statement );
    end

    return snak
end

function p.formatDMS( context, options, value )
	if not value.amount then return value end
	if options and options.unit == '-' then return value.amount end
	local prefix = "+"
	if tonumber( value.amount ) < 0 then
		prefix = "−"
	end
	return p.formatAngle ( math.abs( tonumber( value.amount ) ), 
		string.len( value.amount ) - string.find( value.amount, '.', 1, true ) - 5,
		prefix .. "%s° %02d′ %s″")
end 

function p.formatRA( context, options, value )
	if not value.amount then return value end
	if options and options.unit == '-' then return value.amount end
	return p.formatAngle (tonumber( value.amount ) / 15, 
		string.len( value.amount ) - string.find( value.amount, '.', 1, true ) - 4,
		"%s<sup>г</sup> %02d<sup>х</sup> %s<sup>с</sup>")
end

function p.formatAngle ( angle, sig, format )
	local d, angle = math.modf( angle )
	local m, angle = math.modf( angle * 60 )
	local mult = 10 ^ sig;
	local s = math.floor( angle * 60 * mult + 0.5 ) / mult;	
	local lang = mw.language.getContentLanguage();
	return string.format( format, d, m, lang:formatNum( s ) )
end

return p