Module:WikiProject banner/auxiliary/sandbox

require('strict')

local p = {}

local sandbox-- = '/sandbox' -- BE SURE TO COMMENT OUT this definition when deploying to live

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

local criteria = mw.html.create('ol')

for i = 1, 6 do

local b = raw_args['b'..i]

if b and b~='unused' then -- criterion in use

b = cfg.b_checklist.mask[b:lower()] or cfg.b_checklist.mask.default

local image = 'File:' .. cfg.b_checklist.icon[b] .. '.svg'

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

local status = mw.html.create('span')

:css('font-style', 'italic')

:wikitext(cfg.b_checklist.status[b])

local criterion = mw.html.create('li')

:wikitext(image .. ' ' .. cfg.b_checklist.criteria[i] .. ': ')

:node(status)

:wikitext(category)

criteria:node(criterion)

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]

)

))

syntax:node(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'}))))

:node(syntax)

:wikitext(cfg.b_checklist.syntax.assess)

end

local col1 = mw.html.create('td')

:addClass('class-b')

:css('padding-bottom', '5px')

:wikitext(cfg.b_checklist.image)

local col211 = mw.html.create('th')

:addClass('wpb-collapsed-head mbox-text')

:attr('colspan', '3')

:css('font-weight', 'normal')

:wikitext(text)

local col212 = mw.html.create('th')

:css('min-width', '3em')-- empty cell for show/hide toggle

local row21 = mw.html.create('tr')

:node(col211)

:node(col212)

local col221 = mw.html.create('td')

:css('font-size', '90%')

:node(criteria)

local col222 = mw.html.create('td')

:css('font-size', '88%')

:node(prompt)

local row22 = mw.html.create('tr')

:node(col221)

:node(col222)

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

:addClass('plainlinks mw-collapsible mw-collapsed')

:node(row21)

:node(row22)

local col2 = mw.html.create('td')

:addClass('wpb-collapsed-notes')

:node(table2)

return mw.html.create('tr')

:node(col1)

:node(col2)

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 titlecell = mw.html.create('th')

:css('text-align', 'left')

:css('padding', '0.2em 2px 0.2em 0')

:cssText(args.TODO_TITLE_STYLE)

:wikitext((args.TODO_TITLE or cfg.todo_list.default_title) .. ':')

local listcell = mw.html.create('td')

: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)

local onecellrow = function(cell)

return mw.html.create('tr'):node(cell)

end

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

:addClass('mw-collapsible mw-collapsed')

:css('background', 'transparent')

:css('width', '100%')

:node(onecellrow(titlecell))

:node(onecellrow(listcell))

local cell1 = mw.html.create('td')

:attr('colspan', '3')

:css('padding', '0')

:node(table1)

return onecellrow(cell1)

end

p.todo_list_ = function(frame)

return p.todo_list(frame.args, frame)

end

p.quality_importance_insection = function(args, class, importance, importance_name, assessment_cat, article, tf_prefix)

---------------------------

-- Category intersection --

---------------------------

local prefix = tf_prefix or ''

if class=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_CLASS'])) then

return nil

end

if importance=='NA' and (yesno(args[prefix..'QII_SUPPRESS_NA']) or yesno(args[prefix..'QII_SUPPRESS_NA_IMPORTANCE'])) then

return nil

end

local form = args[prefix..'QII_FORMAT']:gsub('C', '_C_'):gsub('I', '_I_'):gsub('T', '_T_')

if not class or not importance or not form then

return nil

end

local new_class

if class=='' then

new_class = 'Unassessed' .. (args[prefix..'QII_UNASSESSED_APPENDIX'] or '')

else

new_class = class .. '-Class'

end

local check_cat = function (typ)

local cat_name = form:gsub('_C_', new_class):gsub('_I_', importance .. '-' .. importance_name):gsub('_T_', assessment_cat .. ' ' .. typ)

local cat = mw.title.new('Category:' .. cat_name)

return cat.exists and #cat:getContent()>0 and cat_name

end

local cat = check_cat(article and 'articles' or 'pages')

return cat

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

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.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_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('' .. 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