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

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
Нет описания правки
м fix
Строка 35: Строка 35:
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
local languageWikidataId = 'Q' .. propClaim.mainsnak.datavalue.value["numeric-id"]
local languageWikidataId = 'Q' .. propClaim.mainsnak.datavalue.value["numeric-id"]
local code = (codes[languageWikidataId] or getLangCodeByArticle(entity:getSitelink('ruwiki')))[1]
local code = codes[languageWikidataId] or getLangCodeByArticle(entity:getSitelink('ruwiki'))[1]
if code then
if code then
local sitelink = entity.sitelinks[code .. projectName]
local sitelink = entity.sitelinks[code .. projectName]

Версия от 10:44, 19 августа 2014

Документация

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

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

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

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

local function getLangCodeByArticle(name) -- длинный список
	local L=mw.loadData("Module:Languages/data");
	for k,v in pairs(L) do
		if v[2] == name then return k end
	end
	return {false}
end

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

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

function p.getSisterProjectLink( projectInterwikiLettter, projectName )
	-- По умолчанию старается достать ссылку на русском,
	-- иначе - на родном (P103), иначе - на хоть бы каком
	local entity = mw.wikibase.getEntityObject()
	if 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/Language-codes');
			for index, 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 code = codes[languageWikidataId] or getLangCodeByArticle(entity:getSitelink('ruwiki'))[1]
					if code then
						local sitelink = entity.sitelinks[code .. projectName]
						if sitelink then
							return projectInterwikiLettter .. ':' .. code .. ':' .. sitelink.title
						end
					end
				end
			end
		end
	end

	-- just take the first one...
	for key, value in pairs(entity.sitelinks) do
		if mw.ustring.sub(key, 0 - mw.ustring.len("projectName")) == projectName then
			return projectInterwikiLettter .. ':' .. mw.ustring.sub(key, 0, mw.ustring.len(key) - 10) .. ':' .. value.title
		end
	end

	return ''
end

return p;