require('strict') local p = {} local sandbox = '/খেলাঘর' -- BE SURE TO COMMENT OUT this definition when deploying to live local yesno = require('মডিউল:Yesno')  local shell = function(frame, header, content, collapsed, class) 	local styles = frame:extensionTag('templatestyles', , {src = 'মডিউল:বার্তার বাক্স/আলোচনা-বাক্স.css'}) 		.. frame:extensionTag('templatestyles', , {src = 'মডিউল:ব্যানারের খোলস' .. (sandbox or ) .. '/শৈলী.css'}) local content_row 	if content then 		content_row = mw.html.create('tr') 			:tag('td') 			:attr('colspan', '2') 			:addClass('banner-shell-inner') 			:addClass('outercollapse') 			:wikitext(content) 			:done() 	end 	local holder = mw.html.create('table') 		:attr('role', 'presentation') 		:addClass('tmbox') 		:addClass('tmbox-notice') 		:addClass('banner-shell') 		:addClass(class) -- allow additional class to be specified 		:addClass(content and 'mw-collapsible' or nil) 		:addClass(collapsed and 'mw-collapsed' or nil) 		:node(header) 		:node(content_row) 	return styles .. tostring(holder) end  p.banner_holder = function(frame) 	local args = require('মডিউল:Arguments').getArgs(frame, {wrappers = {'টেমপ্লেট:ব্যানার ধারক'}}) 	local image = '[[File:' .. (args.image or 'NewFavicon icon.svg') 		.. '|' .. (args.size or '24') .. 'px' 		.. '|link=' .. (args.image_link or ) 		.. '|alt=' .. (args.alt or ) .. ']]' 	local image_cell = mw.html.create('td') 		:addClass('mbox-image') 		:wikitext(image) 	local text_cell = mw.html.create('td') 		:addClass('mbox-text') 		:addClass('banner-shell-header') 		:tag('span') 		:addClass('nowrap') 		:css('float', 'left') 		:wikitext(string.rep(' ', 10)) 		:done() 		:wikitext(args.text or 'Other talk page banners') 	local header = mw.html.create('tr') 		:node(image_cell) 		:node(text_cell) 	return shell(frame, header, args[1], yesno(args.collapsed)) end  local DuplicateBanners = function(text) 	local capture = '([^<>]*)' 	local banners = {} 	for project in text:gmatch(capture) do 		if banners[project] == true then 			return project 		end 		banners[project] = true 	end end  p.banner_shell = function(frame) 	local cfg = mw.loadData('মডিউল:ব্যানারের খোলস/কনফিগ' .. (sandbox or )) 	local args = require('মডিউল:Arguments').getArgs(frame, {wrappers = {cfg.template}}) 	local title = args.demo_page and mw.title.new(args.demo_page) or mw.title.getCurrentTitle() 	local pagetype = require('মডিউল:পাতার ধরন')._main{ 		page = title.prefixedText, 		dab = cfg.page_types.dab, 		sia = 'set index article', 		soft_redirect = cfg.page_types.soft_redirect, 		nonexistent = cfg.page_types.nonexistent, 		timedtext = cfg.page_types.timedtext, 		defaultns = 'extended' 	} 	local lang = mw.language.getContentLanguage() 	local classmask = require('মডিউল:উইকিপ্রকল্প ব্যানার' .. (sandbox or )).class_mask 	local class = args['শ্রেনী'] or args.class or args['শ্রেণী'] or args['শ্রেণি'] 	if class then 		class = cfg.class[string.upper(class)] 	else class =  	end     class = classmask(class , title.talkPageTitle, false, pagetype) 	local demo = not yesno(args.category or true, true) or args.demo_page 	local out = {} 	local addCategory = function(category, sort_key) 		if not demo and title.isTalkPage then 			local category_title = mw.title.new('বিষয়শ্রেণী:' .. category) 			table.insert(out, '[[' .. category_title.prefixedText .. (sort_key and ('|' .. sort_key) or ) .. ']]') 		end 	end 	if demo and not args.demo_page then 		pagetype = 'article' 	end 	local blp = args.blp and args.blp:lower() 	if yesno(blp) or blp=='activepol' or yesno(args.living) then 		table.insert(out, frame:expandTemplate{ 			title = cfg.blp_template.blp, 			args = {activepol = blp=='activepol' and 'yes'} 		}) 	elseif blp=='other' then 		table.insert(out, frame:expandTemplate{ 			title = cfg.blp_template.blpo} 		) 	end 	local vital 	if yesno(args.vital) then 		local page = mw.ustring.upper(mw.ustring.sub(title.subjectPageTitle.text, 1, 1)) -- get first letter of article name 		local codepoint = mw.ustring.codepoint(page, 1, 1) 		if codepoint<65 or codepoint>90 then --first letter is not between A-Z 			page = 'others' 		end 		local data_page = mw.title.new('Wikipedia:Vital articles/data/' .. page .. '.json') 		if data_page.exists then 			local index = title.subjectPageTitle.text 			index = tostring(tonumber(index))==index and tonumber(index) or index --convert to number if page is numerical, otherwise loadJsonData does not work 			local data = mw.loadJsonData(data_page.fullText)[index] 			if data then 				local level = data.level and tostring(data.level) 				if level and data.topic then 					local link = 'Wikipedia:Vital articles/Level/' .. level 					if (level=='4' or level=='5') then 						link = link .. '/' .. data.topic 					end 					if data.sublist then 						link = link .. '/' .. data.sublist 					end 					if data.section then 						link = link .. '#' .. data.section 					end 					if not mw.title.new(link).exists then -- add tracking category if link does not exist 						addCategory(cfg.vital.attention, 'L') 					end 					vital = cfg.vital.with_level:format(link, level) 				else 					vital = cfg.vital.without_level 				end 				for _, cat in ipairs(cfg.vital.categories) do 					if cat:find('_CLASS') and (class=='অ-নিবন্ধ' or class==) then 						addCategory(cfg.vital.attention, class=='অ-নিবন্ধ' and 'N' or 'U') 					elseif level==nil then 						addCategory(cfg.vital.attention, 'V') 					elseif data.topic==nil then 						addCategory(cfg.vital.attention, 'T') 					else 						local category = cat 							:gsub('_CLASS', class .. '-শ্রেনীর') 							:gsub('_LEVEL', level) 							:gsub('_TOPIC', data.topic) 						addCategory(category) 					end 				end 				addCategory(cfg.vital.all) 			else 				addCategory(cfg.vital.not_listed) 			end 		end 	end 	local text, icon_image, icon_str 	if class=='অ-নিবন্ধ' then 		icon_image = cfg.icons.type[pagetype] or cfg.icons.default 		icon_str = pagetype=='page' and 'Non-article page' or lang:ucfirst(pagetype) 		text = {cfg.rating.not_required:format(vital or pagetype)} 		if args.class then 			addCategory(cfg.tracking.redundant_class) 		end 	elseif class== then 		icon_image = cfg.icons.unassessed 		icon_str =  'অমূল্যায়িত নিবন্ধ' 		text = {cfg.rating.not_yet:format(vital or pagetype)} 		addCategory('সকল অমূল্যায়িত নিবন্ধ') 	else 		icon_image = cfg.icons.quality[class] or cfg.icons.unassessed 		icon_str =  class .. '-শ্রেনীর ' .. pagetype 		text = {cfg.rating.rated:format(vital or pagetype, class)} 	end 	local icon = string.format('%s|35px|class=noviewer|alt=', icon_image, icon_str)      table.insert(text, 1, cfg.rating.scale) 	if args[1] then 		table.insert(text, '' .. cfg.project.interest .. ' ') 		table.insert(text, yesno(args.collapsed) and cfg.project.collapsed or cfg.project.uncollapsed) 		local duplicate_cat = DuplicateBanners(args[1]) 		if duplicate_cat and title.isTalkPage then 			addCategory(cfg.tracking.duplicate, duplicate_cat) 		end 	elseif not yesno(args.vital) and class~= then -- if no projects and not vital and assessed then add class super category 		addCategory(class .. '-শ্রেনীর নিবন্ধ') 	end 	local header = mw.html.create('tr') 		:tag('td') 			:addClass('assess') 			:wikitext(icon) 			:done() 		:tag('td') 			:addClass('banner-shell-header') 			:css('text-align', 'left') 			:css('font-weight', 'normal') 			:wikitext(table.concat(text)) 			:done() 	table.insert( 		out, 		shell(frame, header, args[1], yesno(args.collapsed), 'wpbs') 	) 	if args.listas then 		table.insert(out, frame:preprocess('')) 	end 	if not demo then 		local tracking = require('মডিউল:Check for unknown parameters')._check({ 			unknown = cfg.tracking.unknown, 			preview = cfg.tracking.preview, 			'1', 'blp', 'category', 'class', 'collapsed', 'demo_page', 'listas', 'vital', 'শ্রেনী','শ্রেণী' 		}, frame:getParent().args) 		table.insert(out, tracking) 		if args.category and yesno(args.category)~=false then -- category should not be "yes" 			addCategory(cfg.tracking.invalid, 'category') 		end 		if args.collapsed and yesno(args.collapsed)~=true then -- collapsed should not be "no" 			addCategory(cfg.tracking.invalid, 'collapsed') 		end 		if yesno(blp)==nil and blp~=nil and blp~='other' and blp~='activepol' then 			addCategory(cfg.tracking.invalid, 'blp') 		end 		if pagetype=='নিবন্ধ' and args.class and class=='' then -- find pages with invalid class parameter 			addCategory(cfg.tracking.invalid, 'Zclass') 		end 	end 	return table.concat(out) end  return p