Module:Category see also: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Mr. Stradivarius (create replacement for Template:Category see also) |
m (5 revisions imported) |
||
(6 intermediate revisions by 3 users not shown) | |||
Line 12: | Line 12: | ||
end | end | ||
-- Given a | -- Gets the length of the sequence seq. Usually this should be done with the # | ||
-- project | -- operator, but we need to work with tables that get their values through an | ||
-- the | -- __index metamethod. | ||
local function getSequenceLength(seq) | |||
local length = 0 | |||
for i in ipairs(seq) do | |||
length = i | |||
end | |||
return length | |||
end | |||
-- Given a table of options, returns a function that formats categories for | |||
-- those options. | |||
-- | |||
-- Options: | |||
-- project - a project code such as "fr" (for the French Wikipedia) | |||
-- showPrefix - a boolean value for whether to show the "Category:" prefix | |||
-- (and the project prefix if specified) | |||
-- | -- | ||
-- This is implemented as a function generator rather than a simple function | -- This is implemented as a function generator rather than a simple function | ||
-- so that we can just process the | -- so that we can just process the options once, instead of every time we | ||
-- | -- generate a category. | ||
local function | local function newCategoryLinker(options) | ||
local formatString | local formatString | ||
if project then | if options.project then | ||
formatString = '[[:' .. project .. ':Category:%s|%s]]' | if options.showPrefix then | ||
formatString = '[[:' .. options.project .. ':Category:%s]]' | |||
else | |||
formatString = '[[:' .. options.project .. ':Category:%s|%s]]' | |||
end | |||
else | else | ||
formatString = '[[:Category:%s|%s]]' | if options.showPrefix then | ||
formatString = '[[:Category:%s]]' | |||
else | |||
formatString = '[[:Category:%s|%s]]' | |||
end | |||
end | end | ||
return function (category) | return function (category) | ||
return formatString:format( | local title = mw.title.new(category) | ||
local pageName, display | |||
if not title then | |||
-- category is not a valid title, usually because of invalid | |||
-- characters like < or [. Raise an error and suppress the stack | |||
-- level information so that we can catch it and format the error | |||
-- message as wikitext. | |||
error(string.format( | |||
"'%s' is not a valid category name", | |||
category | |||
), 0) | |||
elseif title.namespace == 14 then -- Category namespace | |||
pageName = title.text | |||
display = title.text | |||
else | |||
pageName = title.prefixedText | |||
display = category | |||
end | |||
-- We can get away with using two arguments even when | |||
-- options.showDisplay is false, as string.format ignores extra | |||
-- arguments as long as there is an argument for each flag in the | |||
-- format string. | |||
return formatString:format(pageName, display) | |||
end | end | ||
end | end | ||
function p._main(args) | function p._main(args) | ||
if | local nLinks = getSequenceLength(args) | ||
if nLinks < 1 then | |||
return makeWikitextError('at least one parameter required') | return makeWikitextError('at least one parameter required') | ||
end | end | ||
local makeCategoryLink = | |||
local makeCategoryLink = newCategoryLinker{ | |||
project = args.project, | |||
showPrefix = nLinks == 1, | |||
} | |||
local links = {} | local links = {} | ||
for i, cat in ipairs(args) do | for i, cat in ipairs(args) do | ||
links[i] = | local success, categoryLink = pcall(makeCategoryLink, cat) | ||
if success then | |||
links[i] = categoryLink | |||
else | |||
-- If there was an error, then categoryLink is the error message. | |||
return makeWikitextError(categoryLink) | |||
end | |||
end | end | ||
local | |||
'%s: %s.', | local formatString | ||
if nLinks == 1 then | |||
formatString = '%s: %s.' | |||
else | |||
formatString = '%s: the categories %s.' | |||
end | |||
-- Don't output a comma before the "and" if we have only two links. | |||
local conjunction | |||
if nLinks == 2 then | |||
conjunction = ' and ' | |||
else | |||
conjunction = ', and ' | |||
end | |||
local hatnoteText = formatString:format( | |||
args.LABEL or 'See also', | args.LABEL or 'See also', | ||
mw.text.listToText(links, ', ', | mw.text.listToText(links, ', ', conjunction) | ||
) | ) | ||
return mHatnote._hatnote(hatnoteText, {selfref = true}) | return mHatnote._hatnote(hatnoteText, {selfref = true}) |
Latest revision as of 13:37, 3 September 2020
Documentation for this module may be created at Module:Category see also/doc
-- This module implements {{Category see also}} local mHatnote = require('Module:Hatnote') local p = {} local function makeWikitextError(msg) return string.format( '<strong class="error">Error: %s ([[Template:Category see also]])</strong>', msg ) end -- Gets the length of the sequence seq. Usually this should be done with the # -- operator, but we need to work with tables that get their values through an -- __index metamethod. local function getSequenceLength(seq) local length = 0 for i in ipairs(seq) do length = i end return length end -- Given a table of options, returns a function that formats categories for -- those options. -- -- Options: -- project - a project code such as "fr" (for the French Wikipedia) -- showPrefix - a boolean value for whether to show the "Category:" prefix -- (and the project prefix if specified) -- -- This is implemented as a function generator rather than a simple function -- so that we can just process the options once, instead of every time we -- generate a category. local function newCategoryLinker(options) local formatString if options.project then if options.showPrefix then formatString = '[[:' .. options.project .. ':Category:%s]]' else formatString = '[[:' .. options.project .. ':Category:%s|%s]]' end else if options.showPrefix then formatString = '[[:Category:%s]]' else formatString = '[[:Category:%s|%s]]' end end return function (category) local title = mw.title.new(category) local pageName, display if not title then -- category is not a valid title, usually because of invalid -- characters like < or [. Raise an error and suppress the stack -- level information so that we can catch it and format the error -- message as wikitext. error(string.format( "'%s' is not a valid category name", category ), 0) elseif title.namespace == 14 then -- Category namespace pageName = title.text display = title.text else pageName = title.prefixedText display = category end -- We can get away with using two arguments even when -- options.showDisplay is false, as string.format ignores extra -- arguments as long as there is an argument for each flag in the -- format string. return formatString:format(pageName, display) end end function p._main(args) local nLinks = getSequenceLength(args) if nLinks < 1 then return makeWikitextError('at least one parameter required') end local makeCategoryLink = newCategoryLinker{ project = args.project, showPrefix = nLinks == 1, } local links = {} for i, cat in ipairs(args) do local success, categoryLink = pcall(makeCategoryLink, cat) if success then links[i] = categoryLink else -- If there was an error, then categoryLink is the error message. return makeWikitextError(categoryLink) end end local formatString if nLinks == 1 then formatString = '%s: %s.' else formatString = '%s: the categories %s.' end -- Don't output a comma before the "and" if we have only two links. local conjunction if nLinks == 2 then conjunction = ' and ' else conjunction = ', and ' end local hatnoteText = formatString:format( args.LABEL or 'See also', mw.text.listToText(links, ', ', conjunction) ) return mHatnote._hatnote(hatnoteText, {selfref = true}) end function p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Category see also', }) return p._main(args) end return p