-- এই মডিউলটি  টেমপ্লেটের জন্য তৈরি করা হয়েছে। -- এটি নিবন্ধের ইতিহাস প্রদর্শনের জন্য ব্যবহৃত হবে যেখানে নিবন্ধের প্রতিটি পরিবর্তনের তারিখ,  -- প্রক্রিয়া এবং ফলাফল প্রদর্শন করা হবে। local Date = require("মডিউল:Date")._Date -- তারিখের জন্য local data = require("মডিউল:নিবন্ধ ইতিহাস/উপাত্ত") -- মডিউলের প্রয়োজনীয় উপাত্ত  local p = {} local LABEL = data.label local MESSAGE =  data.message local RESULT = data.result local function date(txt)     -- এই ফাংশনটি একটি তারিখ স্ট্রিং গ্রহণ করে এবং তারিখটি সাজানো ভাবে প্রদর্শন করে। 	local dt = Date(txt) 	if(dt) then -- যদি তারিখ সঠিক হয় 		dt = dt:text("mdy") -- তারিখ সাজানো 	else -- যদি তারিখ ভুল হয় 		dt = "ভুলভাবে বিন্যস্ত তারিখ" 	end     -- তারিখ প্রদর্শন 	return dt end function p.showCurrentStatus(title, topic, currentstatus) 	-- বর্তমান অবস্থা প্রদর্শন 	local topic = data.topic[topic] 	if topic == nil then 		topic = "অজানা" 	end 	local image = data.image[currentstatus] 	local message = string.format(MESSAGE[currentstatus], title, title, topic, topic) 	return '\n|-\n|30px|| align="center" colspan="2" |' .. message end function p.showMilestones(actions) 	local result = '\n|-\n!তারিখ!!মাইলফলক!!ফলাফল\n|-\n' 	mw.logObject(actions) 	for seq, action in pairs(actions) do 		local actionLabel = LABEL[action[""]] 		local resultLabel = RESULT[action["result"]] 		if(action["date"] == nil) then 			action["date"] = "" 		end 		if(action["link"] == nil) then 			action["link"] = actionLabel 		else 			action["link"] = '[['..action["link"]..'|'..actionLabel..']]' 		end 		if actionLabel == nil then 			actionLabel = action[""] 		end 		if resultLabel == nil then 			resultLabel = action["result"] 		end 		if(action["date"] ~= "") then 			local dt = date(action["date"]) 			local oldid = tonumber(action["oldid"]) 			if(oldid ~= nil) then 				dt = ""..dt.."" 			end 			result = result .. '|' .. dt .. '||' .. action["link"] .. '||' .. resultLabel .. '\n|-\n' 		end 	end 	return result end  function p.showDYK(dyks, count) 	-- first dyk 	local firstDyk = dyks[1] 	if(firstDyk["date"] == nil) then 		return "" 	end 	local result = date(firstDyk["date"]) 	if(count > 1) then 		-- multiple dyks 		for i = 2, count - 1 do 			local dyk = dyks[i] 			if(dyk["date"] ~= nil) then 				result = result .. ", " .. date(dyk["date"]) 			end 		end 		-- last dyk 		local lastDyk = dyks[count] 		result = result .. " ও " .. date(lastDyk["date"]) 	end 	result = "|[[file:"..data.image["dyk"].."|30px]]||"..string.format(MESSAGE["dyk"],result).."\n|-\n" 	return result end function p.show(config) 	-- MESSAGE is a table that contains the messages that will be displayed 	-- based on the current status of the article 	-- if the current status is not found in the table, then the function will return as if the article is not in any status 	if(MESSAGE[config["currentstatus"]] == nil) then 		config["currentstatus"] = "unknown" -- Unknown status    	end     local content = '{| align="center" style="text-align:center;" class="tmbox tmbox-notice' 	local isSmall = config["small"] or config["actioncount"] > 1 	if(isSmall) then 		content = content.. ' tmbox-small' 	end 	content = content .. '"' 	--- বর্তমান অবস্থা প্রদর্শন 	 	content = content .. p.showCurrentStatus(config["title"], config["topic"], config["currentstatus"]) 	-- মাইলফলক প্রদর্শন 	if (config["actioncount"] > 0) then 		content = content .. p.showMilestones(config["action"]) 	end 	if (config["dykcount"] > 0) then 		content = content .. p.showDYK(config["dyk"], config["dykcount"]) 	end 	-- মাইলফলক শেষ; এখন আজাকি প্রদর্শন 	content = content .. "|}" 	return content end  function parseArguments(arguments) 	local PARAMETER_PATTERN = "(%a+)(%d+)(%a*)" -- pattern to match the parameter name 	local parsedConfig = { 		-- title of the article 		["title"] = mw.title.getCurrentTitle()["text"], 		-- topic of the article 		["topic"] = arguments["topic"], 		-- current status of the article 		["currentstatus"] = arguments["currentstatus"], 		["actioncount"] = 0, 		["dykcount"] = 0, 		["action"] = {}, 		["dyk"] = {} 	} 	 	for parameter, value in pairs(arguments) do 		-- Parse parameters like action1, action1date, action1result, action1oldid, action1link 		value = mw.text.trim(value) 		parameter = mw.text.trim(parameter) 		parameter = mw.ustring.lower(parameter) 		local partBeforeNumber, number, partAfterNumber = string.match(parameter, PARAMETER_PATTERN) 		if(partBeforeNumber) then 			-- covers the action and dyk parameters 			partAfterNumber  = tostring(partAfterNumber) 			number = tonumber(number) 			-- strip the value  			if(number ~= nil) then 				-- Not a scaler because it has a sequence number 				if (parsedConfig[partBeforeNumber] == nil) then 					parsedConfig[partBeforeNumber] = {} 				end 				if (parsedConfig[partBeforeNumber][number] == nil) then 					parsedConfig[partBeforeNumber][number] = {} 				end 				parsedConfig[partBeforeNumber][number][partAfterNumber] = value 				countLabel = partBeforeNumber.."count" 				-- Increase the count of that particular action 				parsedConfig[countLabel] = parsedConfig[countLabel] + 1 			else 				-- Scaler 				parsedConfig[partBeforeNumber] = value 			end 		else 			-- covers the rest of the parameters 			-- like topic, currentstatus, small 			parsedConfig[parameter] = value 		end 	end 	-- log the parsed config 	mw.logObject(parsedConfig) 	return parsedConfig end function p.main(frame) 	local arguments = frame:getParent().args 	local parsedConfig = parseArguments(arguments) 	return p.show(parsedConfig) end return p