Jump to content
Wikipedia The Free Encyclopedia

Module:WikiProject banner/templatepage/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by MSGJ (talk | contribs) at 13:04, 24 March 2025 (NA is not a class). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision .Revision as of 13:04, 24 March 2025 by MSGJ (talk | contribs) (NA is not a class)
Module documentation[view] [edit] [history] [purge]
[画像:Ready for use] This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing.
[画像:Protected] This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing.
WikiProject banners
Module
Template:WPBannerMeta
Config
Styles
Auxiliary
templatepage
Category (errors)

This submodule of Module:WikiProject banner produces the output which will be displayed on WikiProject banner template pages. It will be displayed automatically on the following pages:

  • Pages of the form Template:WikiProject PROJECT
  • Pages specified by the BANNER_NAME parameter (if used)

The module produces the following main components:

The above documentation is transcluded from Module:WikiProject banner/templatepage/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Add categories to the /doc subpage. Subpages of this module.
 require('strict')
 local p = {}
 local sandbox = '/sandbox'
 local template_page_cfg = {
	info = 'This WikiProject banner template uses [[Module:WikiProject banner]], a meta-template for easily creating and maintaining project banners. Please report any errors or feature requests to [[Module talk:WikiProject banner]].',
	notice_text = 'Information or warnings about the template are below:',
	quality_criteria = {
		custom = 'This project has opted out of project-independent quality assessments and is using a <b>[[%s|custom class mask]]</b>.',
		custom_tracking = {category = 'WikiProjects using a non-standard quality scale'},
		missing = 'The %s parameter is set to <i>custom</i> but there is no custom class mask held at [[%s]]. Therefore the quality scale has been switched off.',
	},
	custom_importance_mask = {
		in_use = 'A <b>[[%s|custom importance mask]]</b> is in use.',
		missing = 'The %s parameter is set to <i>subpage</i> but there is no custom importance mask held at [[%s]]. Therefore the importance scale has been switched off.',
		unused = 'The [[%s|/importance subpage]] is currently not in use. To use it, set %s. To remove this warning, please delete or blank that subpage.'
	},
	more_than = {
		zero = 'any of them are',
		one = 'more than one of them is',
		more = 'more than %s of them are'
	},
	note = {
		collapsing = 'The %s notes in this template will automatically collapse if %s activated. To change this setting, set or update the %s parameter.',
		counter = 'A hook is attached to the %s parameter but no valid counter has been attached to %s.',
		tracking = {sort_key = 'Hook collapsed'},
	},
	assessment_link = {
		missing = 'This project banner specifies a non-existent assessment page %s. Please <b>[%s update or remove]</b> the %s parameter to fix this problem.',
		edit_summary = 'set ASSESSMENT_LINK parameter',
	},
	project = {
		text = 'The required PROJECT parameter has not been defined.',
		banner = 'The page name of the banner template does not exist. Please check the PROJECT or BANNER_NAME parameters.',
		tracking = {sort_key = 'Missing PROJECT parameter'},
	},
	substcheck = {
		text = 'A feature for detecting incorrectly [[Wikipedia:Template substitution|substituted]] project banners has not yet been implemented on this template. Please see the [[Template:WPBannerMeta/doc#Simple options|documentation]] for how to set the %s parameter.',
		tracking = {sort_key = 'Check'},
	},
	portal = {
		text = 'This banner template includes a link to [[%s]], %s',
		no_image = 'but there is no custom image defined yet. Please read the %s.',
		image_link = 'and the accompanying image is %s. See the %s on how to change this.',
		instructions = '[[Template:Portal/doc#Image|instructions]]',
		missing = 'but this portal does not exist - you may have defined %s incorrectly or the portal may have been deleted.',
		tracking = {sort_key = 'O'},
	},
	task_force = {
		text = 'A task force does not have a defined name, which is needed for proper classification of these articles. Please add the %s parameter.',
		tracking = {sort_key = 'N'},
		collapsing = 'The %s task forces and/or work groups will automatically collapse if %s displayed. To change this setting, set or update the %s parameter.',
	},
	check_assessment = {
		classes = {'FA', 'FL', 'A', 'GA', 'B', 'C', 'Start', 'Stub', 'List', 'Unassessed', 'NA'},
		importances = {'Top', 'High', 'Mid', 'Low', 'NA', 'Unknown'},
		text = 'Some of the assessment categories required for %s do not currently exist, and should to be created to avoid redlinks appearing on talk pages. Alternatively, you may need to set or update the %s parameter in this template.',
		icon = 'Nuvola apps kfig.svg',
		create_summary = 'Creating category for [[WP:1.0/A|1.0 Assessment scheme]]',
		quality_preload = 'Template:WPBannerMeta/templatepage/preloadqual',
		importance_preload = 'Template:WPBannerMeta/templatepage/preloadimp',
		meta_preload = 'Template:WPBannerMeta/templatepage/preloadmeta',
		editintro = 'Template:WPBannerMeta/templatepage/editintro',
		parameter_suffix = 'ASSESSMENT_CAT',
		tracking = {sort_key = 'Assessment categories missing'},
		too_many = 'There are too many task forces to check the assessment categories for each one, so the following selection have been checked: %s.',
	},
	check_other = {
		text = 'The following categories are required for the banner to work correctly. Please either create these categories or adjust the banner so that they are not required.',
		icon = 'Nuvola apps kfig.svg',
		tracking = {sort_key = 'Z'},
	},
	default_tracking = 'WikiProject banners with errors',
	template_categories = {
		non_standard = {category = 'WikiProject banners with non-standard names'},
		sandbox = {category = 'WikiProject banner template sandboxes'},
		with_quality = {category = 'WikiProject banners with quality assessment'},
		without_quality = {category = 'WikiProject banners without quality assessment'},
		inactive = {category = 'Inactive WikiProject banners'}
	},
	parameters = {
		preview = 'Unexpected or deprecated parameter _VALUE_',
		category = '[[Category:WikiProject banners with errors|U]]',
		parameters = {'PROJECT', 'BANNER_NAME', 'PROJECT_NAME', 'PROJECT_LINK', 'demo_page', 'substcheck', 'category', 'listas', 'MAIN_TEXT', 'MAIN_ARTICLE', 'PORTAL', 'TF_TEXT', 'TF_SIZE', 'TF_COLLAPSE', 'TF_HEADER', 'INHERIT_IMPORTANCE', 'NOTE_SIZE', 'COLLAPSED', 'COLLAPSED_HEAD', 'MAIN_CAT', 'BOTTOM_TEXT', 'HOOK_NESTED', 'HOOK_NESTED_ASSESS', 'HOOK_ASSESS', 'HOOK_TF', 'HOOK_NOTE', 'HOOK_BOTTOM', 'HOOK_COLLAPSED', 'HOOK_IMPORTANCE', 'PROJECT_STATUS', 'DOC'},
		extra = {
			{
				trigger = 'IMAGE_LEFT',
				parameters = {'IMAGE_LEFT_SIZE'}
			},
			{
				trigger = 'IMAGE_RIGHT',
				parameters = {'IMAGE_RIGHT_SIZE'}
			},
			{
				trigger = 'class',
				parameters = {'QUALITY_SCALE', 'QUALITY_CRITERIA', 'ASSESSMENT_CAT', 'ASSESSMENT_LINK'}
			},
			{
				triggers = {'b1', 'b2', 'b3', 'b4', 'b5', 'b6'},
				parameters = {'B_DISPLAY_ON_START'},
				categories = {'B1_CAT', 'B2_CAT', 'B3_CAT', 'B4_CAT', 'B5_CAT', 'B6_CAT', 'B_MAIN_CAT'}
			},
			{
				triggers = {'importance', 'priority'},
				parameters = {'IMPORTANCE_SCALE', 'ASSESSMENT_CAT', 'ASSESSMENT_LINK', 'IMPN'}
			},
			{
				trigger = 'auto',
				parameters = {'AUTO_ASSESS_CAT'}
			},
			{
				trigger = 'attention',
				parameters = {'ATTENTION_CAT'}
			},
			{
				trigger = 'infobox',
				parameters = {'INFOBOX_CAT'}
			},
			{
				triggers = {'TODO_TEXT', 'TODO_LINK'},
				parameters = {'TODO_TITLE', 'TODO_EDITLINKS', 'TODO_TITLE_STYLE', 'TODO_STYLE'}
			},
			{
				trigger = 'QII_FORMAT',
				parameters = {'QII_SUPPRESS_NA', 'QII_SUPPRESS_NA_CLASS', 'QII_SUPPRESS_NA_IMPORTANCE', 'QII_UNASSESSED_APPENDIX'}
			},
			{
				trigger = 'image-needed',
				parameters = {'IM_IMAGE', 'image-location', 'image-details', 'image-topic', 'image-type'},
				categories = {'IM_LOCATION_CATEGORY', 'IM_TOPIC_CATEGORY'}
			},
			{
				triggers = {'collaboration-candidate', 'collaboration-current', 'collaboration-past'},
				parameters = {'COLL_LINK', 'COLL_TEXT', 'COLL_IMAGE'},
				categories = {'COLL_CANDIDATE_CAT', 'COLL_CURRENT_CAT', 'COLL_PAST_CAT'}
			},
			{
				trigger = 'a class',
				parameters = {'ACR_SUBPAGE_LINK', 'ACR_REVIEW_LINK', 'ACR_IMAGE', 'ACR_SIZE', 'ACR_PRELOAD'},
				categories = {'ACR_PASS_CAT', 'ACR_FAIL_CAT', 'ACR_CURRENT_CAT', 'ACR_INVALID_CAT'}
			},
			{
				triggers = {'peer review', 'old peer review'},
				parameters = {'PR_LINK', 'peer review title', 'PR_IMAGE', 'PR_SIZE'},
				categories = {'PR_CAT', 'PR_OLD_CAT', 'PR_INVALID_CAT'}
			}
		},
		taskforce = {
			prefix = 'TF_%s_',
			suffix = {'LINK', 'NAME', 'NESTED', 'IMAGE', 'TEXT', 'QUALITY', 'ASSESSMENT_CAT', 'MAIN_CAT', 'PORTAL', 'HOOK', 'SIZE', 'QII_FORMAT', 'QII_SUPPRESS_NA', 'QII_SUPPRESS_NA_CLASS', 'QII_SUPPRESS_NA_IMPORTANCE', 'QII_UNASSESSED_APPENDIX'},
		},
		note = {
			prefix = 'NOTE_%s_',
			suffix = {'TEXT', 'IMAGE', 'CAT', 'SIZE'},
		},
		tracking = 'Automatic parameter checking is enabled and pages with invalid parameters can be found in the [[%s|tracking category]].',
		create = 'Automatic parameter checking is enabled. Create the [[%s|tracking category]] to track invalid parameters.',
	},
	inactive = 'This project has been identified as %s. Please see [[WP:INACTIVEWP]] for more information. To reactivate this project, change <code>inactive</code> on the first line to <code>main</code>.'
 }
 local auto_doc_cfg = {
	lead = 'This is the WikiProject banner template used by %s to keep track of articles within its scope.',
	main_cat = 'All articles are categorised into [[:Category:%s]].',
	attention = 'set _PARAMETER|yes_ if the article needs immediate attention from experienced editors. Use only if another parameter does not cover the need for attention; this should be used sparingly. It is strongly encouraged to also add a section to the talk page explaining what needs attention. This parameter populates [[:Category:%s]].',
	auto = 'this parameter is for the use of [[Wikipedia:Bots|bots]] and indicates that the article has been [[Wikipedia:Types of bots#WikiProject tagging and auto-assessment bots|automatically rated]]:\n'
		.. '*length – based on the length of the article;\n'
		.. '*inherit – because one or more other projects use this class;\n'
		.. '*yes or stub (in conjunction with <code>|class=stub</code>) – as Stub-Class because it uses a [[Wikipedia:Stub|stub template]].\n'
		.. 'Use of the above values with this parameter populates [[:Category:%s]].',
	category = {
		list = 'general',
		text = 'set _PARAMETER|no_ if, and only if, a banner is being used for demonstration or testing purposes, to prevent unnecessary or undesirable categorization. Otherwise, omit this parameter.',
		description = 'Set to no to display the banner without any categories. For testing or demo purposes; should not be used in articles.',
		suggestedvalues = {'no'},
		alwaysShow = true
	},
	image_needed = {
		text = 'to request that %s be [[Wikipedia:Uploading images|added]] to the page.',
		location = 'specify the location of the requested image. Will be categorised into Category:Wikipedia requested %ss in LOCATION, where LOCATION is the value of the _PARAMETER_ paramater.',
		details = 'additional text to insert before the words \"be [[Wikipedia:Uploading images|added]] to this article\" to describe the subject or type of image that is requested.',
		topic = 'specify the topic of the requested image. Will be categorised into Category:Wikipedia requested %ss of TOPIC, where TOPIC is the value of the _PARAMETER_ parameter.',
		_type = 'overrides the default text (%s); also used to categorise the request.',
		default = 'If no %s is specified then [[:Category:%s]] is used by default.'
	},
	importance = {
		list = 'general',
		text = 'see [[#Importance assessment]] below.',
		description = 'Assess the importance or priority of the article to the WikiProject',
		example = 'low',
		suggested = true,
		suggestedvalues = {'Low', 'Mid', 'High', 'Top', 'NA'},
		isBasic = true,
		heading = 'Importance assessment',
		standard = 'This project uses the standard importance scale. Valid values are shown below.',
		_table = {
			_input = 'Input<br>(not case sensitive)',
			importance = 'Importance',
			category = 'Category',
			population = 'Population',
		},
		classes = {'Top', 'High', 'Mid', 'Low', 'NA'}
	},
	infobox = 'set _PARAMETER|yes_ if the article needs an [[Wikipedia:Manual of Style/Infoboxes|infobox]]. Remember that infoboxes are not suitable for all articles, and can overwhelm short articles. This parameter populates [[:Category:%s]].',
	listas = {
		list = 'deprecated',
		text = 'this parameter should be used with the banner shell template, not on individual project banners. Please see [[Template:WikiProject banner shell]] for details.',
		description = 'Define a sort key, mainly for biographical articles, so that the page is sorted under the surname rather than the first name.',
		example = 'Smith, John',
		isFull = false
	},
	note = {
		yes_no = 'set _PARAMETER|yes_ or any non-blank value other than "no", "n" or "0". ',
		text = 'The following message will be displayed: "%s"',
		category = 'This will populate [[:Category:%s]].'
	},
	portal_selected = {
		-- 'selected' can be replaced with a link in the format of [[Portal:{{{portal1-name}}}/{{{portal1-link}}}|selected]] if a link is given
		text = 'This article has been selected for use on the [[Portal:%s|%s portal]].',
		image = 'Portal-puzzle.svg',
	},
	class = {
		list = 'deprecated',
		text = 'this parameter should be used with the banner shell template, not on individual project banners. See [[#Quality assessment]] below.',
		description = 'Assess the quality of the article. Please add this parameter to the banner shell instead.',
		example = 'C',
		deprecated = true,
		suggestedvalues = {'Stub', 'Start', 'C', 'B', 'A', 'List', 'GA', 'FA', 'FL'},
		isFull = false
	},
	quality = {
		heading = 'Quality assessment',
		custom = 'This project has opted to use custom quality criteria. See the %s for details.',
		default = 'This project uses %s. Valid values are shown below.',
		class_parameter = 'Classification based on class parameter',
		_table = {
			_input = 'Input<br>(not case sensitive)',
			icon = 'Icon',
			class = 'Class',
			category = 'Category',
			population = 'Population',
			namespace = 'Namespace'
		},
		classes = {'FA', 'A', 'GA', 'B', 'C', 'Start', 'Stub', 'FL', 'List'},
		extended = {'File', 'Draft', 'Category', 'Disambig', 'Portal', 'Redirect', 'Template', 'FM'},
		redirect = 'Classification of redirects and disambiguation pages',
		redirects = 'Redirects will automatically be classified as %s-class and placed in %s.',
		dabs = 'Disambiguation pages will automatically be classified as %s-class and placed in %s.',
		not_defined = 'If the <code>|class=</code> parameter is not defined and the WikiProject banner is placed on the talk page of a redirect (in any namespace) or disambigation page then it will automatically be classified as follows:',
		namespace = 'Classification based on namespace',
		deduced = 'In addition, if <code>|class=</code> is empty, undefined or unrecognized, then the class will be deduced from the namespace of the page when possible.',
		other = 'In all other circumstances, articles will be classed as <i>Unassessed</i> and placed in [[:Category:Unassessed %s]].'
	},	
	task_force = {
		yes_no = 'set _PARAMETER|yes_ if the article is supported by [[%s|%s]]. ',
		category = 'This parameter populates [[:Category:%s]]. ',
		class = 'This parameter populates the relevant subcategory of [[:Category:%s by quality]] based on the <code>|%s=</code> parameter. ',
		importance = 'This parameter sets the importance of the article according to %s. It populates the relevant subcategory of [[:Category:%s by importance]]. See [[#Importance assessment]] for valid values.'
	},
	usage_basic = 'Place this on the talk page of relevant articles:',
	usage_full = 'It is usual to remove any unused parameters from the template call.',
 }

 p.templatepage = function(args, raw_args, inactive_status)
 local wikilink = function(link, display)
	if link then
		return display and '[['..link..'|'..display..']]' or '[['..link..']]'
	else
		return display or ''
	end
 end
 ---------------------------
 -- Initialise variables ---
 ---------------------------
 local cfg = mw.loadData('Module:WikiProject banner/config' .. (sandbox or ''))
 local cfg_tp = template_page_cfg -- convenient shortcut for template_page configuration settings
 local lang = mw.language.getContentLanguage()
 local current_page = mw.title.getCurrentTitle()
 local on_sandbox = lang:lc(current_page.subpageText)=='sandbox' -- on sandbox subpage
	or current_page.namespace==2 -- in User namespace
	or current_page.rootText=='WPBannerMeta' -- subpage of Template:WPBannerMeta
 local frame = mw.getCurrentFrame()
 local parameter_format = function(parameter, value)
	local code = parameter and mw.html.create('code')
		:addClass('tpl-para')
			:css('word-break', 'break-word') --TODO: add to css page
			:wikitext('|' .. parameter .. '=' .. (value or ''))
			:done()
	return tostring(code)
 end
 local yesno = require('Module:Yesno')
 local messageBox = require('Module:Message box').main
 local project = args.PROJECT or ''
 local banner_name = mw.title.new(args.BANNER_NAME or 'Template:WikiProject ' .. project)
 local project_name = args.PROJECT_NAME or 'WikiProject ' .. project
 local notices, tracking_cats = {}, {}
 local add_tracking = function(tracking, show_on_sandbox)
	local category = tracking.category or cfg_tp.default_tracking -- uses [[Category:WikiProject banners with errors]] by default
	local key = tracking.sort_key or (project~='' and project or '*') -- sort key defaults to name of project
	if not on_sandbox or show_on_sandbox then
		table.insert(tracking_cats, wikilink('Category:' .. category, key))
	end
 end
 local project_link = args.PROJECT_LINK or 'Wikipedia:WikiProject ' .. project
 ---------------------------
 -- Count notes/taskforces -
 ---------------------------
 local task_forces, notes, taskforce_categories = {}, {}, {}
 for arg_name, _ in pairs(raw_args) do
	local tf_match = mw.ustring.match(arg_name,'^tf (%d+)$')
	if tf_match then
		table.insert(task_forces, tf_match)
	end
	local tf, cat = mw.ustring.match(arg_name,'^tf (%d+) cat (%d+)$')
	if tf then
		if not taskforce_categories[tf] then-- initialise table
			taskforce_categories[tf] = {}
		end
		table.insert(taskforce_categories[tf], cat)
	end
	local note_match = mw.ustring.match(arg_name,'^note (%d+)$')
	if note_match then
		table.insert(notes, note_match)
	end
 end
 table.sort(task_forces, function (x, y) return tonumber(x) < tonumber(y) end)
 table.sort(notes, function (x, y) return tonumber(x) < tonumber(y) end)
 ---------------------------
 -- Demonstrative banner ---
 ---------------------------
 args.PROJECT = args.PROJECT or ''
 args.class = raw_args.class and not inactive_status and 'C'
 args.importance = raw_args.importance and 'High'
 args.priority = raw_args.priority and 'High'
 args.auto = raw_args.auto and 'inherit'
 args.attention = raw_args.attention and 'yes'
 args.infobox = raw_args.infobox and 'yes'
 args.b1 = raw_args.b1 and 'yes'
 args.b2 = raw_args.b2 and 'no'
 args.b3 = raw_args.b3 and 'foo'
 args.b4 = raw_args.b4 and 'yes'
 args.b5 = raw_args.b5 and 'na'
 args.b6 = raw_args.b6
 args['image-needed'] = raw_args['image-needed'] and 'yes'
 args['collaboration-candidate'] = raw_args['collaboration-candidate'] and 'yes'
 args['collaboration-current'] = raw_args['collaboration-current'] and 'yes'
 args['collaboration-past'] = raw_args['collaboration-past'] and 'yes'
 args['a class'] = raw_args['a class'] and 'current'
 args['peer review'] = raw_args['peer review'] and 'yes'
 args['old peer review'] = raw_args['old peer review'] and 'yes'
 for _, tf in ipairs(task_forces) do
	args['tf '..tf] = 'yes'
	if raw_args['tf '..tf..' importance'] then
		args['tf '..tf..' importance'] = 'Top'
	end
 end
 for _, note in ipairs(notes) do
	local text_arg = args['NOTE_'..note..'_TEXT']
	if text_arg and text_arg~='' then
		args['note '..note] = 'yes'
	end
 end
 local demo_banner, note_count, tf_count, assessment_link = require('Module:WikiProject banner' .. (sandbox or ''))._main(args, args, true, banner_name)
 if not assessment_link then --temporary code until main module updated
	assessment_link = args.ASSESSMENT_LINK
 end
 if not assessment_link then
	local project_link = mw.title.new(args.PROJECT_LINK or 'Wikipedia:' .. project_name)
	local fallback = mw.title.new(project_link.prefixedText .. '/Assessment')
	assessment_link = fallback.exists and fallback.prefixedText
 elseif assessment_link=='no' then
	assessment_link = nil
 end
 ---------------------------
 -- Project status ---------
 ---------------------------
 if inactive_status then
	table.insert(notices, cfg_tp.inactive:format(inactive_status))
 end
 ---------------------------
 -- Quality criteria -------
 ---------------------------
 local custom_mask = banner_name:subPageTitle('class')
 if args.QUALITY_CRITERIA=='custom' then
	add_tracking(cfg_tp.quality_criteria.custom_tracking)
	if custom_mask.exists and #custom_mask:getContent()>1 then
		table.insert(notices, cfg_tp.quality_criteria.custom:format(
			custom_mask.prefixedText
		))
	else
		table.insert(notices, string.format(
			cfg_tp.quality_criteria.missing,
			parameter_format('QUALITY_CRITERIA'),
			custom_mask.prefixedText
		))
	end
 end
 ---------------------------
 -- Custom importance mask -
 ---------------------------
 local custom_mask = banner_name:subPageTitle('importance')
 if args.IMPORTANCE_SCALE=='subpage' then
	if custom_mask.exists and #custom_mask:getContent()>1 then
		table.insert(notices, string.format(
			cfg_tp.custom_importance_mask.in_use,
			custom_mask.prefixedText
		))
	else
		table.insert(notices, string.format(
			cfg_tp.custom_importance_mask.missing,
			parameter_format('IMPORTANCE_SCALE'),
			custom_mask.prefixedText
		))
	end
 elseif custom_mask.exists and #custom_mask:getContent()>1 then
	table.insert(notices, string.format(
		cfg_tp.custom_importance_mask.unused,
		custom_mask.prefixedText,
		parameter_format('IMPORTANCE_SCALE','subpage')
	))
 end
 ---------------------------
 -- Collapsed sections -----
 ---------------------------
 local more_than = function(n)
	return n>=2 and string.format(cfg_tp.more_than.more, tostring(n))
		or n==1 and cfg_tp.more_than.one
		or n==0 and cfg_tp.more_than.zero
 end
 local tf_threshold = tonumber(args.TF_COLLAPSE) or (args.TF_HEADER and cfg.task_force.lower_threshold) or cfg.task_force.upper_threshold
 if tf_count > tf_threshold then
	table.insert(notices, string.format(
		cfg_tp.task_force.collapsing,
		tf_count,
		more_than(tf_threshold),
		parameter_format('TF_COLLAPSE')
	))
 end
 local note_threshold = tonumber(args.COLLAPSED) or 2
 local hook_collapsed
 if args.HOOK_COLLAPSED then
	local success, result = pcall(mw.ext.ParserFunctions.expr, args.HOOK_COLLAPSED)
	hook_collapsed = success and tonumber(result) or nil
	if args.HOOK_COLLAPSED=='auto' then
		hook_collapsed = args.HOOK_NOTE and 1 or 0 -- default assumption is that HOOK_NOTE produces max one note
	end
 end
 if note_count > note_threshold then
	table.insert(notices, string.format(
		cfg_tp.note.collapsing,
		note_count,
		more_than(note_threshold),
		parameter_format('COLLAPSED')
	))
 end
 if args.HOOK_NOTE then
	if not hook_collapsed then
		table.insert(notices, string.format(
			cfg_tp.note.counter,
			parameter_format('HOOK_NOTE'),
			parameter_format('HOOK_COLLAPSED')
		))
		add_tracking(cfg_tp.note.tracking)
	end
 end
 ---------------------------
 -- Assessment link --------
 ---------------------------
 if raw_args.class or raw_args.importance then
	local url = mw.uri.fullUrl(banner_name.prefixedText,{
		action = 'edit',
		summary = cfg_tp.assessment_link.edit_summary
	})
	if args.ASSESSMENT_LINK then
		if not mw.title.new(args.ASSESSMENT_LINK).exists then
			table.insert(notices, string.format(
				cfg_tp.assessment_link.missing,
				wikilink(args.ASSESSMENT_LINK),
				tostring(url),
				parameter_format('ASSESSMENT_LINK')
			))
		end
	end
 end
 ---------------------------
 -- Project parameter ------
 ---------------------------
 if args.PROJECT=='' then
	table.insert(notices, cfg_tp.project.text)
	add_tracking(cfg_tp.project.tracking)
 end
 ---------------------------
 -- Subst check ------------
 ---------------------------
 if not raw_args.substcheck then
	table.insert(notices, string.format(
		cfg_tp.substcheck.text,
		parameter_format('substcheck')
	))
	add_tracking(cfg_tp.substcheck.tracking)
 end
 ---------------------------
 -- Portal link ------------
 ---------------------------
 if args.PORTAL then
	local portal_image = require('Module:Portal')._image(args.PORTAL)
	local portal_link = mw.title.new('Portal:' .. args.PORTAL)
	local explain
	if portal_link and portal_link.exists then
		if portal_image=='Portal-puzzle.svg' then
			explain = string.format(cfg_tp.portal.no_image, cfg_tp.portal.instructions)
		else
			explain = string.format(
				cfg_tp.portal.image_link,
				wikilink(':File:' .. portal_image),
				cfg_tp.portal.instructions
			)
		end
	else
		explain = string.format(cfg_tp.portal.missing, parameter_format('PORTAL'))
		add_tracking(cfg_tp.portal.tracking)
	end
	local text = string.format(
		cfg_tp.portal.text,
		portal_link.prefixedText,
		explain
	)
	table.insert(notices, text)
 end
 ---------------------------
 -- Task forces ------------
 ---------------------------
 for _, k in ipairs(task_forces) do
	local name_parameter = 'TF_'..k..'_NAME'
	if raw_args['tf '..k] and not args['TF_'..k..'_NAME'] then
		table.insert(notices, string.format(
			cfg_tp.task_force.text,
			parameter_format('TF_'..k..'_NAME')
		))
		add_tracking(cfg_tp.task_force.tracking)
	end
 end
 ---------------------------
 -- Parameter checking -----
 ---------------------------
 if not inactive_status then
	local category = mw.title.new(cfg.unknown_parameters.tracking:format(project_name))
	local text = string.format(
		category.exists and cfg_tp.parameters.tracking or cfg_tp.parameters.create,
		':' .. category.fullText
	)
	table.insert(notices, text)
 end
 ---------------------------
 -- Assessment categories --
 ---------------------------
 local importance_name = args.IMPN or (raw_args.priority and 'priority' or cfg.importance.default_name)
 local check_assessment_categories = function(project, assessment_cat, quality, importance_scale, prefix, tf_name)
	local cat = (assessment_cat and assessment_cat:gsub(' articles', '') or project or '') -- strip "articles" from assessment category
	local missing_cats = {}
	local red_cats_in_use = false
	local check_cat = function(cat_name, _preload)
		local category = mw.title.new('Category:' .. cat_name)
		if not category.exists then
			local url = mw.uri.fullUrl('Category:' .. cat_name, {
				action = 'edit',
				preload = _preload,
				editintro = cfg_tp.check_assessment.editintro,
				preview = 'no',
				summary = cfg_tp.check_assessment.create_summary,
				['preloadparams[1]'] = project,
				['preloadparams[2]'] = mw.ustring.gsub(cat, ' articles', '') -- needs simplifying
			})
			local pages_in_category = mw.site.stats.pagesInCategory(cat_name, 'pages')
			if pages_in_category>0 then
				red_cats_in_use = true
			end
			local label = pages_in_category>0 and '<b>create</b>' or 'create'
			local create_link = wikilink(':' .. category.prefixedText) .. ' &ndash; ([' .. tostring(url) .. ' ' .. label .. '])'
			table.insert(missing_cats, create_link)
		end
	end
	if quality then
		check_cat(lang:ucfirst(cat) .. ' articles by quality', cfg_tp.check_assessment.meta_preload)
		for _, class in ipairs(cfg_tp.check_assessment.classes) do
			local cat_name = (class=='Unassessed' and 'Unassessed' or class..'-Class') .. ' ' .. cat .. ' ' .. (class=='NA' and 'pages' or 'articles')
			check_cat(cat_name, cfg_tp.check_assessment.quality_preload)
		end
	end
	if importance_scale and importance_scale~='inline' and importance_scale~='subpage' then
		check_cat(lang:ucfirst(cat) .. ' articles by ' .. importance_name, cfg_tp.check_assessment.meta_preload)
		for _, importance in ipairs(cfg_tp.check_assessment.importances) do
			local cat_name = importance .. '-' .. importance_name .. ' ' .. cat .. ' ' .. (importance=='NA' and 'pages' or 'articles')
			check_cat(cat_name, cfg_tp.check_assessment.importance_preload)
		end
	end
	if #missing_cats>0 then
		local intro = string.format(
			cfg_tp.check_assessment.text,
			tf_name or project or '',
			parameter_format((prefix or '') .. cfg_tp.check_assessment.parameter_suffix)
		)
		local list = mw.html.create('ul')
		for _, missing in ipairs(missing_cats) do
			list:tag('li')
				:wikitext(missing)
				:done()
		end
		list:done()
		if red_cats_in_use then
			add_tracking(cfg_tp.check_assessment.tracking)
		end
		return messageBox('ombox', {
			type = 'content',
			image = '[[File:' .. cfg_tp.check_assessment.icon .. '|50px]]',
			text = intro .. tostring(list)
		})
	end
	return ''
 end
 local missing_cats, warnings = {}, {}
 local red_other_cats_in_use = false
 local check_other_category = function(cat_name)
	if cat_name and cat_name~='none' then
		local category = mw.title.new('Category:' .. (cat_name or ''))
		if category and not category.exists then
			local pages_in_category = mw.site.stats.pagesInCategory(cat_name, 'pages')
			if pages_in_category>0 then
				red_other_cats_in_use = true
			end
			table.insert(missing_cats, wikilink(':' .. category.prefixedText))
		end
	end
 end
 table.insert(warnings, check_assessment_categories(
	project,
	args.ASSESSMENT_CAT,
	raw_args.class and args.QUALITY_CRITERIA~='custom',
	(raw_args.importance or raw_args.priority) and (args.IMPORTANCE_SCALE or '')
 ))
 local ntf, check_task_forces = #task_forces, {}
 if ntf>10 then -- too many task forces to check all, so check a selection instead
	local used = {}
	math.randomseed(os.time())
	for i = 1, 10 do
		local new
		repeat
			new = math.random(ntf)
		until not used[new]
		table.insert(check_task_forces, task_forces[new])
		used[new] = true
	end
	table.sort(check_task_forces, function (x, y) return tonumber(x) < tonumber(y) end)
	table.insert(notices, string.format(cfg_tp.check_assessment.too_many, table.concat(check_task_forces,', ')))
 else
	check_task_forces = task_forces
 end
 for _, k in ipairs(check_task_forces) do
	local tf_prefix = 'TF_' .. k .. '_'
	table.insert(warnings, check_assessment_categories(
		project,
		args[tf_prefix..'ASSESSMENT_CAT'] or (args[tf_prefix..'NAME'] or '')..' articles',
		raw_args.class and yesno(args[tf_prefix..'QUALITY']) and args.QUALITY_CRITERIA~='custom',
		raw_args['tf '..k..' importance'] and (args.IMPORTANCE_SCALE or ''),
		tf_prefix,
		args[tf_prefix..'NAME']
	))
	check_other_category(args[tf_prefix .. 'MAIN_CAT'])
	for _, p in ipairs(taskforce_categories[k] or {}) do
		check_other_category(args[tf_prefix .. 'CAT_' .. p])
	end
 end
 ---------------------------
 -- Template categories ----
 ---------------------------
 local pagetype_module = require('Module:Pagetype')._main
 local pagetype = function(title)
	return pagetype_module{page = title.fullText}
 end

 if on_sandbox then
	add_tracking(cfg_tp.template_categories.sandbox, true)
 elseif inactive_status then
	add_tracking(cfg_tp.template_categories.inactive)
 else
	if raw_args.class then
		add_tracking(cfg_tp.template_categories.with_quality)
	else
		add_tracking(cfg_tp.template_categories.without_quality)
	end
	if (args.PROJECT_NAME=='WikiProject '..project or not args.PROJECT_NAME) and current_page.rootPageTitle.prefixedText~='Template:WikiProject ' .. project then
		add_tracking(cfg_tp.template_categories.non_standard)
	end

	-- List of categories to check. Should probably have a one consistent style.
	local category_suffixes = {
		project_name .. "-related templates",
		'Wikipedia-' .. project_name .. ' collaboration templates',
		'Wikipedia-' .. project_name .. ' collaboration',
		project_name .. ' templates',
		project_name,
	}

	-- Check each category
	local found = false
	for _, suffix in ipairs(category_suffixes) do
		local category_title = mw.title.new('Category:' .. suffix)
		if category_title.exists and pagetype(category_title) ~= 'redirect' then
			table.insert(tracking_cats, wikilink(category_title.fullText, '*'))
			found = true
			break
		end
	end
 end
 ---------------------------
 -- Check parameters -------
 ---------------------------
 local parameters = {}
 local append_table = function(source)
	for _, v in ipairs(source) do
		table.insert(parameters, v)
	end
 end
 append_table(cfg_tp.parameters.parameters)
 for _, k in ipairs(task_forces) do
	local task_force_parameters = {'tf '..k, 'tf '..k..' importance'}
	local prefix = string.format(cfg_tp.parameters.taskforce.prefix, k) 
	for _, p in ipairs(cfg_tp.parameters.taskforce.suffix) do
		table.insert(task_force_parameters, prefix .. p)
	end
	for _, p in ipairs(taskforce_categories[k] or {}) do
		table.insert(task_force_parameters, 'tf ' .. k .. ' cat ' .. p)
		table.insert(task_force_parameters, prefix .. 'CAT_' .. p)
	end
	append_table(task_force_parameters)
 end
 for _, k in ipairs(notes) do
	local note_parameters = {'note '..k}
	local prefix = string.format(cfg_tp.parameters.note.prefix, k)
	for _, p in ipairs(cfg_tp.parameters.note.suffix) do
		table.insert(note_parameters, prefix .. p)
	end
	append_table(note_parameters)
	check_other_category(args[prefix .. 'CAT'])
 end
 for _, set in ipairs(cfg_tp.parameters.extra) do
	local allow_parameters = false
	if set.trigger then
		table.insert(parameters, set.trigger)
		allow_parameters = raw_args[set.trigger] and true
	elseif set.triggers then
		append_table(set.triggers)
		for _, trig in ipairs(set.triggers) do
			if raw_args[trig] then
				allow_parameters = true
			end
		end
	end
	if allow_parameters then
		append_table(set.parameters)
		if set.categories then
			append_table(set.categories)
			for _, cat in ipairs(set.categories) do
				check_other_category(args[cat])
			end
		end
	end
 end
 parameters.preview = cfg_tp.parameters.preview
 parameters.unknown = on_sandbox and '' or cfg_tp.parameters.category
 local parameter_check = current_page.rootPageTitle.text=='WikiProject Military history' and ''
	or require('Module:Check for unknown parameters')._check(parameters, raw_args)
 ---------------------------
 -- Other categories -------
 ---------------------------
 if raw_args.attention then
	local attention_cat = args.ATTENTION_CAT or string.format(cfg.attention.default_cat, project)
	check_other_category(attention_cat)
 end
 if raw_args.infobox then
	local infobox_cat = args.INFOBOX_CAT or string.format(cfg.infobox.default_cat, project)
	check_other_category(infobox_cat)
 end
 if raw_args.auto then
	local auto_cat = args.AUTO_ASSESS_CAT or string.format(cfg.auto.default_cat, project)
	check_other_category(auto_cat)
 end
 check_other_category(args.MAIN_CAT)
 if #missing_cats>0 then
	local list = mw.html.create('ul')
	for _, missing in ipairs(missing_cats) do
		list:tag('li')
			:wikitext(missing)
			:done()
	end
	list:done()
	table.insert(warnings, messageBox('ombox', {
		type = 'content',
		image = '[[File:' .. cfg_tp.check_other.icon .. '|50px]]',
		text = cfg_tp.check_other.text .. tostring(list)
	}))
	if red_other_cats_in_use then
		add_tracking(cfg_tp.check_other.tracking)
	end
 end
 ---------------------------
 -- Produce notices --------
 ---------------------------
 local notice_html, notice_list
 if #notices>=1 then
	notice_html = mw.html.create('ul')
	for _, notice in ipairs(notices) do
		notice_html:tag('li')
			:wikitext(notice)
			:done()
	end
	notice_list = ' ' .. cfg_tp.notice_text .. tostring(notice_html)
 end
 local info = messageBox('ombox', {
	type = 'notice',
	image = '[[File:Icon tools.svg|50px]]',
	text = cfg_tp.info .. (notice_list or '')
 })
 ---------------------------
 -- Auto documentation -----
 ---------------------------
 local td_params, auto_doc, parameter_name = {}, {}, {}
 local basic, full, parameter_used, param = {}, {}, {}, {}
 local ad_cfg = auto_doc_cfg
 local class_module = require('Module:Class')
 local template_code = mw.title.getCurrentTitle():getContent()
 local transclusion_count = require('Module:Transclusion count').fetch{args={}}
 if transclusion_count and transclusion_count~='' then
	local high_use = frame:expandTemplate{title='Template:High-use'}
	table.insert(auto_doc, high_use)
 end
 for _, parameter in pairs(parameters) do
	parameter_name[parameter] = string.match(
		template_code,
		'%|%s*' .. parameter:gsub('%-','%%%-') .. '%s*=%s*{{{([^|}]*)'
	)
 end
 local addTitle = function(title, level, section)
	local hl = 'h' .. tostring(level or 2)
	local _table = section or auto_doc
	table.insert(_table, tostring(mw.html.create(hl):wikitext(title)) .. '\n')
 end
 local parameter_description = function(parameter, options)
 -- This function produces a bullet point with information about using a parameter.
 -- It also adds an entry to the TemplateData so that tools like TemplateWizard and Rater operate correctly. Parameters:
 -- positional parameter = the name of the parameter, e.g. note 1. This will be mapped to the name of the actual parameter used by the template.
 -- options = table of options
	-- text = text to display to explain how the parameter is used
	-- list = which list should the bullet point be added to, e.g. 'general', 'notes' or 'task_forces'
	-- isBasic = set to true to include the parameter in the list of basic parameters
	-- isFull = set to false to exclude the parameter from the full list of parameters
	-- alwaysShow = set to true to always show this bullet point, even if the parameter is not found in the template's code, e.g. for the category parameter
	-- any other options to send to TemplateData, e.g. label, description, type, suggested, autovalue, default, required. See TemplateData documentation for details.
	local option = options or ad_cfg[parameter]
	local p_name = parameter_name[parameter]
	if not p_name and option.alwaysShow then
		p_name = parameter
	end
	if p_name then
		if not parameter_used[p_name] then
			local syntax = '|' .. p_name .. '= '
			if option.isBasic then
				table.insert(basic, syntax)
			end
			if not (option.isFull==false) then
				table.insert(full, syntax)
				td_params[p_name] = {
					label = option.label or option.p_name,
					['type'] = option.type or 'line', -- use line type unless specified
					example = option.example,
					description = option.description or option.text,
					suggestedvalues = option.suggestedvalues,
					suggested = option.suggested,
					deprecated = option.deprecated,
					autovalue = option.autovalue,
					default = option.default,
					required = option.required
				}
			end
			parameter_used[p_name] = true
		end
		local parsed_text = option.text
			:gsub('_PARAMETER_', parameter_format(p_name))
			:gsub('_PARAMETER%|?(%a*)_', parameter_format(p_name, '%1'))
			:gsub('_PAGETYPE_', 'article')
		local desc = '<b>' .. p_name .. '</b> – ' .. parsed_text
		local new_item = mw.html.create('li'):wikitext(desc)
		if param[option.list] then
			table.insert(param[option.list], new_item)
		else
			param[option.list] = {new_item}
		end
	end
 end
 parameter_description('listas')
 parameter_description('class')
 parameter_description('importance')
 parameter_description('auto', {
	list = 'notes',
	text = ad_cfg.auto:format(args.AUTO_ASSESS_CAT or cfg.auto.default_cat:format(project)),
	description = 'Indicates that the article has been automatically assessed by a bot or other tool.',
	example = 'yes'
 })
 parameter_description('attention', {
	list = 'notes',
	text = ad_cfg.attention:format(args.ATTENTION_CAT or cfg.attention.default_cat:format(project)),
	description = 'Indicates that the article needs immediate attention from experienced editors.',
	example = 'yes'
 })
 parameter_description('infobox', {
	list = 'notes',
	text = ad_cfg.infobox:format(args.INFOBOX_CAT or cfg.infobox.default_cat:format(project)),
	description = 'Indicates that the article needs an infobox.',
	example = 'yes'
 })
 if raw_args['image-needed'] then
	parameter_description('image-needed', {
		list = 'notes',
		text = ad_cfg.image_needed.text:format(args['image-type'] or cfg.image_needed.default_type)
	})
	parameter_description('image-type', {
		list = 'notes',
		text = ad_cfg.image_needed._type:format(cfg.image_needed.default_type)
	})
	parameter_description('image-details', {
		 list = 'notes',
		 text = ad_cfg.image_needed.details
	})
	local loc_cat = args.IM_LOCATION_CATEGORY
		and (' ' .. ad_cfg.image_needed.default:format('location', args.IM_LOCATION_CATEGORY))
		or ''
	parameter_description('image-location', {
		list = 'notes',
		text = ad_cfg.image_needed.location:format(args['image-type'] or 'photograph') .. loc_cat
	})
	local topic_cat = args.IM_TOPIC_CATEGORY
		and (' ' .. ad_cfg.image_needed.default:format('topic', args.IM_TOPIC_CATEGORY))
		or ''
	parameter_description('image-topic', {
		list = 'notes',
		text = ad_cfg.image_needed.topic:format(args['image-type'] or 'photograph') .. topic_cat,
	})
 end
 for _, k in ipairs(notes) do
	local text = ad_cfg.note.yes_no
	if args['NOTE_'..k..'_TEXT'] then
		text = text .. ad_cfg.note.text:format(args['NOTE_'..k..'_TEXT'])
	end
	if args['NOTE_'..k..'_CAT'] then
		text = text .. ' ' .. ad_cfg.note.category:format(args['NOTE_'..k..'_CAT'])
	end
	parameter_description('note '..k, {
		list = 'notes',
		text = text,
		description = 'Triggers a custom note in the banner.',
		example = 'yes',
		suggestedvalues = {'yes', 'no'}
	})
 end
 for _, k in ipairs(task_forces) do
	local tf_imp_name = raw_args['tf ' .. k .. ' importance'] and parameter_name['tf ' .. k .. ' importance']
	local prefix = 'TF_' .. k .. '_'
	local text = ad_cfg.task_force.yes_no:format(
		args[prefix..'LINK'] or '',
		args[prefix..'NAME'] or ''
	)
	if args[prefix..'MAIN_CAT'] then
		text = text .. ' ' .. ad_cfg.task_force.category:format(args[prefix..'MAIN_CAT'])
	end
	if yesno(args[prefix..'QUALITY']) and args[prefix..'ASSESSMENT_CAT'] then
		text = text .. ' ' .. ad_cfg.task_force.class:format(
			args[prefix..'ASSESSMENT_CAT'],
			'class'
		)
	end
	parameter_description('tf ' .. k, {
		list = 'task_forces',
		text = text,
		description = 'Triggers ' .. (args[prefix..'NAME'] or 'a custom task force') .. ' in the banner.',
		example = 'yes',
		suggestedvalues = {'yes', 'no'}
	})
	if tf_imp_name and args[prefix..'ASSESSMENT_CAT'] then
		local imp_text = ad_cfg.task_force.importance:format(
			args[prefix..'NAME'] or 'the task force',
			args[prefix..'ASSESSMENT_CAT']
		)
		parameter_description('tf ' .. k .. ' importance', {
			list = 'task_forces',
			text = imp_text,
			description = 'Set the importance for ' .. (args[prefix..'NAME'] or 'the task force'),
			example = 'low',
			suggestedvalues = {'top', 'high', 'mid', 'low', 'NA'}
		})
	end
 end
 parameter_description('category')
 ---------------------------
 -- Quality documentation --
 ---------------------------
 local quality
 local create_heading_row = function(root, headings)
	local heading_row = mw.html.create('tr')
	for _, heading in ipairs(headings) do
		local text = root and root[heading] or heading
		local heading_cell = mw.html.create('th'):wikitext(text)
		heading_row:node(heading_cell)
	end
	return heading_row
 end
 local assessment_cat = (args.ASSESSMENT_CAT and args.ASSESSMENT_CAT:gsub(' articles', '') or project or '') -- strip "articles" from assessment categorylocal assessment_cat = args.ASSESSMENT_CAT or project .. ' articles'
 if raw_args.class then
	quality = {}
	local text
	if args.QUALITY_CRITERIA=='custom' and assessment_link then
		local scale = cfg.quality.project_scale:format(wikilink(assessment_link..'#'..lang:ucfirst(cfg.quality.name), cfg.quality.name))
		text = ad_cfg.quality.custom:format(scale)
	else
		text = ad_cfg.quality.default:format(cfg.quality.default_scale)
	end
	table.insert(quality, text)
	local exists = {}
	addTitle(ad_cfg.quality.class_parameter, 3, quality)
	local add_row = function(option)
		local pages = ' ' .. (option.article and 'articles' or 'pages')
		local rowspan = option.rowspan or 1
		local cat = option.class .. '-Class ' .. assessment_cat .. pages
		local col1 = mw.html.create('th')
			:wikitext(option.input or option.class)
		local col2 = mw.html.create('td')
			:attr('rowspan', rowspan)
			:css('text-align', 'center')
			:wikitext(class_module.icon{option.class})
		local col3 = class_module._class{
			option.class,
			category = assessment_cat .. pages,
			image = 'no',
			rowspan = rowspan
		}
		local col4 = mw.html.create('td')
			:attr('rowspan', rowspan)
			:wikitext(wikilink(':Category:' .. cat))
		local col5 = mw.html.create('td')
			:attr('rowspan', rowspan)
			:css('text-align', 'right')
			:wikitext(lang:formatNum(mw.site.stats.pagesInCategory(cat)))
		return mw.html.create('tr'):node(col1):node(col2):node(col3):node(col4):node(col5)
	end
	local class_table = mw.html.create('table')
		:addClass('wikitable')
		:node(create_heading_row(ad_cfg.quality._table, {'_input', 'icon', 'class', 'category', 'population'}))
	for _, class in ipairs(ad_cfg.quality.classes) do
		class_table:node(add_row{class=class, article=true})
	end
	table.insert(quality, tostring(class_table))
	for _, class in ipairs(ad_cfg.quality.extended) do
		local cat = mw.title.new('Category:' .. class .. '-Class ' .. assessment_cat .. ' pages')
		if cat.exists and #cat:getContent()>1 then
			exists[class] = true
		end
	end
	addTitle(ad_cfg.quality.redirect, 3, quality)
	local redirects = ad_cfg.quality.redirects:format(
		exists.Redirect and 'Redirect' or 'NA',
		wikilink(':Category:' .. (exists.Redirect and 'Redirect' or 'NA') .. '-Class ' .. assessment_cat .. ' pages')
	)
	local dabs = ad_cfg.quality.dabs:format(
		exists.Disambig and 'Disambig' or 'NA',
		wikilink(':Category:' .. (exists.Disambig and 'Disambig' or 'NA') .. '-Class ' .. assessment_cat .. ' pages')
	)
	table.insert(quality, ad_cfg.quality.not_defined)
	local list = mw.html.create('ul')
		:tag('li')
			:wikitext(redirects)
			:done()
		:tag('li')
			:wikitext(dabs)
			:done()
	table.insert(quality, tostring(list))
	addTitle(ad_cfg.quality.namespace, 3, quality)
	table.insert(quality, ad_cfg.quality.deduced)
	local first_col = function(text)
		return mw.html.create('tr'):tag('th')
			:wikitext(text)
			:done()
	end
	local na_rowspan = 3
		+ (exists.File and 0 or 2)
		+ (exists.Category and 0 or 1)
		+ (exists.Portal and 0 or 1)
		+ (exists.Template and 0 or 2)
		+ (exists.Project and 0 or 1)
		+ (exists.Draft and 0 or 1)
	local namespace_table = mw.html.create('table')
		:addClass('wikitable')
		:node(create_heading_row(ad_cfg.quality._table, {'namespace', 'icon', 'class', 'category', 'population'}))
		:node(add_row{class='NA', input='User talk', rowspan=na_rowspan})
		:node(not exists.File and first_col('File talk'))
		:node(not exists.File and first_col('TimedText talk'))
		:node(not exists.Category and first_col('Category talk'))
		:node(not exists.Portal and first_col('Portal talk'))
		:node(not exists.Template and first_col('Template talk'))
		:node(not exists.Template and first_col('Module talk'))
		:node(not exists.Project and first_col('Project talk'))
		:node(not exists.Draft and first_col('Draft talk'))
		:node(first_col('Help talk'))
		:node(first_col('MediaWiki talk'))
		:node(exists.File and add_row{class='File', input='File talk', rowspan=2})
		:node(exists.File and first_col('TimedText talk'))
		:node(exists.Category and add_row{class='Category', input='Category talk'})
		:node(exists.Portal and add_row{class='Portal', input='Portal talk'})
		:node(exists.Template and add_row{class='Template', input='Template talk', rowspan=2})
		:node(exists.Template and first_col('Module talk'))
		:node(exists.Project and add_row{class='Project', input='Project talk'})
		:node(exists.Draft and add_row{class='Draft', input='Draft talk'})
	table.insert(quality, tostring(namespace_table))
	table.insert(quality, ad_cfg.quality.other:format(assessment_cat .. ' articles'))
 end
 ---------------------------
 -- Importance doc ---------
 ---------------------------
 local importance_doc
 if raw_args.importance and args.IMPORTANCE_SCALE~='inline' and args.IMPORTANCE_SCALE~='subpage' then
	importance_doc = {}
	local imp_doc = ad_cfg.importance
	addTitle(imp_doc.heading, 2, importance_doc)
	table.insert(importance_doc, imp_doc.standard)
	local add_row = function(importance)
		local cat = importance..'-' .. 'importance ' .. assessment_cat
		return mw.html.create('tr')
			:tag('th')
				:wikitext(importance)
				:done()
			:node(frame:expandTemplate{title='Template:Importance', args={importance, category=assessment_cat}})
			:tag('td')
				:wikitext(wikilink(':Category:'..cat))
				:done()
			:tag('td')
				:css('text-align', 'right') --TODO: add to css page
				:wikitext(lang:formatNum(mw.site.stats.pagesInCategory(cat)))
				:done()
	end
	local imp_table = mw.html.create('table')
		:addClass('wikitable')
		:tag('tr')
			:tag('th')
				:wikitext(imp_doc._table._input)
				:done()
			:tag('th')
				:wikitext(imp_doc._table.importance)
				:done()
			:tag('th')
				:wikitext(imp_doc._table.category)
				:done()
			:tag('th')
				:wikitext(imp_doc._table.population)
				:done()
		:done()
	for _, importance in ipairs(imp_doc.classes) do
		imp_table:node(add_row(importance))
	end
	table.insert(importance_doc, tostring(imp_table))
 end
 ---------------------------
 -- Build documentation ----
 ---------------------------
 table.insert(auto_doc, string.format(ad_cfg.lead, wikilink(project_link, project_name)))
 if args.MAIN_CAT then
	table.insert(auto_doc, ' ' .. ad_cfg.main_cat:format(args.MAIN_CAT))
 end
 addTitle('Basic usage', 3)
 table.insert(auto_doc, ad_cfg.usage_basic
	.. frame:extensionTag{
		name = 'syntaxhighlight',
		content = '{{WikiProject banner shell |class= |\n'
			.. '{{' .. banner_name.text .. ' ' .. table.concat(basic) .. '}}\n'
			.. '}}',
		args = {lang = 'wikitext'}
	}
 )
 addTitle('Full usage', 3)
 table.insert(auto_doc, ad_cfg.usage_full
	.. frame:extensionTag{
		name = 'syntaxhighlight',
		content = '{{WikiProject banner shell |class= |listas= |blp= |\n'
			.. '{{' .. banner_name.text .. ' ' .. table.concat(full) .. '}}\n'
			.. '}}',
		args = {lang = 'wikitext'}
	}
 )
 local showSection = function(list, title)
	if param[list] then
		if title then
			addTitle(title, 3)
		end
		local out = mw.html.create('ul')
		for _, v in ipairs(param[list]) do
			out:node(v)
		end
		table.insert(auto_doc, tostring(out:done()))
	end
 end
 addTitle('Parameters')
 showSection('general')
 showSection('notes', 'Notes and alerts')
 showSection('task_forces', 'Task forces')
 showSection('deprecated', 'Deprecated parameters')
 if quality then
	addTitle(ad_cfg.quality.heading)
	table.insert(auto_doc, table.concat(quality))
 end
 if importance_doc then
	table.insert(auto_doc, table.concat(importance_doc))
 end
 ---------------------------
 -- Template data ----------
 ---------------------------
 local template_data = {
	description = 'This template identifies the article as being within scope of ' .. project_name .. '.',
	format = 'inline',
	params = td_params
 }
 if args.DOC=='auto' then
	addTitle('TemplateData', 3)
	table.insert(
		auto_doc,
		frame:extensionTag{
			name = 'templatedata',
			content = mw.text.jsonEncode(template_data)
		}
	)
 end

 local doc = ''
 if args.DOC=='auto' or args.DOC=='auto+custom' then
	local not_documented = {'INHERIT_IMPORTANCE', 'priority', 'IMPN', 'QII_FORMAT', 'collaboration-candidate', 'collaboration-current', 'collaboration-past', 'a class', 'peer review', 'old peer review'}
	local doc_missing = false
	for _, p in ipairs(not_documented) do
		if raw_args[p] then
			doc_missing = p
		end
	end
	if doc_missing then
		add_tracking{
			category = 'WikiProject banner templates using undocumented features',
			sort_key = doc_missing
		}
	end
	doc = require('Module:Documentation').main{content = table.concat(auto_doc)}
 end
 if args.DOC=='custom' or args.DOC=='auto+custom' then
	doc = doc .. require('Module:Documentation').main()
 end

 return parameter_check .. demo_banner .. info .. (inactive_status and '' or table.concat(warnings)) .. table.concat(tracking_cats) .. doc
 end

 return p

AltStyle によって変換されたページ (->オリジナル) /