Line 1: |
Line 1: |
− | local makeUrl = require('Module:URL')._url
| |
− |
| |
| local p = {} | | 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) | | function p.main(frame) |
− | local args = require('Module:Arguments').getArgs(frame, { | + | return '' |
− | wrappers = 'Template:Official website'
| |
− | })
| |
− | return p._main(args)
| |
| end | | end |
| | | |
| return p | | return p |