Revision as of 07:39, 3 December 2024 edit149.109.6.103 (talk)No edit summaryTag: Reverted← Previous edit | Latest revision as of 12:00, 19 December 2024 edit undoMSGJ (talk | contribs)Autopatrolled, Administrators130,781 edits bot is taking a long time to replace these, so better to leave it in for now | ||
(20 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
require('strict') | require('strict') | ||
local p = {} | local p = {} | ||
local sandbox = '/sandbox' | local sandbox = '/sandbox' -- BE SURE TO COMMENT OUT this definition when deploying to live | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
local shell = function(frame, header, content, collapsed, class) |
local shell = function(frame, header, content, collapsed, class) | ||
local styles = frame:extensionTag('templatestyles', '', {src = 'Module:Message box/tmbox.css'}) | |||
.. frame:extensionTag('templatestyles', '', {src = 'Module:Banner shell' .. (sandbox or '') .. '/styles.css'}) | .. frame:extensionTag('templatestyles', '', {src = 'Module:Banner shell' .. (sandbox or '') .. '/styles.css'}) | ||
local content_row | local content_row | ||
Line 11: | Line 12: | ||
:tag('td') | :tag('td') | ||
:attr('colspan', '2') | :attr('colspan', '2') | ||
:addClass('banner-shell-inner'):addClass('outercollapse') | :addClass('banner-shell-inner') | ||
:addClass('outercollapse') | |||
:wikitext(content) | :wikitext(content) | ||
:done() | :done() | ||
Line 17: | Line 19: | ||
local holder = mw.html.create('table') | local holder = mw.html.create('table') | ||
:attr('role', 'presentation') | :attr('role', 'presentation') | ||
:addClass('tmbox'):addClass('tmbox-notice'):addClass('banner-shell') | :addClass('tmbox') | ||
:addClass('tmbox-notice') | |||
:addClass('banner-shell') | |||
:addClass(class) -- allow additional class to be specified | :addClass(class) -- allow additional class to be specified | ||
:addClass(content and 'mw-collapsible' or nil) | :addClass(content and 'mw-collapsible' or nil) | ||
Line 36: | Line 40: | ||
:wikitext(image) | :wikitext(image) | ||
local text_cell = mw.html.create('td') | local text_cell = mw.html.create('td') | ||
:addClass('mbox-text'):addClass('banner-shell-header') | :addClass('mbox-text') | ||
:addClass('banner-shell-header') | |||
:tag('span'):addClass('nowrap'):css('float', 'left'):wikitext(string.rep(' ', 10)):done() | :tag('span') | ||
:addClass('nowrap') | |||
:css('float', 'left') | |||
:wikitext(string.rep(' ', 10)) | |||
:done() | |||
:wikitext(args.text or 'Other talk page banners') | :wikitext(args.text or 'Other talk page banners') | ||
local header = mw.html.create('tr'):node(image_cell):node(text_cell) | local header = mw.html.create('tr') | ||
:node(image_cell) | |||
:node(text_cell) | |||
return shell(frame, header, args, yesno(args.collapsed)) | return shell(frame, header, args, yesno(args.collapsed)) | ||
end | end | ||
local DuplicateBanners = function(text) | local DuplicateBanners = function(text) | ||
local capture = '<span class="wpb%-project">(*)</span>' | local capture = '<span class="wpb%-project">(*)</span>' | ||
local banners = {} | local banners = {} | ||
for project in text:gmatch(capture) do | for project in text:gmatch(capture) do | ||
Line 87: | Line 98: | ||
args = {activepol = blp=='activepol' and 'yes'} | args = {activepol = blp=='activepol' and 'yes'} | ||
}) | }) | ||
if (yesno(blp) or blp=='activepol') and yesno(args.living) then | |||
⚫ | addCategory(cfg.tracking. |
||
elseif (yesno(blp)==false and blp~=nil and blp~='activepol') or (yesno(args.living)==false and args.living~=nil) or blp=='other' then | |||
⚫ | addCategory(cfg.tracking. |
||
⚫ | end | ||
elseif blp=='other' then | elseif blp=='other' then | ||
table.insert(out, frame:expandTemplate{ | table.insert(out, frame:expandTemplate{ | ||
title = cfg.blp_template.blpo} | title = cfg.blp_template.blpo} | ||
) | ) | ||
if blp=='other' and not(yesno(args.living)) and args.living~=nil then | |||
⚫ | addCategory(cfg.tracking. |
||
⚫ | end | ||
elseif yesno(blp)==false and yesno(args.living)==false then | |||
addCategory(cfg.tracking.redundant) | |||
end | end | ||
local vital | local vital | ||
Line 160: | Line 161: | ||
icon_str = pagetype=='page' and 'Non-article page' or lang:ucfirst(pagetype) | icon_str = pagetype=='page' and 'Non-article page' or lang:ucfirst(pagetype) | ||
text = {cfg.rating.not_required:format(vital or pagetype)} | text = {cfg.rating.not_required:format(vital or pagetype)} | ||
if args.class then | |||
⚫ | addCategory(cfg.tracking.redundant_class) | ||
⚫ | end | ||
elseif class=='' then | elseif class=='' then | ||
icon_image = cfg.icons.unassessed | icon_image = cfg.icons.unassessed | ||
Line 204: | Line 208: | ||
unknown = cfg.tracking.unknown, | unknown = cfg.tracking.unknown, | ||
preview = cfg.tracking.preview, | preview = cfg.tracking.preview, | ||
'1', 'blp', 'category', 'class', 'collapsed', 'demo_page', 'listas |
'1', 'blp', 'category', 'class', 'collapsed', 'demo_page', 'listas', 'vital' | ||
}, frame:getParent().args) | }, frame:getParent().args) | ||
table.insert(out, tracking) | table.insert(out, tracking) | ||
if args.category and yesno(args.category)~=false then -- category should not be "yes" | |||
for _, param in ipairs{'category', 'collapsed', 'living'} do -- check if each has a boolean value | |||
⚫ | addCategory(cfg.tracking.invalid, 'category') | ||
if yesno(args, 'invalid')=='invalid' then | |||
⚫ | end | ||
addCategory(cfg.tracking.invalid, param) | |||
if args.collapsed and yesno(args.collapsed)~=true then -- collapsed should not be "no" | |||
end | |||
⚫ | addCategory(cfg.tracking.invalid, 'collapsed') | ||
end | end | ||
if yesno(blp)==nil and blp~=nil and blp~='other' and blp~='activepol' then | if yesno(blp)==nil and blp~=nil and blp~='other' and blp~='activepol' then | ||
addCategory(cfg.tracking.invalid, ' |
addCategory(cfg.tracking.invalid, 'blp') | ||
end | end | ||
if pagetype=='article' and args.class and class=='' then -- find pages with invalid class parameter | if pagetype=='article' and args.class and class=='' then -- find pages with invalid class parameter |
Latest revision as of 12:00, 19 December 2024
This is the module sandbox page for Module:Banner shell (diff). |
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. |
This Lua module is used on approximately 11,100,000 pages, or roughly 18% 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. |
Banner shell |
---|
Module |
Config |
Styles |
Template:WikiProject banner shell |
Template:Banner holder |
Needs attention |
Usage
This module implements Template:WikiProject banner shell and Template:Banner holder. Please refer to those templates' documentation.
The above documentation is transcluded from Module:Banner shell/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' -- BE SURE TO COMMENT OUT this definition when deploying to live local yesno = require('Module:Yesno') local shell = function(frame, header, content, collapsed, class) local styles = frame:extensionTag('templatestyles', '', {src = 'Module:Message box/tmbox.css'}) .. frame:extensionTag('templatestyles', '', {src = 'Module:Banner shell' .. (sandbox or '') .. '/styles.css'}) local content_row if content then content_row = mw.html.create('tr') :tag('td') :attr('colspan', '2') :addClass('banner-shell-inner') :addClass('outercollapse') :wikitext(content) :done() end local holder = mw.html.create('table') :attr('role', 'presentation') :addClass('tmbox') :addClass('tmbox-notice') :addClass('banner-shell') :addClass(class) -- allow additional class to be specified :addClass(content and 'mw-collapsible' or nil) :addClass(collapsed and 'mw-collapsed' or nil) :node(header) :node(content_row) return styles .. tostring(holder) end p.banner_holder = function(frame) local args = require('Module:Arguments').getArgs(frame, {wrappers = {'Template:Banner holder'}}) local image = '[[File:' .. (args.image or 'NewFavicon icon.svg') .. '|' .. (args.size or '24') .. 'px' .. '|link=' .. (args.image_link or '') .. '|alt=' .. (args.alt or '') .. ']]' local image_cell = mw.html.create('td') :addClass('mbox-image') :wikitext(image) local text_cell = mw.html.create('td') :addClass('mbox-text') :addClass('banner-shell-header') :tag('span') :addClass('nowrap') :css('float', 'left') :wikitext(string.rep(' ', 10)) :done() :wikitext(args.text or 'Other talk page banners') local header = mw.html.create('tr') :node(image_cell) :node(text_cell) return shell(frame, header, args, yesno(args.collapsed)) end local DuplicateBanners = function(text) local capture = '<span class="wpb%-project">(*)</span>' local banners = {} for project in text:gmatch(capture) do if banners == true then return project end banners = true end end p.banner_shell = function(frame) local cfg = mw.loadData('Module:Banner shell/config' .. (sandbox or '')) local args = require('Module:Arguments').getArgs(frame, {wrappers = {cfg.template}}) local title = args.demo_page and mw.title.new(args.demo_page) or mw.title.getCurrentTitle() local pagetype = require('Module:Pagetype')._main{ page = title.prefixedText, dab = cfg.page_types.dab, sia = 'set index article', soft_redirect = cfg.page_types.soft_redirect, nonexistent = cfg.page_types.nonexistent, timedtext = cfg.page_types.timedtext, defaultns = 'extended' } local lang = mw.language.getContentLanguage() local classmask = require('Module:WikiProject banner' .. (sandbox or '')).class_mask local class = classmask(args.class or '', title.talkPageTitle, false, pagetype) local demo = not yesno(args.category or true, true) or args.demo_page local out = {} local addCategory = function(category, sort_key) if not demo and title.isTalkPage then local category_title = mw.title.new('Category:' .. category) table.insert(out, ']') end end if demo and not args.demo_page then pagetype = 'article' end local blp = args.blp and args.blp:lower() if yesno(blp) or blp=='activepol' or yesno(args.living) then table.insert(out, frame:expandTemplate{ title = cfg.blp_template.blp, args = {activepol = blp=='activepol' and 'yes'} }) elseif blp=='other' then table.insert(out, frame:expandTemplate{ title = cfg.blp_template.blpo} ) end local vital if yesno(args.vital) then local page = mw.ustring.upper(mw.ustring.sub(title.subjectPageTitle.text, 1, 1)) -- get first letter of article name local codepoint = mw.ustring.codepoint(page, 1, 1) if codepoint<65 or codepoint>90 then --first letter is not between A-Z page = 'others' end local data_page = mw.title.new('Misplaced Pages:Vital articles/data/' .. page .. '.json') if data_page.exists then local index = title.subjectPageTitle.text index = tostring(tonumber(index))==index and tonumber(index) or index --convert to number if page is numerical, otherwise loadJsonData does not work local data = mw.loadJsonData(data_page.fullText) if data then local level = data.level and tostring(data.level) if level and data.topic then local link = 'Misplaced Pages:Vital articles/Level/' .. level if (level=='4' or level=='5') then link = link .. '/' .. data.topic end if data.sublist then link = link .. '/' .. data.sublist end if data.section then link = link .. '#' .. data.section end if not mw.title.new(link).exists then -- add tracking category if link does not exist addCategory(cfg.vital.attention, 'L') end vital = cfg.vital.with_level:format(link, level) else vital = cfg.vital.without_level end for _, cat in ipairs(cfg.vital.categories) do if cat:find('_CLASS') and (class=='NA' or class=='') then addCategory(cfg.vital.attention, class=='NA' and 'N' or 'U') elseif level==nil then addCategory(cfg.vital.attention, 'V') elseif data.topic==nil then addCategory(cfg.vital.attention, 'T') else local category = cat :gsub('_CLASS', class .. '-Class') :gsub('_LEVEL', level) :gsub('_TOPIC', data.topic) addCategory(category) end end addCategory(cfg.vital.all) else addCategory(cfg.vital.not_listed) end end end local text, icon_image, icon_str if class=='NA' then icon_image = cfg.icons.type or cfg.icons.default icon_str = pagetype=='page' and 'Non-article page' or lang:ucfirst(pagetype) text = {cfg.rating.not_required:format(vital or pagetype)} if args.class then addCategory(cfg.tracking.redundant_class) end elseif class=='' then icon_image = cfg.icons.unassessed icon_str = 'Unassessed article' text = {cfg.rating.not_yet:format(vital or pagetype)} addCategory('All unassessed articles') else icon_image = cfg.icons.quality or cfg.icons.unassessed icon_str = class .. '-Class ' .. pagetype text = {cfg.rating.rated:format(vital or pagetype, class)} end local icon = string.format(']', icon_image, icon_str) table.insert(text, ' ' .. cfg.rating.scale) if args then table.insert(text, '<br>' .. cfg.project.interest .. ' ') table.insert(text, yesno(args.collapsed) and cfg.project.collapsed or cfg.project.uncollapsed) local duplicate_cat = DuplicateBanners(args) if duplicate_cat and title.isTalkPage then addCategory(cfg.tracking.duplicate, duplicate_cat) end elseif not yesno(args.vital) and class~='' then -- if no projects and not vital and assessed then add class super category addCategory(class .. '-Class articles') end local header = mw.html.create('tr') :tag('td') :addClass('assess') :wikitext(icon) :done() :tag('td') :addClass('banner-shell-header') :css('text-align', 'left') :css('font-weight', 'normal') :wikitext(table.concat(text)) :done() table.insert( out, shell(frame, header, args, yesno(args.collapsed), 'wpbs') ) if args.listas then table.insert(out, frame:preprocess('{{DEFAULTSORT:' .. args.listas .. '}}')) end if not demo then local tracking = require('Module:Check for unknown parameters')._check({ unknown = cfg.tracking.unknown, preview = cfg.tracking.preview, '1', 'blp', 'category', 'class', 'collapsed', 'demo_page', 'listas', 'vital' }, frame:getParent().args) table.insert(out, tracking) if args.category and yesno(args.category)~=false then -- category should not be "yes" addCategory(cfg.tracking.invalid, 'category') end if args.collapsed and yesno(args.collapsed)~=true then -- collapsed should not be "no" addCategory(cfg.tracking.invalid, 'collapsed') end if yesno(blp)==nil and blp~=nil and blp~='other' and blp~='activepol' then addCategory(cfg.tracking.invalid, 'blp') end if pagetype=='article' and args.class and class=='' then -- find pages with invalid class parameter addCategory(cfg.tracking.invalid, 'Zclass') end end return table.concat(out) end return pCategory: