Модуль:Іншыя катэгорыі
Выгляд
Гэты модуль стварае й рэалізуе шаблён {{Іншыя катэгорыі}}.
-- Гэты модуль апрацоўвае {{Іншыя катэгорыі}}
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