-- This module implements Template:Random portal component  local p = {}  local mRandom = require('মডিউল:Random') local convert = require('মডিউল:সংখ্যা রূপান্তরকারী').convert local currentTitle = mw.title.getCurrentTitle()  -- tracking function added by BHG 29/04/2019 -- called as subPageTrackingCategories(pages, args.max) local function subPageTrackingCategories(pages, max, header) 	local retval = ""; 	local thispagetitle = mw.title.getCurrentTitle().text  	-- don't track DYK etc, only selected/featured articles, biogs etc 	if ((string.find(header, "/[sS]elected") == -1) and (string.find(header, "/[fF]eatured") == -1)) then 		return retval 	end 	-- no tracking unless we are in Portal namespace 	if (mw.title.getCurrentTitle().nsText ~= "Portal") then 		return "" 	end  	-- no tracking if this is a subpage 	if ((mw.ustring.match(thispagetitle, "/") ~= nil) and (thispagetitle ~= "AC/DC")) then 		return retval 	end  	local maxNum = tonumber(max) 	local availableSubPageCount = maxNum  	-- Check for missing subpages at end of alleged number range 	while availableSubPageCount > 0 and not mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount)).exists do 		availableSubPageCount = availableSubPageCount - 1 	end 	if availableSubPageCount < maxNum then  		retval = retval .. "" 	else 		-- Check for spurious subpages beyond end of alleged number range 		while mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount + 1)).exists do 			availableSubPageCount = availableSubPageCount + 1 		end 		if availableSubPageCount > maxNum then  			retval = retval .. "" 		end 	end  	-- before categorising, check what type of subpage we are categorising, and if detected, categorise images separately 	local subpageType = "subpages" -- generic type 	local subpageName = pages.subpage 	subpageName = mw.ustring.gsub(subpageName, "^[^/]*/", "") 	subpageName = mw.ustring.lower(subpageName) 	if ((mw.ustring.find(subpageName, "picture", 1, true) ~= nil) or 		(mw.ustring.find(subpageName, "image", 1, true) ~= nil) or 		(mw.ustring.find(subpageName, "panorama", 1, true) ~= nil)) then 		subpageType = "image subpages" 	end 	if (availableSubPageCount < 2) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 5) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 10) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 15) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 20) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 25) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 30) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 40) then 		retval = retval .. "" 	elseif (availableSubPageCount <= 50) then 		retval = retval .. "" 	else 		retval = retval .. "" 	end 	return retval; end local function getRandomNumber(max) 	-- gets a random integer between 1 and max; max defaults to 1 	return mRandom.number{max or 1} end  local function expandArg(args, key) 	-- Emulate how unspecified template parameters appear in wikitext. If the 	-- specified argument exists, its value is returned, and if not the argument 	-- name is returned inside triple curly braces. 	local val = args[key] 	if val then 		return val 	else 		return string.format('', key) 	end end  local function getPages(args) 	local pages = {} 	pages.root = args.rootpage or currentTitle.prefixedText 	pages.subpage = pages.root .. '/' .. expandArg(args, 'subpage') 	local tries = 10 	repeat 		pages.random = pages.subpage .. '/' .. convert('bn', tostring(getRandomNumber(args.max))) 		tries = tries - 1 	until tries < 1 or mw.title.new(pages.random).exists 	pages.footer = 'টেমপ্লেট:বাক্স-নিচ' 	return pages end  local function tryExpandTemplate(frame, title, args) 	local success, result = pcall(frame.expandTemplate, frame, {title = title, args = args}) 	if success then 		return result 	else 		local msg = string.format( 			'"%s" নামক কোন পাতার অস্তিত্ব নেই।', 			title 		) 		if mw.title.getCurrentTitle().namespace == 100 then -- is in the portal namespace 			msg = msg .. 'বিষয়শ্রেণী:প্রবেশদ্বারে দৃষ্টি আকর্ষণ প্রয়োজন' 		end 		return msg 	end end  local function getHeader(frame, pages, header, template) 	return tryExpandTemplate( 		frame, 		template or pages.root .. '/বাক্স-উপর', 		{header, pages.random} 	) end  local function getRandomSubpageContent(frame, pages) 	return tryExpandTemplate( 		frame, 		pages.random 	) end  local function getFooter(frame, pages, link) 	return tryExpandTemplate( 		frame, 		pages.footer, 		{link} 	) end  function p._main(args, frame) 	frame = frame or mw.getCurrentFrame() 	local pages = getPages(args)  	local ret = {} 	ret[#ret + 1] = getHeader(frame, pages, args.header or 'subpage', args.headertemplate) 	ret[#ret + 1] = getRandomSubpageContent(frame, pages) 	if not args.footer or not args.footer:find('%S') then 		ret[#ret + 1] = '</div>' 	else 		ret[#ret + 1] = getFooter(frame, pages, string.format( 			'%s', 			pages.subpage, 			expandArg(args, 'footer') 		)) 	end  	return table.concat(ret, '\n') .. subPageTrackingCategories(pages, args.max, args.header) end  function p._nominate(args, frame) 	frame = frame or mw.getCurrentFrame() 	local pages = getPages(args) 	 	local ret = {} 	ret[#ret + 1] = getHeader(frame, pages, expandArg(args, 'header'), args.headertemplate) 	ret[#ret + 1] = getRandomSubpageContent(frame, pages) 	ret[#ret + 1] = getFooter(frame, pages, string.format( 		'প্রস্তাবনা • %s ', 		expandArg(args, 'subpage'), 		pages.subpage, 		args.footer or 'সংগ্রহশালা' 	))  	return table.concat(ret, '\n') .. subPageTrackingCategories(pages, args.max, args.header) end  local function makeInvokeFunction(func) 	return function (frame) 		local args = require('Module:Arguments').getArgs(frame, { 			trim = false, 			removeBlanks = false, 			wrappers = { 				'টেমপ্লেট:অজানাক্রমে প্রবেশদ্বারের উপাদান', 				'টেমপ্লেট:মনোনয়ন করুন সহকারে অজানাক্রমে প্রবেশদ্বারের উপাদান' 			} 		}) 		return func(args, frame) 	end end  p.main = makeInvokeFunction(p._main) p.nominate = makeInvokeFunction(p._nominate)  return p