Permanently protected module
From Wikipedia, the free encyclopedia


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



-- Gets the rank for a Wikidata property table. Returns 1, 0 or -1, in

-- order of rank.

local function getRank(prop)

	local rank = prop.rank

	if rank == 'preferred' then

		return 1

	elseif rank == 'normal' then

		return 0

	elseif rank == 'deprecated' then

		return -1

	else

		-- No rank or undefined rank is treated as "normal".

		return 0

	end

end



-- Finds whether a Wikidata property is qualified as being in English.

local function isEnglish(prop)

	local ret = quickPcall(function ()

		for i, lang in ipairs(prop.qualifiers.P407) do

			if lang.datavalue.value'numeric-id' == 1860 then

				return true

			end

		end

		return false

	end)

	return ret == true

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.getAllStatements(mw.wikibase.getEntityIdForCurrentPage(), 'P856')

	end)



	-- Clone the objects in case other code needs them in their original order.

	websites = websites and mw.clone(websites) or {}



	-- Add the table index to the objects in case it is needed in the sort.

	for i, website in ipairs(websites) do

		website._index = i

	end



	-- Sort the websites, first by highest rank, and then by websites in the

	-- English language, then by the website's original position in the

	-- property list. When we are done, get the URL from the highest-sorted

	-- object.

	table.sort(websites, function(ws1, ws2)

		local r1 = getRank(ws1)

		local r2 = getRank(ws2)

		if r1 ~= r2 then

			return r1 > r2

		end

		local e1 = isEnglish(ws1)

		local e2 = isEnglish(ws2)

		if e1 ~= e2 then

			return e1

		end

		return ws1._index < ws2._index

	end)

	local url = quickPcall(function ()

		return websites1].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 and not options.wikidataurl then

		local qid = mw.wikibase.getEntityIdForCurrentPage()

		local result = '<strong class="error">' ..

			'No URL found. Please specify a URL here or add one to Wikidata.' ..

			'</strong>'

		if qid then

			result = result.. ' [[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=Edit this at Wikidata |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|Edit this at Wikidata]]'

		end

		return result

	end

	local ret = {}

	ret#ret + 1 = string.format(

		'<span class="official-website">%s</span>',

		makeUrl(options.url or options.wikidataurl, options.display)

	)

	if options.wikidataurl and not options.url then

		local qid = mw.wikibase.getEntityIdForCurrentPage()

		if qid then

			ret#ret + 1 = '[[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=Edit this at Wikidata |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|Edit this at Wikidata]]'

		end

	end

	return table.concat(ret, ' ')

end



-- Render the tracking category.

local function renderTrackingCategory(url, wikidataurl)

	if mw.title.getCurrentTitle().namespace ~= 0 then

		return ''

	end

	local category

	if not url and not wikidataurl then

		category = 'Official website missing URL'

	elseif not url and wikidataurl then

		return ''

	elseif url and wikidataurl then

		if url:gsub('/%s*$', '') ~= wikidataurl:gsub('/%s*$', '') 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 = args1 or args.URL or args.url

	local wikidataurl = fetchWikidataUrl()

	local formattedUrl = renderUrl{

		url = url,

		wikidataurl = wikidataurl,

		display = args2 or args.name or 'Official website'

	}

	return formattedUrl .. renderTrackingCategory(url, wikidataurl)

end



function p.main(frame)

	local args = require('Module:Arguments').getArgs(frame, {

		wrappers = 'Template:Official website'

	})

	return p._main(args)

end



return p
Permanently protected module
From Wikipedia, the free encyclopedia


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



-- Gets the rank for a Wikidata property table. Returns 1, 0 or -1, in

-- order of rank.

local function getRank(prop)

	local rank = prop.rank

	if rank == 'preferred' then

		return 1

	elseif rank == 'normal' then

		return 0

	elseif rank == 'deprecated' then

		return -1

	else

		-- No rank or undefined rank is treated as "normal".

		return 0

	end

end



-- Finds whether a Wikidata property is qualified as being in English.

local function isEnglish(prop)

	local ret = quickPcall(function ()

		for i, lang in ipairs(prop.qualifiers.P407) do

			if lang.datavalue.value'numeric-id' == 1860 then

				return true

			end

		end

		return false

	end)

	return ret == true

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.getAllStatements(mw.wikibase.getEntityIdForCurrentPage(), 'P856')

	end)



	-- Clone the objects in case other code needs them in their original order.

	websites = websites and mw.clone(websites) or {}



	-- Add the table index to the objects in case it is needed in the sort.

	for i, website in ipairs(websites) do

		website._index = i

	end



	-- Sort the websites, first by highest rank, and then by websites in the

	-- English language, then by the website's original position in the

	-- property list. When we are done, get the URL from the highest-sorted

	-- object.

	table.sort(websites, function(ws1, ws2)

		local r1 = getRank(ws1)

		local r2 = getRank(ws2)

		if r1 ~= r2 then

			return r1 > r2

		end

		local e1 = isEnglish(ws1)

		local e2 = isEnglish(ws2)

		if e1 ~= e2 then

			return e1

		end

		return ws1._index < ws2._index

	end)

	local url = quickPcall(function ()

		return websites1].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 and not options.wikidataurl then

		local qid = mw.wikibase.getEntityIdForCurrentPage()

		local result = '<strong class="error">' ..

			'No URL found. Please specify a URL here or add one to Wikidata.' ..

			'</strong>'

		if qid then

			result = result.. ' [[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=Edit this at Wikidata |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|Edit this at Wikidata]]'

		end

		return result

	end

	local ret = {}

	ret#ret + 1 = string.format(

		'<span class="official-website">%s</span>',

		makeUrl(options.url or options.wikidataurl, options.display)

	)

	if options.wikidataurl and not options.url then

		local qid = mw.wikibase.getEntityIdForCurrentPage()

		if qid then

			ret#ret + 1 = '[[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt=Edit this at Wikidata |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|Edit this at Wikidata]]'

		end

	end

	return table.concat(ret, ' ')

end



-- Render the tracking category.

local function renderTrackingCategory(url, wikidataurl)

	if mw.title.getCurrentTitle().namespace ~= 0 then

		return ''

	end

	local category

	if not url and not wikidataurl then

		category = 'Official website missing URL'

	elseif not url and wikidataurl then

		return ''

	elseif url and wikidataurl then

		if url:gsub('/%s*$', '') ~= wikidataurl:gsub('/%s*$', '') 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 = args1 or args.URL or args.url

	local wikidataurl = fetchWikidataUrl()

	local formattedUrl = renderUrl{

		url = url,

		wikidataurl = wikidataurl,

		display = args2 or args.name or 'Official website'

	}

	return formattedUrl .. renderTrackingCategory(url, wikidataurl)

end



function p.main(frame)

	local args = require('Module:Arguments').getArgs(frame, {

		wrappers = 'Template:Official website'

	})

	return p._main(args)

end



return p

Videos

Youtube | Vimeo | Bing

Websites

Google | Yahoo | Bing

Encyclopedia

Google | Yahoo | Bing

Facebook