Module:Interwiki

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua
CodeDiscussionEditHistoryNo test API DocumentationSubpagesLinksTestsResultsSandbox All modules

English language.svg

Back end to Template:Interwiki from wikidata. Please do not use directly but through the template.

Purpose. This module provides a way to supply interwiki links to pages that cannot be fully served by Wikidata for a variety of reasons, such as:

  1. Two pages are substantially identical, but only one can be directly linked to Wikidata.
    Example: most Hebrew-script pages on this wiki, which are substantially identical to corresponding Latin-script pages.
  2. Pages that have exact analogues in only a few wikis, but near analogues in many wikis.
    This commonly happens in Template (Xablón), Project/Wikipedia (Vikipedya), and Help (Ayudo) name spaces.
  3. Page does not have its own entry in Wikidata.
    All pages are allowed to have entries in Wikidata, but in some of the cases above, it may or not seem entirely necessary to create them.

Instructions

In case of reason 1 above

  1. Open tabs in your browser for the following pages:
    • The page having Wikidata links (example: Astronomiya)
    • The substantially identical page without its own Wikidata links (example: אסטרונומייה)
    • The Wikidata item of the first page (example: d:Q333)
    • The Wikidata item of the second page (example: d:Q20819872)
  2. In the Wikidata item of the second page, add the following to "Statements": "said to be the same as" with the value of the Wikidata item of the first page. (Note: "said to be the same as" is property d:Property:P460.)
  3. Edit the second page on this Wiki with the following code, at the bottom, just before categories. (If the page is a template, be sure this code is included within the <noinclude></noinclude> tags.)
    • {{#invoke:Interwiki|interwiki}}
  4. Save all changes.

The second page should now include all the interwiki links of the first page.

In case of reason 2 above

  1. Open tabs in your browser for the following pages:
  2. Edit the first page on this Wiki with the following code, at the bottom, just before categories. (If the page is a template, be sure this code is included within the <noinclude></noinclude> tags.)
    • {{#invoke:Interwiki|interwiki|qid=Qnnnnnnn}}, where Qnnnnnnn is the Wikidata item number of the near-analogue page.
  3. Save all changes.

The first page should now include all the interwiki links of the second page, except where an exact analogue already exists in the first page's own Wikidata item.

In case of reason 3 above

  1. Consider creating a Wikidata item for the page, and proceed as in reason 1 above.
  2. Otherwise, proceed as in reason 2 above.

Code

-- Originally from https://sv.wikipedia.org/wiki/Modul:Interwiki by [[user:Innocent_bystander]]
-- Modified by [[user:Jarekt]]

-- Use as follows:
--            {{#invoke:Interwiki|interwiki}}

-- or, specifying an item to draw interwikis from:
--            {{#invoke:Interwiki|interwiki|qid=Q5}}

local p = {}

-- Excludes some wikiprojects that are not Wikipedia, even if their code ends with 'wiki'
-- If using this code on other wiki please add your wiki to this list
local excludedProjects = {
	wikidatawiki  = 1,
	commonswiki   = 1,
	specieswiki   = 1,
	metawiki      = 1,
	mediawikiwiki = 1
}	

local redirectProperties = {
	P301 = 1,
	P460 = 1
}

function redirect(entity) -- access the first valid value of P460
	if entity and entity.claims then
		for P in pairs(redirectProperties) do
			for i, j in pairs(entity:getBestStatements( P )) do
				if j.mainsnak.snaktype == 'value' then
					return j.mainsnak.datavalue.value.id
				end
			end
		end
	end
	return nil
end

function p.interwiki(frame)
	local s = {}
	local entity = mw.wikibase.getEntity()
	local qid = frame.args.qid or frame:getParent().args.qid -- uses parameter qid of the module if it exists, otherwise follow P460
	if not qid or qid == '' then
		qid = redirect(entity)
	end
	if qid then
		local entity2 = mw.wikibase.getEntity(qid)
		if entity2 and entity2.sitelinks then
			for i, j in pairs(entity2.sitelinks) do
			  local lang = mw.ustring.sub( j.site, 1, -5) -- split j.site into language and project parts
				local proj = mw.ustring.sub( j.site, -4)
				if not excludedProjects[j.site] and proj == 'wiki' then -- excludes sites on the list as well as Wikisource, Wikiquote, Wikivoyage etc
					if mw.title.getCurrentTitle().namespace == 14 or ((entity and not entity.sitelinks[j.site]) or not entity) then -- excludes interwiki to projects that already have sitelinks in the present page, but just overwrite it on categories
						lang = mw.ustring.gsub(lang, '_','-')
						table.insert(s, '[[' .. lang .. ':' .. j.title .. ']]' ) -- put together a interwiki-link to other projects
					end
				end
			end
		end
	end
	return table.concat(s, '\n')
end

return p