Module:Multi-section link

-- 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', 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