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

Обычно для ссылок используется URL-форматтер из свойства маска URL (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 )
	if id:match("^[%s-0-9X]*$") or id:match("^%s*ISBN[%s-0-9X]*$") then
		return '[[Special:Booksources/' .. id .. '|' .. id .. ']]';
	else
		local frame = mw.getCurrentFrame();
		if id:match("<br") or id:match("\*") then
			return frame:expandTemplate{ title = 'Харц ISBN', args = { ['1']=id, noprefix='1', nolink='1' } };
		else
			return frame:expandTemplate{ title = 'Харц ISBN', args = { ['1']=id, noprefix='1' } };
		end
	end
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 == '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 HydrologyBookTom = string.sub(id, 13, 14);
    local HydrologyBookVypusk = string.sub(id, 15, 15);

    if HydrologyBookTom == '99' then
        return '[http://verum.wiki/index.php?claster=gvr&q=' .. id .. ' ' .. id .. ']';
    else
        local ref = frame:callParserFunction{ name = '#tag:ref', args = { '{{Книга:РПВ ГИ|' .. HydrologyBookTom .. '|' .. HydrologyBookVypusk .. '}}' } };

        return '[http://verum.wiki/index.php?claster=gvr&q=' .. id .. ' ' .. id .. ']' .. ref;
    end
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;