| 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', |
| | + | noInputWarning = 'no page names specified', |
| | + | 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 pages = {} | + | 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 |
| | + | indices[#indices + 1] = k |
| | 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 |
| − | local page = display and | + | sparsePages[k] = display and |
| | string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v | | string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v |
| − | pages[#pages + 1] = page
| |
| | 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] |
| 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, |
| − | category = args.category, | + | ifexists = yesno(frame.args.ifexists), |
| − | selfref = frame.args.selfref or args.selfref, | + | namespace = frame.args.namespace or args.namespace, |
| | + | selfref = yesno(frame.args.selfref or args.selfref), |
| | template = template | | template = template |
| | } | | } |
| | return p._labelledList(pages, labels, options) | | return p._labelledList(pages, labels, options) |
| | + | end |
| | + | local function exists(title) |
| | + | local success, result = pcall(function() return title.exists end) |
| | + | if success then |
| | + | return result |
| | + | else |
| | + | return true |
| | + | end |
| | end | | end |
| | | | |
| | function p._labelledList (pages, labels, options) | | function p._labelledList (pages, labels, options) |
| | + | local removednonexist = false |
| | + | if options.ifexists then |
| | + | for k = #pages, 1, -1 do --iterate backwards to allow smooth removals |
| | + | local v = pages[k] |
| | + | if mw.ustring.sub(mw.text.trim(v), 1, 1) ~= "#" then |
| | + | local title = mw.title.new(getTarget(v), namespace) |
| | + | if (v == '') or (title == nil) or not exists(title) then |
| | + | table.remove(pages, k) |
| | + | removednonexist = true |
| | + | end |
| | + | end |
| | + | end |
| | + | end |
| | labels = labels or {} | | labels = labels or {} |
| − | if #pages == 0 then
| |
| − | return mHatnote.makeWikitextError(
| |
| − | 'no page names specified',
| |
| − | (options.template or defaults.template) .. '#Errors',
| |
| − | options.category
| |
| − | )
| |
| − | 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 120: |
| | (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 removednonexist then |
| | + | mw.addWarning( |
| | + | string.format( |
| | + | msg.noOutputWarning, options.template or defaults.template |
| | + | ) |
| | + | ) |
| | + | return '' |
| | + | else |
| | + | return mHatnote.makeWikitextError( |
| | + | msg.noInputWarning, |
| | + | (options.template or defaults.template) .. msg.errorSuffix, |
| | + | options.category |
| | + | ) |
| | end | | end |
| | end | | end |