Module:WikiProject banner/auxiliary
Appearance
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
WikiProject banners |
---|
Module |
Template:WPBannerMeta |
Config |
Styles |
Auxiliary |
templatepage |
Category (errors) |
This Lua module is used on approximately 3,900,000 pages, or roughly 6% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module contains extra functions not frequently used by Module:WikiProject banner to support the following features:
- B-class checklist
- To-do list
- Assessment category intersection
- Image-needed note
- Collaboration note
- A-class review note
- Peer review note
require('strict')
local p = {}
local sandbox-- = '/sandbox'
local cfg = mw.loadData('Module:WikiProject banner/config' .. (sandbox or ''))
local yesno = require('Module:Yesno')
local lang = mw.getLanguage(cfg.language)
p.b_checklist = function(args, raw_args, class, demo, assessment_link)
---------------------------
-- B-class checklist ------
---------------------------
local show_checklist = false
local parameters_used = args.b1 or args.b2 or args.b3 or args.b4 or args.b5 or args.b6
if (class=='B' or class=='C' or class=='BL' or class=='CL')-- always displayed on C or B
or ((class=='Start' or class=='List') and yesno(args.B_DISPLAY_ON_START))-- show on Start/List if option selected
or ((class=='Start' or class=='Stub') and parameters_used) then-- show on Start or Stub if any parameters used
show_checklist = true
end
if show_checklist then
local scale = args.QUALITY_CRITERIA=='custom' and assessment_link and assessment_link..'#'..lang:ucfirst(cfg.quality.name)
or cfg.b_checklist.default_scale
local text = cfg.b_checklist.text:format(
parameters_used and cfg.b_checklist.checked or cfg.b_checklist.not_checked,
scale
)
local syntax = {}
local criteria = mw.html.create('ol')
for i = 1, 6 do
local b = raw_args['b'..i]
if b and b~='unused' then -- crtierion in use
b = cfg.b_checklist.mask[b:lower()] or cfg.b_checklist.mask.default
local image = '[[File:' .. cfg.b_checklist.icon[b] .. '.svg|16x16px|link=|alt=]]'
local failed_cat = args['B'..i..'_CAT']
local category = ''
if b~='y' and b~='x' and failed_cat and not demo then -- criterion failed
category = '[[Category:' .. failed_cat .. ']]'
end
if (b=='u' or b=='i') and args.B_MAIN_CAT and not demo then -- unevaluated or invalid parameter
category = category .. '[[Category:' .. args.B_MAIN_CAT .. ']]'
end
criteria:tag('li')
:wikitext(image .. ' ' .. cfg.b_checklist.criteria[i] .. ': ')
:tag('span')
:css('font-style', 'italic')
:wikitext(cfg.b_checklist.status[b])
:wikitext(category)
:allDone()
local new_syntax = mw.html.create('li')
:addClass('nowrap')
:wikitext(cfg.b_checklist.syntax.prompt:format(
tostring(i),
cfg.b_checklist.criteria[i] .. string.rep(
' ',
cfg.b_checklist.syntax.max_width-#cfg.b_checklist.criteria[i]
)
))
:done()
table.insert(syntax, tostring(new_syntax))
end
end
local prompt
if not parameters_used then
prompt = mw.html.create('span')
:wikitext(cfg.b_checklist.syntax.text:format(tostring(mw.title.getCurrentTitle():fullUrl({action = 'edit'}))))
:tag('ul')
:css('font-size', '88%')
:css('margin', '0px')
:css('font-family', 'monospace, sans-serif')
:css('padding', '1em')
:css('border', '1px dashed #2f6fab')
:css('background-color', '#f9f9f9')
:css('line-height', '1.1em')
:css('list-style', 'none')
:node(table.concat(syntax))
:done()
:wikitext(cfg.b_checklist.syntax.assess)
:done()
end
local checklist = mw.html.create('tr')
:tag('td')
:addClass('assess-b')
:css('padding-bottom', '5px') --TODO add to styles.css
:wikitext(cfg.b_checklist.image)
:done()
:tag('td')
:addClass('wpb-collapsed-notes')
:tag('table')
:addClass('plainlinks mw-collapsible mw-collapsed')
:tag('tr')
:tag('th')
:addClass('wpb-collapsed-head mbox-text')
:attr('colspan', '3')
:css('font-weight', 'normal')
:wikitext(text):done()
:tag('td')
:css('min-width', '3em')
:done() -- empty cell for show/hide toggle
:done()
:tag('tr')
:tag('td')
:css('font-size', '90%')
:node(criteria):done()
:tag('td')
:css('font-size', '88%')
:node(prompt):done()
:tag('td')
:addClass('empty-cell')
:done()
:done()
:done()
:done()
:done()
return checklist
end
end
p.todo_list = function(args, frame)
---------------------------
-- To-do list -------------
---------------------------
local list
if args.TODO_LINK then
local link = function(action)
local url = mw.uri.fullUrl(args.TODO_LINK, {action = action})
return mw.html.create('li'):wikitext('[' .. tostring(url) .. ' ' .. cfg.todo_list[action] .. ']')
end
local links = yesno(args.TODO_EDITLINKS or true, 'true') and frame:expandTemplate{title = 'Flatlist', args = {
class = 'plainlinks',
style = 'text-align:center;font-size:90%;',
[1] = tostring(mw.html.create('ul')
:node(link('edit'))
:node(link('history'))
:node(link('watch'))
:node(link('purge'))
)
}} or ''
list = links .. '\n' .. frame:expandTemplate{title = args.TODO_LINK}
else
list = ('\n' .. args.TODO_TEXT) or ''
end
local todo_list = mw.html.create('tr')
:tag('td')
:attr('colspan', '3')
:css('padding', '0') --TODO add to styles.css
:tag('table')
:addClass('mw-collapsible mw-collapsed')
:css('background', 'transparent') --TODO add to styles.css
:css('width', '100%')
:tag('tr')
:tag('th') --TODO add to styles.css
:css('text-align', 'left')
:css('padding', '0.2em 2px 0.2em 0')
:cssText(args.TODO_TITLE_STYLE)
:wikitext((args.TODO_TITLE or cfg.todo_list.default_title) .. ':')
:done()
:done()
:tag('tr')
:tag('td') --TODO add to styles.css
:css('text-align', 'left')
:css('padding', '5px')
:css('background-color', 'white')
:css('border', '1px solid #c0c090')
:css('margin-top', '5px')
:cssText(args.TODO_STYLE)
:wikitext(list)
:allDone()
return todo_list
end
p.todo_list_ = function(frame)
return p.todo_list(frame.args, frame)
end
p.quality_importance_insection = function(args, class, importance, importance_name, tf_prefix)
---------------------------
-- Category intersection --
---------------------------
local suppress = false
local prefix = tf_prefix or ''
if class=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_CLASS'])) then
suppress = true
end
if importance=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_IMPORTANCE'])) then
suppress = true
end
if not class or not importance then
suppress = true
end
local format = args[prefix..'QII_FORMAT']:gsub('C', '_C_'):gsub('I', '_I_'):gsub('T', '_T_')
if format and not suppress then
local new_class
if class=='' then
new_class = 'Unassessed' .. (args[prefix..'QII_UNASSESSED_APPENDIX'] or '')
else
new_class = class .. '-Class'
end
local assessment_cat = args[prefix..'ASSESSMENT_CAT'] or args.PROJECT..' articles'
local cat_name = format:gsub('_C_', new_class):gsub('_I_', importance .. '-' .. importance_name):gsub('_T_', assessment_cat)
local cat = mw.title.new('Category:' .. cat_name)
return cat.exists and #cat:getContent()>0 and cat_name
end
end
p.image_needed = function(args)
---------------------------
-- Image needed -----------
---------------------------
local type = cfg.image_needed.default_type
if args['image-type'] then
local add_article = function(word)
local article = cfg.image_needed.article.consonant
if cfg.image_needed.vowels[word:sub(1, 1)] then
article = cfg.image_needed.article.vowel
end
return article .. ' <b>' .. word .. '</b>'
end
type = add_article(args['image-type'])
end
local details = ''
if args['image-details'] then
details = ' ' .. cfg.image_needed.details:format(args['image-details'])
end
local location = ''
if args['image-location'] then
local location_cat = mw.title.new('Category:Wikipedians in ' .. args['image-location'])
if location_cat.exists then
location = ' ' .. cfg.image_needed.help:format('[[:' .. location_cat.fullText .. '|' .. location_cat.text .. ']]')
end
end
local category_exists = function(category)
local title = mw.title.new('Category:' .. category)
if title.exists then
return category
end
end
return {
text = cfg.image_needed.text:format(type, details, location),
image_name = args.IM_IMAGE or cfg.image_needed.default_image,
category = args['image-location'] and category_exists(
cfg.image_needed.location:format(
args['image-type'] or 'photograph',
args['image-location']
)
) or args.IM_LOCATION_CATEGORY,
category2 = args['image-topic'] and category_exists(
cfg.image_needed.topic:format(
args['image-type'] or 'photograph',
args['image-topic']
)
) or args.IM_TOPIC_CATEGORY
}
end
p.collaboration = function(args, title)
---------------------------
-- Collaboration ----------
---------------------------
local image = args.COLL_IMAGE or cfg.collaboration.default_image
local link = '[[' .. (args.COLL_LINK or '') .. '|' .. (args.COLL_TEXT or cfg.collaboration.default_text) .. ']]'
local note_args = {candidate = {}, current = {}, past = {}}
if yesno(args['collaboration-candidate'], true) then
local subpage_link = (args.COLL_LINK or '') .. '#' .. title.subjectPageTitle.text
note_args.candidate = {
text = cfg.collaboration.candidate:format(subpage_link, link),
image_name = image,
size = cfg.collaboration.size,
category = args.COLL_CANDIDATE_CAT
}
end
if yesno(args['collaboration-current'], true) then
note_args.current = {
text = cfg.collaboration.current:format(link),
image_name = image,
size = cfg.collaboration.size,
category = args.COLL_CURRENT_CAT
}
end
if yesno(args['collaboration-past'], true) then
note_args.past = {
text = cfg.collaboration.past:format(link),
image_name = image,
size = cfg.collaboration.size,
category = args.COLL_PAST_CAT
}
end
return note_args
end
p.a_class = function(args, lang)
---------------------------
-- A-class review ---------
---------------------------
local status = cfg.a_class.mask[lang:lc(args['a class'])]
if status==nil then
return {}
end
local link_exists = args.ACR_SUBPAGE_LINK and mw.title.new(args.ACR_SUBPAGE_LINK).exists or false
local link = mw.html.create('span'):css('font-weight', 'bold')
local label = cfg.a_class.status[status]
if args.ACR_SUBPAGE_LINK and status=='current' and not link_exists and args.ACR_PRELOAD then -- use custom preload template when creating discussion page
local url = mw.uri.fullUrl(args.ACR_SUBPAGE_LINK, {
action = 'edit',
preload = args.ACR_PRELOAD,
summary = cfg.a_class.create_summary
})
link:wikitext('[' .. tostring(url) .. ' ' .. label .. ']')
else
link:wikitext('[[' .. (args.ACR_SUBPAGE_LINK or '') .. '|' .. label .. ']]')
end
return {
text = cfg.a_class.text:format(
tostring(link),
args.ACR_REVIEW_LINK or ''
),
image_name = args.ACR_IMAGE or cfg.a_class.icon[status],
size = args.ACR_SIZE or '18x18px',
background = cfg.a_class.background,
category = args[cfg.a_class.category[status]],
category2 = not link_exists and args.ACR_INVALID_CAT
}
end
p.peer_review = function(args, title)
---------------------------
-- Peer review ------------
---------------------------
local image = args.PR_IMAGE or cfg.peer_review.default_image
local size = args.PR_SIZE or cfg.peer_review.size
local link = args.PR_LINK or ''
local pr_title = args['peer review title'] and mw.title.new(args['peer review title']) or title
local subpage_link = link .. '/' .. pr_title.subjectPageTitle.text
local invalid_cat = not mw.title.new(subpage_link).exists and args.PR_INVALID_CAT
local note_args = {current = {}, past = {}}
if yesno(args['peer review'], true) then
note_args.current = {
text = cfg.peer_review.current:format(subpage_link, link),
image_name = image,
size = size,
category = args.PR_CAT,
category2 = invalid_cat
}
end
if yesno(args['old peer review'], true) then
note_args.past = {
text = cfg.peer_review.past:format(link, subpage_link),
image_name = image,
size = size,
category = args.PR_OLD_CAT,
category2 = invalid_cat
}
end
return note_args
end
return p