Модуль:Wikidata/Flags

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

Модуль для вывода флага элемента из Викиданных, используется вместе с Модуль:Wikidata. Частые использования:

  • указание гражданства персоны: {{wikidata|P27}}
  • список городов-побратимов: {{Wikidata/SisterCities}}

Методы

getFlag

Метод для получения кода вставки флага.

Параметры:

  • parseTimeFromSnak — метод (или таблица, содержащая его) для получения timestamp'а из утверждения (см. в Модуль:Wikidata)
  • countryEntityOrId — сущность или ID элемента, для которого выводится флаг
  • actualDate — момент времени (timestamp), на который нужно вывести флаг

Если для соответствующего момента нашлось утверждение с флагом, то метод возвращает код вставки. Иначе возращается nil.

Тесты

✔ Все тесты пройдены.

Название Ожидается Фактически
✔ testGetFlag


TODO

  • Сейчас последний флаг используется для периода, в который не было других флагов. В таких случаях флага не должно быть вообще.
local p = {};

function p.getFlag( parseTimeFromSnak, countryEntityOrId, actualDate )
	local flagClaims;
	if type( countryEntityOrId ) == "string" then
		flagClaims = mw.wikibase.getAllStatements( countryEntityOrId, 'P41' )
	elseif countryEntityOrId and countryEntityOrId.claims and countryEntityOrId.claims.P41 then
		flagClaims = countryEntityOrId.claims.P41
	end

	if not flagClaims or #flagClaims == 0 then
		return nil;
	end

	local countryFlags = {};
	for _, flagImageStatement in pairs( flagClaims ) do
		if flagImageStatement.rank ~= 'deprecated' then
			local flagImage;
			if flagImageStatement and
				flagImageStatement.mainsnak and
    			not (flagImageStatement.qualifiers and flagImageStatement.qualifiers.P366)
			then
				if flagImageStatement.mainsnak.datavalue and
					flagImageStatement.mainsnak.datavalue.value
				then
					flagImage = flagImageStatement.mainsnak.datavalue.value;
				elseif flagImageStatement.mainsnak.snaktype == 'novalue' then
					flagImage = 'novalue';
				end
			end
			local flagStartTime = -9223372036854775808;
			if flagImageStatement.qualifiers and
				flagImageStatement.qualifiers.P580 and
				flagImageStatement.qualifiers.P580[ 1 ]
			then
				if type( parseTimeFromSnak ) == 'table' then
					parseTimeFromSnak = parseTimeFromSnak.parseTimeFromSnak;
				end
				local parsedFlagStartTime = parseTimeFromSnak( flagImageStatement.qualifiers.P580[ 1 ] );
				if parsedFlagStartTime then
					flagStartTime = parsedFlagStartTime;
				end
			end
			if flagImage then
				countryFlags[ flagStartTime ] = flagImage;
			end
		end
	end

	local goodFlag = nil;
	if countryFlags then
		local ordered_dates = {};
		for flagBeginDate in pairs( countryFlags ) do
			table.insert( ordered_dates, flagBeginDate );
		end
		table.sort( ordered_dates );

		for i = 1, #ordered_dates do
			local flagBeginDate, flag = ordered_dates[ i ], countryFlags[ ordered_dates[ i ] ];
			if actualDate >= flagBeginDate then
				goodFlag = flag;
			end
		end
	end
	if goodFlag then
		if goodFlag == 'novalue' then
			return nil;
		end
		if goodFlag == 'Flag of Belgium.svg' then
			goodFlag = 'Flag of Belgium (civil).svg';
		end
		return '[[File:' .. goodFlag .. '|20x15px|border|link=|alt=]]';
	end
	return nil;
end

return p;