|
|
Line 1: |
Line 1: |
| 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)
| |
| 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, ' ')
| |
Documentation for this module may be created at Module:Official website/doc