Модуль:Wikidata/Flags
Внешний вид
Модуль для вывода флага элемента из Викиданных, используется вместе с Модуль:Wikidata. Частые использования:
- указание гражданства персоны: Шаблон:Tp
- список городов-побратимов: {{Wikidata/SisterCities}}
Методы
[править]getFlag
[править]Метод для получения кода вставки флага.
Параметры:
parseTimeFromSnak
— метод (или таблица, содержащая его) для получения timestamp'а из утверждения (см. в Модуль:Wikidata)countryEntityOrId
— сущность или ID элемента, для которого выводится флагactualDate
— момент времени (timestamp), на который нужно вывести флаг
Если для соответствующего момента нашлось утверждение с флагом, то метод возвращает код вставки. Иначе возращается nil
.
Ошибка скрипта: Модуля «Wikidata/Flags/testcases» не существует.
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
return '[[File:' .. goodFlag .. '|20x15px|border]]';
end
return nil;
end
return p;