Module:Section link: Difference between revisions
Appearance
Content deleted Content added
w>Primefac fix error for when {{}} are used inside of the slink (TPER) |
Caleb Cooper (talk | contribs) No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
-- This module implements {{section link}}. |
-- This module implements {{section link}}. |
||
| ⚫ | |||
local checkType = require('libraryUtil').checkType |
local checkType = require('libraryUtil').checkType |
||
| ⚫ | |||
local p = {} |
local p = {} |
||
| Line 9: | Line 9: | ||
display = display or section |
display = display or section |
||
page = page or '' |
page = page or '' |
||
-- MediaWiki doesn't allow these in `page`, so only need to do for `section` |
|||
if type(section) == 'string' then |
|||
section = string.gsub(section, "{", "{") |
|||
section = string.gsub(section, "}", "}") |
|||
end |
|||
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, "'", ""), '"', '') |
|||
title = mw.ustring.gsub(title, "%b<>", "") |
|||
return mw.title.new(title).prefixedText |
|||
end |
end |
||
| Line 48: | Line 37: | ||
-- Make the link(s). |
-- Make the link(s). |
||
local isShowingPage = not options.nopage |
local isShowingPage = not yesno(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 = '§& |
local display = '§ ' .. section |
||
if isShowingPage then |
if isShowingPage then |
||
page = page or title.prefixedText |
page = page or title.prefixedText |
||
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) |
||
| Line 90: | Line 67: | ||
-- Add the intro text. |
-- Add the intro text. |
||
local intro = '§§& |
local intro = '§§ ' |
||
if isShowingPage then |
if isShowingPage then |
||
intro = (page or title.prefixedText) .. ' ' .. intro |
intro = (page or title.prefixedText) .. ' ' .. intro |
||
| Line 101: | Line 78: | ||
function p.main(frame) |
function p.main(frame) |
||
local yesno = require('Module:Yesno') |
|||
local args = require('Module:Arguments').getArgs(frame, { |
local args = require('Module:Arguments').getArgs(frame, { |
||
wrappers = 'Template:Section link', |
wrappers = 'Template:Section link', |
||
| Line 112: | Line 88: | ||
end |
end |
||
}) |
}) |
||
for k, v in pairs(args) do -- replace underscores in the positional parameter values |
|||
if 'number' == type(k) then |
|||
if not yesno (args['keep-underscores']) then -- unless |keep-underscores=yes |
|||
args[k] = mw.uri.decode (v, 'WIKI'); -- percent-decode; replace underscores with space characters |
|||
else |
|||
args[k] = mw.uri.decode (v, 'PATH'); -- percent-decode; retain underscores |
|||
end |
|||
end |
|||
end |
|||
-- Sort the arguments. |
-- Sort the arguments. |
||
| Line 130: | Line 96: | ||
-- 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 = |
page = v |
||
elseif type(k) == 'number' then |
elseif type(k) == 'number' then |
||
sections[k] = v |
sections[k] = v |
||
| Line 136: | Line 102: | ||
options[k] = v |
options[k] = v |
||
end |
end |
||
end |
|||
options.nopage = yesno (options.nopage); -- make boolean |
|||
-- 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 |
||
Latest revision as of 08:50, 15 November 2022
| 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 page was automatically imported from Commons any changes will be overwritten, the source page is here () |
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}}
|
Paris § Notes |
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 |
-- This module implements {{section link}}.
local checkType = require('libraryUtil').checkType
local yesno = require('Module:Yesno')
local p = {}
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 sections == nil then
sections = {}
elseif type(sections) == 'string' then
sections = {sections}
elseif type(sections) ~= 'table' then
error(string.format(
"type error in argument #2 to '_main' " ..
"(string, table or nil expected, got %s)",
type(sections)
), 2)
end
options = options or {}
title = title or mw.title.getCurrentTitle()
-- Deal with blank page names elegantly
if page and not page:find('%S') then
page = nil
options.nopage = true
end
-- Make the link(s).
local isShowingPage = not yesno(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 a list of the links to display.
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 separator for mw.text.listToText, but a custom
-- conjunction. There is also a special case conjunction if we only
-- have two links.
local conjunction
if #sections == 2 then
conjunction = '​ and '
else
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',
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
})
-- 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