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

Модуль:Выпадковы элемэнт парталу

Зьвесткі зь Вікіпэдыі — вольнай энцыкляпэдыі

Дакумэнтацыю да гэтага модуля можна стварыць у Модуль:Выпадковы элемэнт парталу/Дакумэнтацыя

-- Гэты модуль выкарыстоўваецца ў [[Шаблён:Выпадковы элемэнт парталу]]

local p = {}

local mRandom = require('Модуль:Выпадковасьць')
local currentTitle = mw.title.getCurrentTitle()

-- функцыя адсочваньня
local function subPageTrackingCategories(pages, max, header)
	local retval = "";
	local thispagetitle = mw.title.getCurrentTitle().text

	-- не адсочваць „Ці ведаеце вы“ і пад., толькі абраныя/добрыя артыкулы і інш.
	if ((string.find(header, "/[Аа]браная") == -1) and (string.find(header, "/[Вв]ыбраная") == -1) and
		(string.find(header, "/[Аа]браны") == -1) and (string.find(header, "/[Вв]ыбраны") == -1)) then
		return retval
	end
	-- не адсочваць, калі мы не ў прасторы парталаў
	if (mw.title.getCurrentTitle().nsText ~= "Партал") then
		return ""
	end

	-- не адсочваць, калі падстаронка
	if ((mw.ustring.match(thispagetitle, "/") ~= nil) and (thispagetitle ~= "AC/DC")) then
		return retval
	end

	local maxNum = tonumber(max)
	local availableSubPageCount = maxNum

	-- Праверка адсутных падстаронак у канцы лічбавага дыяпазону
	while availableSubPageCount > 0 and not mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount)).exists do
		availableSubPageCount = availableSubPageCount - 1
	end
	if availableSubPageCount < maxNum then 
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу зь меншай колькасьцю падстаронак, чым зададзена]]"
	else
		-- Пошук няўлічаных падстаронак па-за вызначаным лічбавым дыяпазонам
		while mw.title.new(pages.subpage .. '/' .. tostring(availableSubPageCount + 1)).exists do
			availableSubPageCount = availableSubPageCount + 1
		end
		if availableSubPageCount > maxNum then 
			retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з большай колькасьцю падстаронак, чым зададзена]]"
		end
	end

	-- перад катэгарызацыяй праверыць, які від падстаронак катэгарызуем,
	-- і калі вызначылі, выявы катэгарызаваць асобна
	local subpageType = "падстаронкамі" -- generic type
	local subpageName = pages.subpage
	subpageName = mw.ustring.gsub(subpageName, "^[^/]*/", "")
	subpageName = mw.ustring.lower(subpageName)
	if ((mw.ustring.find(subpageName, "выява", 1, true) ~= nil) or
		(mw.ustring.find(subpageName, "фота", 1, true) ~= nil) or
		(mw.ustring.find(subpageName, "панарама", 1, true) ~= nil)) then
		subpageType = "падстаронкамі выяваў"
	end
	if (availableSubPageCount < 2) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу зь менш чым 2 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 5) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 2—5 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 10) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 6—10 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 15) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 11—15 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 20) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 16—20 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 25) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 21—25 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 30) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 26—30 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 40) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 31—40 існымі " .. subpageType .. "]]"
	elseif (availableSubPageCount <= 50) then
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з 41—50 існымі " .. subpageType .. "]]"
	else
		retval = retval .. "[[Катэгорыя:Вікіпэдыя:Выпадковы элемэнт парталу з больш як 50 існымі " .. subpageType .. "]]"
	end
	return retval;
end
local function getRandomNumber(max)
	-- узяць выпадковы цэлы лік ад 1 да max; дапомна max = 1
	return mRandom.number{max or 1}
end

local function expandArg(args, key)
	-- Імітуе, як няйменаваныя парамэтры шаблёну вывядуцца ў вікітэксьце.
	-- Калі зададзены парамэтар існуе, вяртаецца ягонае значэньне, а калі не —
	-- вяртаецца імя аргумэнта ўнутры трайных фігурных дужак.
	local val = args[key]
	if val then
		return val
	else
		return string.format('{{{%s}}}', key)
	end
end

local function getPages(args)
	local pages = {}
	pages.root = args.rootpage or currentTitle.prefixedText
	pages.subpage = pages.root .. '/' .. expandArg(args, 'subpage')
	local tries = 10
	repeat
		pages.random = pages.subpage .. '/' .. getRandomNumber(args.max)
		tries = tries - 1
	until tries < 1 or mw.title.new(pages.random).exists
	pages.footer = 'Партал:Канец блёку'
	return pages
end

local function tryExpandTemplate(frame, title, args)
	local success, result = pcall(frame.expandTemplate, frame, {title = title, args = args})
	if success then
		return result
	else
		local msg = string.format(
			'<strong class="error">Старонка "[[%s]]" не існуе.</strong>',
			title
		)
		if mw.title.getCurrentTitle().namespace == 100 then -- у прасторы парталаў
			msg = msg .. '[[Катэгорыя:Вікіпэдыя:Парталы, якія патрабуюць увагі]]'
		end
		return msg
	end
end

local function getHeader(frame, pages, header, template)
	return tryExpandTemplate(
		frame,
		template or pages.root .. '/Пачатак блёку',
		{header, pages.random}
	)
end

local function getRandomSubpageContent(frame, pages)
	return tryExpandTemplate(
		frame,
		pages.random
	)
end

local function getFooter(frame, pages, link)
	return tryExpandTemplate(
		frame,
		pages.footer,
		{link}
	)
end

function p._main(args, frame)
	frame = frame or mw.getCurrentFrame()
	local pages = getPages(args)

	local ret = {}
	ret[#ret + 1] = getHeader(frame, pages, args.header or 'subpage', args.headertemplate)
	ret[#ret + 1] = getRandomSubpageContent(frame, pages)
	if not args.footer or not args.footer:find('%S') then
		ret[#ret + 1] = '<div style="clear:both;"></div></div>'
	else
		ret[#ret + 1] = getFooter(frame, pages, string.format(
			'[[%s|%s]]',
			pages.subpage,
			expandArg(args, 'footer')
		))
	end

	return table.concat(ret, '\n') .. subPageTrackingCategories(pages, args.max, args.header)
end

function p._nominate(args, frame)
	frame = frame or mw.getCurrentFrame()
	local pages = getPages(args)
	
	local ret = {}
	ret[#ret + 1] = getHeader(frame, pages, expandArg(args, 'header'), args.headertemplate)
	ret[#ret + 1] = getRandomSubpageContent(frame, pages)
	ret[#ret + 1] = getFooter(frame, pages, string.format(
		'[[/Намінацыя/%s|Прапанаваць]] • [[%s|%s]] ',
		expandArg(args, 'subpage'),
		pages.subpage,
		args.footer or 'Архіў'
	))

	return table.concat(ret, '\n') .. subPageTrackingCategories(pages, args.max, args.header)
end

local function makeInvokeFunction(func)
	return function (frame)
		local args = require('Модуль:Аргумэнты').getArgs(frame, {
			trim = false,
			removeBlanks = false,
			wrappers = {
				'Шаблён:Выпадковы элемэнт парталу',
				'Шаблён:Выпадковы элемэнт парталу з намінацыяй'
			}
		})
		return func(args, frame)
	end
end

p.main = makeInvokeFunction(p._main)
p.nominate = makeInvokeFunction(p._nominate)

return p