|
ll>Primefac |
Line 1: |
Line 1: |
| -- This module implements {{section link}}.
| | {{#invoke:Section link|main}}<noinclude> |
| | | {{documentation}} |
| local checkType = require('libraryUtil').checkType
| | <!-- Categories go on the /doc subpage and interwikis go on Wikidata. --> |
| | | </noinclude> |
| 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 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
| |