require('strict') local p = {} local sandbox-- = '/sandbox' local cfg = mw.loadData('মডিউল:উইকিপ্রকল্প ব্যানার/config' .. (sandbox or )) local yesno = require('Module:Yesno') local lang = mw.getLanguage(cfg.language)  p.b_checklist = function(args, raw_args, class, demo, assessment_link)  -- B-class checklist ------  local show_checklist = false local parameters_used = args.b1 or args.b2 or args.b3 or args.b4 or args.b5 or args.b6 if (class=='B' or class=='C' or class=='BL' or class=='CL')-- always displayed on C or B 	or ((class=='Start' or class=='List') and yesno(args.B_DISPLAY_ON_START))-- show on Start/List if option selected 	or ((class=='Start' or class=='Stub') and parameters_used) then-- show on Start or Stub if any parameters used 	show_checklist = true end if show_checklist then 	local scale = args.QUALITY_CRITERIA=='custom' and assessment_link and assessment_link..'#'..lang:ucfirst(cfg.quality.name) 		or cfg.b_checklist.default_scale 	local text = string.format( 		cfg.b_checklist.text, 		parameters_used and cfg.b_checklist.checked or cfg.b_checklist.not_checked, 		scale 	) 	local syntax = {} 	local criteria = mw.html.create('ol') 	for i = 1, 6 do 		local b = raw_args['b'..i] 		if b and b~='unused' then -- crtierion in use 			b = cfg.b_checklist.mask[string.lower(b)] or cfg.b_checklist.mask.default 			local image = '[[File:' .. cfg.b_checklist.icon[b] .. '.svg|16x16px|link=|alt=]]' 			local failed_cat = args['B'..i..'_CAT'] 			local category =  			if b~='y' and b~='x' and failed_cat and not demo then -- criterion failed 				category = 'Category:' .. failed_cat .. '' 			end 			if (b=='u' or b=='i') and args.B_MAIN_CAT and not demo then -- unevaluated or invalid parameter 				category = category .. 'Category:' .. args.B_MAIN_CAT .. '' 			end 			criteria:tag('li') 				:wikitext(image .. ' ' .. cfg.b_checklist.criteria[i] .. ': ') 				:tag('span') 					:css('font-style', 'italic') --TODO add to styles.css 					:wikitext(cfg.b_checklist.status[b]) 					:wikitext(category) 			:allDone() 			local new_syntax = mw.html.create('li') 				:addClass('nowrap') 				:wikitext(string.format( 					cfg.b_checklist.syntax.prompt, 					tostring(i), 					cfg.b_checklist.criteria[i] .. string.rep(' ', cfg.b_checklist.syntax.max_width-#cfg.b_checklist.criteria[i]) 			)) 			:done() 			table.insert(syntax, tostring(new_syntax)) 		end 	end 	local prompt 	if not parameters_used then 		prompt = mw.html.create('span') 			:wikitext(string.format( 				cfg.b_checklist.syntax.text, 				tostring(mw.title.getCurrentTitle():fullUrl({action = 'edit'})) 			)) 			:tag('ul') --TODO add to styles.css 				:css('font-size', '88%') 				:css('margin', '0px') 				:css('font-family', 'monospace, sans-serif') 				:css('padding', '1em') 				:css('border', '1px dashed #2f6fab') 				:css('background-color', '#f9f9f9') 				:css('line-height', '1.1em') 				:css('list-style', 'none') 				:node(table.concat(syntax)) 			:done() 			:wikitext(cfg.b_checklist.syntax.assess) 		:done() 	end 	local checklist = mw.html.create('tr') 		:tag('td') 			:addClass('assess-b') 			:css('padding-bottom', '5px') --TODO add to styles.css 			:wikitext(cfg.b_checklist.image) 		:done() 		:tag('td') 			:addClass('wpb-collapsed-notes') 			:tag('table') 				:addClass('plainlinks mw-collapsible mw-collapsed') 				:tag('tr') 					:tag('th') 						:addClass('wpb-collapsed-head mbox-text') 						:attr('colspan', '3') 						:css('font-weight', 'normal') --TODO add to styles.css 						:wikitext(text):done() 					:tag('td') 						:css('min-width', '3em') --TODO add to styles.css 						:done() -- empty cell for show/hide toggle 				:done() 				:tag('tr') 					:tag('td') 						:css('font-size', '90%') --TODO add to styles.css 						:node(criteria):done() 					:tag('td') 						:css('font-size', '88%') --TODO add to styles.css 						:node(prompt):done() 					:tag('td') 						:addClass('empty-cell') 						:done() 				:done() 			:done() 		:done() 	:done() 	return checklist end end  p.todo_list = function(args, frame)  -- To-do list -------------  local list if args.TODO_LINK then 	local link = function(action) 		local url = mw.uri.fullUrl(args.TODO_LINK, {action = action}) 		return mw.html.create('li'):wikitext('[' .. tostring(url) .. ' ' .. cfg.todo_list[action] .. ']') 	end 	local links = yesno(args.TODO_EDITLINKS or true, 'true') and frame:expandTemplate{title = 'Flatlist', args = { 		class = 'plainlinks', 		style = 'text-align:center;font-size:90%;', 		[1] = tostring(mw.html.create('ul') 			:node(link('edit')) 			:node(link('history')) 			:node(link('watch')) 			:node(link('purge')) 		) 	}} or 	list = links .. '\n' .. frame:expandTemplate{title = args.TODO_LINK} else 	list = ('\n' .. args.TODO_TEXT) or  end local todo_list = mw.html.create('tr') 	:tag('td') 		:attr('colspan', '3') 		:css('padding', '0') --TODO add to styles.css 		:tag('table') 			:addClass('mw-collapsible mw-collapsed') 			:css('background', 'transparent') --TODO add to styles.css 			:css('width', '100%') 			:tag('tr') 				:tag('th') --TODO add to styles.css 					:css('text-align', 'left') 					:css('padding', '0.2em 2px 0.2em 0') 					:cssText(args.TODO_TITLE_STYLE) 					:wikitext((args.TODO_TITLE or cfg.todo_list.default_title) .. ':') 				:done() 			:done() 			:tag('tr') 				:tag('td') --TODO add to styles.css 					:css('text-align', 'left') 					:css('padding', '5px') 					:css('background-color', 'white') 					:css('border', '1px solid #c0c090') 					:css('margin-top', '5px') 					:cssText(args.TODO_STYLE) 					:wikitext(list) allDone() return todo_list end p.todo_list_ = function(frame) 	return p.todo_list(frame.args, frame) end  p.quality_importance_insection = function(args, class, importance, importance_name, tf_prefix)  -- Category intersection --  local suppress = false local prefix = tf_prefix or if class=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_CLASS'])) then 	suppress = true end if importance=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_IMPORTANCE'])) then 	suppress = true end if not class or not importance then 	suppress = true end local format = args[prefix..'QII_FORMAT']:gsub('C', '_C_'):gsub('I', '_I_'):gsub('T', '_T_') if format and not suppress then 	local new_class 	if class== then 		new_class = 'Unassessed' .. (args[prefix..'QII_UNASSESSED_APPENDIX'] or ) 	else 		new_class = class .. '-Class' 	end 	local assessment_cat = args[prefix..'ASSESSMENT_CAT'] or args.PROJECT..' articles' 	local cat_name = format:gsub('_C_', new_class):gsub('_I_', importance .. '-' .. importance_name):gsub('_T_', assessment_cat) 	local cat = mw.title.new('Category:' .. cat_name) 	return cat.exists and #cat:getContent()>0 and cat_name end end  p.image_needed = function(args, pagetype)  -- Image needed -----------  local type = cfg.image_needed.default_type if args['image-type'] then 	local add_article = function(word) 		local article = cfg.image_needed.article.consonant 		if cfg.image_needed.vowels[string.sub(word, 1, 1)] then 			article = cfg.image_needed.article.vowel 		end 		return article .. ' ' .. word .. '' 	end 	type = add_article(args['image-type']) end local details =  if args['image-details'] then 	details = ' ' .. string.format(cfg.image_needed.details, args['image-details']) end local location = if args['image-location'] then 	local location_cat = mw.title.new('Category:Wikipedians in ' .. args['image-location']) 	if location_cat.exists then 		location = ' ' .. string.format( 			cfg.image_needed.help, 			'' .. location_cat.text .. '' 		) 	end end local category_exists = function(category) 	local title = mw.title.new('Category:' .. category) 	if title.exists then 		return category 	end end return { 	text = string.format(cfg.image_needed.text, type, details, pagetype, location), 	image_name = args.IM_IMAGE or cfg.image_needed.default_image, 	category = args['image-location'] and category_exists(string.format( 		cfg.image_needed.location, 		args['image-type'] or 'photograph', 		args['image-location'] 	)) or args.IM_LOCATION_CATEGORY, 	category2 = args['image-topic'] and category_exists(string.format( 		cfg.image_needed.topic, 		args['image-type'] or 'photograph', 		args['image-topic'] 	)) or args.IM_TOPIC_CATEGORY } end  p.collaboration = function(args, pagetype, title)  -- Collaboration ----------  local image = args.COLL_IMAGE or cfg.collaboration.default_image local link = '[[' .. (args.COLL_LINK or ) .. '|' .. (args.COLL_TEXT or cfg.collaboration.default_text) .. ']]' local note_args = {candidate = {}, current = {}, past = {}} if yesno(args['collaboration-candidate'], true) then 	local subpage_link = (args.COLL_LINK or ) .. '#' .. title.subjectPageTitle.text 	note_args.candidate = { 		text = string.format(cfg.collaboration.candidate, pagetype, subpage_link, link), 		image_name = image, 		size = cfg.collaboration.size, 		category = args.COLL_CANDIDATE_CAT 	} end if yesno(args['collaboration-current'], true) then 	note_args.current = { 		text = string.format(cfg.collaboration.current, pagetype, link), 		image_name = image, 		size = cfg.collaboration.size, 		category = args.COLL_CURRENT_CAT 	} end if yesno(args['collaboration-past'], true) then 	note_args.past = { 		text = string.format(cfg.collaboration.past, pagetype, link), 		image_name = image, 		size = cfg.collaboration.size, 		category = args.COLL_PAST_CAT 	} end return note_args end  p.a_class = function(args, lang)  -- A-class review ---------  local status = cfg.a_class.mask[lang:lc(args['a class'])] if status==nil then 	return {} end local subpage = args.ACR_SUBPAGE_LINK or  local link_exists = args.ACR_SUBPAGE_LINK and mw.title.new(subpage).exists or false local category = { 	pass = 'ACR_PASS_CAT', 	fail = 'ACR_FAIL_CAT', 	current = 'ACR_CURRENT_CAT' } return { 	text = string.format( 		cfg.a_class.text, 		subpage, 		cfg.a_class.status[status], 		args.ACR_REVIEW_LINK or 	), 	image_name = args.ACR_IMAGE or cfg.a_class.icon[status], 	size = args.ACR_SIZE or '18x18px', 	background = cfg.a_class.background, 	category = args[category[status]], 	category2 = not link_exists and args.ACR_INVALID_CAT } end  p.peer_review = function(args, title)  -- Peer review ------------  local image = args.PR_IMAGE or cfg.peer_review.default_image local size = args.PR_SIZE or cfg.peer_review.size local link = args.PR_LINK or  local pr_title = args['peer review title'] and mw.title.new(args['peer review title']) or title local subpage_link = link .. '/' .. pr_title.subjectPageTitle.text local invalid_cat = not mw.title.new(subpage_link).exists and args.PR_INVALID_CAT local note_args = {current = {}, past = {}} if yesno(args['peer review'], true) then 	note_args.current = { 		text = string.format(cfg.peer_review.current, subpage_link, link), 		image_name = image, 		size = size, 		category = args.PR_CAT, 		category2 = invalid_cat 	} end if yesno(args['old peer review'], true) then 	note_args.past = { 		text = string.format(cfg.peer_review.past, link, subpage_link), 		image_name = image, 		size = size, 		category = args.PR_OLD_CAT, 		category2 = invalid_cat 	} end return note_args  end return p