Module:Hatnote: Difference between revisions

Content deleted Content added
make makeWikitextError use Module:Yesno to parse the demo parameter, and remove underscores from all the function names, as that's normally done for private functions, whereas these are public
Revert
 
(42 intermediate revisions by 11 users not shown)
Line 3:
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{rellinkhatnote}} and {{hatnoteformat link}} meta-templates, and includes --
-- helper functions for other Lua hatnote modules. to format hatnote links. --
--------------------------------------------------------------------------------
 
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
 
local p = {}
Line 28 ⟶ 30:
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
 
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
 
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
 
Line 34 ⟶ 53:
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to truefalse.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
Line 50 ⟶ 69:
end
 
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
function p.formatPages(...)
-- Formats aan listerror ofmessage pagesto usingbe formatLinkreturned and returns it as anto arraywikitext. NilIf
-- addTrackingCategory is not false after being returned from
-- values are not allowed.
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
local pages = {...}
-- is added.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p.formatLink(page)
end
return ret
end
 
function p.formatPageTables(...)
-- Takes a list of page/display tables and returns it as a list of
-- formatted links. Nil values are not allowed.
local pages = {...}
local links = {}
for i, t in ipairs(pages) do
checkType('formatPageTables', i, t, 'table')
local link = t[1]
local display = t[2]
links[i] = p.formatLink(link, display)
end
return links
end
 
function p.makeWikitextError(msg, demo)
-- Formats an error message to be returned to wikitext. If demo is not nil
-- or false, no error category is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
local errorCategory = 'Hatnote templates with errors'
-- Make the help link text.
local errorCategoryLink
local helpText
if yesno(demo) then
if helpLink then
errorCategoryLink = string.format(
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
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 = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
errorCategory
)
else
errorCategoryLinkcategory = ''
end
return stringmw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
errorCategoryLink
category
)
end
 
local curNs = mw.title.getCurrentTitle().namespace
--------------------------------------------------------------------------------
p.missingTargetCat =
-- Format link
--Default missing target category, exported for use in related modules
--
((curNs == 0) or (curNs == 14)) and
-- Makes a wikilink from the given link and display values. Links are escaped
'Articles with hatnote templates targeting a nonexistent page' or nil
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#".
--------------------------------------------------------------------------------
 
function p.formatLinkquote(frametitle)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
local args = getArgs(frame)
--mark, kerns that side as with {{-'}}
local link = args[1]
local displayquotationMarks = args[2]{
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
if not link then
}
return p.makeWikitextError('no link specified')
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
end
quotationMarks[string.sub(title, 1, 1)],
return p.formatLink(link, display)
quotationMarks[string.sub(title, -1, -1)]
end
if quoteLeft or quoteRight then
 
title = mw.html.create("span"):wikitext(title)
function p.formatLink(link, display)
-- Find whether we need to use the colon trick or not. We need to use the
-- colon trick for categories and files, as otherwise category links
-- categorise the page and file links display the file.
checkType('formatLink', 1, link, 'string')
checkType('formatLink', 2, display, 'string', true)
link = removeInitialColon(link)
local namespace = p.findNamespaceId(link, false)
local colon
if namespace == 6 or namespace == 14 then
colon = ':'
else
colon = ''
end
 
-- Find the display value.
if not display then
local page, section = link:match('^(.-)#(.*)$')
if page then
display = page .. ' § ' .. section
end
end
 
-- Assemble the link.
if display then
return string.format('[[%s%s|%s]]', colon, link, display)
else
return string.format('[[%s%s]]', colon, link)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
 
Line 152 ⟶ 136:
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
p[''] = function (frame) return p.hatnote(frame:newChild{ title = "Template:Hatnote" }) end
 
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
local options = {}
if not s then
return p.makeWikitextError(
'no text specified'),
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
options.extraclasses = args.extraclasses
options.selfref extraclasses = args.selfrefextraclasses,
selfref = args.selfref
return p._hatnote(s, options)
})
end
 
Line 168 ⟶ 157:
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local classes = {'rellink'}
local extraclassesinline = options.extraclassesinline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local selfref = options.selfref
iflocal type(extraclasses) == 'string' then
if type(options.extraclasses) == 'string' then
classes[#classes + 1] = extraclasses
extraclasses = options.extraclasses
end
 
if selfref then
hatnote
classes[#classes + 1] = 'selfref'
:attr('role', 'note')
end
:addClass(p.defaultClasses(inline))
return string.format(
:addClass(extraclasses)
'<div class="%s">%s</div>',
:addClass(options.selfref and 'selfref' or nil)
table.concat(classes, ' '),
:wikitext(s)
 
)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end