Jump to content

Module:Official website

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Mr. Stradivarius (talk | contribs) at 23:48, 6 January 2016 (Protected "Module:Official website": High-risk Lua module ([Edit=Allow only template editors and admins] (indefinite) [Move=Allow only template editors and admins] (indefinite))). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local makeUrl = require('Module:URL')._url

local p = {}

-- Wrapper for pcall which returns nil on failure.
local function quickPcall(func)
	local success, result = pcall(func)
	if success then
		return result
	end
end

-- Fetches the official website URL from Wikidata.
local fetchWikidataUrl
fetchWikidataUrl = function()
	-- Get objects for all official sites on Wikidata.
	local websites = quickPcall(function ()
		return mw.wikibase.getEntityObject().claims.P856
	end)
	websites = websites or {}
	
	-- Find the website object with the highest rank, or the first one if there
	-- is a tie. Then get the URL from that object.
	local ranks = {}
	for i, website in ipairs(websites) do
		if website.rank and not ranks[website.rank] then
			ranks[website.rank] = i
		end
	end
	local url = quickPcall(function ()
		local website = websites[ranks.preferred or ranks.normal or ranks.deprecated]
		return website.mainsnak.datavalue.value
	end)
	
	-- Cache the result so that we only do the heavy lifting once per #invoke.
	fetchWikidataUrl = function ()
		return url
	end

	return url
end

-- Render the URL link, plus other visible output.
local function renderUrl(options)
	if not options.url then
		return '<strong class="error">' ..
			'No URL found. Please specify a URL here or add one to Wikidata.' ..
			'</strong>'
	end
	local ret = {}
	ret[#ret + 1] = string.format(
		'<span class="official-website">%s</span>',
		makeUrl(options.url, options.display)
	)
	if options.format == 'flash' then
		ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
			title = 'Link note',
			args = {note = 'Requires [[Adobe Flash player]]'}
		}
	end
	if options.mobile then
		ret[#ret + 1] = '(' .. makeUrl(options.mobile, 'Mobile') .. ')'
	end
	return table.concat(ret, ' ')
end

-- Render the tracking category.
local function renderTrackingCategory(url)
	if mw.title.getCurrentTitle().namespace ~= 0 then
		return ''
	end
	local category
	if not url then
		category = 'Official website missing URL'
	elseif fetchWikidataUrl() then
		if url and url ~= fetchWikidataUrl() then
			category = 'Official website different in Wikidata and Wikipedia'
		end
	else
		category = 'Official website not in Wikidata'
	end
	return category and string.format('[[Category:%s]]', category) or ''
end

function p._main(args)
	local url = args[1] or args.URL or fetchWikidataUrl()
	local formattedUrl = renderUrl{
		url = url,
		display = args[2] or args.name or 'Official website',
		mobile = args.mobile,
		format = args.format
	}
	return formattedUrl .. renderTrackingCategory(url)
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		wrappers = 'Template:Official website'
	})
	return p._main(args)
end

return p