Editing Module:Section link

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. Read the Privacy Policy to learn what information we collect about you and how we use it.

If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 4: Line 4:


local p = {}
local p = {}
local function makeWikitextError(msg)
return string.format(
'<strong class="error">[[Template:Section link]] error: %s.</strong>',
msg
)
end


local function makeSectionLink(page, section, display)
local function makeSectionLink(page, section, display)
Line 9: Line 16:
page = page or ''
page = page or ''
return string.format('[[%s#%s|%s]]', page, section, display)
return string.format('[[%s#%s|%s]]', page, section, display)
end
local function normalizeTitle(title)
title = mw.ustring.gsub(mw.ustring.gsub(title,"'",""),'"','')
return mw.title.new(mw.ustring.gsub(title,"%b<>","")).prefixedText
end
end


Line 20: Line 22:
checkType('_main', 1, page, 'string', true)
checkType('_main', 1, page, 'string', true)
checkType('_main', 3, options, 'table', true)
checkType('_main', 3, options, 'table', true)
if sections == nil then
if type(sections) == 'string' then
sections = {}
elseif type(sections) == 'string' then
sections = {sections}
sections = {sections}
elseif type(sections) ~= 'table' then
elseif type(sections) ~= 'table' then
error(string.format(
error(string.format(
"type error in argument #2 to '_main' " ..
"type error in argument #2 to '_main' (string or table expected, got %s)",
"(string, table or nil expected, got %s)",
type(sections)
type(sections)
), 2)
), 2)
Line 33: Line 32:
options = options or {}
options = options or {}
title = title or mw.title.getCurrentTitle()
title = title or mw.title.getCurrentTitle()
 
if #sections < 1 then
-- Deal with blank page names elegantly
return makeWikitextError('at least one section must be specified')
if page and not page:find('%S') then
page = nil
options.nopage = true
end
end


-- Make the link(s).
-- Make the link(s).
local isShowingPage = not options.nopage
local isShowingPage = not options.nopage
if #sections <= 1 then
if #sections == 1 then
local linkPage = page or ''
local linkPage = page or ''
local section = sections[1] or 'Notes'
local section = sections[1] or 'Notes'
local display = '§&nbsp;' .. section
local display = '§&thinsp;' .. section
if isShowingPage then
if isShowingPage then
page = page or title.prefixedText
page = page or title.prefixedText
if options.display and options.display ~= '' then
display = page .. ' ' .. display
if normalizeTitle(options.display) == normalizeTitle(page) then
display = options.display .. ' ' .. display
else
error(string.format(
'Display title "%s" was ignored since it is ' ..
"not equivalent to the page's actual title",
options.display
), 0)
end
else
display = page .. ' ' .. display
end
end
end
return makeSectionLink(linkPage, section, display)
return makeSectionLink(linkPage, section, display)
else
else
-- Multiple sections. First, make a list of the links to display.
-- Multiple sections. First, make the list of links.
local ret = {}
local ret = {}
for i, section in ipairs(sections) do
for i, section in ipairs(sections) do
ret[i] = makeSectionLink(page, section)
ret[i] = makeSectionLink(page, section)
end
end
 
-- Assemble the list of links into a string with mw.text.listToText.
-- Assemble the list of links into a string with mw.text.listToText.
-- We use the default separator for mw.text.listToText, but a custom
-- We use the default arguments for mw.text.listToText, unless we have
-- conjunction. There is also a special case conjunction if we only
-- exactly two sections, in which case we use a custom conjunction.
-- have two links.
local conjunction
local conjunction
if #sections == 2 then
if #sections == 2 then
conjunction = '&#8203; and '
conjunction = '&#8203; and '
else
conjunction = ', and '
end
end
ret = mw.text.listToText(ret, nil, conjunction)
ret = mw.text.listToText(ret, nil, conjunction)


-- Add the intro text.
-- Add the intro text.
local intro = '§§&nbsp;'
local intro = '§§&thinsp;'
if isShowingPage then
if isShowingPage then
intro = (page or title.prefixedText) .. ' ' .. intro
intro = (page or title.prefixedText) .. ' ' .. intro
end
end
ret = intro .. ret
ret = intro .. ret
 
return ret
return ret
end
end
Line 95: Line 76:
function p.main(frame)
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Section link',
wrappers = 'Template: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
})
})


Line 112: Line 86:
-- Doing this in the loop because of a bug in [[Module:Arguments]]
-- Doing this in the loop because of a bug in [[Module:Arguments]]
-- when using pairs with deleted arguments.
-- when using pairs with deleted arguments.
page = mw.text.decode(v, decodeNamedEntities)
page = v
elseif type(k) == 'number' then
elseif type(k) == 'number' then
sections[k] = v
sections[k] = v
Line 118: Line 92:
options[k] = v
options[k] = v
end
end
end
-- Extract section from page, if present
if page then
local p, s = page:match('^(.-)#(.*)$')
if p then page, sections[1] = p, s end
end
end


Line 139: Line 107:
end
end
sections = compressArray(sections)
sections = compressArray(sections)
 
return p._main(page, sections, options)
return p._main(page, sections, options)
end
end


return p
return p
Please note that all contributions to Nonbinary Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see Nonbinary Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: