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 |
meta>Mr. Stradivarius keep the "Category:" prefix if we have one link |
||
| 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) | ||
-- We can get away with using two arguments even when 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(category, category) | return formatString:format(category, category) | ||
end | end | ||
| Line 32: | Line 58: | ||
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] = makeCategoryLink(cat) | links[i] = makeCategoryLink(cat) | ||
end | 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 = string.format( | local hatnoteText = string.format( | ||
'%s: %s.', | '%s: %s.', | ||
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}) | ||
Revision as of 13:29, 12 May 2017
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)
-- We can get away with using two arguments even when 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(category, category)
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
links[i] = makeCategoryLink(cat)
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 = string.format(
'%s: %s.',
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