Module:Labelled list hatnote: Difference between revisions
Content added Content deleted
m (1 revision imported: flags) |
(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) |
|||
local pages = {} |
|||
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] |
||
labels[3] = frame.args[3] --no defaulting |
|||
labels[4] = frame.args[4] --no defaulting |
|||
local template = frame:getParent():getTitle() |
local template = frame:getParent():getTitle() |
||
local args = mArguments.getArgs(frame, {parentOnly = true}) |
local args = mArguments.getArgs(frame, {parentOnly = true}) |
||
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 64: | 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 |
|||
labels = labels or {} |
labels = labels or {} |
||
⚫ | |||
for k, v in pairs(pages) do |
|||
if mHatnote.findNamespaceId(v) ~= 0 then |
|||
label = |
|||
( |
|||
#pages == 1 and |
|||
(labels[3] or labels[1] or defaults.label) or |
|||
(labels[4] or labels[2] or defaults.label) |
|||
) or defaults.label |
|||
end |
|||
end |
|||
if #pages == 0 then |
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 |
||
⚫ | |||
local text = string.format( |
local text = string.format( |
||
options.labelForm or defaults.labelForm, |
options.labelForm or defaults.labelForm, |