Module:Article stub box: Difference between revisions
Created page with "--[[ This module was created by User:CodeHydro (Alexander Zhikun He). User:Jackmcbarn and User:Mr._Stradivarius provided a great deal of assistance in writting p.main() p.main() draw heavily from the following version of Template:Asbox of the English Wikipedia, authored primarily by User:Rich_Farmbrough https://en.wikipedia.org/w/index.php?title=Template:Asbox&oldid=619510287 p.templatepage() is derived from the following revision of Template:Asbox/templatepage, author..." |
No edit summary |
||
| Line 33: | Line 33: | ||
}, require('Module:Buffer') | }, 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 attention, catTag, catKey = Buffer'Stub message templates needing attention', '[[Category:%s]]', '%s|%s%s' | ||
local function category(cat) | local function category(cat) | ||
for _, v in ipairs((tostring(cat) == cat or cat.t) and {cat} or cat) do | for _, v in ipairs((tostring(cat) == cat or cat.t) and {cat} or cat) do | ||
if v and v ~= true then | --[[ | ||
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; | |||
Takes table {ifNot = Boolean, text, {cat. sort key, cat. sort name}} | |||
Will return an empty string instead when ifNot evaluates to true | |||
]] | |||
local function ombox(v) | |||
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 | |||
--[[ | |||
Unlike original template, module now takes unlimited cats! This function also performs | |||
most stub category error checks except for the ombox for when main |category= is omitted (See p.template()) | |||
]] | |||
local function catStub(page, pageDoc) | |||
stubCats = {missing = {}, 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 | |||
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) | |||
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. | |||
table.insert(stubCats.v, | |||
page and (--p.templatepage passes page; p.main does not, i.e. articles are categorized without sort keys. | |||
v=='' and tsort == 'no'--if true, inserts 'true' in table, which category() will reject | |||
or tsort and {cat, k = ' ', t = tsort} | |||
or {cat, k = ' *', t = page.text}--note space in front of sort key | |||
) | |||
or cat | |||
) | |||
--Check category existance only if on the template page (i.e. stub documentation) | |||
if page then | |||
if not mw.title.new('Category:' .. cat).exists then | |||
code = code or mw.html.create'code':wikitext'|category' | |||
table.insert(stubCats.missing, tostring(mw.clone(code):wikitext(v))) | |||
end | end | ||
p. | --[[ | ||
Checks non-demo stub template for documentation and flags if doc is present. | |||
All stub cats names are checked and flagged if it does not match 'Category: [] stub'. | |||
The main stub cat is exempt from the name check if the stub template has its own doc | |||
(presumably, this doc would have an explanation as to why the main stub cat is non-conforming). | |||
]] | |||
table.insert(stubCats.v, v == '' and not p.demo and pageDoc.exists and | |||
'Stub message templates with documentation subpages' | |||
or not cat:match' stubs$' and {k = 'S', t = page.text} | |||
) | |||
end | |||
end | |||
--Add category names after loop is completed | |||
category(stubCats.v) | |||
return #stubCats.missing > 0 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} | |||
} | |||
end | |||
--Shows population of categories found by catStub(). Outputs demo values if none | |||
local function population() | |||
local wikitext, base = {}, '* [[:Category:%s]] (population: %s)\n' | |||
if not args.category and stubCats[1] ~= false then | |||
table.insert(stubCats, 1, false) | |||
end | |||
for _, v in ipairs(stubCats) do | |||
table.insert(wikitext, base:format( | |||
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. | |||
function p.templatepage(frame, page) | |||
args, page = p:init(frame, page) | |||
local tStubDoc = mw.title.new'Template:Stub documentation' | |||
local pageDoc = page:subPageTitle('doc') | |||
--Reorganization note: Original Asbox alternates between outputting categories and checking on params |category#=. | |||
--Rather than checking multiple times and switching tasks, all stub category param operations have been rolled into catStub() | |||
return Buffer( | |||
ombox{--Show ombox warnings for missing args. | |||
ifNot = args.category, | |||
'The <code>|category</code> parameter is not set. Please add an appropriate stub category.', | |||
{k = 'C', t = 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.', | |||
{k = 'D', t = page.text} | |||
}) | |||
:_(catStub(page, pageDoc))--catStub() may also return an ombox if there are non-existing categories | |||
:_(category{ | |||
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 | |||
require('Module:Documentation').main{ | |||
content = Buffer(page.text ~= 'Stub' and--This comparison performed in {{Asbox/stubtree}} before it invokes Module:Asbox stubtree | |||
-- TODO: update this instance of Asbox to Article stub box eventually | |||
require('Module:Asbox stubtree').subtree{args = {pagename = page.text}} | |||
) | |||
:_in'\n== About this template ==\nThis template is used to identify a':_(args.subject):_'stub':_(args.qualifier):_out' '--space | |||
:_'. 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' | |||
:wikitext( mw.text.nowiki( '{{' ), page.text == 'Stub' and 'stub' or page.text, '}}') | |||
) | |||
:_' 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} | |||
) | |||
:_'\n== General information ==\n' | |||
:_(frame:expandTemplate{title = tStubDoc.text}) | |||
:_'\n\n'(), | |||
['link box'] = Buffer'This documentation is automatically generated by [[Module:Article stub box]].' | |||
:_in'The general information is transcluded from [[Template:Stub documentation]]. ' | |||
:_(mw.html.create'span' | |||
:cssText'font-size:smaller;font-style:normal;line-height:130%' | |||
:node(('([%s edit] | [%s history])'):format( | |||
tStubDoc:fullUrl('action=edit', 'relative'), | |||
tStubDoc:fullUrl('action=history', 'relative') | |||
)) | |||
) | |||
:_out() | |||
:_(page.protectionLevels.edit and page.protectionLevels.edit[1] == 'sysop' and | |||
"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.' | |||
)' <br/>' | |||
} | |||
)() | |||
end | |||
function p.main(frame, page) | |||
args, page = p:init(frame, page) | |||
local output = mw.html.create'div' | |||
:attr{role = 'note'} | |||
:addClass'metadata plainlinks asbox stub' | |||
:tag'table' | |||
:attr{role = 'presentation'} | |||
:tag'tr' | |||
:addClass'noresize' | |||
:node((args.icon or args.image) and | |||
mw.html.create'td' | |||
:wikitext(args.icon or ('[[File:%s|%spx|alt=%s]]'):format( | |||
args.image or '', | |||
args.pix or '40x30', | |||
args.imagealt or 'Stub icon' | |||
)) | |||
) | |||
:tag'td' | |||
:tag'p' | |||
:addClass'asbox-body' | |||
:wikitext( | |||
Buffer'This':_(args.subject):_(args.article or 'article'):_(args.qualifier)' ',--space | |||
' is a [[Wikipedia:stub|stub]]. You can help Wikipedia by [', | |||
page:fullUrl('action=edit', 'relative'), | |||
' expanding it].' | |||
) | |||
:done() | |||
:node(args.note and | |||
mw.html.create() | |||
:tag'p' | |||
:addClass'asbox-note' | |||
:wikitext(args.note) | |||
:done() | |||
) | |||
:allDone() | |||
:node(args.name and | |||
require'Module:Navbar'._navbar{ | |||
args.name, | |||
mini = 'yes', | |||
} | |||
) | |||
--[[ | |||
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 p.demo then | |||
if p.demo ~= 'doc' then catStub() end | |||
--Unless p.demo is set to 'art', it will also include error categories normally only shown on | |||
--the template but not in the article. The elseif after namespace == 0 means demo cats will never show in article space. | |||
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 | ||
end | end | ||
return | return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(output:wikitext(not p.demo and category{done = true} or nil)) | ||
end | end | ||
return p | |||