local makeUrl = require('মডিউল: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 Bangla. local function isEnglish(prop) 	local ret = quickPcall(function () 		for i, lang in ipairs(prop.qualifiers.P407) do 			if lang.datavalue.value['numeric-id'] == 9610 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 = '' .. 			'কোনো ইউআরএল পাওয়া যায়নি। অনুগ্রহ করে, এখানে একটি ইউআরএল দিন বা একটি উইকিউপাত্ত যোগ করুন।' .. 			'' 		if qid then 			result = result.. ' frameless |text-top |10px |alt=উইকিউপাত্তে এটি সম্পাদনা করুন |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|উইকিউপাত্তে এটি সম্পাদনা করুন' 		end 		return result 	end 	local ret = {} 	ret[#ret + 1] = string.format( 		'%s', 		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] = 'frameless |text-top |10px |alt=উইকিউপাত্তে এটি সম্পাদনা করুন |link=https://www.wikidata.org/wiki/' .. qid .. '#P856|উইকিউপাত্তে এটি সম্পাদনা করুন' 		end 	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 = 'দাপ্তরিক ওয়েবসাইটে ইউআরএল অনুপস্থিত' 	elseif not url and wikidataurl then 		return  	elseif url and wikidataurl then 		if url:gsub('/%s*$', ) ~= wikidataurl:gsub('/%s*$', ) then 			category = 'উইকিউপাত্ত ও উইকিপিডিয়াতে দাপ্তরিক ওয়েবসাইট ভিন্ন' 		end 	else 		category = 'উইকিউপাত্তে দাপ্তরিক ওয়েবসাইট নেই' 	end 	return category and string.format('বিষয়শ্রেণী:%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 'দাপ্তরিক ওয়েবসাইট' 	} 	return formattedUrl .. renderTrackingCategory(url, wikidataurl) end  function p.main(frame) 	local args = require('মডিউল:Arguments').getArgs(frame, { 		wrappers = 'টেমপ্লেট:দাপ্তরিক ওয়েবসাইট' 	}) 	return p._main(args) end  return p