Line 9: |
Line 9: |
| local libraryUtil = require('libraryUtil') | | local libraryUtil = require('libraryUtil') |
| local checkType = libraryUtil.checkType | | local checkType = libraryUtil.checkType |
| + | local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg |
| local mArguments -- lazily initialise [[Module:Arguments]] | | local mArguments -- lazily initialise [[Module:Arguments]] |
| local yesno -- lazily initialise [[Module:Yesno]] | | local yesno -- lazily initialise [[Module:Yesno]] |
Line 56: |
Line 57: |
| local ret = {} | | local ret = {} |
| for i, page in ipairs(pages) do | | for i, page in ipairs(pages) do |
− | ret[i] = p._formatLink(page) | + | ret[i] = p._formatLink{link = page} |
| end | | end |
| return ret | | return ret |
Line 70: |
Line 71: |
| local link = t[1] | | local link = t[1] |
| local display = t[2] | | local display = t[2] |
− | links[i] = p._formatLink(link, display) | + | links[i] = p._formatLink{link = link, display = display} |
| end | | end |
| return links | | return links |
Line 93: |
Line 94: |
| -- Make the category text. | | -- Make the category text. |
| local category | | local category |
− | if not title.isTalkPage and yesno(addTrackingCategory) ~= false then | + | if not title.isTalkPage -- Don't categorise talk pages |
| + | and title.namespace ~= 2 -- Don't categorise userspace |
| + | and yesno(addTrackingCategory) ~= false -- Allow opting out |
| + | then |
| category = 'Hatnote templates with errors' | | category = 'Hatnote templates with errors' |
| category = string.format( | | category = string.format( |
Line 126: |
Line 130: |
| -- with colons if necessary, and links to sections are detected and displayed | | -- with colons if necessary, and links to sections are detected and displayed |
| -- with " § " as a separator rather than the standard MediaWiki "#". Used in | | -- with " § " as a separator rather than the standard MediaWiki "#". Used in |
− | -- the {{format hatnote link}} template. | + | -- the {{format link}} template. |
| -------------------------------------------------------------------------------- | | -------------------------------------------------------------------------------- |
| | | |
| function p.formatLink(frame) | | function p.formatLink(frame) |
| + | -- The formatLink export function, for use in templates. |
| + | yesno = require('Module:Yesno') |
| local args = getArgs(frame) | | local args = getArgs(frame) |
| local link = args[1] | | local link = args[1] |
− | local display = args[2]
| |
| if not link then | | if not link then |
| return p.makeWikitextError( | | return p.makeWikitextError( |
| 'no link specified', | | 'no link specified', |
− | 'Template:Format hatnote link#Errors', | + | 'Template:Format link#Errors', |
| args.category | | args.category |
| ) | | ) |
| end | | end |
− | return p._formatLink(link, display) | + | return p._formatLink{ |
| + | link = link, |
| + | display = args[2], |
| + | italicizePage = yesno(args.italicizepage), |
| + | italicizeSection = yesno(args.italicizesection), |
| + | } |
| end | | end |
| | | |
− | function p._formatLink(link, display) | + | local function italicize(s) |
− | checkType('_formatLink', 1, link, 'string') | + | -- Italicize a string. |
− | checkType('_formatLink', 2, display, 'string', true) | + | return '<i>' .. s .. '</i>' |
| + | end |
| + | |
| + | local function maybeItalicize(s, shouldItalicize) |
| + | -- italicize s if s is a string and the shouldItalicize parameter is true. |
| + | if s and shouldItalicize then |
| + | return italicize(s) |
| + | else |
| + | return s |
| + | end |
| + | end |
| | | |
− | -- Remove the initial colon for links where it was specified manually. | + | local function parseLink(link) |
| + | -- Parse a link and return a table with the link's components. |
| + | -- These components are: |
| + | -- - link: the link, stripped of any initial colon (always present) |
| + | -- - page: the page name (always present) |
| + | -- - section: the page name (may be nil) |
| + | -- - display: the display text, if manually entered after a pipe (may be nil) |
| link = removeInitialColon(link) | | link = removeInitialColon(link) |
| | | |
| -- Find whether a faux display value has been added with the {{!}} magic | | -- Find whether a faux display value has been added with the {{!}} magic |
| -- word. | | -- word. |
− | if not display then | + | local prePipe, display = link:match('^(.-)|(.*)$') |
− | local prePipe, postPipe = link:match('^(.-)|(.*)$')
| + | link = prePipe or link |
− | link = prePipe or link
| + | |
− | display = postPipe | + | -- Find the page, if it exists. |
| + | -- For links like [[#Bar]], the page will be nil. |
| + | local preHash, postHash = link:match('^(.-)#(.*)$') |
| + | local page |
| + | if not preHash then |
| + | -- We have a link like [[Foo]]. |
| + | page = link |
| + | elseif preHash ~= '' then |
| + | -- We have a link like [[Foo#Bar]]. |
| + | page = preHash |
| + | end |
| + | |
| + | -- Find the section, if it exists. |
| + | local section |
| + | if postHash and postHash ~= '' then |
| + | section = postHash |
| end | | end |
| + | |
| + | return { |
| + | link = link, |
| + | page = page, |
| + | section = section, |
| + | display = display, |
| + | } |
| + | end |
| + | |
| + | function p._formatLink(options) |
| + | -- The formatLink export function, for use in modules. |
| + | checkType('_formatLink', 1, options, 'table') |
| + | checkTypeForNamedArg('_formatLink', 'link', options.link, 'string', false) |
| + | checkTypeForNamedArg( |
| + | '_formatLink', |
| + | 'display', |
| + | options.display, |
| + | 'string', |
| + | true |
| + | ) |
| + | checkTypeForNamedArg( |
| + | '_formatLink', |
| + | 'italicizePage', |
| + | options.italicizePage, |
| + | 'boolean', |
| + | true |
| + | ) |
| + | checkTypeForNamedArg( |
| + | '_formatLink', |
| + | 'italicizeSection', |
| + | options.italicizeSection, |
| + | 'boolean', |
| + | true |
| + | ) |
| | | |
− | -- Find the display value. | + | local parsed = parseLink(options.link) |
| + | local display = options.display or parsed.display |
| + | |
| + | -- Deal with the case where we don't have to pipe the link |
| + | if not display and not parsed.section and not options.italicizePage then |
| + | return string.format('[[:%s]]', parsed.link) |
| + | end |
| + | |
| + | -- Find the display text for piped links |
| if not display then | | if not display then |
− | local page, section = link:match('^(.-)#(.*)$') | + | local page = maybeItalicize(parsed.page, options.italicizePage) |
− | if page then | + | local section = maybeItalicize(parsed.section, options.italicizeSection) |
− | display = page .. ' § ' .. section | + | if not page then |
| + | display = string.format('§ %s', section) |
| + | elseif section then |
| + | display = string.format('%s § %s', page, section) |
| + | else |
| + | display = page |
| end | | end |
| end | | end |
− | | + | |
− | -- Assemble the link. | + | return string.format('[[:%s|%s]]', parsed.link, display) |
− | if display then | |
− | return string.format(
| |
− | '[[:%s|%s]]',
| |
− | string.gsub(link, '|(.*)$', ''), --display overwrites manual piping
| |
− | display
| |
− | )
| |
− | else
| |
− | return string.format('[[:%s]]', link)
| |
− | end
| |
| end | | end |
| | | |