local LIST_MODULE = 'মডিউল:উইকিপিডিয়া বিজ্ঞাপন/তালিকা' local DATA_MODULE = 'মডিউল:উইকিপিডিয়া বিজ্ঞাপন/উপাত্ত'  local p = {} local warnings = {}  local function addWarning(msg) 	table.insert(warnings, msg) end  local function makeWikilink(page, display) 	return string.format('%s', page, display) end  local function makeUrlLink(url, display) 	url = tostring(url) 	return string.format('[%s %s]', url, display) end  local function colorText(s, color) 	return string.format('%s', color, s) end  local function getImageData(args) 	-- This function gets an image data from the data module. It also tracks 	-- whether the image data choice was random. 	local data = mw.loadData(DATA_MODULE)  	local function getSomeImageData(id, param) 		id = tonumber(id) or id 		local someImageData = data.ids[id] 		if someImageData then 			return someImageData 		else 			addWarning(string.format("'%s' নং আইডির অস্তিত্ব নেই", tostring(id))) 			return nil 		end 	end  	-- Get the image data of the ad to display. 	local imageData, isRandom 	if args.ad then 		imageData = getSomeImageData(args.ad, 'ad') 		if not imageData then 			return nil 		end 		isRandom = false 	else 		local imageDataArray, length 		if args[1] then 			imageDataArray = {} 			for i, id in ipairs(args) do 				imageDataArray[#imageDataArray + 1] = getSomeImageData(id, i) 			end 			length = #imageDataArray 			if length < 1 then 				return nil 			end 		else 			imageDataArray = data.list 			length = data.noAds 		end 		assert(length >= 1, string.format( 			'%s-এ কোন বিজ্ঞাপন পাওয়া যায়নি', 			DATA_MODULE 		)) 		isRandom = length > 1 		if isRandom then 			math.randomseed(os.clock() * 1000000000) 			imageData = imageDataArray[math.random(length)] 		else 			imageData = imageDataArray[1] 		end 	end  	-- Check that the image data has the required fields. We have already 	-- checked the ID in the data module. 	for i, field in ipairs{'image', 'link'} do 		assert(imageData[field], string.format( 			"%s-এ অবৈধ উপাত্ত রয়েছে; '%s' নং আইডিসহ ছকের কোন '%s' ক্ষেত্র নেই", 			LIST_MODULE, tostring(imageData.id), field 		)) 	end  	return imageData, isRandom end  local function renderAd(imageData, args, title, isRandom) 	local width = tonumber(args.width) or 468 	local maxWidth = width + 9 	local linkColor = args.linkcolor or '#002bb8'  	-- Table root 	local root = mw.html.create('table') 	root 		:addClass('plainlinks qxz-ads') 		:css('color', args.color or '#555555') 		:css('border', 'none') 		:css('background', args.background) 		:css('line-height', '1em') 		:css('font-size', '90%') 		:css('display', 'block') 		:css('overflow', 'auto') 		:css('max-width', maxWidth .. 'px') 	if args.float then 		root:css('float', args.float) 		root:css('margin', args.margin) 	else 		root:css('margin', args.margin or '0 auto') 	end 	 	-- Image row 	root 		:tag('tr') 			:tag('td') 				:attr('colspan', 2) 				:css('border', 'none') 				:wikitext(string.format( 					'%dpx|alt=%s-এর জন্য উইকিপিডিয়া বিজ্ঞাপন|link=%s', 					imageData.image, 					width, 					imageData.link, 					imageData.link 				)) 	 	-- Links row 	if not args.nolinks then 		local linksRow = root:tag('tr')  		-- Wikipedia ads link 		linksRow 			:tag('td') 				:css('border', 'none') 				:wikitext(makeWikilink( 					'টেমপ্লেট:উইকিপিডিয়া বিজ্ঞাপন', 					colorText('উইকিপিডিয়া বিজ্ঞাপন', linkColor) 				))  		-- File info, purge and ID 		local links = {} 		links[#links + 1] = makeWikilink( 			':File:' .. imageData.image, 			colorText('ফাইলের তথ্য', linkColor) 		) 		if args.showpurge or isRandom then 			links[#links + 1] = makeUrlLink( 				title:fullUrl{action = 'purge'}, 				colorText('আরেকটি দেখান', linkColor) 			) 		end 		links[#links + 1] = '#' .. tostring(imageData.id) 		linksRow 			:tag('td') 				:css('text-align', 'right') 				:css('border', 'none') 				:wikitext(table.concat(links, ' – ')) 	end  	return tostring(root) end  local function renderWarnings(args, title) 	if #warnings < 1 then 		return nil 	end  	-- Error list 	local root = mw.html.create('div') 		:css('width', '468px') 	if args.float then 		root 			:css('float', args.float) 			:css('clear', 'both') 	else 		root:css('margin', '0 auto') 	end 	local list = root:tag('ul') 		:addClass('error') 		:css('font-size', '90%') 	for _, msg in ipairs(warnings) do 		list 			:tag('li') 				:wikitext(string.format( 					'উইকিপিডিয়া বিজ্ঞাপন ত্রুটি: %s (সাহায্য)।', 					msg 				)) 	end  	-- Category. We use Module:Category handler for its blacklist. 	local mCatHandler = require('মডিউল:বিষয়শ্রেণী পরিচালনাকারী') 	local category = mCatHandler._main{ 		all = 'বিষয়শ্রেণী:ত্রুটিসহ উইকিপিডিয়া বিজ্ঞাপনের টেমপ্লেট', 		nocat = args.nocat, 		page = title and title.prefixedText 	}  	local ret = tostring(root) 	if category then 		ret = ret .. category 	end 	return ret end  function p._main(args, title) 	title = title or mw.title.getCurrentTitle() 	local ret = {} 	local imageData, isRandom = getImageData(args) 	if imageData then 		ret[#ret + 1] = renderAd(imageData, args, title, isRandom) 	end 	ret[#ret + 1] = renderWarnings(args, title) 	if #ret > 0 then 		return table.concat(ret) 	else 		return nil 	end end  function p.main(frame) 	local args = require('Module:Arguments').getArgs(frame, { 		wrappers = 'টেমপ্লেট:উইকিপিডিয়া বিজ্ঞাপন' 	}) 	return p._main(args) end  return p