Ётамс сёрматфть няфтьфонц потмос (содержаниянцты)

Модуль: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.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 awardId == '-' then
			-- separator
			table.insert( out, '|' .. i .. '|| colspan="3" | ----' )
		elseif i > 350 then
			-- limits
			table.insert( out, '|' .. i .. '|| … || … || … || …' )
			break
		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
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy