м (1 версия импортирована)
м (1 версия импортирована)
 
(не показаны 2 промежуточные версии 2 участников)
Строка 1: Строка 1:
local p = {};
local p = {}
 
function p.getWikibooksLink ( )
function p.getWikibooksLink( context )
return p.getSisterProjectLink( 'b', 'wikibooks' );
return p.getSisterProjectLink( 'b', 'wikibooks', context.args.from )
end
end
 
function p.getWikiquoteLink ( )
function p.getWikiquoteLink( context )
return p.getSisterProjectLink( 'q', 'wikiquote' );
return p.getSisterProjectLink( 'q', 'wikiquote', context.args.from )
end
end
 
function p.getWikisourceLink ( )
function p.getWikisourceLink( context )
return p.getSisterProjectLink( 's', 'wikisource' );
return p.getSisterProjectLink( 's', 'wikisource', context.args.from )
end
end
 
function p.getWikipediaLink ( )
function p.getWikipediaLink( context )
return p.getSisterProjectLink( 'w', 'wiki' );
return p.getSisterProjectLink( 'w', 'wiki', context.args.from )
end
end


function p.getWiktionaryLink ( )
function p.getWiktionaryLink( context )
return p.getSisterProjectLink( 'wikt', 'wiktionary' );
return p.getSisterProjectLink( 'wikt', 'wiktionary', context.args.from )
end
end
 
function p.getSisterProjectLink( projectInterwikiLettter, projectName )
function p.getSisterProjectLink( projectInterwikiPrefix, projectName, entityId )
entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
-- По умолчанию старается достать ссылку на русском, иначе - на родном (P103)
-- По умолчанию старается достать ссылку на русском, иначе - на родном (P103)
local wbStatus, entity = pcall( mw.wikibase.getEntityObject )
local wbStatus, sitelink = pcall( mw.wikibase.getSitelink, entityId, 'ru' .. projectName )
if wbStatus ~= true or not entity or not entity.sitelinks then
if wbStatus and sitelink then
return projectInterwikiPrefix .. ':' .. sitelink
end
 
local wbStatus, langClaims = pcall( mw.wikibase.getBestStatements, entityId, 'P103' )
if wbStatus ~= true or not langClaims then
return ''
return ''
end
end
if entity.sitelinks['ru' .. projectName] then
return projectInterwikiLettter .. ':' .. entity.sitelinks['ru' .. projectName].title
local codes = mw.loadData( 'Module:Wikidata:Dictionary/P424' )
end
for _, claim in ipairs( langClaims ) do
if claim.mainsnak and
if entity.claims then
claim.mainsnak.datavalue and
local propValues = entity.claims['P103']
claim.mainsnak.datavalue.value and
if propValues then
claim.mainsnak.datavalue.value.id
local codes = mw.loadData( 'Module:Wikidata:Dictionary/P424' );
then
for i, propClaim in pairs(propValues) do
local codesById = codes[ claim.mainsnak.datavalue.value.id ]
if propClaim.mainsnak and propClaim.mainsnak.datavalue and propClaim.mainsnak.datavalue.value and propClaim.mainsnak.datavalue.value["numeric-id"] then
if codesById then
local languageWikidataId = 'Q' .. propClaim.mainsnak.datavalue.value["numeric-id"]
for _, code in ipairs( codesById ) do
local codesById = codes[languageWikidataId];
wbStatus, sitelink = pcall( mw.wikibase.getSitelink, entityId, code .. projectName )
if ( codesById ) then
if wbStatus and sitelink then
for j, code in pairs( codesById ) do
return projectInterwikiPrefix .. ':' .. code .. ':' .. sitelink
local sitelink = entity.sitelinks[code .. projectName]
if sitelink then
return projectInterwikiLettter .. ':' .. code .. ':' .. sitelink.title
end
end
end
end
end
end
Строка 51: Строка 52:
end
end
end
end
 
return ''
return ''
end
end
 
return p;
return p

Текущая версия от 18:34, 21 июня 2023

Модуль возвращает ссылку на братские проекты согласно информации из Викиданных:

  • если есть русская ссылка, возвращается она
  • если есть ссылка на родном языке писателя (см. передаваемый аргумент), то используется она. Поддерживаются multiple значения для языка
  • если ничего из этого нет, возвращается пустая строка

ИспользованиеПравить

Викиучебник
{{#invoke:Wikidata/Interproject|getWikibooksLink}}
Викитека
{{#invoke:Wikidata/Interproject|getWikisourceLink}}
Викицитатник
{{#invoke:Wikidata/Interproject|getWikiquoteLink}}
Викисловарь
{{#invoke:Wikidata/Interproject|getWiktionaryLink}}

local p = {}

function p.getWikibooksLink( context )
	return p.getSisterProjectLink( 'b', 'wikibooks', context.args.from )
end

function p.getWikiquoteLink( context )
	return p.getSisterProjectLink( 'q', 'wikiquote', context.args.from )
end

function p.getWikisourceLink( context )
	return p.getSisterProjectLink( 's', 'wikisource', context.args.from )
end

function p.getWikipediaLink( context )
	return p.getSisterProjectLink( 'w', 'wiki', context.args.from )
end

function p.getWiktionaryLink( context )
	return p.getSisterProjectLink( 'wikt', 'wiktionary', context.args.from )
end

function p.getSisterProjectLink( projectInterwikiPrefix, projectName, entityId )
	entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
	-- По умолчанию старается достать ссылку на русском, иначе - на родном (P103)
	local wbStatus, sitelink = pcall( mw.wikibase.getSitelink, entityId, 'ru' .. projectName )
	if wbStatus and sitelink then
		return projectInterwikiPrefix .. ':' .. sitelink
	end

	local wbStatus, langClaims = pcall( mw.wikibase.getBestStatements, entityId, 'P103' )
	if wbStatus ~= true or not langClaims then
		return ''
	end
	
	local codes = mw.loadData( 'Module:Wikidata:Dictionary/P424' )
	for _, claim in ipairs( langClaims ) do
		if claim.mainsnak and
			claim.mainsnak.datavalue and
			claim.mainsnak.datavalue.value and
			claim.mainsnak.datavalue.value.id
		then
			local codesById = codes[ claim.mainsnak.datavalue.value.id ]
			if codesById then
				for _, code in ipairs( codesById ) do
					wbStatus, sitelink = pcall( mw.wikibase.getSitelink, entityId, code .. projectName )
					if wbStatus and sitelink then
						return projectInterwikiPrefix .. ':' .. code .. ':' .. sitelink
					end
				end
			end
		end
	end

	return ''
end

return p