Editing Template:Official website

Jump to navigation Jump to search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
<includeonly>{{#invoke:Official website|main}}{{#invoke:Check for unknown parameters|check|showblankpositional=1|unknown={{main other|1=[[Category:Pages using Official website with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Official website]] with unknown parameter "_VALUE_"|1|2|URL|url|mobile|name|format}}</includeonly><!--
+
local makeUrl = require('Module:URL')._url
  
--><noinclude>{{documentation}}</noinclude>
+
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.getEntityObject().claims.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 entity = mw.wikibase.getEntityObject() or {}
 +
local qid = entity.id
 +
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 entity = mw.wikibase.getEntityObject() or {}
 +
local qid = entity.id
 +
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 = '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, 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

Please note that all contributions to wikieduonline may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Wikieduonline:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Advertising: