×
Create a new article
Write your page title here:
We currently have 1,225 articles on What if Doctor Who Wasn't Axed?. Type your article name above or create one of the articles listed here!



    What if Doctor Who Wasn't Axed?

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

    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 websites[1].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
    	if options.format == 'flash' then
    		ret[#ret + 1] = mw.getCurrentFrame():expandTemplate{
    			title = 'Color',
    			args = {'#505050', '(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, 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 = args[1] or args.URL or args.url
    	local wikidataurl = fetchWikidataUrl()
    	local formattedUrl = renderUrl{
    		url = url,
    		wikidataurl = wikidataurl,
    		display = args[2] or args.name or 'Official website',
    		format = args.format,
    		mobile = args.mobile
    	}
    	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
    
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.