Line 1: |
Line 1: |
| -- This module implements {{section link}}. | | -- This module implements {{section link}}. |
| + | require('Module:No globals'); |
| | | |
| local checkType = require('libraryUtil').checkType | | local checkType = require('libraryUtil').checkType |
Line 9: |
Line 10: |
| 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, "'", ""), '"', '') |
| + | title = mw.ustring.gsub(title, "%b<>", "") |
| + | return mw.title.new(title).prefixedText |
| end | | end |
| | | |
Line 40: |
Line 47: |
| local linkPage = page or '' | | local linkPage = page or '' |
| local section = sections[1] or 'Notes' | | local section = sections[1] or 'Notes' |
− | local display = '§ ' .. section | + | local display = '§ ' .. section |
| if isShowingPage then | | if isShowingPage then |
| page = page or title.prefixedText | | page = page or title.prefixedText |
− | display = page .. ' ' .. display | + | 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 | | end |
| return makeSectionLink(linkPage, section, display) | | return makeSectionLink(linkPage, section, display) |
Line 66: |
Line 85: |
| | | |
| -- 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 77: |
Line 96: |
| | | |
| 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 87: |
Line 107: |
| 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 95: |
Line 125: |
| -- 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 = v | + | page = mw.text.decode(v, true) |
| elseif type(k) == 'number' then | | elseif type(k) == 'number' then |
| sections[k] = v | | sections[k] = v |
Line 101: |
Line 131: |
| 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 |
| | | |