Jump to content

Module:IncubatorInterwiki

From Wikimedia Incubator

Documentation for this module may be created at Module:IncubatorInterwiki/doc

local p = {}

-- language codes with underscore '_', have to be translated to '-', to be readable for MediaWiki
local langcode = {
	['bat_smg'] = 'bat-smg',
	['be_x_old'] = 'be-tarask',
	['cbk_zam'] = 'cbk-zam',
	['fiu_vro'] = 'fiu-vro',
	['map_bms'] = 'map-bms',
	['nds_nl'] = 'nds-nl',
	['roa_rup'] = 'roa-rup',
	['roa_tara'] = 'roa-tara',
	['zh_classical'] = 'zh-classical',
	['zh_min_nan'] = 'zh-min-nan', -- a comma has to be added when new lines are added
	['zh_yue'] = 'zh-yue'
}

-- Lookup for standard language codes (used in Incubator) to language codes used
-- in dbnames in Wikimedia/Wikidata
local lang2db_map = {
	['be-tarask'] = 'be_x_old',
	['gsw'] = 'als',
	['lzh'] = 'zh_classical',
	['nan'] = 'zh_min_nan',
	['nb'] = 'no',
	['nrf'] = 'nrm',
	['rup'] = 'roa_rup',
	['sgs'] = 'bat_smg',
	['vro'] = 'fiu_vro',
	['yue'] = 'zh_yue'
}

-- Mapping of Incubator test wiki project codes to database suffixes (used in Wikidata)
-- and interwiki prefixes.
local project_map = {
	['Wb'] = {'wikibooks', 'b:'},
	['Wn'] = {'wikinews', 'n:'},
	['Wp'] = {'wiki', ''},
	['Wq'] = {'wikiquote', 'q:'},
	['Wt'] = {'wiktionary', 'wikt:'},
	['Wy'] = {'wikivoyage', 'voy:'}
}

-- Mapping of database suffixes and special sitelinks to interface message keys
-- (like MediaWiki:Wikibase-otherprojects-commons) and URLs/URL patterns
local db_map = {
	['wikibooks'] = {'wikibooks', 'https://$1.wikibooks.org/wiki/'},
	['wikinews'] = {'wikinews', 'https://$1.wikinews.org/wiki/'},
	['wiki'] = {'wikipedia', 'https://$1.wikipedia.org/wiki/'},
	['wikiquote'] = {'wikiquote', 'https://$1.wikiquote.org/wiki/'},
	['wikisource'] = {'wikisource', 'https://$1.wikisource.org/wiki/'},
	['wikiversity'] = {'wikiversity', 'https://$1.wikiversity.org/wiki/'},
	['wikivoyage'] = {'wikivoyage', 'https://$1.wikivoyage.org/wiki/'},
	['wiktionary'] = {'wiktionary', 'https://$1.wiktionary.org/wiki/'},
	['commonswiki'] = {'commons', 'https://commons.wikimedia.org/wiki/'},
	['mediawikiwiki'] = {'mediawiki', 'https://mediawiki.org/wiki/'},
	['metawiki'] = {'meta', 'https://meta.wikimedia.org/wiki/'},
	['sourceswiki'] = {'sources', 'https://wikisource.org/wiki/'},
	['specieswiki'] = {'species', 'https://wikispecies.org/wiki/'},
	['wikidatawiki'] = {'wikidata', 'https://www.wikidata.org/wiki/'},
	['wikimaniawiki'] = {'wikimania', 'https://wikimania.wikimedia.org/wiki/'}
}

local function startsWith(str, start)
	return str:sub(1, #start) == start
end

local function endsWith(str, ending)
	return ending == '' or str:sub(-#ending) == ending
end

-- Check the validity of a page title format, and return the project & langcode if it is valid
local function getPrefix(title)
	local pagenamesplit = mw.text.split(title, '/')
	if mw.ustring.match(pagenamesplit[1], 'W[bnpqty]') and #pagenamesplit >= 3 then
		return { pagenamesplit[1], pagenamesplit[2] }
	else
		return { 'Wp', 'NOLANGUAGECODE' }
	end
end

p.interwiki = function(frame)
	local s = {'[[Category:Maintenance:Pages using the interwiki template]]'}
	local qid = frame.args.qid or frame:getParent().args[1] or frame:getParent().args.qid or ''
	local prefix = getPrefix(mw.title.getCurrentTitle().text)
	local project = prefix[1]
	local thislang = prefix[2]
	thislang = lang2db_map[thislang] or thislang
	if not project then
		return nil
	elseif not mw.ustring.match( qid, '^[Qq][1-9]%d*$' ) then
		s = {'[[Category:Maintenance:Pages with invalid QID in interwiki template]]'}
	else
		local dbsuffix = project_map[project][1]
		local iwprefix = project_map[project][2]
		if qid then
			local entity = mw.wikibase.getEntity(qid)
			if entity and entity.sitelinks then
				for i, j in pairs(entity.sitelinks) do
					if db_map[j.site] or startsWith(j.site, thislang) then
						local sitedbsuffix = db_map[j.site] or db_map[mw.ustring.sub(j.site, #thislang+1)]
						if sitedbsuffix then
							local span = '<span class="wminc-otherprojects" data-project="' .. sitedbsuffix[1] .. '" data-url="' .. mw.ustring.gsub(mw.ustring.gsub(sitedbsuffix[2], '$1', thislang), '_', '-') .. mw.uri.encode(j.title, 'WIKI') .. '"></span>'
							table.insert(s, span)
						end
					elseif endsWith(j.site, dbsuffix) then
						local lang = mw.ustring.gsub(j.site, dbsuffix, '')
						if langcode[lang] or #lang <= 3 then
							-- Special case for the Norwegian Bokmål Wikipedia;
							-- use 'nb' instead of 'no' for that one site
							if j.site == 'nowiki' then
								lang = 'nb'
							end
							lang = langcode[lang] or lang
							local iwtext = '[[' .. lang .. ':' .. iwprefix .. j.title .. ']]'
							-- Special case for the Shawiya Wiktionary;
							-- unfortunately there is no way to link to it via
							-- interlanguage link from anything other than other
							-- Wiktionaries, so we need to skip it.
							if j.site == 'shywiktionary' or j.site == 'btmwiktionary' then
								iwtext = '<!--' .. iwtext .. '-->'
							end
							table.insert(s, iwtext)
						end
					end
				end
			end
		end
	end
	table.sort(s)
	return table.concat(s, '\n')
end

return p