<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://capipedia.cap.gov/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProject_banner</id>
	<title>Module:WikiProject banner - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://capipedia.cap.gov/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProject_banner"/>
	<link rel="alternate" type="text/html" href="https://capipedia.cap.gov/index.php?title=Module:WikiProject_banner&amp;action=history"/>
	<updated>2026-05-06T04:30:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://capipedia.cap.gov/index.php?title=Module:WikiProject_banner&amp;diff=1645&amp;oldid=prev</id>
		<title>NMcLarty27: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://capipedia.cap.gov/index.php?title=Module:WikiProject_banner&amp;diff=1645&amp;oldid=prev"/>
		<updated>2024-01-12T15:41:30Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 11:41, 12 January 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>NMcLarty27</name></author>
	</entry>
	<entry>
		<id>https://capipedia.cap.gov/index.php?title=Module:WikiProject_banner&amp;diff=1644&amp;oldid=prev</id>
		<title>en&gt;Gonnym: Restore checking for unknown parameters for templates that don&#039;t have a specific category; include in tracking category unknown empty parameters so the bots can clear these as well</title>
		<link rel="alternate" type="text/html" href="https://capipedia.cap.gov/index.php?title=Module:WikiProject_banner&amp;diff=1644&amp;oldid=prev"/>
		<updated>2024-01-11T15:27:45Z</updated>

		<summary type="html">&lt;p&gt;Restore checking for unknown parameters for templates that don&amp;#039;t have a specific category; include in tracking category unknown empty parameters so the bots can clear these as well&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local sandbox-- = &amp;#039;/sandbox&amp;#039;&lt;br /&gt;
local cfg = mw.loadData(&amp;#039;Module:WikiProject banner/config&amp;#039; .. (sandbox or &amp;#039;&amp;#039;))&lt;br /&gt;
local args_module = require(&amp;#039;Module:Arguments&amp;#039;)&lt;br /&gt;
local mbox = require(&amp;#039;Module:Message box&amp;#039;).main&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local frame = mw.getCurrentFrame()&lt;br /&gt;
local lang = mw.getLanguage(cfg.language)&lt;br /&gt;
local current_title = mw.title.getCurrentTitle()&lt;br /&gt;
local parameter_format = function(parameter, value)&lt;br /&gt;
	return frame:expandTemplate{title=&amp;#039;para&amp;#039;, args={parameter, value or &amp;#039;&amp;#039;}}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local wikilink = function(link, display)&lt;br /&gt;
	if link then&lt;br /&gt;
		return display and &amp;#039;[[&amp;#039;..link..&amp;#039;|&amp;#039;..display..&amp;#039;]]&amp;#039; or &amp;#039;[[&amp;#039;..link..&amp;#039;]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return display or &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local image = function(image_name, size, alt, position)&lt;br /&gt;
	return image_name and &amp;#039;[[File:&amp;#039;&lt;br /&gt;
		.. image_name&lt;br /&gt;
		.. (size and &amp;#039;|&amp;#039; .. size or &amp;#039;&amp;#039;)&lt;br /&gt;
		.. (position and &amp;#039;|&amp;#039; .. position or &amp;#039;&amp;#039;)&lt;br /&gt;
		.. (alt and &amp;#039;|alt=&amp;#039; .. alt or &amp;#039;&amp;#039;)&lt;br /&gt;
		.. &amp;#039;]]&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local if_exists = function(target, fallback) -- function to add wikilink if target exists&lt;br /&gt;
	local title = mw.title.new(target)&lt;br /&gt;
	if title and title.exists then&lt;br /&gt;
		return wikilink(target)&lt;br /&gt;
	else&lt;br /&gt;
		return fallback or target&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local isarticle = function(class)&lt;br /&gt;
	local article = true&lt;br /&gt;
	for _,v in ipairs(cfg.quality.non_article_classes) do&lt;br /&gt;
		if class==v then -- class matches one of the non-article classes&lt;br /&gt;
			article = false&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return article&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.readarticleclass = function(options, page) -- used by _main and also Module:Banner shell&lt;br /&gt;
	page = page or current_title.prefixedText&lt;br /&gt;
	local get_parameter_value = require(&amp;#039;Module:Template parameter value&amp;#039;).getValue&lt;br /&gt;
	local success, result = get_parameter_value(page, cfg.WPBS_redirects, &amp;#039;class&amp;#039;, options)&lt;br /&gt;
	return success and result&lt;br /&gt;
	-- returns FALSE if banner shell template does not exist on page&lt;br /&gt;
	-- returns BLANK if class parameter is not defined or is defined blank&lt;br /&gt;
	-- otherwise returns class parameter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local importance_mask = function(raw_importance, class, scale, banner_name)&lt;br /&gt;
	local importance&lt;br /&gt;
	if scale==&amp;#039;inline&amp;#039; then -- pass importance without change&lt;br /&gt;
		importance = raw_importance&lt;br /&gt;
	elseif scale==&amp;#039;subpage&amp;#039; then&lt;br /&gt;
		local custom_mask = banner_name:subPageTitle(&amp;#039;importance&amp;#039;)&lt;br /&gt;
		if custom_mask.exists and #custom_mask:getContent()&amp;gt;1 then -- pass to custom importance mask&lt;br /&gt;
			importance = mw.text.trim(frame:expandTemplate{&lt;br /&gt;
				title = custom_mask.prefixedText,&lt;br /&gt;
				args = {importance=raw_importance or &amp;#039;¬&amp;#039;, class=class}&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		importance = frame:expandTemplate{&lt;br /&gt;
			title = &amp;#039;Template:Importance mask&amp;#039;,&lt;br /&gt;
			args = {raw_importance or &amp;#039;¬&amp;#039;, class=class}}&lt;br /&gt;
	end&lt;br /&gt;
	if importance==&amp;#039;¬&amp;#039; then&lt;br /&gt;
		importance = nil&lt;br /&gt;
	end&lt;br /&gt;
	return importance&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local page_assessment = function(project, class, importance) -- add PageAssessments parser function&lt;br /&gt;
	local assessment = table.concat({project, class or &amp;#039;&amp;#039;, importance or &amp;#039;&amp;#039;},&amp;#039;|&amp;#039;)&lt;br /&gt;
	frame:preprocess(&amp;#039;{{#assessment:&amp;#039; .. assessment .. &amp;#039;}}&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local bubble = function(text, colour, conflict)&lt;br /&gt;
	local out = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wpb-header-bubbles&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;background&amp;#039;, colour)&lt;br /&gt;
		:css(&amp;#039;border&amp;#039;, conflict and cfg.quality.conflict.border or (cfg.quality.border..&amp;#039; &amp;#039;..colour))&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
	return tostring(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._main = function(args, raw_args, demo, banner_name)&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Initialise parameters --&lt;br /&gt;
---------------------------&lt;br /&gt;
local project = args.PROJECT or &amp;#039;PROJECT&amp;#039;&lt;br /&gt;
local project_name = args.PROJECT_NAME or &amp;#039;WikiProject &amp;#039; .. project&lt;br /&gt;
local project_link = mw.title.new(args.PROJECT_LINK or &amp;#039;Wikipedia:&amp;#039; .. project_name)&lt;br /&gt;
local pagetype = demo and not args.demo_page and &amp;#039;article&amp;#039; or require(&amp;#039;Module:Pagetype&amp;#039;)._main({&lt;br /&gt;
	page = args.demo_page&lt;br /&gt;
})&lt;br /&gt;
local rows, nested_ratings, task_forces, notes, categories, taskforce_categories = {}, {}, {}, {}, {}, {}&lt;br /&gt;
local add_category = function(category, key)&lt;br /&gt;
	if category and category~=&amp;#039;none&amp;#039; then&lt;br /&gt;
		table.insert(categories, {category = category, key = key})&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local parse_text = function(text)&lt;br /&gt;
	return text and text:gsub(&amp;#039;_PAGETYPE_&amp;#039;, pagetype)&lt;br /&gt;
end&lt;br /&gt;
for arg_name, arg_value in pairs(args) do&lt;br /&gt;
	local tf_match = mw.ustring.match(arg_name,&amp;#039;^tf (%d+)$&amp;#039;)&lt;br /&gt;
	local note_match = mw.ustring.match(arg_name,&amp;#039;^note (%d+)$&amp;#039;)&lt;br /&gt;
	if tf_match and yesno(arg_value, true) then&lt;br /&gt;
		table.insert(task_forces, tf_match)&lt;br /&gt;
	elseif note_match and yesno(arg_value, true) then&lt;br /&gt;
		table.insert(notes, note_match)&lt;br /&gt;
	else&lt;br /&gt;
		local tf, cat = mw.ustring.match(arg_name,&amp;#039;^tf (%d+) cat (%d+)$&amp;#039;)&lt;br /&gt;
		if tf and yesno(arg_value, true) then&lt;br /&gt;
			if not taskforce_categories[tf] then -- initialise table&lt;br /&gt;
				taskforce_categories[tf] = {}&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(taskforce_categories[tf], cat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
table.sort(task_forces, function (x, y) return tonumber(x) &amp;lt; tonumber(y) end)&lt;br /&gt;
table.sort(notes, function (x, y) return tonumber(x) &amp;lt; tonumber(y) end)&lt;br /&gt;
local warning = &amp;#039;&amp;#039;&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Location warning -------&lt;br /&gt;
---------------------------&lt;br /&gt;
local show_namespace_warning = not (current_title.isTalkPage or demo)&lt;br /&gt;
if show_namespace_warning then&lt;br /&gt;
	local text = cfg.namespace_warning.text:format(&lt;br /&gt;
		pagetype,&lt;br /&gt;
		current_title.talkPageTitle.fullText,&lt;br /&gt;
		parameter_format(&amp;#039;category&amp;#039;, &amp;#039;no&amp;#039;)&lt;br /&gt;
	)&lt;br /&gt;
	local sortkey = current_title.namespace==10 and cfg.namespace_warning.sortkey_on_template_page or cfg.namespace_warning.sortkey&lt;br /&gt;
	if current_title.namespace==10 then -- on the Template namespace&lt;br /&gt;
		text = text .. &amp;#039;  &amp;#039; .. cfg.namespace_warning.on_template_page:format(&lt;br /&gt;
			parameter_format(&amp;#039;BANNER_NAME&amp;#039;),&lt;br /&gt;
			current_title.prefixedText&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	warning = mbox(&amp;#039;ombox&amp;#039;, {&lt;br /&gt;
		image = &amp;#039;[[File:&amp;#039; .. cfg.namespace_warning.image .. &amp;#039;|40px]]&amp;#039;,&lt;br /&gt;
		type = cfg.namespace_warning.type_,&lt;br /&gt;
		text = text&lt;br /&gt;
	})&lt;br /&gt;
	if not current_title.subjectPageTitle:inNamespace(2) then&lt;br /&gt;
		add_category(cfg.namespace_warning.categories, sortkey)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Substitution warning ---&lt;br /&gt;
---------------------------&lt;br /&gt;
if args.substcheck==&amp;#039;SUBST&amp;#039; then&lt;br /&gt;
	local text = cfg.subst_warning.text:format(&lt;br /&gt;
		project_name,&lt;br /&gt;
		&amp;#039;&amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;&amp;#039;..banner_name.prefixedText..&amp;#039;&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
	warning = warning .. mbox(&amp;#039;ombox&amp;#039;, {&lt;br /&gt;
		image = &amp;#039;[[File:&amp;#039; .. cfg.subst_warning.image .. &amp;#039;|40px]]&amp;#039;,&lt;br /&gt;
		type = cfg.subst_warning.type_,&lt;br /&gt;
		text = text,&lt;br /&gt;
	}) .. cfg.subst_warning.categories&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Primary image/text -----&lt;br /&gt;
---------------------------&lt;br /&gt;
local assessment_cat = args.ASSESSMENT_CAT or project .. &amp;#039; articles&amp;#039;&lt;br /&gt;
local primary_image = function(image_name, size)&lt;br /&gt;
	local cell = mw.html.create(&amp;#039;td&amp;#039;)&lt;br /&gt;
	if image_name and image_name~=&amp;#039;&amp;#039; then&lt;br /&gt;
		cell:addClass(&amp;#039;mbox-image wpb-image&amp;#039;)&lt;br /&gt;
		:wikitext(image(image_name, size, cfg.image.alt))&lt;br /&gt;
	else&lt;br /&gt;
		cell:addClass(&amp;#039;mbox-empty-cell&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	cell:done()&lt;br /&gt;
	return cell&lt;br /&gt;
end&lt;br /&gt;
local portal = args.PORTAL&lt;br /&gt;
local portal_box = portal and frame:expandTemplate{title=&amp;#039;Portal&amp;#039;, args={portal}} or &amp;#039;&amp;#039;&lt;br /&gt;
local main_text = portal_box .. (parse_text(args.MAIN_TEXT) or cfg.main_text:format(&lt;br /&gt;
	pagetype,&lt;br /&gt;
	project_link.prefixedText,&lt;br /&gt;
	project_name,&lt;br /&gt;
	args.MAIN_ARTICLE and if_exists(args.MAIN_ARTICLE) or if_exists(project, project .. &amp;#039; articles&amp;#039;),&lt;br /&gt;
	project_link.talkPageTitle.prefixedText&lt;br /&gt;
))&lt;br /&gt;
local image_left_size = args.IMAGE_LEFT_SIZE or cfg.image.default_size&lt;br /&gt;
local primary_row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	:node(primary_image(args.IMAGE_LEFT, image_left_size))&lt;br /&gt;
	:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
		:wikitext(main_text)&lt;br /&gt;
		:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;metadata wpb-metadata&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;wpb-project&amp;#039;):wikitext(project):done()&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;wpb-project_link&amp;#039;):wikitext(project_link.prefixedText):done()&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;wpb-banner_name&amp;#039;):wikitext(banner_name.prefixedText):done()&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;wpb-assessment_cat&amp;#039;):wikitext(assessment_cat):done()&lt;br /&gt;
		:done()&lt;br /&gt;
	:done()	&lt;br /&gt;
	:node(primary_image(args.IMAGE_RIGHT, args.IMAGE_RIGHT_SIZE or cfg.image.default_size))&lt;br /&gt;
:done()&lt;br /&gt;
table.insert(rows, primary_row)&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Quality assessment -----&lt;br /&gt;
---------------------------&lt;br /&gt;
local assessment_link = args.ASSESSMENT_LINK&lt;br /&gt;
if not assessment_link then&lt;br /&gt;
	local fallback = mw.title.new(project_link.prefixedText .. &amp;#039;/Assessment&amp;#039;)&lt;br /&gt;
	assessment_link = fallback.exists and fallback.prefixedText&lt;br /&gt;
elseif assessment_link==&amp;#039;no&amp;#039; then&lt;br /&gt;
	assessment_link = nil&lt;br /&gt;
end&lt;br /&gt;
local class_mask = require(&amp;#039;Module:Class mask&amp;#039; .. (sandbox or &amp;#039;&amp;#039;))._main&lt;br /&gt;
local check_exists = function(class, assessment_cat) -- check if category exists and is not blank&lt;br /&gt;
	if not isarticle(class) then&lt;br /&gt;
		local cat =  mw.title.new(&amp;#039;Category:&amp;#039; .. class .. &amp;#039;-Class&amp;#039; .. &amp;#039; &amp;#039; .. assessment_cat)&lt;br /&gt;
		return (cat.exists and #cat:getContent()&amp;gt;0) and class or &amp;#039;NA&amp;#039; -- automatically use NA for non-article pages if category does not exist&lt;br /&gt;
	else&lt;br /&gt;
		return class&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local class = raw_args.class&lt;br /&gt;
if class then -- banner gives quality ratings&lt;br /&gt;
	local title = args.demo_page and mw.title.new(args.demo_page) or current_title&lt;br /&gt;
	local article_class = p.readarticleclass({ignore_subtemplates=true}, title.prefixedText)&lt;br /&gt;
	article_class = article_class and class_mask({article_class}, title)&lt;br /&gt;
	local show_quality, conflict = true, false&lt;br /&gt;
	if args.QUALITY_CRITERIA==&amp;#039;custom&amp;#039; then -- project has opted out of standard assessment scale and uses a custom mask&lt;br /&gt;
		local custom_mask = banner_name:subPageTitle(&amp;#039;class&amp;#039;)&lt;br /&gt;
		if custom_mask.exists and #custom_mask:getContent()&amp;gt;1 then&lt;br /&gt;
			class = mw.text.trim(frame:expandTemplate{&lt;br /&gt;
				title = custom_mask.prefixedText,&lt;br /&gt;
				args = raw_args&lt;br /&gt;
			})&lt;br /&gt;
			if class==&amp;#039;&amp;#039; and article_class and article_class~=&amp;#039;&amp;#039; then -- if unassessed and article class exists, check if it can be inherited&lt;br /&gt;
				local new_arg_table = {}&lt;br /&gt;
				for arg, val in pairs(raw_args) do -- construct new argument table to send to custom mask&lt;br /&gt;
					new_arg_table[arg] = val&lt;br /&gt;
				end&lt;br /&gt;
				new_arg_table.class = article_class -- replace class with inherited class&lt;br /&gt;
				local article_class_normalised = mw.text.trim(frame:expandTemplate{&lt;br /&gt;
					title = custom_mask.prefixedText,&lt;br /&gt;
					args = new_arg_table&lt;br /&gt;
				})&lt;br /&gt;
				if article_class_normalised and article_class_normalised~=&amp;#039;&amp;#039; then&lt;br /&gt;
					class = article_class_normalised -- inherit class from article_class normalised by custom mask&lt;br /&gt;
				else&lt;br /&gt;
					article_class = nil -- effectively no article_class for this banner&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		class = class_mask({FQS = &amp;#039;yes&amp;#039;, [1] = class}, title)&lt;br /&gt;
	end&lt;br /&gt;
	if article_class then -- banner shell exists&lt;br /&gt;
		if article_class==&amp;#039;&amp;#039; then -- no article class defined&lt;br /&gt;
			if class==&amp;#039;&amp;#039; then -- local class also does not exist, check whether any other class parameters are defined inside the shell&lt;br /&gt;
				local classparam = p.readarticleclass({ignore_blank=true, only_subtemplates=true}, title.prefixedText)&lt;br /&gt;
				if classparam==&amp;#039;&amp;#039; then -- no class parameters defined, display as globally unassessed&lt;br /&gt;
					show_quality = false -- hide quality class in project banner&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif class==&amp;#039;&amp;#039; or class==article_class then -- local class matches article class or is blank&lt;br /&gt;
			show_quality = false -- hide quality class in project banner&lt;br /&gt;
			class = article_class&lt;br /&gt;
		elseif (article_class==&amp;#039;NA&amp;#039;) and not isarticle(class) then -- article class and local class are both non-article classes&lt;br /&gt;
			show_quality = false&lt;br /&gt;
		else -- article class exists and differs from local class&lt;br /&gt;
			if args.QUALITY_CRITERIA~=&amp;#039;custom&amp;#039; then&lt;br /&gt;
				conflict = true&lt;br /&gt;
				add_category(cfg.quality.conflict.category)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not isarticle(class) then&lt;br /&gt;
		local cat =  mw.title.new(cfg.quality.assessment_category:format(class, assessment_cat))&lt;br /&gt;
		if not (cat.exists and #cat:getContent()&amp;gt;0) then --check if category exists and is not blank&lt;br /&gt;
			class = &amp;#039;NA&amp;#039; -- automatically use NA for non-article pages if category does not exist&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local category = (class==&amp;#039;&amp;#039; and &amp;#039;Unassessed&amp;#039; or class..&amp;#039;-Class&amp;#039;) .. &amp;#039; &amp;#039; .. assessment_cat&lt;br /&gt;
	if show_quality then -- quality rating shown in banner&lt;br /&gt;
		local class_module = require(&amp;#039;Module:Class&amp;#039;)._class&lt;br /&gt;
		local rating&lt;br /&gt;
		if pagetype==&amp;#039;article&amp;#039; then&lt;br /&gt;
			rating = class==&amp;#039;&amp;#039; and cfg.quality.not_yet or cfg.quality.rated:format(class)&lt;br /&gt;
		else&lt;br /&gt;
			rating = cfg.quality.not_required&lt;br /&gt;
		end&lt;br /&gt;
		local scale = args.QUALITY_CRITERIA==&amp;#039;custom&amp;#039;&lt;br /&gt;
			and assessment_link&lt;br /&gt;
			and cfg.quality.project_scale:format(wikilink(assessment_link..&amp;#039;#&amp;#039;..lang:ucfirst(cfg.quality.name), cfg.quality.name))&lt;br /&gt;
			or cfg.quality.default_scale&lt;br /&gt;
		local quality_rating = conflict and cfg.quality.conflict.text or cfg.quality.rating:format(pagetype, rating, scale)&lt;br /&gt;
		local colour = cfg.quality.colour[class] or cfg.quality.colour.default&lt;br /&gt;
		local class_row =  mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;assess&amp;#039;):addClass(&amp;#039;assess-&amp;#039; .. class)&lt;br /&gt;
				:css(&amp;#039;background&amp;#039;, colour):wikitext(wikilink(&amp;#039;:Category:&amp;#039; .. category, class==&amp;#039;&amp;#039; and &amp;#039;???&amp;#039; or class))&lt;br /&gt;
				:css(&amp;#039;border&amp;#039;, conflict and cfg.quality.conflict.border or (cfg.quality.border..&amp;#039; &amp;#039;..colour))&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(quality_rating)&lt;br /&gt;
		:allDone()&lt;br /&gt;
		table.insert(rows, class_row)&lt;br /&gt;
		table.insert(&lt;br /&gt;
			nested_ratings,&lt;br /&gt;
			1,&lt;br /&gt;
			bubble(class==&amp;#039;&amp;#039; and &amp;#039;Unassessed&amp;#039; or (class..&amp;#039;‑class&amp;#039;), colour, conflict)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	add_category(category)&lt;br /&gt;
end&lt;br /&gt;
if args.HOOK_ASSESS then&lt;br /&gt;
	table.insert(rows, args.HOOK_ASSESS)&lt;br /&gt;
end&lt;br /&gt;
if raw_args.b1 or raw_args.b2 or raw_args.b3 or raw_args.b4 or raw_args.b5 or raw_args.b6 then&lt;br /&gt;
	local b_checklist = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).b_checklist(args, raw_args, class, demo, assessment_link)&lt;br /&gt;
	table.insert(rows, b_checklist)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Importance assessment --&lt;br /&gt;
---------------------------&lt;br /&gt;
local importance = importance_mask(raw_args.importance or raw_args.priority, class, args.IMPORTANCE_SCALE, banner_name)&lt;br /&gt;
local importance_name = args.IMPN or (raw_args.priority and &amp;#039;priority&amp;#039; or cfg.importance.default_name)&lt;br /&gt;
if importance then -- banner gives importance ratings&lt;br /&gt;
	local category = importance .. &amp;#039;-&amp;#039; .. importance_name .. &amp;#039; &amp;#039; .. assessment_cat&lt;br /&gt;
	if importance~=&amp;#039;NA&amp;#039; then -- display importance rating&lt;br /&gt;
		local rating = importance==&amp;#039;Unknown&amp;#039; and cfg.importance.not_yet or cfg.importance.rated:format(importance, importance_name)&lt;br /&gt;
		local scale_name = cfg.importance.scale:format(importance_name)&lt;br /&gt;
		local scale = assessment_link&lt;br /&gt;
			and cfg.importance.project_scale:format(assessment_link..&amp;#039;#&amp;#039;..lang:ucfirst(scale_name), scale_name)&lt;br /&gt;
			or cfg.importance.default_scale&lt;br /&gt;
		local importance_rating = cfg.importance.rating:format(pagetype, rating, scale)&lt;br /&gt;
		local colour =  cfg.importance.colour[importance] or cfg.importance.colour.default&lt;br /&gt;
		local importance_row =  mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;assess&amp;#039;):addClass(&amp;#039;import&amp;#039;):addClass(&amp;#039;import-&amp;#039; .. importance)&lt;br /&gt;
				:css(&amp;#039;background&amp;#039;, colour):wikitext(wikilink(&amp;#039;:Category:&amp;#039; .. category, importance==&amp;#039;Unknown&amp;#039; and &amp;#039;???&amp;#039; or importance))&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(importance_rating)&lt;br /&gt;
		:allDone()&lt;br /&gt;
		table.insert(rows, importance_row)&lt;br /&gt;
		if importance~=&amp;#039;Unknown&amp;#039; then -- importance is not NA or Unknown&lt;br /&gt;
			table.insert(&lt;br /&gt;
				nested_ratings,&lt;br /&gt;
				bubble(importance..&amp;#039;‑&amp;#039;..importance_name, colour)&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	add_category(category)&lt;br /&gt;
end&lt;br /&gt;
if class or importance then&lt;br /&gt;
	page_assessment(project, class, importance)&lt;br /&gt;
end&lt;br /&gt;
if args.HOOK_IMPORTANCE then&lt;br /&gt;
	table.insert(rows, args.HOOK_IMPORTANCE)&lt;br /&gt;
end&lt;br /&gt;
if args.QII_FORMAT then&lt;br /&gt;
	add_category(require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).quality_importance_insection(args, class, importance, importance_name))&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Collapsing sections ----&lt;br /&gt;
---------------------------&lt;br /&gt;
local collapse_section = function(collapse, new_rows, header)&lt;br /&gt;
	if collapse then&lt;br /&gt;
		local collapsed_section = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		local collapsed_rows = collapsed_section:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;,&amp;#039;3&amp;#039;):addClass(&amp;#039;wpb-collapsed-notes&amp;#039;):tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;mw-collapsible mw-collapsed&amp;#039;):tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
					:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
						:attr(&amp;#039;colspan&amp;#039;,&amp;#039;3&amp;#039;):addClass(&amp;#039;wpb-collapsed-head&amp;#039;):wikitext(header)&lt;br /&gt;
					:done()&lt;br /&gt;
				:done()&lt;br /&gt;
				:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
					:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
						:addClass(&amp;#039;mbox-image wpb-gutter&amp;#039;):css(&amp;#039;min-width&amp;#039;,image_left_size):tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;wpb-iefix&amp;#039;):wikitext(&amp;#039;/&amp;amp;nbsp;&amp;#039;):&lt;br /&gt;
					done() --TO FIX IE&lt;br /&gt;
				:done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):done()&lt;br /&gt;
			:done()&lt;br /&gt;
			for _, row in ipairs(new_rows) do&lt;br /&gt;
				collapsed_rows:node(row)&lt;br /&gt;
			end&lt;br /&gt;
		collapsed_section:allDone()&lt;br /&gt;
		table.insert(rows, collapsed_section)&lt;br /&gt;
	else&lt;br /&gt;
		for _, row in ipairs(new_rows) do&lt;br /&gt;
			table.insert(rows, row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Task forces ------------&lt;br /&gt;
---------------------------&lt;br /&gt;
local nested_tf, taskforce_output = {}, {}&lt;br /&gt;
local tf_default_size = args.TF_SIZE or cfg.task_force.default_size&lt;br /&gt;
for _, k in ipairs(task_forces) do&lt;br /&gt;
	local tf_prefix = &amp;#039;TF_&amp;#039; .. k .. &amp;#039;_&amp;#039;&lt;br /&gt;
	local tf_assessment_cat = args[tf_prefix..&amp;#039;ASSESSMENT_CAT&amp;#039;] or (args[tf_prefix..&amp;#039;NAME&amp;#039;] or &amp;#039;&amp;#039;)..&amp;#039; articles&amp;#039;&lt;br /&gt;
	local tf_importance&lt;br /&gt;
	if raw_args[&amp;#039;tf &amp;#039;..k..&amp;#039; importance&amp;#039;] then&lt;br /&gt;
		tf_importance = importance_mask(raw_args[&amp;#039;tf &amp;#039;..k..&amp;#039; importance&amp;#039;], class, args.IMPORTANCE_SCALE, banner_name)&lt;br /&gt;
		if tf_importance==&amp;#039;Unknown&amp;#039; and yesno(args.INHERIT_IMPORTANCE) then&lt;br /&gt;
			tf_importance = importance&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix .. &amp;#039;TEXT&amp;#039;]~=&amp;#039;none&amp;#039; then&lt;br /&gt;
		local portal = args[tf_prefix..&amp;#039;PORTAL&amp;#039;] and frame:expandTemplate{title=&amp;#039;Portal&amp;#039;, args={args[tf_prefix .. &amp;#039;PORTAL&amp;#039;], height=&amp;#039;15&amp;#039;, margin=&amp;#039;0&amp;#039;}} or &amp;#039;&amp;#039;&lt;br /&gt;
		local text = &amp;#039;&amp;#039;&lt;br /&gt;
		local tf_text = args[tf_prefix..&amp;#039;TEXT&amp;#039;] or args.TF_TEXT&lt;br /&gt;
		if tf_text then&lt;br /&gt;
			text = portal .. tf_text&lt;br /&gt;
				:gsub(&amp;#039;_NAME_&amp;#039;, args[tf_prefix .. &amp;#039;NAME&amp;#039;] or &amp;#039;&amp;#039;)&lt;br /&gt;
				:gsub(&amp;#039;_LINK_&amp;#039;, args[tf_prefix .. &amp;#039;LINK&amp;#039;] or &amp;#039;&amp;#039;)&lt;br /&gt;
				:gsub(&amp;#039;_IMPORTANCE_&amp;#039;, tf_importance or &amp;#039;&amp;#039;)&lt;br /&gt;
				:gsub(&amp;#039;_PAGETYPE_&amp;#039;, pagetype)&lt;br /&gt;
		else&lt;br /&gt;
			local tf_importance_text = tf_importance&lt;br /&gt;
				and tf_importance~=&amp;#039;NA&amp;#039;&lt;br /&gt;
				and tf_importance~=&amp;#039;Unknown&amp;#039;&lt;br /&gt;
				and &amp;#039; &amp;#039; .. cfg.task_force.importance:format(&lt;br /&gt;
					wikilink(&amp;#039;:Category:&amp;#039; .. tf_importance .. &amp;#039;-&amp;#039; .. importance_name .. &amp;#039; &amp;#039; .. tf_assessment_cat, tf_importance .. &amp;#039;-&amp;#039; .. importance_name)&lt;br /&gt;
				) or &amp;#039;&amp;#039;&lt;br /&gt;
			text = portal .. cfg.task_force.text:format(&lt;br /&gt;
				pagetype,&lt;br /&gt;
				wikilink(args[tf_prefix .. &amp;#039;LINK&amp;#039;], args[tf_prefix .. &amp;#039;NAME&amp;#039;]),&lt;br /&gt;
				tf_importance_text&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
		local tf_size = args[tf_prefix .. &amp;#039;SIZE&amp;#039;] or tf_default_size&lt;br /&gt;
		local tf_image = &amp;#039;&amp;#039;&lt;br /&gt;
		if args[tf_prefix .. &amp;#039;IMAGE&amp;#039;] then&lt;br /&gt;
			tf_image = image(args[tf_prefix .. &amp;#039;IMAGE&amp;#039;], tf_size, cfg.task_force.icon_alt, &amp;#039;center&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local taskforce = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):wikitext(tf_image):done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;):attr(&amp;#039;colspan&amp;#039;,&amp;#039;2&amp;#039;):wikitext(text):allDone()&lt;br /&gt;
		table.insert(taskforce_output, taskforce)&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix..&amp;#039;HOOK&amp;#039;] then&lt;br /&gt;
		table.insert(taskforce_output, args[tf_prefix..&amp;#039;HOOK&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	if yesno(args[tf_prefix..&amp;#039;QUALITY&amp;#039;]) and class then&lt;br /&gt;
		local tf_class = check_exists(class, tf_assessment_cat)&lt;br /&gt;
		add_category((tf_class==&amp;#039;&amp;#039; and &amp;#039;Unassessed&amp;#039; or tf_class..&amp;#039;-Class&amp;#039;) .. &amp;#039; &amp;#039; .. tf_assessment_cat)&lt;br /&gt;
	end&lt;br /&gt;
	if tf_importance then&lt;br /&gt;
		add_category(tf_importance .. &amp;#039;-&amp;#039; .. importance_name .. &amp;#039; &amp;#039; .. tf_assessment_cat)&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix..&amp;#039;QII_FORMAT&amp;#039;] then&lt;br /&gt;
		add_category(require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).quality_importance_insection(args, class, tf_importance, importance_name, tf_prefix))&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix..&amp;#039;NAME&amp;#039;] then&lt;br /&gt;
		page_assessment(project..&amp;#039;/&amp;#039;..args[tf_prefix..&amp;#039;NAME&amp;#039;], class, tf_importance)&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix..&amp;#039;MAIN_CAT&amp;#039;] then&lt;br /&gt;
		add_category(args[tf_prefix..&amp;#039;MAIN_CAT&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	if args[tf_prefix..&amp;#039;NESTED&amp;#039;] then&lt;br /&gt;
		table.insert(nested_tf, wikilink(args[tf_prefix..&amp;#039;LINK&amp;#039;], args[tf_prefix..&amp;#039;NESTED&amp;#039;]))&lt;br /&gt;
	end&lt;br /&gt;
	for _, c in ipairs(taskforce_categories[k] or {}) do-- add additional taskforce categories&lt;br /&gt;
		add_category(args[tf_prefix..&amp;#039;CAT_&amp;#039;..c])&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
if args.HOOK_TF then&lt;br /&gt;
	table.insert(taskforce_output, args.HOOK_TF)&lt;br /&gt;
end&lt;br /&gt;
local threshold = tonumber(args.TF_COLLAPSE) or (args.TF_HEADER and cfg.task_force.lower_threshold) or cfg.task_force.upper_threshold&lt;br /&gt;
collapse_section(&lt;br /&gt;
	#taskforce_output &amp;gt; threshold,&lt;br /&gt;
	taskforce_output,&lt;br /&gt;
	args.TF_HEADER or cfg.task_force.header&lt;br /&gt;
)&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Notes ------------------&lt;br /&gt;
---------------------------&lt;br /&gt;
local note_output = {}&lt;br /&gt;
local note_default_size = args.NOTE_SIZE or args.NOTE_1_SIZE or cfg.note.default_size&lt;br /&gt;
local render_note = function(note_args)--text, image_name, size, category, sort_prefix&lt;br /&gt;
	local sort = note_args.sort_prefix and note_args.sort_prefix .. current_title.text&lt;br /&gt;
	add_category(note_args.category, sort)&lt;br /&gt;
	add_category(note_args.category2, sort)&lt;br /&gt;
	if note_args.text then&lt;br /&gt;
		local note_image = image(note_args.image_name, note_args.size or note_default_size, cfg.note.icon_alt, &amp;#039;center&amp;#039;)&lt;br /&gt;
		local new_note = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):css(&amp;#039;background&amp;#039;, note_args.background):wikitext(note_image):done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(note_args.text):allDone()&lt;br /&gt;
		table.insert(note_output, new_note)&lt;br /&gt;
		if note_image then&lt;br /&gt;
			local icon = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;wpb-header-bubbles&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;[[File:&amp;#039; .. note_args.image_name .. &amp;#039;|&amp;#039; .. cfg.note.header_icon .. &amp;#039;|&amp;#039; .. note_args.text .. &amp;#039;|link=|alt=]]&amp;#039;)&lt;br /&gt;
				:done()&lt;br /&gt;
			table.insert(nested_ratings, tostring(icon))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local auto = false&lt;br /&gt;
local auto_arg = args.auto and args.auto:lower()&lt;br /&gt;
if (auto_arg==&amp;#039;yes&amp;#039; or auto_arg==&amp;#039;stub&amp;#039;) and class==&amp;#039;Stub&amp;#039; then&lt;br /&gt;
	auto = &amp;#039;stub&amp;#039;&lt;br /&gt;
elseif (auto_arg==&amp;#039;inherit&amp;#039; or auto_arg==&amp;#039;length&amp;#039;) and class and class~=&amp;#039;&amp;#039; then&lt;br /&gt;
	auto = auto_arg&lt;br /&gt;
end&lt;br /&gt;
if auto then&lt;br /&gt;
	local auto_cat = args.AUTO_ASSESS_CAT or cfg.auto.default_cat:format(project)&lt;br /&gt;
	local auto_text = cfg.auto.assessed:format(&lt;br /&gt;
		pagetype,&lt;br /&gt;
		cfg.auto[auto], -- method of automatic assessment&lt;br /&gt;
		parameter_format(&amp;#039;auto&amp;#039;)&lt;br /&gt;
	)&lt;br /&gt;
	local sort_prefix&lt;br /&gt;
	if auto==&amp;#039;stub&amp;#039; then&lt;br /&gt;
		sort_prefix = &amp;#039;S&amp;#039;&lt;br /&gt;
	elseif auto==&amp;#039;length&amp;#039; then&lt;br /&gt;
		sort_prefix = &amp;#039;L&amp;#039;&lt;br /&gt;
	elseif auto==&amp;#039;inherit&amp;#039; then&lt;br /&gt;
		local sort_codes = cfg.auto.sort_codes&lt;br /&gt;
		sort_prefix = sort_codes[class] or cfg.auto.default_sort_code&lt;br /&gt;
	end&lt;br /&gt;
	render_note{&lt;br /&gt;
		text = auto_text,&lt;br /&gt;
		image_name =  cfg.auto.icon,&lt;br /&gt;
		category = auto_cat,&lt;br /&gt;
		sort_prefix = sort_prefix&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
if yesno(args.attention, true) then&lt;br /&gt;
	local attention_cat = args.ATTENTION_CAT or cfg.attention.default_cat:format(project)&lt;br /&gt;
	render_note{&lt;br /&gt;
		text = cfg.attention.text:format(pagetype),&lt;br /&gt;
		image_name = cfg.attention.icon,&lt;br /&gt;
		category = attention_cat&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
if yesno(args.infobox, true) then&lt;br /&gt;
	local infobox_cat = args.INFOBOX_CAT or cfg.infobox.default_cat:format(project)&lt;br /&gt;
	render_note{&lt;br /&gt;
		text = cfg.infobox.text:format(pagetype),&lt;br /&gt;
		image_name = cfg.infobox.icon,&lt;br /&gt;
		category = infobox_cat&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
for _, k in ipairs(notes) do&lt;br /&gt;
	local note_prefix = &amp;#039;NOTE_&amp;#039; .. k .. &amp;#039;_&amp;#039;&lt;br /&gt;
	render_note{&lt;br /&gt;
		text = parse_text(args[note_prefix..&amp;#039;TEXT&amp;#039;]),&lt;br /&gt;
		image_name = args[note_prefix..&amp;#039;IMAGE&amp;#039;],&lt;br /&gt;
		size = args[note_prefix..&amp;#039;SIZE&amp;#039;],&lt;br /&gt;
		category = args[note_prefix..&amp;#039;CAT&amp;#039;]&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
if yesno(args[&amp;#039;image-needed&amp;#039;], true) then&lt;br /&gt;
	local image_needed_args = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).image_needed(args, pagetype)&lt;br /&gt;
	render_note(image_needed_args)&lt;br /&gt;
end&lt;br /&gt;
if yesno(args[&amp;#039;collaboration-candidate&amp;#039;], true) or yesno(args[&amp;#039;collaboration-current&amp;#039;], true) or yesno(args[&amp;#039;collaboration-past&amp;#039;], true) then&lt;br /&gt;
	local collaboration_args = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).collaboration(args, pagetype, current_title)&lt;br /&gt;
	render_note(collaboration_args.candidate)&lt;br /&gt;
	render_note(collaboration_args.current)&lt;br /&gt;
	render_note(collaboration_args.past)&lt;br /&gt;
end&lt;br /&gt;
if yesno(args[&amp;#039;a class&amp;#039;], true) then&lt;br /&gt;
	local a_class_args = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).a_class(args, lang)&lt;br /&gt;
	render_note(a_class_args)&lt;br /&gt;
end&lt;br /&gt;
if yesno(args[&amp;#039;peer review&amp;#039;], true) or yesno(args[&amp;#039;old peer review&amp;#039;], true) then&lt;br /&gt;
	local peer_review_args = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).peer_review(args, current_title)&lt;br /&gt;
	render_note(peer_review_args.current)&lt;br /&gt;
	render_note(peer_review_args.past)&lt;br /&gt;
end&lt;br /&gt;
local note_count = #note_output&lt;br /&gt;
if args.HOOK_NOTE then&lt;br /&gt;
	table.insert(note_output, args.HOOK_NOTE)&lt;br /&gt;
	local hook_collapsed = 0&lt;br /&gt;
	if args.HOOK_COLLAPSED then&lt;br /&gt;
		local success, result = pcall(mw.ext.ParserFunctions.expr, args.HOOK_COLLAPSED)&lt;br /&gt;
		hook_collapsed = success and tonumber(result) or 0&lt;br /&gt;
		if args.HOOK_COLLAPSED==&amp;#039;auto&amp;#039; then&lt;br /&gt;
			hook_collapsed = 1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	note_count = note_count + hook_collapsed&lt;br /&gt;
end&lt;br /&gt;
collapse_section(&lt;br /&gt;
	note_count &amp;gt; (tonumber(args.COLLAPSED) or cfg.note.threshold),&lt;br /&gt;
	note_output,&lt;br /&gt;
	args.COLLAPSED_HEAD or cfg.note.header&lt;br /&gt;
)&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Bottom text ------------&lt;br /&gt;
---------------------------&lt;br /&gt;
if args.HOOK_BOTTOM then&lt;br /&gt;
	table.insert(rows, args.HOOK_BOTTOM)&lt;br /&gt;
end&lt;br /&gt;
if args.TODO_LINK or args.TODO_TEXT then&lt;br /&gt;
	local todolist = require(cfg.auxiliary_module .. (sandbox or &amp;#039;&amp;#039;)).todo_list(args, frame)&lt;br /&gt;
	table.insert(rows, todolist)&lt;br /&gt;
end&lt;br /&gt;
if args.BOTTOM_TEXT then&lt;br /&gt;
	local bottom_text = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		bottom_text&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;,&amp;#039;3&amp;#039;)&lt;br /&gt;
			:wikitext(parse_text(args.BOTTOM_TEXT))&lt;br /&gt;
	:allDone()&lt;br /&gt;
	table.insert(rows, bottom_text)&lt;br /&gt;
end&lt;br /&gt;
if args.MAIN_CAT then&lt;br /&gt;
	add_category(args.MAIN_CAT)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Nested display ---------&lt;br /&gt;
---------------------------&lt;br /&gt;
if args.HOOK_NESTED then&lt;br /&gt;
	local hook_nested = args.HOOK_NESTED:gsub(&amp;#039;^&amp;amp;#32;/ &amp;#039;, &amp;#039;&amp;#039;) -- remove initial slash, will be added later&lt;br /&gt;
	table.insert(nested_tf, hook_nested)&lt;br /&gt;
end&lt;br /&gt;
local nested_tf_str = &amp;#039;&amp;#039;&lt;br /&gt;
if #nested_tf&amp;gt;0 then&lt;br /&gt;
	nested_tf_str = tostring(mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;font-weight&amp;#039;, &amp;#039;normal&amp;#039;)&lt;br /&gt;
		:wikitext(&amp;#039;: &amp;#039; .. table.concat(nested_tf, &amp;#039; / &amp;#039;))&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
local nested_ratings_str = #nested_ratings&amp;gt;0 and table.concat(nested_ratings, &amp;#039; &amp;#039;) or &amp;#039;&amp;#039;&lt;br /&gt;
if args.HOOK_NESTED_ASSESS then&lt;br /&gt;
	nested_ratings_str = nested_ratings_str .. tostring(mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wpb-header-bubbles&amp;#039;)&lt;br /&gt;
		:wikitext(args.HOOK_NESTED_ASSESS)&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
local header_row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	:addClass(&amp;#039;wpb-header&amp;#039;)&lt;br /&gt;
	:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wpb-header-icon&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;width&amp;#039;, &amp;#039;50px&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
		:wikitext(image(args.IMAGE_LEFT, cfg.image.header_size, cfg.image.alt))&lt;br /&gt;
	:done()&lt;br /&gt;
	:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wpb-header-combined&amp;#039;)&lt;br /&gt;
		:wikitext(wikilink(project_link.prefixedText, project) .. nested_tf_str .. &amp;#039;  &amp;#039; .. nested_ratings_str)&lt;br /&gt;
	:allDone()&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Prepare categories -----&lt;br /&gt;
---------------------------&lt;br /&gt;
local categories_formatted = &amp;#039;&amp;#039;&lt;br /&gt;
if args.demo_page then -- for testing purposes&lt;br /&gt;
	local category_list = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;background-color&amp;#039;, &amp;#039;#F5F5F5&amp;#039;):css(&amp;#039;border-width&amp;#039;, &amp;#039;1px&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;width&amp;#039;, &amp;#039;500px&amp;#039;)&lt;br /&gt;
		:wikitext(&amp;#039;Categories:&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;ul&amp;#039;)&lt;br /&gt;
	for _, cat in ipairs(categories) do&lt;br /&gt;
		local cat_link = wikilink(&amp;#039;:Category:&amp;#039; .. cat.category, cat.category)&lt;br /&gt;
		category_list:tag(&amp;#039;li&amp;#039;):wikitext(cat_link):done()&lt;br /&gt;
	end&lt;br /&gt;
	categories_formatted = tostring(category_list:allDone())&lt;br /&gt;
elseif not demo then&lt;br /&gt;
	local categories_linked = {}&lt;br /&gt;
	for _, cat in ipairs(categories) do&lt;br /&gt;
		local cat_link = wikilink(&amp;#039;Category:&amp;#039; .. cat.category, cat.key)&lt;br /&gt;
		table.insert(categories_linked, cat_link)&lt;br /&gt;
	end&lt;br /&gt;
	categories_formatted = table.concat(categories_linked)&lt;br /&gt;
end&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Make banner ------------&lt;br /&gt;
---------------------------&lt;br /&gt;
local status_class = (cfg.status[args.PROJECT_STATUS] or cfg.status.default_active) .. cfg.status.suffix&lt;br /&gt;
local banner = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
local banner_rows = banner&lt;br /&gt;
	:addClass(&amp;#039;tmbox tmbox-notice mw-collapsible innercollapse wpb &amp;#039; .. status_class)&lt;br /&gt;
	:css(&amp;#039;table-layout&amp;#039;, &amp;#039;fixed&amp;#039;)&lt;br /&gt;
	:node(header_row)&lt;br /&gt;
	:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-text wpb-main&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;,&amp;#039;2&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
				for _, row in ipairs(rows) do&lt;br /&gt;
					banner_rows:node(row)&lt;br /&gt;
				end&lt;br /&gt;
if args.listas then&lt;br /&gt;
	frame:preprocess(&amp;#039;{{DEFAULTSORT:&amp;#039; .. args.listas .. &amp;#039;}}&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
local tstyle = frame:extensionTag (&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src=&amp;#039;Module:Message box/tmbox.css&amp;#039;}) ..&lt;br /&gt;
	frame:extensionTag (&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src = &amp;#039;Module:WikiProject banner&amp;#039; .. (sandbox or &amp;#039;&amp;#039;) .. &amp;#039;/styles.css&amp;#039;})&lt;br /&gt;
return warning .. tstyle .. tostring(banner) .. categories_formatted, note_count, #taskforce_output, assessment_link&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local parameter_check = function(frame, banner_name, project_name)&lt;br /&gt;
---------------------------&lt;br /&gt;
-- Unknown parameters -----&lt;br /&gt;
---------------------------&lt;br /&gt;
local parent_args = args_module.getArgs(frame, {parentOnly = true, removeBlanks = false})&lt;br /&gt;
local template_code = banner_name:getContent()&lt;br /&gt;
local parameters = {}&lt;br /&gt;
for parameter in template_code:gmatch(&amp;#039;{{{([^|]+)&amp;#039;) do&lt;br /&gt;
	table.insert(parameters, parameter)&lt;br /&gt;
end&lt;br /&gt;
parameters.preview = cfg.unknown_parameters.preview:format(wikilink(banner_name.fullText))&lt;br /&gt;
local unknown_category = cfg.unknown_parameters.tracking:format(project_name)&lt;br /&gt;
if not mw.title.new(unknown_category).exists then&lt;br /&gt;
	unknown_category = cfg.unknown_parameters.default&lt;br /&gt;
end&lt;br /&gt;
parameters.unknown = unknown_category and &amp;#039;[[&amp;#039; .. unknown_category .. &amp;#039;|_VALUE_]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
return require(&amp;#039;Module:Check for unknown parameters&amp;#039;)._check(parameters, parent_args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local initialise = function(args, raw_args, inactive)&lt;br /&gt;
	local project_name = args.PROJECT_NAME or &amp;#039;WikiProject &amp;#039; .. (args.PROJECT or &amp;#039;PROJECT&amp;#039;)&lt;br /&gt;
	local banner_name = mw.title.new(args.BANNER_NAME or &amp;#039;Template:WikiProject &amp;#039; .. (args.PROJECT or &amp;#039;PROJECT&amp;#039;))&lt;br /&gt;
	local demo = not yesno(args.category or true, true) or args.demo_page&lt;br /&gt;
	local on_template_page = not demo and current_title.rootPageTitle==banner_name.rootPageTitle&lt;br /&gt;
	local unknown_parameters = banner_name.exists and not demo and parameter_check(frame, banner_name, project_name) or &amp;#039;&amp;#039;&lt;br /&gt;
	if on_template_page then&lt;br /&gt;
		local templatepage = require(&amp;#039;Module:WikiProject banner/templatepage&amp;#039; .. (sandbox or &amp;#039;&amp;#039;)).templatepage&lt;br /&gt;
		return templatepage(args, raw_args, inactive)&lt;br /&gt;
	else&lt;br /&gt;
		return unknown_parameters .. p._main(args, raw_args, demo or inactive, banner_name), nil -- nil to disregard subsequent returned values&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame)&lt;br /&gt;
	local args = args_module.getArgs(frame, {frameOnly = true})&lt;br /&gt;
	local raw_args = args_module.getArgs(frame, {frameOnly = true, removeBlanks = false})&lt;br /&gt;
	return initialise(args, raw_args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.inactive = function(frame)&lt;br /&gt;
	local args = args_module.getArgs(frame, {frameOnly = true})&lt;br /&gt;
	local project_name = args.PROJECT_NAME or &amp;#039;WikiProject &amp;#039; .. (args.PROJECT or &amp;#039;PROJECT&amp;#039;)&lt;br /&gt;
	local project_link = mw.title.new(args.PROJECT_LINK or &amp;#039;Wikipedia:&amp;#039; .. project_name)&lt;br /&gt;
	local _status = cfg.status[args.PROJECT_STATUS] or cfg.status.default_inactive&lt;br /&gt;
	local main_text = cfg.inactive.text:format(&lt;br /&gt;
		&amp;#039;_PAGETYPE_&amp;#039;,&lt;br /&gt;
		project_link.prefixedText,&lt;br /&gt;
		project_name,&lt;br /&gt;
		_status&lt;br /&gt;
	)&lt;br /&gt;
	return initialise({&lt;br /&gt;
			PROJECT = args.PROJECT,&lt;br /&gt;
			PROJECT_STATUS = _status,&lt;br /&gt;
			BANNER_NAME = args.BANNER_NAME,&lt;br /&gt;
			IMAGE_LEFT = cfg.inactive.image,&lt;br /&gt;
			IMAGE_LEFT_SIZE = cfg.inactive.image_size,&lt;br /&gt;
			MAIN_TEXT = main_text,&lt;br /&gt;
			HOOK_NESTED_ASSESS = &amp;#039; &amp;#039; .. cfg.inactive.nested:format(_status),&lt;br /&gt;
			substcheck = args.substcheck,&lt;br /&gt;
			category = args.category&lt;br /&gt;
		},&lt;br /&gt;
		{&lt;br /&gt;
			class = frame.args.class,&lt;br /&gt;
			substcheck = &amp;#039;&amp;#039; -- to prevent warning on templatepage&lt;br /&gt;
		},&lt;br /&gt;
		true -- to prevent categorisation&lt;br /&gt;
	), nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>en&gt;Gonnym</name></author>
	</entry>
</feed>