Module:Section link
Appearance
![]() | This Lua module is used in MediaWiki:Abusefilter-warning-notwallofshame, and on approximately 91,000 pages. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid major disruption, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on the talk page before implementing them. |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This module creates links to sections, nicely formatted with the "§" symbol instead of the default "#".
Usage
From wikitext
From wikitext, this module should be used via the template {{section link}}. Please see the template page for documentation.
From Lua
First, load the module:
local mSectionLink = require('Module:Section link')
You can then make section links via the _main function.
mSectionLink._main(page, sections, options, title)
Parameters:
- page - the page name to link to. Defaults to the full page name of title, or the current title if that is not specified.
- sections - an array of section names to link to, or a string to link to just one section name.
- options - a table of options. Accepts the following fields:
- nopage - set this to true to avoid displaying the base page name in links.
- title - a default mw.title object to use instead of the current title. Intended for testing purposes.
All parameters are optional.
Examples
Lua code | Wikitext code | Result |
---|---|---|
mSectionLink('Paris')
|
{{section link|Paris}}
|
Template:Section link error: at least one section must be specified. |
mSectionLink('Paris', 'Architecture')
|
{{section link|Paris|Architecture}}
|
Paris § Architecture |
mSectionLink('Paris', {'Architecture', 'Culture'})
|
{{section link|Paris|Architecture|Culture}}
|
Paris §§ Architecture and Culture |
mSectionLink('Paris', {'Architecture', 'Culture', 'Sport'})
|
{{section link|Paris|Architecture|Culture|Sport}}
|
Paris §§ Architecture, Culture and Sport |
mSectionLink('Paris', {'Architecture', 'Culture', 'Sport'}, {nopage = true})
|
{{section link|Paris|Architecture|Culture|Sport|nopage=yes}}
|
§§ Architecture, Culture and Sport |
See also
- The character used is U+00A7 § SECTION SIGN (§)
-- This module implements {{section link}}.
local checkType = require('libraryUtil').checkType
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)
display = display or section
page = page or ''
return string.format('[[%s#%s|%s]]', page, section, display)
end
function p._main(page, sections, options, title)
-- Validate input.
checkType('_main', 1, page, 'string', true)
checkType('_main', 3, options, 'table', true)
if type(sections) == 'string' then
sections = {sections}
elseif type(sections) ~= 'table' then
error(string.format(
"type error in argument #2 to '_main' (string or table expected, got %s)",
type(sections)
), 2)
end
options = options or {}
title = title or mw.title.getCurrentTitle()
if #sections < 1 then
return makeWikitextError('at least one section must be specified')
end
-- Make the link(s).
local isShowingPage = not options.nopage
if #sections == 1 then
local linkPage = page or ''
local section = sections[1] or 'Notes'
local display = '§ ' .. section
if isShowingPage then
page = page or title.prefixedText
display = page .. ' ' .. display
end
return makeSectionLink(linkPage, section, display)
else
-- Multiple sections. First, make the list of links.
local ret = {}
for i, section in ipairs(sections) do
ret[i] = makeSectionLink(page, section)
end
-- Assemble the list of links into a string with mw.text.listToText.
-- We use the default arguments for mw.text.listToText, unless we have
-- exactly two sections, in which case we use a custom conjunction.
local conjunction
if #sections == 2 then
conjunction = '​ and '
end
ret = mw.text.listToText(ret, nil, conjunction)
-- Add the intro text.
local intro = '§§ '
if isShowingPage then
intro = (page or title.prefixedText) .. ' ' .. intro
end
ret = intro .. ret
return ret
end
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:Section link'
})
-- Sort the arguments.
local page
local sections, options = {}, {}
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 = v
elseif type(k) == 'number' then
sections[k] = v
else
options[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)
return p._main(page, sections, options)
end
return p