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

Материал из Буинский уезд (Буинск, Байбулатово, Кайрево, Бурундуки) - генеалогические исследовании
Перейти к навигации Перейти к поиску
м (1 версия импортирована)
 
ru>Dima st bk
(fix)
Строка 1: Строка 1:
 
local p = {};
 
local p = {};
 
+
 +
function p.getWikibooksLink ( )
 +
return p.getSisterProjectLink( 'b', 'wikibooks' );
 +
end
 +
 +
function p.getWikiquoteLink ( )
 +
return p.getSisterProjectLink( 'q', 'wikiquote' );
 +
end
 +
 
function p.getWikisourceLink ( )
 
function p.getWikisourceLink ( )
 
return p.getSisterProjectLink( 's', 'wikisource' );
 
return p.getSisterProjectLink( 's', 'wikisource' );
 +
end
 +
 +
function p.getWikipediaLink ( )
 +
return p.getSisterProjectLink( 'w', 'wiki' );
 
end
 
end
  
function p.getWikiquoteLink ( )
+
function p.getWiktionaryLink ( )
return p.getSisterProjectLink( 'q', 'wikiquote' );
+
return p.getSisterProjectLink( 'wikt', 'wiktionary' );
 
end
 
end
 
+
 
function p.getSisterProjectLink( projectInterwikiLettter, projectName )
 
function p.getSisterProjectLink( projectInterwikiLettter, projectName )
 
-- По умолчанию старается достать ссылку на русском, иначе - на родном (P103)
 
-- По умолчанию старается достать ссылку на русском, иначе - на родном (P103)
local entity = mw.wikibase.getEntityObject()
+
local wbStatus, entity = pcall( mw.wikibase.getEntityObject )
if not entity or not entity.sitelinks then
+
if wbStatus ~= true or not entity or not entity.sitelinks then
 
return ''
 
return ''
 
end
 
end
Строка 18: Строка 30:
 
return projectInterwikiLettter .. ':' .. entity.sitelinks['ru' .. projectName].title
 
return projectInterwikiLettter .. ':' .. entity.sitelinks['ru' .. projectName].title
 
end
 
end
 
+
 
if entity.claims then
 
if entity.claims then
 
local propValues = entity.claims['P103']
 
local propValues = entity.claims['P103']
 
if propValues then
 
if propValues then
local codes = mw.loadData('Module:Wikidata:Dictionary/P424');
+
local codes = mw.loadData( 'Module:Wikidata:Dictionary/P424' );
 
for i, propClaim in pairs(propValues) do
 
for i, propClaim in pairs(propValues) do
 
if propClaim.mainsnak and propClaim.mainsnak.datavalue and propClaim.mainsnak.datavalue.value and propClaim.mainsnak.datavalue.value["numeric-id"] then
 
if propClaim.mainsnak and propClaim.mainsnak.datavalue and propClaim.mainsnak.datavalue.value and propClaim.mainsnak.datavalue.value["numeric-id"] then
Строка 39: Строка 51:
 
end
 
end
 
end
 
end
 
+
 
return ''
 
return ''
 
end
 
end
 
+
 
return p;
 
return p;

Версия 12:42, 2 августа 2017

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

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

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

{{#invoke:Wikidata/Interproject|getWikibooksLink}}
{{#invoke:Wikidata/Interproject|getWikisourceLink}}
{{#invoke:Wikidata/Interproject|getWikiquoteLink}}
{{#invoke:Wikidata/Interproject|getWiktionaryLink}}

local p = {};
 
function p.getWikibooksLink ( )
	return p.getSisterProjectLink( 'b', 'wikibooks' );
end
 
function p.getWikiquoteLink ( )
	return p.getSisterProjectLink( 'q', 'wikiquote' );
end
 
function p.getWikisourceLink ( )
	return p.getSisterProjectLink( 's', 'wikisource' );
end
 
function p.getWikipediaLink ( )
	return p.getSisterProjectLink( 'w', 'wiki' );
end

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