-- This module implements   local mHatnote = require('Module:Hatnote')  local p = {}  local function makeWikitextError(msg) 	return string.format( 		'ত্রুটি: %s (টেমপ্লেট:এছাড়াও দেখুন বিষয়শ্রেণী)', 		msg 	) end  -- Gets the length of the sequence seq. Usually this should be done with the # -- operator, but we need to work with tables that get their values through an -- __index metamethod. local function getSequenceLength(seq) 	local length = 0 	for i in ipairs(seq) do 		length = i 	end 	return length end  -- Given a table of options, returns a function that formats categories for -- those options. -- -- Options: -- project - a project code such as "fr" (for the French Wikipedia) -- showPrefix - a boolean value for whether to show the "Category:" prefix --              (and the project prefix if specified) -- -- This is implemented as a function generator rather than a simple function -- so that we can just process the options once, instead of every time we -- generate a category. local function newCategoryLinker(options) 	local formatString 	if options.project then 		if options.showPrefix then 			formatString = ':' .. options.project .. ':Category:%s' 		else 			formatString = '%s' 		end 	else 		if options.showPrefix then 			formatString = ':বিষয়শ্রেণী:%s' 		else 			formatString = '%s' 		end 	end 	return function (category) 		local title = mw.title.new(category) 		local pageName, display 		if not title then 			-- category is not a valid title, usually because of invalid 			-- characters like < or [. Raise an error and suppress the stack 			-- level information so that we can catch it and format the error 			-- message as wikitext. 			error(string.format( 				"'%s' কোন বৈধ বিষয়শ্রেণীর নাম নয়", 				category 			), 0) 		elseif title.namespace == 14 then -- Category namespace 			pageName = title.text 			display = title.text 		else 			pageName = title.prefixedText 			display = category 		end 		-- We can get away with using two arguments even when 		-- options.showDisplay is false, as string.format ignores extra 		-- arguments as long as there is an argument for each flag in the 		-- format string. 		return formatString:format(pageName, display) 	end end  function p._main(args) 	local nLinks = getSequenceLength(args)  	if nLinks < 1 then 		return makeWikitextError('অন্তত একটি প্যারামিটার প্রয়োজন') 	end  	local makeCategoryLink = newCategoryLinker{ 		project = args.project, 		showPrefix = nLinks == 1, 	}  	local links = {} 	for i, cat in ipairs(args) do 		local success, categoryLink = pcall(makeCategoryLink, cat) 		if success then 			links[i] = categoryLink 		else 			-- If there was an error, then categoryLink is the error message. 			return makeWikitextError(categoryLink) 		end 	end  	local formatString 	if nLinks == 1 then 		formatString = '%s: %s।' 	else 		formatString = '%s: %s।' 	end  	-- Don't output a comma before the "and" if we have only two links. 	local conjunction 	if nLinks == 2 then 		conjunction = ' ও ' 	else 		conjunction = ' ও ' 	end  	local hatnoteText = formatString:format( 		args.LABEL or 'এছাড়াও দেখুন', 		mw.text.listToText(links, ', ', conjunction) 	) 	return mHatnote._hatnote(hatnoteText, {selfref = true}) end  function p.main(frame) 	local args = require('Module:Arguments').getArgs(frame, { 		wrappers = 'টেমপ্লেট:এছাড়াও দেখুন বিষয়শ্রেণী', 	}) 	return p._main(args) end  return p