Module:Labelled list hatnote: Difference between revisions
From Roses, Tulips, & Liberty
Content added Content deleted
m (1 revision imported) |
(Fixed iteration-and-removal bug) |
||
Line 10: | Line 10: | ||
local mHatlist = require('Module:Hatnote list') |
local mHatlist = require('Module:Hatnote list') |
||
local mArguments --initialize lazily |
local mArguments --initialize lazily |
||
local yesno --initialize lazily |
|||
local p = {} |
local p = {} |
||
Line 18: | Line 19: | ||
prefixes = {'label', 'label ', 'l'}, |
prefixes = {'label', 'label ', 'l'}, |
||
template = 'Module:Labelled list hatnote' |
template = 'Module:Labelled list hatnote' |
||
} |
|||
-- Localizable message strings |
|||
local msg = { |
|||
errorSuffix = '#Errors', |
|||
⚫ | |||
noOutputWarning = |
|||
"'''[[%s]] — no output: none of the target pages exist.'''" |
|||
} |
} |
||
Line 26: | Line 35: | ||
-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1' |
-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1' |
||
prefixes = prefixes or defaults.prefixes |
prefixes = prefixes or defaults.prefixes |
||
local |
local indices = {} |
||
local sparsePages = {} |
|||
for k, v in pairs(args) do |
for k, v in pairs(args) do |
||
if type(k) == 'number' then |
if type(k) == 'number' then |
||
⚫ | |||
local display |
local display |
||
for i = 1, #prefixes do |
for i = 1, #prefixes do |
||
Line 34: | Line 45: | ||
if display then break end |
if display then break end |
||
end |
end |
||
sparsePages[k] = display and |
|||
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v |
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v |
||
⚫ | |||
end |
end |
||
end |
end |
||
table.sort(indices) |
|||
⚫ | |||
for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end |
|||
return pages |
return pages |
||
end |
|||
--Helper function to get a page target from a processed page string |
|||
--e.g. "Page|Label" → "Page" or "Target" → "Target" |
|||
local function getTarget(pagename) |
|||
local pipe = string.find(pagename, '|') |
|||
return string.sub(pagename, 0, pipe and pipe - 1 or nil) |
|||
end |
end |
||
Line 49: | Line 69: | ||
function p.labelledList (frame) |
function p.labelledList (frame) |
||
mArguments = require('Module:Arguments') |
mArguments = require('Module:Arguments') |
||
yesno = require('Module:Yesno') |
|||
local labels = {frame.args[1] or defaults.label} |
local labels = {frame.args[1] or defaults.label} |
||
labels[2] = frame.args[2] or labels[1] |
labels[2] = frame.args[2] or labels[1] |
||
Line 57: | Line 78: | ||
local pages = p.preprocessDisplays(args) |
local pages = p.preprocessDisplays(args) |
||
local options = { |
local options = { |
||
category = yesno(args.category), |
|||
extraclasses = frame.args.extraclasses, |
extraclasses = frame.args.extraclasses, |
||
ifexists = yesno(frame.args.ifexists), |
|||
namespace = frame.args.namespace or args.namespace, |
|||
selfref = yesno(frame.args.selfref or args.selfref), |
|||
template = template |
template = template |
||
} |
} |
||
Line 66: | Line 89: | ||
function p._labelledList (pages, labels, options) |
function p._labelledList (pages, labels, options) |
||
if options.ifexists then |
|||
⚫ | |||
for k = #pages, 1, -1 do --iterate backwards to allow smooth removals |
|||
⚫ | |||
local v = pages[k] |
|||
⚫ | |||
local title = mw.title.new(getTarget(v), namespace) |
|||
⚫ | |||
if (v == '') or title == nil or not title.exists then |
|||
⚫ | |||
table.remove(pages, k) |
|||
⚫ | |||
end |
|||
end |
|||
end |
end |
||
⚫ | |||
label = (#pages == 1 and labels[1] or labels[2]) or defaults.label |
label = (#pages == 1 and labels[1] or labels[2]) or defaults.label |
||
for k, v in pairs(pages) do |
for k, v in pairs(pages) do |
||
Line 83: | Line 108: | ||
(labels[4] or labels[2] or defaults.label) |
(labels[4] or labels[2] or defaults.label) |
||
) or defaults.label |
) or defaults.label |
||
end |
|||
end |
|||
if #pages == 0 then |
|||
if options.ifexists then |
|||
mw.addWarning( |
|||
string.format( |
|||
msg.noOutputWarning, options.template or defaults.template |
|||
) |
|||
) |
|||
return '' |
|||
else |
|||
⚫ | |||
msg.noInputWarning, |
|||
⚫ | |||
⚫ | |||
) |
|||
end |
end |
||
end |
end |