Module:Asbox
Revision as of 03:20, 6 January 2015 by blackwiki>Codehydro (comments and some code simplification)
| This Lua module is used on approximately 2,350,000 pages, or roughly 585% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. Transclusion count updated automatically (see documentation). |
| This module is rated as ready for general use. It has reached a mature form and is thought to be bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
| 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. |
Usage
This module implements the {{Asbox}} template. Please see the template page for usage instructions.
Acknowledgements
In addition to the contributors listed in the contribution histories of Template:Asbox and Module:Asbox, this module also implements ideas from the deleted Template:Asbox/templatepage, which primary author is User:MSGJ and included code contributions from User:WOSlinker, and User:Od_Mishehu.
Tracking category
local p = {
cats = {inv = {}}
}
local WRAPPER_TEMPLATE = 'Template:Asbox'
local args, stubCats
function demo(text, alt)
return args.demo and text or alt
end
--Formats category links. Stores them until called with cat.done=true
--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.
--Such keys must always be paired in a table {{'cat', 'sort'}}
local attention = 'Stub message templates needing attention'
function category(cat)
for _, v in ipairs(type(cat) == type'' and {cat} or cat) do
p.key = string.format(
'[[%sCategory:%s]]',
demo(':', ''),
--All user-inputed cats are always paired with a sort key
--Since all non-user cat are longer than 2 chars, we can
--compare length instead of checking type
#v > 2 and v or string.format(
demo('%s|Category:%s|%s', '%s|%s%s'),
#v[1] < 2 and attention or v[1],
#v[1] < 2 and attention or v[1],
#v[1] < 2 and table.concat(v) or v[2]
)
)
if not p.cats.inv[p.key] then
table.insert(p.cats, p.key)
p.cats.inv[p.key] = #p.cats
end
end
return cat.done and table.concat(p.cats, demo(' | ', '')) or ''
end
--Makes an ombox warning; will return an empty string instead
--if optional v.ifNot is true
function ombox(v)--{text, {subcat, page}}
if v.ifNot then
return ''
end
p.ombox = p.ombox or require('Module:Message box').ombox
category{v[2]}
return p.ombox{
type = 'content',
text = v[1]
}
end
function catStub(page, pageDoc)--p.templatepage passes page; p.main does not
stubCats = {
missing = {},
S = {},
v = {}
}
--Find category parameters and store the number (main cat = '')
for k, _ in pairs(args) do
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
cat = args['category' .. v]
tsort = args['tempsort' .. v]
--Does not place in main category if |tempsort = 'no'
--For example, if stub template simply adds |qualifier= to a meta stub
--and includes a |category#= to a sub-category of the main category
if v ~= '' or tsort ~= 'no' then
table.insert(stubCats.v, {cat, page and (tsort or ('*' .. page.text))})
end
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
table.insert(stubCats.missing, '<code>category' .. v .. '</code>')
end
table.insert(stubCats.v,
--Only check for docs if main |category= is set and flags if present.
--Main categories with no docs and all numbered categories
--are checked for proper naming and flagged if not
v == '' and pageDoc.exists and
'Stub message templates with documentation subpages'
or not string.match(cat, ' stubs$') and {'S', page.text}
or nil
)
end
end
--Add category names after loop is completed
category(stubCats.v)
--Out params set to non-categories with <code> tags to ombox
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),
{'N', page.text}
} or ''
end
--Shows population of categories found by catStub()
--Outputs demo values if there are none
function population()
local wikitext, base = '', '* [[:Category:%s]] (population: (%s)\n'
if #stubCats == 0 then
return string.format(base, '{{{category}}}', 0)
end
for k, v in ipairs(stubCats) do
wikitext = wikitext .. string.format(base, args['category' .. v], mw.site.stats.pagesInCategory(args['category' .. v], 'all'))
end
return wikitext
end
--Flags bad stub templates and creates standard doc page
function p.templatepage(frame, page)
local tStubDoc = mw.title.new('Template:Stub documentation')
local pageDoc = mw.title.new(page.fullText .. '/doc')
page = page or mw.title.getCurrentTitle()
args = args or require('Module:Arguments').getArgs(frame, {
wrappers = WRAPPER_TEMPLATE
})
category{
'Stub message templates',
'Exclude in print',
--Changed. Original Asbox does its first of 3 checks on params |category#= here.
--Rather than checking multiple times, all operations involving those params have been rolled into catStub()
(args.icon and
'Stub message templates using icon parameter'
or (args.image and
(mw.title.new('Media:' .. mw.text.split(args.image, '|')[1]).exists and
nil
or {'B', page.text}
)
or 'Stub message templates without images'
)
),
args.imagealt and {'I', page.text} or nil
}
--Show ombox warnings and check for bat stub categories
return ombox{
ifNot = args.category,
'The <code>|category</code> parameter is not set. Please add an appropriate stub category.',
{'C', page.text}
}
.. ombox{
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.',
{'D', page.text}
}
.. catStub(page, pageDoc)
--Add standard stub template documentation
.. ((args.demo and args.demo ~= 'doc' and '') or (require('Module:Documentation').main{
content =
(page.text ~= 'Stub' and --This comparison performed in {{Asbox/stubtree}} before it invokes Module:Asbox stubtree
require('Module:Asbox stubtree').subtree{args = {pagename = page.text}}
or ''
)
.. '\n== About this template ==\nThis template is used to identify a '
.. string.format('%s stub%s.', args.subject or '', args.qualifier and (' ' .. args.qualifier) or '')
.. ' 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>{{'
.. (page.text == 'Stub' and
'stub'
or page.text
)
.. '}}</code> produces the message shown at the beginning, and adds the article to the following categor' .. (#stubCats > 1 and 'ies' or 'y') .. ':\n'
.. population()
.. (pageDoc.exists and --transclusion of /doc if it exists
frame:expandTemplate{title = pageDoc.text}
or ''
)
.. '\n== General information ==\n'--Generic documentation
.. 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)
page = page or mw.title.getCurrentTitle()
args = args or require('Module:Arguments').getArgs(frame, {
wrappers = WRAPPER_TEMPLATE
})
local output = mw.html.create()
local asbox = output:tag'table'
:addClass('metadata plainlinks stub')
:css('background', 'transparent')
:attr('role', 'presentation')
if args.icon or args.image then
asbox:tag('td'):wikitext(args.icon or string.format(
'[[File:%s|%spx|alt=%s]]',
args.image,
args.pix or '40x30',
args.imagealt or 'Stub icon'
))
end
local buffer = asbox:tag('td')
buffer:tag('i'):wikitext(string.format(
'This %s %s %s is a [[Wikipedia:stub|stub]]. You can help Wikipedia by [%s expanding it].',
args.subject or '',
args.article or 'article',
args.qualifier or '',
page:fullUrl('action=edit', 'relative')
))
if args.name then
buffer:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 'yes',
style = 'position: absolute; right: 15px; display: none;'
})
end
if args.note then
buffer:tag('br')
buffer:tag('span')
:css('font-style', 'normal')
:css('font-size', 'smaller')
:wikitext(args.note)
end
if page.namespace == 0 then -- Main namespace
category'All stub articles'
catStub()
elseif args.demo then
--Preview categories; not in original template, but shouldn't hurt
p.templatepage(frame, page)
output:wikitext(string.format('<small>Demo categories: %s</small>', category{done = true}))
else
local normalizedName = mw.title.new(args.name or '')
if normalizedName and normalizedName.fullText == page.fullText then
output:wikitext(p.templatepage(frame, page))
elseif not page.isSubpage and page.namespace == 10 then -- Template namespace and not a subpage
category{{args.name and 'E' or 'W', page.text}}
end
end
return output
:wikitext(
category{done = not args.demo},
args.demo == 'doc' and p.templatepage(frame, page) or nil
)
end
return p