Модуль:Wikidata/Medals
Материал из ChronoWiki
Перейти к навигацииПерейти к поискуДля документации этого модуля может быть создана страница Модуль: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.getRecipientCategoryFromEntity( 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.getRecipientCategoryFromEntity( 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 = entity:getSitelink() 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