Модуль:Wikidata/item

From in.wiki
Jump to navigation Jump to search

Для документации этого модуля может быть создана страница Модуль:Wikidata/item/doc

local WDS = require( 'Module:WikidataSelectors' );
local p = {};

local categoryLinksToEntitiesWithMissingLabel = '[[Категория:Википедия:Статьи со ссылками на элементы Викиданных без русской подписи]]';

local function getGenderLabelForEntityId( entityId, gender )
	local genderPropertyId
	if gender == 1 then
		genderPropertyId = 'P3321'
	elseif gender == 2 then
		genderPropertyId = 'P2521'
	else
		return mw.wikibase.label( entityId )
	end
	
	local genderLabels = mw.wikibase.getAllStatements( entityId, genderPropertyId )
	
	if genderLabels then
		genderLabels = WDS.filterByLanguage( WDS.filterByRank( genderLabels, 'deprecated', true ), 'ru' );
	end

	if genderLabels and
		genderLabels[ 1 ] and
		genderLabels[ 1 ].mainsnak and
		genderLabels[ 1 ].mainsnak.datatype == 'monolingualtext'
	then
		return genderLabels[ 1 ].mainsnak.datavalue.value.text;
	end

	return mw.wikibase.label( entityId )
end
   
local function formatOccupationLinkForEntityId( entityId, gender )
	local label = getGenderLabelForEntityId( entityId, gender );

	-- first try to link to occupation article
    local link = mw.wikibase.sitelink( entityId )
    if link and not label then
        label = link
    end
    
    -- if we don't have article for occupation, try to link to field of occupation
    if not link then
	    local fooEntity = mw.wikibase.getEntity( entityId );
	    if fooEntity and fooEntity.claims and fooEntity.claims.P425 then
		    fooEntity = WDS.filterByRank( fooEntity.claims.P425, 'deprecated', true );
			if fooEntity ~= nil and
			   fooEntity[1] and
			   fooEntity[1].mainsnak and
			   fooEntity[1].mainsnak.datavalue and
			   fooEntity[1].mainsnak.datavalue.value and
			   fooEntity[1].mainsnak.datavalue.value.id then
				link = mw.wikibase.sitelink( fooEntity[1].mainsnak.datavalue.value.id );
			end
		end
	end

	-- no article about occupation or field, link to wikidata
    if not link then
	    link = ':d:' .. entityId
	end

    if label then
        return '[[' .. link .. '|' .. label .. ']]'
    end
    
    -- сообщение об отсутвии локализованного названия
    -- not good, but better than nothing
    return '[[' .. link .. '|' .. entityId .. ']]<span style="border-bottom: 1px dotted; cursor: help; white-space: nowrap" title="В Викиданных нет русской подписи к элементу. Вы можете помочь, указав русский вариант подписи.">?</span>' .. categoryLinksToEntitiesWithMissingLabel;
end

function p.formatEntityWithGenderClaim( context, options, statement )
	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 is missing'); end;
	if ( not statement ) then error( 'statement not specified'); end;
	
	local gender = 0 -- per [[ISO/IEC 5218]]
	if options.entity.claims.P21 and 
         options.entity.claims.P21[1] and
         options.entity.claims.P21[1].mainsnak and
         options.entity.claims.P21[1].mainsnak.datavalue and
         options.entity.claims.P21[1].mainsnak.datavalue.value
    then
    	local genderId = options.entity.claims.P21[1].mainsnak.datavalue.value.id
    	if genderId == 'Q6581097' or genderId == 'Q2449503' or genderId == 'Q44148' then
    		gender = 1
    	elseif genderId == 'Q6581072' or genderId == 'Q1052281' or genderId == 'Q43445' then
    		gender = 2
		end
 	end

	local snak = statement.mainsnak;
	if snak and snak.datavalue and snak.datavalue.value and snak.datavalue.value.id then
		local entityId = snak.datavalue.value.id;
		local value = formatOccupationLinkForEntityId( entityId, gender )
		return context.wrapSnak( value, snak.hash )
	end
	
	return context.formatSnak( options, snak )
end

function p.applyDefaultTemplate( context, options, statement )
	local snak = context.formatSnak( options, statement.mainsnak )
    if ( statement.qualifiers and statement.qualifiers.P249 and statement.qualifiers.P249[1].snaktype == 'value') then
    	snak = statement.qualifiers.P249[1].datavalue.value
    	entityId = statement.mainsnak.datavalue.value.id
		wbStatus, entity = pcall( mw.wikibase.getEntity, entityId );
		if ( entity.claims and entity.claims.P1424 ) then
			wbStatus, template = pcall( mw.wikibase.getEntity, 
				entity.claims.P1424[1].mainsnak.datavalue.value.id )
			if template:getSitelink( ) then
				snak = options.frame:preprocess( string.gsub( template:getSitelink( ), 
					'Шаблон:', '{{' ) .. '|' .. 
					statement.qualifiers.P249[1].datavalue.value .. '}}' )
			end
		end
    end

	--References
	if ( options.references and snak ) then
    	snak = snak .. context.formatRefs( options, statement );
    end

    return snak
end

function p.formatCategoryOnly( context, options, value )
	return context.extractCategory( options, value )
end
 
return p