مواد ڏانھن هلو

ماڊيول:Official website

کليل ڄاڻ چيڪلي، وڪيپيڊيا مان


هي ماڊيول ڪيترن ئي سانچن کي لاڳو ڪري ٿو:

ٽريڪنگ زمرا

[سنواريو]

پڻ ڏسو

[سنواريو]

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.
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
		return 0
	end
end

-- Finds whether a Wikidata property is qualified as being in English.
local function isEnglish(prop)
	local ret = quickPcall(function()
		if not prop.qualifiers or not prop.qualifiers.P407 then
			return false
		end

		for _, lang in ipairs(prop.qualifiers.P407) do
			if lang.datavalue
				and lang.datavalue.value
				and 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(qid)
	local websites = quickPcall(function()
		local id = qid or mw.wikibase.getEntityIdForCurrentPage()
		if not id then
			return {}
		end
		return mw.wikibase.getAllStatements(id, 'P856')
	end)

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

	for i, website in ipairs(websites) do
		website._index = i
	end

	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)

	fetchWikidataUrl = function()
		return url
	end

	return url
end

-- Renders the URL link and visible output.
local function renderUrl(options)
	if not options.url and not options.wikidataurl then
		if options.suppress_error then
			return ''
		end

		local qid = options.qid or 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 = options.qid or 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

-- Renders 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 qid = args.qid
	local wikidataurl = fetchWikidataUrl(qid)

	local formattedUrl = renderUrl{
		url = url,
		wikidataurl = wikidataurl,
		display = args[2] or args.name or 'Official website',
		qid = qid
	}

	return formattedUrl .. renderTrackingCategory(url, wikidataurl)
end

function p._url(args)
	local qid = args.qid
	local wikidataurl = fetchWikidataUrl(qid)

	local formattedUrl = renderUrl{
		suppress_error = 1,
		wikidataurl = wikidataurl,
		qid = qid
	}

	local warning = ''
	if wikidataurl == nil then
		local generateWarning = require('Module:If preview')._warning
		warning = generateWarning({
			'No official website ([[wikidata:Property:P856|P856]]) found in Wikidata. Nothing will be displayed.'
		})
	end

	return formattedUrl .. warning
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame)
	return p._main(args)
end

function p.url(frame)
	local args = require('Module:Arguments').getArgs(frame)
	return p._url(args)
end

return p