Mô đun:Category see also

-- Mô đun này thực hiện 
local mHatnote = require('Mô đun:Hatnote')
local p = {}
local function makeWikitextError(msg)
	return string.format(
		'Lỗi: %s (Bản mẫu:Xem thêm thể loại)',
		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 "Thể loại:" 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 .. ':Thể loại:%s'
		else
			formatString = '%s'
		end
	else
		if options.showPrefix then
			formatString = ':Thể loại:%s'
		else
			formatString = '%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' không phải là một tên thể loại hợp lệ",
				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('yêu cầu ít nhất một tham số')
	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
			linksi = 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: thể loại %s.'
	end
	-- Don't output a comma before the "and" if we have only two links.
	local conjunction
	if nLinks == 2 then
		conjunction = ' và '
	else
		conjunction = ', và '
	end
	local hatnoteText = formatString:format(
		args.LABEL or 'Xem thêm',
		mw.text.listToText(links, ', ', conjunction)
	)
	return mHatnote._hatnote(hatnoteText, {selfref = true})
end
function p.main(frame)
	local args = require('Mô đun:Arguments').getArgs(frame, {
		wrappers = 'Bản mẫu:Xem thêm thể loại',
	})
	return p._main(args)
end
return p