Module:Hatnote: Difference between revisions
Content added Content deleted
m (1 revision imported: cquote/rquote) |
(don't add pages in the user namespace to Category:Hatnote templates with errors) |
||
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 |
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 |
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 |
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 130: | Line 134: | ||
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( |
||
Line 140: | Line 145: | ||
) |
) |
||
end |
end |
||
return p._formatLink |
return p._formatLink{ |
||
link = link, |
|||
display = args[2], |
|||
italicizePage = yesno(args.italicizepage), |
|||
italicizeSection = yesno(args.italicizesection), |
|||
} |
|||
end |
end |
||
function |
local function italicize(s) |
||
-- Italicize a string. |
|||
checkType('_formatLink', 1, link, 'string') |
|||
return '<i>' .. s .. '</i>' |
|||
checkType('_formatLink', 2, display, 'string', true) |
|||
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 |
|||
local function parseLink(link) |
|||
-- Remove the initial colon for links where it was specified manually. |
|||
-- 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. |
||
local prePipe, display = link:match('^(.-)|(.*)$') |
|||
link = prePipe or link |
|||
link = prePipe or link |
|||
display = postPipe |
|||
end |
|||
-- Find the |
-- Find the section, if it exists. |
||
local page, section = link:match('^(.-)#(.*)$') |
|||
page = page or link |
|||
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 |
|||
) |
|||
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 |
local page = maybeItalicize(parsed.page, options.italicizePage) |
||
local section = maybeItalicize(parsed.section, options.italicizeSection) |
|||
if page then |
|||
if section then |
|||
display = page .. ' § ' .. section |
|||
display = string.format('%s § %s', page, section) |
|||
else |
|||
display = page |
|||
end |
end |
||
end |
end |
||
return string.format('[[:%s|%s]]', parsed.link, display) |
|||
-- Assemble the link. |
|||
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 |
||