మాడ్యూల్:Category see also: కూర్పుల మధ్య తేడాలు

వికీపీడియా నుండి
Jump to navigation Jump to search
Content deleted Content added
output "the categories" before the links if we have more than one link
better namespace handling for category names, and raise an error for invalid titles
పంక్తి 50: పంక్తి 50:
end
end
return function (category)
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
-- We can get away with using two arguments even when
-- options.showDisplay is false, as string.format ignores extra
-- options.showDisplay is false, as string.format ignores extra
-- arguments as long as there is an argument for each flag in the
-- arguments as long as there is an argument for each flag in the
-- format string.
-- format string.
return formatString:format(category, category)
return formatString:format(pageName, display)
end
end
end
end
పంక్తి 72: పంక్తి 90:
local links = {}
local links = {}
for i, cat in ipairs(args) do
for i, cat in ipairs(args) do
local success, categoryLink = pcall(makeCategoryLink, cat)
links[i] = 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



06:50, 15 మే 2017 నాటి కూర్పు

-- 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