Module:WikiProject banner/templatepage

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 custom class mask.',

custom_tracking = {category = 'WikiProjects using a non-standard quality scale'},

missing = 'The %s parameter is set to custom but there is no custom class mask held at %s. Therefore the quality scale has been switched off.',

},

custom_importance_mask = {

in_use = 'A custom importance mask is in use.',

missing = 'The %s parameter is set to subpage but there is no custom importance mask held at %s. Therefore the importance scale has been switched off.',

unused = 'The /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 [%s update or remove] 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 substituted project banners has not yet been implemented on this template. Please see the 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 = '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 1.0 Assessment scheme',

_preload = {

root = 'Template:WikiProject banner preload template',

quality = 'quality',

importance = 'importance',

meta = 'meta'

},

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 = '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'}

},

{

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 tracking category.',

create = 'Automatic parameter checking is enabled. Create the 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 inactive on the first line to main.'

}

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 bots and indicates that the article has been 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 |class=stub) – as Stub-Class because it uses a 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 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 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
(not case sensitive)',

importance = 'Importance',

category = 'Category',

population = 'Population',

},

classes = {'Top', 'High', 'Mid', 'Low', 'NA'}

},

infobox = 'set _PARAMETER|yes_ if the article needs an 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 selected if a link is given

text = 'This article has been selected for use on the %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.',

class_parameter = 'Classification based on class parameter',

class_text = 'Classification of articles is made by adding the %s parameter to the banner shell template. Valid values are shown below.',

_table = {

_input = 'Input
(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',

not_defined = 'If 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:',

redirects = 'Redirects will automatically be classified as %s-class and placed in :Category:%s-Class %s pages.',

dabs = 'Disambiguation pages will automatically be classified as %s-class and placed in :Category:%s-Class %s pages.',

namespace = 'Classification based on namespace',

deduced = 'When placed on non-articles, the class will be deduced from the namespace of the page.',

all_na = 'All non-articles are classified as NA-class and will populate :Category:NA-Class %s pages.\n',

other = 'In all other circumstances, articles will be classed as Unassessed and placed in :Category:Unassessed %s.'

},

task_force = {

yes_no = 'set _PARAMETER|yes_ if the article is supported by %s. ',

category = 'This parameter populates :Category:%s. ',

class = 'This parameter populates the relevant subcategory of :Category:%s by quality based on the |%s= 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 ''..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 = cfg_tp.check_assessment._preload.root .. '/' .. _preload,

preview = 'no',

summary = cfg_tp.check_assessment.create_summary,

['preloadparams[1]'] = project

})

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 'create' or 'create'

local create_link = wikilink(':' .. category.prefixedText) .. ' – ([' .. 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._preload.meta)

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._preload.quality)

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._preload.meta)

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._preload.importance)

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 = '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 = '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 = '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 = '' .. p_name .. ' – ' .. 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 category

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, ad_cfg.quality.class_text:format(parameter_format('class')) .. 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',

exists.Redirect and 'Redirect' or 'NA',

assessment_cat

)

local dabs = ad_cfg.quality.dabs:format(

exists.Disambig and 'Disambig' or 'NA',

exists.Disambig and 'Disambig' or 'NA',

assessment_cat

)

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)

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'})

if na_rowspan==11 then -- all non-articles classified as NA, don't bother displaying table

table.insert(quality, ad_cfg.quality.all_na:format(assessment_cat))

else

table.insert(quality, ad_cfg.quality.deduced .. tostring(namespace_table))

end

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 pages = ' ' .. (importance=='NA' and 'pages' or 'articles')

local cat = importance..'-' .. 'importance ' .. assessment_cat .. pages

local col1 = mw.html.create('th'):wikitext(importance)

local col2 = frame:expandTemplate{

title = 'Template:Importance',

args = {importance, category = assessment_cat .. pages}

}

local col3 = mw.html.create('td'):wikitext(wikilink(':Category:' .. cat))

local col4 = mw.html.create('td'):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)

end

local imp_table = mw.html.create('table')

:addClass('wikitable')

:node(create_heading_row(imp_doc._table, {'_input', 'importance', 'category', 'population'}))

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