Module:Multi-section link
Module documentation[view] [edit] [history] [purge]
This module implements {{multi-section link}}. Please see the template documentation for usage instructions.
-- This module creates a section link with multiple section names.
local p = {}
local function normalizePageName(page)
local title = mw.title.new(page)
if not title then
error(string.format("'%s' is not a valid page name", page), 3)
elseif title.namespace == 6 or title.namespace == 14 then
return ':' .. title.prefixedText
else
return title.prefixedText
end
end
function p._main(args)
-- Sort the arguments.
local sections = {}
local page = ""
for k, v in pairs(args) do
if k == 1 then
-- Doing this in the loop because of a bug in [[Module:Arguments]]
-- when using pairs with deleted arguments.
page = mw.text.decode(v, true)
elseif type(k) == 'number' then
sections[k] = v
end
end
-- Compress the sections array.
local function compressArray(t)
local nums, ret = {}, {}
for num in pairs(t) do
nums[#nums + 1] = num
end
table.sort(nums)
for i, num in ipairs(nums) do
ret[i] = t[num]
end
return ret
end
sections = compressArray(sections)
-- Deal with blank page names elegantly
if not page:find('%S') then
page = ""
else
page = normalizePageName(page)
end
if #sections == 0 then
if #page == 0 then
error('neither |1=pagename nor |2=section found', 2)
end
return string.format('[[%s]]', page)
end
local builder = {page, ' '}
if #page == 0 then
builder = {}
end
for i, s in ipairs(sections) do
table.insert(builder, string.rep('§', i))
table.insert(builder, ' ')
table.insert(builder, s)
table.insert(builder, ' ')
end
table.remove(builder)
local display = table.concat(builder)
local fragment = sections[#sections]
return string.format('[[%s#%s|%s]]', page, fragment, display)
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Multi-section link',
valueFunc = function (key, value)
value = value:match('^%s*(.-)%s*$') -- Trim whitespace
-- Allow blank first parameters, as the wikitext template does this.
if value ~= '' or key == 1 then
return value
end
end
})
return p._main(args)
end
return p