Module:Article stub box: Difference between revisions

Content deleted Content added
comments and some code simplification
Escape `{{` in output to avoid a Parsoid bug. See Wikipedia:AutoWikiBrowser/Tasks#c-Anomie-20250302162200-Anomie-20250302155000 for details.
 
(37 intermediate revisions by 11 users not shown)
Line 1:
--[[
local p = {
This module was created by User:CodeHydro (Alexander Zhikun He).
cats = {inv = {}}
User:Jackmcbarn and User:Mr._Stradivarius provided a great deal of assistance in writting p.main()
}
local WRAPPER_TEMPLATE = 'Template:Asbox'
local args, stubCats
 
p.main() draw heavily from the following version of Template:Asbox of the English Wikipedia, authored primarily by User:Rich_Farmbrough
function demo(text, alt)
https://en.wikipedia.org/w/index.php?title=Template:Asbox&oldid=619510287
return args.demo and text or alt
end
 
p.templatepage() is derived from the following revision of Template:Asbox/templatepage, authored primarily by User:MSGJ
--Formats category links. Stores them until called with cat.done=true
https://en.wikipedia.org/w/index.php?title=Template:Asbox/templatepage&oldid=632914791
--Takes multiple or single categories in the form of 'cat' or {'cat1', 'cat2', {'cat3', 'sort3'}}
 
--If it finds a category name of length 1, assumes it is a sort key.
Both templates had significant contributions from numerous others listed in the revision history tab of their respective pages.
--Such keys must always be paired in a table {{'cat', 'sort'}}
--]]
local attention = 'Stub message templates needing attention'
local WRAPPER_TEMPLATE, args = 'Template:Article stub box'
function category(cat)
-- TODO: update this instance of Asbox to Article stub box eventually
for _, v in ipairs(type(cat) == type'' and {cat} or cat) do
local templatestyles = 'Module:Article stub box/styles.css'
p.key = string.format(
local p, Buffer, stubCats = {
'[[%sCategory:%s]]',
--Prevents dupli-cats... get it? Maybe not?
demo(':', ''),
cats = setmetatable({}, {__newindex = function(t, i, v)
--All user-inputed cats are always paired with a sort key
if not rawget(t, i) then
--Since all non-user cat are longer than 2 chars, we can
rawset(t, i, v)
--compare length instead of checking type
table.insert(t, i)
#v > 2 and v or string.format(
end
demo('%s|Category:%s|%s', '%s|%s%s'),
end}),
#v[1] < 2 and attention or v[1],
--initializes variables required by both p.main and p.templatepage
#v[1] < 2 and attention or v[1],
init = function(self, frame, page)
#v[1] < 2 and table.concat(v) or v[2]
args, page = args or require('Module:Arguments').getArgs(frame, {
)
wrappers = WRAPPER_TEMPLATE
)
}), page or mw.title.getCurrentTitle()
if not p.cats.inv[p.key] then
--Ensures demo parameter will never affect category() output for articles
table.insert(p.cats, p.key)
self.demo = self.demo or page.namespace ~= 0 and args.demo
p.cats.inv[p.key] = #p.cats
return args, page
end
}, require('Module:Buffer')
 
--[[
Formats category links. Stores them until called with cat.done=true
Takes multiple or single categories in the form of 'cat'
or a table of strings and/or tables containing parts. (See below)
]]
local attention, catTag, catKey = Buffer'Stub message templates needing attention', '[[Category:%s]]', '%s|%s%s'
local function category(cat)
for _, v in ipairs((tostring(cat) == cat or cat.t) and {cat} or cat) do
--[[
If v is a table:
[1] = full category name; defaults to local attention if blank
k = Category sort key. Prefix before v.t
t = page.text or args.tempsort#; appended after k (or in its place if omitted). Required if v is not a string
Basically the same as v = (v[1] or attention) .. ' | ' .. (v.k or '') .. v.t
]]
if v and v ~= true then--reject v = nil, false, or true
p.cats[catTag:format(tostring(v) == v and
v
or (v[1] and Buffer(v[1]) or attention):_in(v.k):_(v.t):_str(2, nil, nil, '|')
)] = true
end
end
return cat.done and table.concat(p.cats, p.demo( and ' | ', '')or nil) or ''
end
 
--[[
--Makes an ombox warning; will return an empty string instead
Makes an ombox warning;
--if optional v.ifNot is true
Takes table {ifNot = Boolean, text, {cat. sort key, cat. sort name}}
function ombox(v)--{text, {subcat, page}}
Will return an empty string instead when ifNot evaluates to true
if v.ifNot then
]]
return ''
local function ombox(v)
end
if v.ifNot then return end
p.ombox = p.ombox or require('Module:Message box').ombox
category{v[2]}
Line 51 ⟶ 73:
end
 
--[[
 
Unlike original template, module now takes unlimited cats! This function also performs
function catStub(page, pageDoc)--p.templatepage passes page; p.main does not
most stub category error checks except for the ombox for when main |category= is omitted (See p.template())
stubCats = {
]]
missing = {},
local function catStub(page, pageDoc)
S = {},
stubCats = {missing = {}, v = {}}
v = {}
-- zwj and zwnj have semantical use in other other wikis, don't remove them
}
local zwj = '\226\128\141' -- U+200D, E2 80 8D
--Find category parameters and store the number (main cat = '')
local zwnj = '\226\128\140' -- U+200C, E2 80 8C
local disallowedUnicodeChars = '[^%w%p%s' .. zwj .. zwnj .. ']' -- for i18n we make this a separate string
local code
for k, _ in pairs(args) do
--Find category parameters and store the number (main cat = '')
table.insert(stubCats, string.match(k, '^category(%d*)$'))
end
table.sort(stubCats)
local cat, tsort
for k, v in ipairs(stubCats) do
--Get category names and, if called by p.templatepage, the optional sort key
local tsort, cat = args['tempsort' .. v], mw.ustring.gsub(args['category' .. v], disallowedUnicodeChars, '')--remove all hidden unicode chars
--Do not place template in main category if |tempsort = 'no'. However, DO place articles of that template in the main category.
tsort = args['tempsort' .. v]
table.insert(stubCats.v,
--Does not place in main category if |tempsort = 'no'
page and (--p.templatepage passes page; p.main does not, i.e. articles are categorized without sort keys.
--For example, if stub template simply adds |qualifier= to a meta stub
-- v=='' and includestsort a |category#== to'no'--if atrue, sub-categoryinserts of'true' thein maintable, which category() will reject
if or vtsort ~=and ''{cat, ork tsort ~= 'no ', thent = tsort}
table.insert(stubCats.v, or {cat, pagek and= (tsort or (' *', ..t = page.text))})--note space in front of sort key
end )
or cat
)
--Check category existance only if on the template page (i.e. stub documentation)
if page then
--Check category existance
--This check is only performed on the template page
--since it uses an expensive parser function
if not mw.title.new('Category:' .. cat).exists then
code = code or mw.html.create'code':wikitext'|category'
table.insert(stubCats.missing, '<code>category' .. v .. '</code>')
table.insert(stubCats.missing, tostring(mw.clone(code):wikitext(v)))
end
--[[
table.insert(stubCats.v,
Checks non--Onlydemo checkstub template for docs if main |category= is setdocumentation and flags if doc is present.
All stub cats names are checked and flagged if it does not match 'Category: [] stub'.
--Main categories with no docs and all numbered categories
The main stub cat is exempt from the name check if the stub template has its own doc
--are checked for proper naming and flagged if not
(presumably, this doc would have an explanation as to why the main stub cat is non-conforming).
v == '' and pageDoc.exists and
]]
'Stub message templates with documentation subpages'
table.insert(stubCats.v, v == '' and not p.demo and pageDoc.exists and
or not string.match(cat, ' stubs$') and {'S', page.text}
'Stub message templates with documentation subpages'
or nil
or not cat:match' stubs$' and {k = 'S', t = page.text}
)
end
Line 94 ⟶ 121:
--Add category names after loop is completed
category(stubCats.v)
return #stubCats.missing > 0 and ombox{
--Out params set to non-categories with <code> tags to ombox
--Changed, original msg:
return stubCats.missing and ombox{
--Changed, original msg: One or more of the stub categories defined in this template do not seem to exist!
--Please double-check the parameters {{para|category}}, {{para|category1}} and {{para|category2}}.
'The following parameter'
.. (#stubCats.missing == 1 and ' defines a stub category that does' or 's define stub categories that do')
.. ' not exist: ' .. mw.text.listToText(stubCats.missing),
{k = 'N', t = page.text}
} or ''
end
 
--Shows population of categories found by catStub(). Outputs demo values if none
local function population()
--Outputs demo values if there are none
local wikitext, base = {}, '* [[:Category:%s]] (population: %s)\n'
function population()
if not args.category and stubCats[1] ~= false then
local wikitext, base = '', '* [[:Category:%s]] (population: (%s)\n'
if # table.insert(stubCats, == 01, thenfalse)
return string.format(base, '{{{category}}}', 0)
end
for k_, v in ipairs(stubCats) do
table.insert(wikitext, base:format(
wikitext = wikitext .. string.format(base, args['category' .. v], mw.site.stats.pagesInCategory(args['category' .. v], 'all'))
v and args['category' .. v] or '{{{category}}}',
v and mw.site.stats.pagesInCategory(args['category' .. v], 'all') or 0
))
end
return table.concat(wikitext)
end
 
--Includes standard stub documention and flags stub templates with bad parameter values.
--Flags bad stub templates and creates standard doc page
function p.templatepage(frame, page)
args, page = p:init(frame, page)
local tStubDoc = mw.title.new('Template:Stub documentation')
local pageDoc = mw.title.new(page.fullText .. :subPageTitle('/doc')
--Reorganization note: Original Asbox alternates between outputting categories and checking on params |category#=.
page = page or mw.title.getCurrentTitle()
--Rather than checking multiple times and switching tasks, all stub category param operations have been rolled into catStub()
args = args or require('Module:Arguments').getArgs(frame, {
return Buffer(
wrappers = WRAPPER_TEMPLATE
ombox{--Show ombox warnings for missing args.
})
ifNot = args.category{,
'The <code>|category</code> parameter is not set. Please add an appropriate stub category.',
'Stub message templates',
{k = 'C', t = page.text}
'Exclude in print',
})
--Changed. Original Asbox does its first of 3 checks on params |category#= here.
:_(ombox{
--Rather than checking multiple times, all operations involving those params have been rolled into catStub()
ifNot = args.subject or args.article or args.qualifier,
(args.icon and
'This stub template contains no description! At least one of the parameters <code>|subject</code>, <code>|article</code> or <code>|qualifier</code> must be defined.',
'Stub message templates using icon parameter'
{k = 'D', t = page.text}
or (args.image and
})
(mw.title.new('Media:' .. mw.text.split(args.image, '|')[1]).exists and
:_(catStub(page, pageDoc))--catStub() may also return an ombox if there are non-existing categories
nil
:_(category{
or {'B', page.text}
done = p.demo ~= 'doc',--Outputs categories if not doc demo
'Stub message templates',
args.icon and
'Stub message templates using icon parameter'
or args.image and (
mw.title.new('Media:' .. mw.text.split(args.image, '|')[1]).exists--do nothing if exists. category() will reject true
or {k = 'B', t = page.text}
)
or 'Stub message templates without images',
args.imagealt and {k = 'I', t = page.text},
)
}),
:_((not p.demo or p.demo == 'doc') and--Add standard stub template documentation
args.imagealt and {'I', page.text} or nil
require('Module:Documentation').main{
}
content = Buffer(page.text ~= 'Stub' and--This comparison performed in {{Asbox/stubtree}} before it invokes Module:Asbox stubtree
--Show ombox warnings and check for bat stub categories
-- TODO: update this instance of Asbox to Article stub box eventually
return ombox{
require('Module:Asbox stubtree').subtree{args = {pagename = page.text}}
ifNot = args.category,
)
'The <code>|category</code> parameter is not set. Please add an appropriate stub category.',
:_in'\n== About this template ==\nThis template is used to identify a':_(args.subject):_'stub':_(args.qualifier):_out' '--space
{'C', page.text}
:_'. It uses {{[[Template:Article stub box|article stub box]]}}, which is a meta-template designed to ease the process of creating and maintaining stub templates.\n=== Usage ===\nTyping '
}
:_(mw.html.create'code'
.. ombox{
:wikitext( mw.text.nowiki( '{{' ), page.text == 'Stub' and 'stub' or page.text, '}}')
ifNot = args.subject or args.article or args.qualifier,
)
'This stub template contains no description! At least one of the parameters <code>|subject</code>, <code>|article</code> or <code>|qualifier</code> must be defined.',
:_' produces the message shown at the beginning, and adds the article to the following categor'
{'D', page.text}
:_(#stubCats > 1 and 'ies' or 'y')
}
:_':\n'
.. catStub(page, pageDoc)
:_(population())
--Add standard stub template documentation
:_(pageDoc.exists and--transclusion of /doc if it exists
.. ((args.demo and args.demo ~= 'doc' and '') or (require('Module:Documentation').main{
frame:expandTemplate{title = pageDoc.text}
content =
)
(page.text ~= 'Stub' and --This comparison performed in {{Asbox/stubtree}} before it invokes Module:Asbox stubtree
:_'\n== General information ==\n'
require('Module:Asbox stubtree').subtree{args = {pagename = page.text}}
:_(frame:expandTemplate{title = tStubDoc.text})
or ''
:_'\n\n'(),
['link box'] = Buffer'This documentation is automatically generated by [[Module:Article stub box]].'
.. '\n== About this template ==\nThis template is used to identify a '
:_in'The general information is transcluded from [[Template:Stub documentation]]. '
.. string.format('%s stub%s.', args.subject or '', args.qualifier and (' ' .. args.qualifier) or '')
:_(mw.html.create'span'
.. ' It uses {{[[Template:Asbox|asbox]]}}, which is a meta-template designed to ease the process of creating and maintaining stub templates.\n=== Usage ===\nTyping <code>{{'
:cssText'font-size:smaller;font-style:normal;line-height:130%'
.. (page.text == 'Stub' and
:node(('([%s edit] | [%s history])'):format(
'stub'
tStubDoc:fullUrl('action=edit', 'relative'),
or page.text
tStubDoc:fullUrl('action=history', 'relative')
)
))
.. '}}</code> produces the message shown at the beginning, and adds the article to the following categor' .. (#stubCats > 1 and 'ies' or 'y') .. ':\n'
.. population( )
:_out()
.. (pageDoc.exists and --transclusion of /doc if it exists
:_(page.protectionLevels.edit and page.protectionLevels.edit[1] == 'sysop' and
frame:expandTemplate{title = pageDoc.text}
"This template is [[WP:PROTECT|fully protected]] and any [[WP:CAT|categories]] should be added to the template's ["
or ''
.. pageDoc:fullUrl('action=edit&preload=Template:Category_interwiki/preload', 'relative')
)
.. '| /doc] subpage, which is not protected.'
.. '\n== General information ==\n'--Generic documentation
)' <br/>'
.. frame:expandTemplate{title = tStubDoc.text} .. '\n\n'
, }
)()
['link box'] =
string.format(
'This documentation is automatically generated by [[Template:Asbox/templatepage]].<br>The general information is transcluded from [[Template:Stub documentation]]. <span style="font-size:smaller;font-style:normal;line-height:130%%">([%s edit] | [%s history])</span>',
tStubDoc:fullUrl('action=edit', 'relative'),
tStubDoc:fullUrl('action=history', 'relative')
)
.. (page.protectionLevels.edit[1] == 'sysop' and
" <br/>This template is [[WP:PROTECT|fully protected]] and any [[WP:CAT|categories]] should be added to the template's ["
.. pageDoc:fullURL('action=edit&preload=Template:Category_interwiki/preload', 'relative')
.. '| /doc] subpage, which is not protected.'
or ''
)
}
--Output categories when done.
.. (args.demo ~= 'doc' and category{done = true} or '')))
end
 
--The template as it appears on articles.
function p.main(frame, page)
args, page = p:init(frame, page)
page = page or mw.title.getCurrentTitle()
local output = mw.html.create'div'
args = args or require('Module:Arguments').getArgs(frame, {
:attr{role = 'note'}
wrappers = WRAPPER_TEMPLATE
:addClass'metadata plainlinks asbox stub'
})
:tag'table'
local output = mw.html.create()
:attr{role = 'presentation'}
local asbox = output:tag'table'
:tag'tr'
:addClass('metadata plainlinks stub')
:addClass'noresize'
:css('background', 'transparent')
:node((args.icon or args.image) and
:attr('role', 'presentation')
mw.html.create'td'
if args.icon or args.image then
asbox:tag('td') :wikitext(args.icon or string.('[[File:%s|%spx|alt=%s]]'):format(
args.image or '',
'[[File:%s|%spx|alt=%s]]',
args.imagepix or '40x30',
args.piximagealt or '40x30Stub icon',
))
args.imagealt or 'Stub icon'
) )
:tag'td'
end
:tag'p'
local buffer = asbox:tag('td')
:addClass'asbox-body'
buffer:tag('i'):wikitext(string.format(
:wikitext(
'This %s %s %s is a [[Wikipedia:stub|stub]]. You can help Wikipedia by [%s expanding it].',
Buffer'This':_(args.subject):_(args.article or 'article'):_(args.qualifier)' ',--space
' is a [[Wikipedia:stub|stub]]. You can help Wikipedia by [',
args.article or 'article',
page:fullUrl('action=edit', 'relative'),
args.qualifier or '',
' expanding it].'
page:fullUrl('action=edit', 'relative')
)
))
:done()
if args.name then
:node(args.note and
buffer:wikitext(require('Module:Navbar')._navbar{
mw.html.create()
args.name,
mini = :tag'yesp',
:addClass'asbox-note'
style = 'position: absolute; right: 15px; display: none;'
:wikitext(args.note)
})
:done()
end
)
if args.note then
buffer:tagallDone('br')
:node(args.name and
buffer:tag('span')
require'Module:Navbar'._navbar{
:css('font-style', 'normal')
args.name,
:css('font-size', 'smaller')
mini = 'yes',
:wikitext(args.note)
}
end
)
--[[
Stub categories for templates include a sort key; this ensures that all stub tags appear at the beginning of their respective categories.
Articles using the template do not need a sort key since they have unique names.
When p.demo equals 'doc', the demo stub categories will appear as those for a stub template.
Otherwise, any non-nil p.demo will emulate article space categories (plus any error cats unless set to 'art')
]]
if page.namespace == 0 then -- Main namespace
category'All stub articles'
catStub()
elseif argsp.demo then
if p.demo ~= 'doc' then catStub() end
--Preview categories; not in original template, but shouldn't hurt
--Unless p.demo is set to 'art', it will also include error categories normally only shown on
p.templatepage(frame, page)
--the template but not in the article. The elseif after namespace == 0 means demo cats will never show in article space.
output:wikitext(string.format('<small>Demo categories: %s</small>', category{done = true}))
p.demodoc = p.demo ~= 'art' and p.templatepage(frame, page)
output = mw.html.create()
:node(output)
:tag'small':wikitext(
'Demo categories: ',
(category{done = true}:gsub('(%[%[)(Category:)([^|%]]-)(%|)', '%1%2%3|%2%3%4'):gsub('(%[%[)(Category:)', '%1:%2'))
):done()
:wikitext(p.demo == 'doc' and p.demodoc or nil)
else
--Checks for valid name; emulates original template's check using {{FULLPAGENAME:{{{name|}}}}}
local normalizedName = mw.title.new(args.name or '')
if normalizedName and normalizedName.fullText == page.fullText then
output = mw.html.create():node(output):wikitext(p.templatepage(frame, page))
elseif not page.isSubpage and page.namespace == 10 then -- Template namespace and not a subpage
category{{k = args.name and 'E' or 'W', t = page.text}}
end
end
return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(output:wikitext(not p.demo and category{done = true} or nil))
return output
:wikitext(
category{done = not args.demo},
args.demo == 'doc' and p.templatepage(frame, page) or nil
)
end