Модуль:Wikidata/link: различия между версиями

Материал из ChronoWiki
Перейти к навигацииПерейти к поиску
(- пока нет рабочего ОКАТО/ОКТМО)
 
м (1 версия импортирована)
 
(нет различий)

Текущая версия на 00:08, 4 января 2020

Набор функций для преобразования ID из свойств Викиданных в работающие ссылки.

Обычно для ссылок используется URL-форматтер из свойства Ошибка Lua в Модуль:WD на строке 452: свойство P1630 не найдено., его можно изменить параметром formatter, текст ссылки можно изменить параметром title. Новую функцию имеет смысл создавать, если задачу по изменению ссылки нельзя решить при помощи этих параметров.


p = {};

function p.fromTemplate( frame )
	local args = frame.args;
	return p.generateLink( args[ 1 ], args[ 2 ], args[ 'title' ] );
end

function p.fromModule( context, options, id )
	return p.generateLink( options[ 'property' ], id, options[ 'title' ], context, options );
end

function p.generateLink( propertyId, id, title, context, options )
	propertyId = propertyId:upper()
	
	if p[ propertyId ] then
		return p[ propertyId ]( context, options, id );
	end

	local pattern = p.findPattern( propertyId )
	if pattern then
		local link = mw.ustring.gsub( pattern, '$1', id );

		if not title or title == '' then
			title = id;
		end

		return '[' .. link .. ' ' .. title .. ']';
	end

	return id
end

function p.P212( context, options, id )
	return '[[Special:Booksources/' .. id .. '|' .. id .. ']]';
end

function p.P267( context, options, id )
	local frame = mw.getCurrentFrame();
	return frame:expandTemplate{ title = 'АТХ', args = { id } };
end

function p.P345( context, options, id )
	local prefix = options and options.prefix
    local number = id
    if not string.match( id, '^%d' ) then
    	prefix = string.sub( id, 1, 2 )
    	number = string.sub( id, 3 )
	end
    local label = 'ID ' .. number
    if prefix == 'ch' then
		return '[[IMDbCharacter:' .. number .. '|' .. label .. ']]'
    end
    if prefix == 'co' then
		return '[[IMDbCompany:' .. number .. '|' .. label .. ']]'
    end
    if prefix == 'nm' then
		return '[[IMDbName:' .. number .. '|' .. label .. ']]'
    end
    if prefix == 'tt' then
		return '[[IMDbTitle:' .. number .. '|' .. label .. ']]'
    end

	return id;
end

function p.P884( context, options, id )
	local frame = mw.getCurrentFrame();
	local HydrologyBook = string.sub(id, 13, 15)
	local ref = frame:callParserFunction{ name = '#tag:ref', args = { '{{Книга:РПВ ГИ|' .. string.sub(HydrologyBook, 1, 2) .. '|' .. string.sub(HydrologyBook, 3) .. '}}' } }
	return id .. ref;
end

function p.P957( context, options, id )
	return '[[Special:Booksources/' .. id .. '|' .. id .. ']]';
end

function p.findPattern( property )
	local entity = mw.wikibase.getEntity( property:upper() );
	if entity then
		local statements = entity:getBestStatements( 'P1630' );
		for _, statement in pairs( statements ) do
			if statement.mainsnak.snaktype == 'value' then
				return statement.mainsnak.datavalue.value;
			end
		end
	end
	return nil;
end

return p;