Перайсьці да зьместу

Модуль:Іншыя катэгорыі

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі
-- Гэты модуль апрацоўвае {{Іншыя катэгорыі}}

local mHatnote = require('Модуль:Іншае значэньне')

local p = {}

local function makeWikitextError(msg)
	return string.format(
		'<strong class="error">Памылка: %s ([[Шаблён:Іншыя катэгорыі]])</strong>',
		msg
	)
end

-- Атрымлівае даўжыню пасьлядоўнасьці seq. Звычайна гэта трэба рабіць з дапамогай апэратару #
-- але нам трэба працаваць з табліцамі, якія атрымліваюць свае значэньні праз
-- мэтамэтад __index.
local function getSequenceLength(seq)
	local length = 0
	for i in ipairs(seq) do
		length = i
	end
	return length
end

-- Улічваючы табліцу опцыяў, вяртае функцыю, якая фарматуе катэгорыі для
-- гэтых опцыяў.
--
-- Опцыі:
-- праект — код праекту, напрыклад «fr» (для Францускай Вікіпэдыі)
-- showPrefix — лягічнае значэньне, якое паказвае, ці паказваць прэфікс «Катэгорыя:»
--              (і прэфікс праекту, калі ўказаны)
--
-- Гэта рэалізавана як генэратар функцыяў, а не як простая функцыя
-- каб мы маглі проста апрацоўваць парамэтры толькі адзін раз, а ня кожны раз, калі мы
-- генэруем катэгорыю.
local function newCategoryLinker(options)
	local formatString
	if options.project then
		if options.showPrefix then
			formatString = '[[:' .. options.project .. ':Катэгорыя:%s]]'
		else
			formatString = '[[:' .. options.project .. ':Катэгорыя:%s|%s]]'
		end
	else
		if options.showPrefix then
			formatString = '[[:Катэгорыя:%s]]'
		else
			formatString = '[[:Катэгорыя:%s|%s]]'
		end
	end
	return function (category)
		local title = mw.title.new(category)
		local pageName, display
		if not title then
			-- катэгорыя не зьяўляецца дапушчальным загалоўкам, звычайна з-за няправільных
			-- сымбаляў, напрыклад < ці [. Гэта выклікае памылку й падаўляе стэкавую
			-- інфармацыю пра узровень, каб мы маглі яе перахапіць і адфарматаваць паведамленьне
			-- пра памылку як вікітэкст.
			error(string.format(
				"'%s' ёсьць недапушчальнай назвай катэгорыі",
				category
			), 0)
		elseif title.namespace == 14 then -- Прастора назваў катэгорыяў
			pageName = title.text
			display = title.text
		else
			pageName = title.prefixedText
			display = category
		end
		-- Мы можам абысьціся выкарыстаньнем двух аргумэнтаў, нават калі
		-- options.showDisplay = false, бо string.format ігнаруе дадатковыя 
		-- аргумэнты, пакуль ёсьць аргумэнт для кожнага сьцягу ў
		-- фарматным радку.
		return formatString:format(pageName, display)
	end
end

function p._main(args)
	local nLinks = getSequenceLength(args)

	if nLinks < 1 then
		return makeWikitextError('патрэбны хаця б адзін парамэтар')
	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
			-- Калі адбылася памылка, то categoryLink — паведамленьне пра памылку.
			return makeWikitextError(categoryLink)
		end
	end

	local formatString
	if nLinks == 1 then
		formatString = '%s: %s'
	else
		formatString = '%s катэгорыі %s'
	end

	-- Не выводзіць коску перад «і», калі ў нас ёсьць толькі дзьве спасылкі.
	local conjunction
	if nLinks == 2 then
		conjunction = ' і '
	else
		conjunction = ', і '
	end

	local hatnoteText = formatString:format(
		args.LABEL or args.label or 'Глядзіце таксама',
		mw.text.listToText(links, ', ', conjunction)
	)
	return mHatnote._hatnote(hatnoteText, {selfref = true})
end

function p.main(frame)
	local args = require('Модуль:Аргумэнты').getArgs(frame, {
		wrappers = 'Шаблён:Іншыя катэгорыі',
	})
	return p._main(args)
end

return p