Module:Multi-section link: Difference between revisions
Appearance
Content deleted Content added
Andy M. Wang (talk | contribs) changing to non-breaking nbsp per lengthy talk discussion with Edokter, SMcCandlish, LLarson, among others about § not wrapping |
sync from sandbox, allow omitting pagename, adapted from https://en.wikipedia.org/w/index.php?title=Module:Section_link&oldid=1226909451 |
||
Line 15: | Line 15: | ||
function p._main(args) |
function p._main(args) |
||
-- Sort the arguments. |
|||
local |
local sections = {} |
||
⚫ | |||
⚫ | |||
displayParts[i] = v |
|||
⚫ | |||
⚫ | |||
-- Doing this in the loop because of a bug in [[Module:Arguments]] |
|||
-- when using pairs with deleted arguments. |
|||
page = mw.text.decode(v, true) |
|||
⚫ | |||
sections[k] = v |
|||
⚫ | |||
end |
end |
||
local nParts = #displayParts |
|||
-- Compress the sections array. |
|||
⚫ | |||
local function compressArray(t) |
|||
error('no page name found in parameter |1=', 2) |
|||
local nums, ret = {}, {} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
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 |
else |
||
⚫ | |||
⚫ | |||
end |
|||
⚫ | |||
⚫ | |||
if #sections == 0 then |
|||
if #page == 0 then |
|||
⚫ | |||
error('neither |1=pagename nor |2=section found', 2) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
local builder = {page, ' '} |
|||
if #page == 0 then |
|||
builder = {} |
|||
end |
|||
for i, s in ipairs(sections) do |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
|||
table.remove(builder) |
|||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
function p.main(frame) |
function p.main(frame) |
||
local args = require('Module:Arguments').getArgs(frame, { |
local args = require('Module:Arguments').getArgs(frame, { |
||
wrappers = 'Template:Multi-section link' |
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) |
return p._main(args) |
Latest revision as of 11:03, 9 December 2024
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