Permanently protected module
From Wikipedia, the free encyclopedia


require('strict')

local p = {}

local sandbox-- = '/sandbox'

local cfg = mw.loadData('Module:WikiProject banner/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.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 = '[[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.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('color', 'inherit'):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('color', 'var( --color-base )'):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('color', 'black')

					: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(argsprefix..'QII_SUPPRESS_NA']) or yesno(argsprefix..'QII_SUPPRESS_NA_CLASS'])) then

	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

	if class=='' then

		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 .. ' <b>' .. word .. '</b>'

	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.fullText .. '|' .. 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.masklang: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.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