Module:Category see also: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Mr. Stradivarius
m (fix comment)
meta>Mr. Stradivarius
(output "the categories" before the links if we have more than one link)
Line 73: Line 73:
for i, cat in ipairs(args) do
for i, cat in ipairs(args) do
links[i] = makeCategoryLink(cat)
links[i] = makeCategoryLink(cat)
end
local formatString
if nLinks == 1 then
formatString = '%s: %s.'
else
formatString = '%s: the categories %s.'
end
end


Line 83: Line 90:
end
end


local hatnoteText = string.format(
local hatnoteText = formatString:format(
'%s: %s.',
args.LABEL or 'See also',
args.LABEL or 'See also',
mw.text.listToText(links, ', ', conjunction)
mw.text.listToText(links, ', ', conjunction)

Revision as of 13:36, 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
		-- 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(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

	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