Модуль:Песочница/Putnik

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
local p = {}

function p.test( frame )
	return mw.getContentLanguage():formatDate( 'j xg Y', '@1575638868' )
end

function p.test2( frame )
	return mw.getContentLanguage():formatDate( 'j xg Y', 'now' )
end

function p.rank( frame )
	return mw.wikibase.entity.claimRanks.RANK_TRUTH;
end

local function splitISO8601(str)
	if 'table' == type(str) then
		if str.args and str.args[1] then
			str = '' .. str.args[1]
		else
			return 'unknown argument type: ' .. type( str ) .. ': ' .. table.tostring( str )
		end
	end
	local Y, M, D = (function(str)
		local pattern = "(%-?%d+)%-(%d+)%-(%d+)T"
		local Y, M, D = mw.ustring.match( str, pattern )
		return tonumber(Y), tonumber(M), tonumber(D)
	end) (str);
	local h, m, s = (function(str)
		local pattern = "T(%d+):(%d+):(%d+)%Z";
		local H, M, S = mw.ustring.match( str, pattern);
		return tonumber(H), tonumber(M), tonumber(S);
	end) (str);
	local oh,om = ( function(str)
		if str:sub(-1)=="Z" then return 0,0 end; -- ends with Z, Zulu time
		-- matches ±hh:mm, ±hhmm or ±hh; else returns nils
		local pattern = "([-+])(%d%d):?(%d?%d?)$";
		local sign, oh, om = mw.ustring.match( str, pattern);
		sign, oh, om = sign or "+", oh or "00", om or "00";
		return tonumber(sign .. oh), tonumber(sign .. om);
	end )(str)
	return {year=Y, month=M, day=D, hour=(h+oh), min=(m+om), sec=s};
end

local function splitDate( str )
	local Y, M, D = ( function( str )
		local pattern = "^(%d+)%-(%d+)%-(%d+)$"
		local Y, M, D = mw.ustring.match( str, pattern )
		return tonumber( Y ), tonumber( M ), tonumber( D )
	end )( str );
	return { year=Y, month=M, day=D, hour=0, min=0, sec=0 };
end

function p.flag( frame )
	local wikidataFlags = require( 'Модуль:Песочница/Putnik/Wikidata/Flags' )

	local parseTimeFromSnak = function( snak )
		if ( snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.time ) then
			return tonumber( os.time( splitISO8601( tostring( snak.datavalue.value.time ) ) ) ) * 1000;
		end
		return nil;
	end
	
	local timestamp = tonumber( os.time( splitDate( frame.args[2] ) ) ) * 1000

	return wikidataFlags.getFlag( parseTimeFromSnak, frame.args[1], timestamp )
end

return p