বিষয়বস্তুতে চলুন

মডিউল:উইকিপিডিয়া বিজ্ঞাপন

উইকিপিডিয়া, মুক্ত বিশ্বকোষ থেকে
মডিউল নথি[তৈরি করুন]
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|%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('<span style="color:%s">%s</span>', 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(
					'[[File:%s|%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