Модуль:Wikidata/Medals
Тифнень-лядяфнень морафтомасна
Для документации этого модуля может быть создана страница Модуль:Wikidata/Medals/doc
local WDS = require( 'Module:WikidataSelectors' )
local moduleDate = require( 'Module:Wikidata/date' )
local awardsOrder = mw.ext.data.get( "Wikidata/awards order.tab" )
local p = {}
local config = {
--Hide award with key QID if there is a reward with value QID
absorption = {
Q16675272 = 'Q654471',
Q16481808 = 'Q8706404',
Q1948730 = 'Q178473',
Q1980962 = 'Q208167',
}
}
--Get string with dates from qualifiers table
local function datesFromQualifier( context, options, qualifierId )
local dates = {}
local qualifiers = options.qualifiers[ qualifierId ]
if qualifiers then
for _, qualifier in pairs( qualifiers ) do
if qualifier.datavalue then
local dateValue = moduleDate.formatDate( context, options, qualifier.datavalue.value )
if dateValue then
table.insert( dates, dateValue )
end
end
end
end
return table.concat( dates, ', ' )
end
--Property function for [[d:Property:P166]]
function p.formatProperty( context, options )
if ( not context ) then error( 'context not specified' ); end;
if ( not options ) then error( 'options not specified' ); end;
if ( not options.entity ) then error( 'options.entity missing' ); end;
local claims;
if options.property then -- TODO: Почему тут может не быть property?
claims = context.selectClaims( options, options.property );
end
if claims == nil then
return '' --TODO error?
end
-- Обход всех заявлений утверждения и с накоплением оформленых
-- предпочтительных заявлений в таблице.
local formattedData = {}
for i, claim in ipairs( claims ) do
if ( claim.mainsnak and
claim.mainsnak and
claim.mainsnak.datavalue and
claim.mainsnak.datavalue.type == 'wikibase-entityid'
) then
local valueId = claim.mainsnak.datavalue.value.id
local formattedStatement = context.formatStatement( options, claim )
-- здесь может вернуться либо оформленный текст заявления, либо строка ошибки, либо nil
if ( formattedStatement and formattedStatement ~= '' ) then
formattedStatement = '<span class="wikidata-claim" data-wikidata-property-id="' .. string.upper( options.property ) .. '" data-wikidata-claim-id="' .. claim.id .. '">' .. formattedStatement .. '</span>'
table.insert( formattedData, {
id = valueId,
html = formattedStatement,
} )
end
end
end
-- Удаление дублей (медаль + звание -> звание)
for i, awardData in ipairs( formattedData ) do
local isAbsorptionFound = false
if config.absorption[ awardData.id ] then
local absorptionAwardId = config.absorption[ awardData.id ]
for _, absorptionAwardData in ipairs( formattedData ) do
if absorptionAwardData.id == absorptionAwardId then
isAbsorptionFound = true
break
end
end
end
if isAbsorptionFound then
table.remove( formattedData, i )
end
end
-- Сортировка медалей по старшинству
local orderedData = {}
local lastValue;
if ( type (awardsOrder) == 'table' ) then
-- Если не отсохла stuctured data
for i, awardFields in ipairs( awardsOrder.data ) do
local awardOrder = awardFields[ 1 ]
if awardOrder == '-' then
-- separator
if lastValue ~= '-' then
table.insert( orderedData, '<br>' )
lastHeight = nil
end
else
for k, awardData in ipairs( formattedData ) do
if awardOrder == awardData.id and not awardData.used then
table.insert( orderedData, awardData.html )
formattedData[ k ].used = true
end
end
end
end
end
for i, awardData in ipairs( formattedData ) do
if not awardData.used then
table.insert( orderedData, awardData.html )
end
end
local lastHeight
for i, awardHtml in ipairs( orderedData ) do
local height = mw.ustring.match( awardHtml, 'x%d+px' )
if height and lastHeight and height ~= lastHeight then
table.insert( orderedData, i, '<br>' )
end
lastHeight = height
end
-- создание текстовой строки со списком оформленых заявлений из таблицы
local out = mw.text.listToText( orderedData, options.separator, options.conjunction )
if out ~= '' then
if options.before then
out = options.before .. out
end
if options.after then
out = out .. options.after
end
end
return out
end
local function getImageFromClaims( claims, property )
local imageClaims = WDS.filter( claims, property )
if imageClaims and #imageClaims then
for i, claim in pairs( imageClaims ) do
if claim.type == 'statement' and claim.mainsnak.snaktype == 'value' then
return claim.mainsnak.datavalue.value
end
end
end
return nil
end
-- Получение изображения (планки или иконки) и его размера
function p.getImageFromEntity( entityOrId, actualDate )
local entity = entityOrId
if type( entityOrId ) == "string" then
entity = mw.wikibase.getEntity( entityOrId )
end
local image = nil
local size = 'x17px'
local border = false
-- получение изображения планки из элемента
image = getImageFromClaims( entity.claims, 'P2425' )
if image then
border = true
end
-- получение иконки из элемента
if not image then
image = getImageFromClaims( entity.claims, 'P2910' )
if image then
size = '40x40px'
end
end
return image, size, border
end
-- Получение категории лауреатов из элемента
function p.getDefaultRecipientCategoryFromEntity( entityOrId )
local entity = entityOrId
if type( entityOrId ) == "string" then
entity = mw.wikibase.getEntity( entityOrId )
end
local category = ''
local categoryClaims = WDS.filter( entity.claims, 'P2517' )
if categoryClaims and #categoryClaims then
for i, claim in pairs( categoryClaims ) do
if claim.type == 'statement' and claim.mainsnak.snaktype == 'value' then
local categoryLink = mw.wikibase.getSitelink( claim.mainsnak.datavalue.value.id )
if categoryLink then
category = category .. '[[' .. categoryLink .. ']]'
end
end
end
end
return category
end
--Value function for [[d:Property:P166]]
function p.formatValue( context, options, statement )
local entityId = statement.id
if not entityId then
return statement
end
local entity = mw.wikibase.getEntity( entityId )
local label = entity:getLabel()
local image, size, border = p.getImageFromEntity( entity )
local recipientCategory = ''
if not options.nocat and options.nocat ~= '' then
recipientCategory = p.getDefaultRecipientCategoryFromEntity( entity )
end
local dates = ''
if options.qualifiers then
local startDates = {}
dates = datesFromQualifier( context, options, 'P580' )
if dates ~= '' then
local endDates = datesFromQualifier( context, options, 'P582' )
if endDates and endDates ~= '' then
dates = dates .. ' — ' .. endDates
end
else
dates = datesFromQualifier( context, options, 'P585' )
end
end
-- получение ссылки по идентификатору и вывод планки
if image then
local link = mw.wikibase.getSitelink( entityId )
local out = '[[File:' .. image
if border == true then
out = out .. '|border'
end
out = out .. '|' .. size .. '|link='
-- получение ссылки из родительского элемента
-- для степеней обычно только одна общая статья
if not link then
local partOfClaims = WDS.filter( entity.claims, 'P361' ) -- часть от
if not partOfClaims or #partOfClaims == 0 then
partOfClaims = WDS.filter( entity.claims, 'P279' ) -- подкласс от
end
if partOfClaims and #partOfClaims then
for i, claim in pairs( partOfClaims ) do
if claim.type == 'statement' and claim.mainsnak.snaktype == 'value' then
link = mw.wikibase.getSitelink( claim.mainsnak.datavalue.value.id )
if link then
break
end
end
end
end
end
if link then
out = out .. link
else
out = out .. 'd:' .. entityId
end
if label then
out = out .. '|' .. label
end
out = out .. ']]'
out = out .. recipientCategory
return out
end
local out = context.formatValueDefault( context, options, statement )
if out and out ~= '' then
if dates ~= '' then
out = out .. ' (' .. dates .. ')'
end
return '<p style="text-align:left>' .. out .. recipientCategory .. '</p>'
end
return ''
end
--Table for documentation
function p.renderDoc()
local out = {}
for i, awardFields in ipairs( awardsOrder.data ) do
local awardId = awardFields[ 1 ]
local link = '[[d:' .. awardId .. '|' .. awardId .. ']]'
if i == 351 then
-- limits
table.insert( out, '| … || … || … || … || …' )
elseif i > 351 and i < #awardsOrder.data then
-- do nothing
elseif awardId == '-' then
-- separator
table.insert( out, '|' .. i .. '|| colspan="3" | ----' )
else
local awardEntity = mw.wikibase.getEntity( awardId )
local image, size, border = p.getImageFromEntity( awardEntity )
if image then
image = '[[File:' .. image
if border == true then
image = image .. '|border'
end
image = image .. '|' .. size .. ']]'
else
image = ''
end
local label = awardEntity:getLabel() or ''
local article = awardEntity:getSitelink()
if article then
if label == '' then
label = article
end
label = '[[' .. article .. '|' .. label .. ']]'
end
local country = awardEntity:formatPropertyValues( 'P17' )[ 'value' ]
table.insert( out, '|' .. i .. '||' .. link .. '||' .. image ..
'||' .. label .. '||' .. country )
end
end
return '{| class="standard"\n' ..
'! # !! Элемент !! Планка !! Название !! Государство\n|-\n' ..
table.concat( out, '\n|-\n' ) ..
'\n|}'
end
return p