มอดูล:ป้ายโครงการวิกิ/auxiliary

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
	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.maskstring.lower(b) or cfg.b_checklist.mask.default
			local image = 'File:' .. cfg.b_checklist.iconb .. '.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 = 
			end
			if (b=='u' or b=='i') and args.B_MAIN_CAT and not demo then -- unevaluated or invalid parameter
				category = category .. 
			end
			criteria:tag('li')
				:wikitext(image .. ' ' .. cfg.b_checklist.criteriai .. ': ')
				:tag('span')
					:css('font-style', 'italic')
					:wikitext(cfg.b_checklist.statusb)
					: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.criteriai .. string.rep(' ', cfg.b_checklist.syntax.max_width-#cfg.b_checklist.criteriai)
			))
			: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')
				: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('background', cfg.quality.colour.B):css('padding-bottom', '5px')
			: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'):wikitext(text):done()
					:tag('td'):css('min-width', '3em'):done() -- empty cell for show/hide toggle
				:done()
				:tag('tr')
					:tag('td'):css('font-size', '90%'):node(criteria):done()
					:tag('td'):css('font-size', '88%'):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_listaction .. )
	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')
		:tag('table'):addClass('mw-collapsible mw-collapsed'):css('background', 'transparent'):css('width', '100%')
			:tag('tr')
				:tag('th'):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'):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 
	suppress = true
end
if importance=='NA' and (yesno(argsprefix..'QII_SUPPRESS_NA') or yesno(argsprefix..'QII_SUPPRESS_NA_IMPORTANCE')) then
	suppress = true
end
if not class or not importance then
	suppress = true
end
local format = argsprefix..'QII_FORMAT':gsub('C', '_C_'):gsub('I', '_I_'):gsub('T', '_T_')
if format and not suppress then
	local new_class
		new_class = 'Unassessed' .. (argsprefix..'QII_UNASSESSED_APPENDIX' or )
	else
		new_class = class .. '-Class'
	end
	local assessment_cat = argsprefix..'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.vowelsstring.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 = category_exists(string.format(
		cfg.image_needed.location,
		args'image-type' or 'photograph',
		args'image-location' or 
	)) or args.IM_LOCATION_CATEGORY,
	category2 = category_exists(string.format(
		cfg.image_needed.topic,
		args'image-type' or 'photograph',
		args'image-topic' or 
	)) 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_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 = lang:lc(args'a class')
if status~='pass' and status~='fail' and status~='current' 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.statusstatus,
		args.ACR_REVIEW_LINK or 
	),
	image_name = args.ACR_IMAGE or cfg.a_class.iconstatus,
	size = args.ACR_SIZE or '18x18px',
	background = cfg.a_class.background,
	category = argscategorystatus,
	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