Module:Section link/doc: Difference between revisions
Appearance
Content deleted Content added
Caleb Cooper (talk | contribs) Created page with "-- This module implements {{section link}}. require('Module:No globals'); local checkType = require('libraryUtil').checkType local p = {} local function makeSectionLink(pag..." |
Caleb Cooper (talk | contribs) No edit summary |
||
| Line 1: | Line 1: | ||
{{Module rating|protected}} |
|||
-- This module implements {{section link}}. |
|||
{{Commons Import}} |
|||
require('Module:No globals'); |
|||
This module creates links to sections, nicely formatted with the "§" symbol instead of the default "#". |
|||
local checkType = require('libraryUtil').checkType |
|||
== Usage == |
|||
local p = {} |
|||
=== From wikitext === |
|||
local function makeSectionLink(page, section, display) |
|||
display = display or section |
|||
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) |
|||
end |
|||
From wikitext, this module should be used via the template {{tl|section link}}. Please see the template page for documentation. |
|||
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 |
|||
=== From Lua === |
|||
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() |
|||
First, load the module: |
|||
-- Deal with blank page names elegantly |
|||
if page and not page:find('%S') then |
|||
page = nil |
|||
options.nopage = true |
|||
end |
|||
<syntaxhighlight lang="lua"> |
|||
-- Make the link(s). |
|||
local mSectionLink = require('Module:Section link') |
|||
local isShowingPage = not options.nopage |
|||
</syntaxhighlight> |
|||
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 |
|||
if options.display and options.display ~= '' then |
|||
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 |
|||
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 |
|||
You can then make section links via the _main function. |
|||
-- 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) |
|||
<syntaxhighlight lang="lua"> |
|||
-- Add the intro text. |
|||
mSectionLink._main(page, sections, options, title) |
|||
local intro = '§§ ' |
|||
</syntaxhighlight> |
|||
if isShowingPage then |
|||
intro = (page or title.prefixedText) .. ' ' .. intro |
|||
end |
|||
ret = intro .. ret |
|||
Parameters: |
|||
return ret |
|||
* <var>page</var> - the page name to link to. Defaults to the full page name of <var>title</var>, or the current title if that is not specified. |
|||
end |
|||
* <var>sections</var> - an array of section names to link to, or a string to link to just one section name. |
|||
end |
|||
* <var>options</var> - a table of options. Accepts the following fields: |
|||
** <var>nopage</var> - set this to true to avoid displaying the base page name in links. |
|||
* <var>title</var> - a default [[mw:Extension:Scribunto/Lua reference manual#Title objects|mw.title object]] to use instead of the current title. Intended for testing purposes. |
|||
All parameters are optional. |
|||
== Examples == |
|||
function p.main(frame) |
|||
local yesno = require('Module:Yesno') |
|||
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 |
|||
}) |
|||
{| class="wikitable" |
|||
for k, v in pairs(args) do -- replace underscores in the positional parameter values |
|||
|- |
|||
if 'number' == type(k) then |
|||
! Lua code |
|||
if not yesno (args['keep-underscores']) then -- unless |keep-underscores=yes |
|||
! Wikitext code |
|||
args[k] = mw.uri.decode (v, 'WIKI'); -- percent-decode; replace underscores with space characters |
|||
! Result |
|||
else |
|||
|- |
|||
args[k] = mw.uri.decode (v, 'PATH'); -- percent-decode; retain underscores |
|||
| {{code|mSectionLink('Paris')|lua}} |
|||
end |
|||
| <code><nowiki>{{section link|Paris}}</nowiki></code> |
|||
end |
|||
| {{section link|Paris}} |
|||
end |
|||
|- |
|||
| {{code|mSectionLink('Paris', 'Architecture')|lua}} |
|||
| <code><nowiki>{{section link|Paris|Architecture}}</nowiki></code> |
|||
| {{section link|Paris|Architecture}} |
|||
|- |
|||
| {{code|mSectionLink('Paris', {'Architecture', 'Culture'})|lua}} |
|||
| <code><nowiki>{{section link|Paris|Architecture|Culture}}</nowiki></code> |
|||
| {{section link|Paris|Architecture|Culture}} |
|||
|- |
|||
| {{code|mSectionLink('Paris', {'Architecture', 'Culture', 'Sport'})|lua}} |
|||
| <code><nowiki>{{section link|Paris|Architecture|Culture|Sport}}</nowiki></code> |
|||
| {{section link|Paris|Architecture|Culture|Sport}} |
|||
|- |
|||
| {{code|1=mSectionLink('Paris', {'Architecture', 'Culture', 'Sport'}, {nopage = true})|2=lua}} |
|||
| <code><nowiki>{{section link|Paris|Architecture|Culture|Sport|nopage=yes}}</nowiki></code> |
|||
| {{section link|Paris|Architecture|Culture|Sport|nopage=yes}} |
|||
|} |
|||
<includeonly>{{#ifeq:{{SUBPAGENAME}}|sandbox | | |
|||
-- Sort the arguments. |
|||
<!-- Categories below this line, please; interwikis at Wikidata --> |
|||
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 = mw.text.decode(v, true) |
|||
elseif type(k) == 'number' then |
|||
sections[k] = v |
|||
else |
|||
options[k] = v |
|||
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 |
|||
}}</includeonly> |
|||
-- 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 |
|||
Latest revision as of 14:02, 20 October 2020
| 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 |