Модуль:ArticleCandidatesNavigation

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
{{i}} Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]

Модуль для шаблонів навігації на підсторінках ВП:ВИЛ {{ВПВИЛ-навігація}}, ВП:ПОЛ {{ВППОЛ-навігація}} тощо.

Використання

{{#invoke:ArticleCandidatesNavigation|navigation
|pagename=Вікіпедія:Статті-кандидати на вилучення
|linkText=На вилучення
|seeAlso=
;Також
: [[Вікіпедія:Статті-кандидати на вилучення|усі кандидати на вилучення]]
|reminder=Пам'ятайте, що статті вилучаються за підсумками обговорення, а не голосування. Неаргументовані голоси не враховуються!
}}

Результат

 
На вилучення:5 травня6 травня7 травня8 травня9 травня10 травня11 травня
Також
усі кандидати на вилучення

Пам'ятайте, що статті вилучаються за підсумками обговорення, а не голосування. Неаргументовані голоси не враховуються!

Функції

Напівжирним позначено обов'язкові параметри.

navigation

Основна функція. Генерує шаблон з навігацією по підсторінках. Параметри:

|pagename=
Повна назва кореневої сторінки.
|linkText=
Текст посилання, яке відображається зліва від календаря підсторінок.
|days=
Кількість днів, які відображаються в календарі підсторінок (включно з поточним). За замовчуванням 7.
|seeAlso=
Додаткова інформація. Відображається меншим шрифтом, списки горизонтальні.
|reminder=
Окреме нагадування. Відкоремлюється від тіла шаблону горизонтальною лінією.
|closed=
Закриття обговорення. Будь-який вміст параметру підставляє шаблон {{closed}}.
|opencat=
Категорія для сторінок з відкритими обговореннями.
|closedcat=
Категорія для сторінок із закритими обговореннями.
|nocat=
Відключення категоризації шаблоном. Будь-який вміст параметру запобігає включенню сторінки у категорії, вказані в opencat і closedcat.
|dateFormat=
Формат дати у назвах підсторінок. Див. довідку. За замовчуванням j xg Y.
|color=
Колір рамки і горизонтальної лінії-відокремлювача. За замовчуванням #6cbed0

dayLink

Генерує посилання на підсторінку, якщо підсторінки не існує - повертає текст сірого кольору. Параметри:

|pagename=
|dateFormat=
Аналогічні відповідним параметрам функції navigation.
|targetDay=
День, на підсторінку якого потрібне посилання. Формат дати повинен підтримуватися функцією парсеру #time. За замовчуванням поточний день.

daysTable

Генерує таблицю-календар підсторінок. Параметри:

|pagename=
|linkText=
|days=
|dateFormat=
Аналогічні відповідним параметрам функції navigation.
local p = {}

-- Посилання на підсторінку певного дня
function p.dayLink(pagename, targetDay, dateFormat)
    local frame = mw.getCurrentFrame()
	if not targetDay then
		local targetDay = frame:callParserFunction('#time', 'Y-m-d')
	end
	if not dateFormat then
		local dateFormat = 'j xg Y'
	end
	local dayPage = frame:callParserFunction('#time', dateFormat, targetDay)
	local linkText = frame:callParserFunction('#time', 'j xg', targetDay)
	local exists = tonumber(frame:callParserFunction('#ifexist', pagename .. '/' .. dayPage, 1, 0))
	local link
	if exists == 1 then
		link = '[[' .. pagename .. '/' .. dayPage .. '|' .. linkText .. ']]'
	else
		link = '<span style="color: gray;">' .. linkText .. '</span>'
	end
	return link
end

-- Календар підсторінок
function p.daysTable(pagename, linkText, days, dateFormat)
	if not days then
		local days = 7
	end
	if not dateFormat then
		local dateFormat = 'j xg Y'
	end
	local tbl = mw.html.create('table')
	tbl
		:addClass('center')
		:css('width', 'auto')
		:css('margin', '0 auto')
	local row
	local adjust
	for i = 1, days do
		if i % 7 == 1 then
			tbl:node(row)
			row = mw.html.create('tr')
			if i == 1 then
				row:tag('td')
					:attr('rowspan', math.ceil(days / 7))
					:css('font-weight', 'bold')
					:wikitext('[[' .. pagename .. '|' .. linkText .. ':]]')	
			end
			if i / 7 > 1 then
				row:css('font-size', 'small')
			end
			--[[
				поправка для дат в таблиці.
				порядковий номер дати                   1	2	3	4	5	6	7
				різниця між даною і поточною датою     -6  -5  -4  -3  -2  -1   0
				поправка                               -7  -7  -7  -7  -7  -7  -7
					
													    8	9  10  11  12  13  14
													  -13 -12 -11 -10  -9  -8  -7
													  -21 -21 -21 -21 -21 -21 -21
				тобто <величина поправки> = 7 * (2 * <номер рядка> - 1)
				можна вирахувати поправку один раз для всього рядка, взявши перший елемент.
				тоді <номер рядка> = i // 7 + 1 = (i - 1) / 7 + 1
				<величина поправки> = 7 * (2 * ((i - 1) / 7 + 1)) - 1) = 7 * (2 * (i - 1) / 7 + 2 - 1) =
				                    = 7 * (2 * (i - 1) / 7 + 1) = 2 * (i - 1) + 7 = 2 * i - 2 + 7 = 2 * i + 5
			  ]]
			adjust = 2 * i + 5
			-- для останнього рядка таблиці додаємо порожню клітинку, щоб вирівняти дати праворуч, і відповідно змінюємо поправку
			if i == math.floor(days / 7) * 7 + 1 then
				row:tag('td'):attr('colspan', 7 - days % 7)
				adjust = adjust + days % 7 - 7
			end
		end
		local targetDay = mw.getCurrentFrame():callParserFunction('#time', 'Y-m-d', tostring(i - adjust) .. 'days')
		row:tag('td'):wikitext(p.dayLink(pagename, targetDay, dateFormat))
		if i == days then
			tbl:node(row)
		end
	end
	
	return tbl
end

-- Знаходження найближчої існуючої підсторінки
local function findClosest(pagename, targetDay, sign, dateFormat)
    local frame = mw.getCurrentFrame()
	local dayPage
	local exists
	for i = 1, 28 do 
		dayPage = frame:callParserFunction('#time', dateFormat, targetDay .. sign .. i .. 'days')
		exists = tonumber(frame:callParserFunction('#ifexist', pagename .. '/' .. dayPage, 1, 0))
		if exists == 1 then
			return dayPage
		end
	end

	return nil
end

-- Посилання на найближчі підсторінки
local function PrevNext(pagename, dateFormat)
    local frame = mw.getCurrentFrame()
	local pageDay = frame:expandTemplate{ title = 'Date Converter', args = { mw.title.getCurrentTitle().subpageText } }
	local prv = findClosest(pagename, pageDay, '-', dateFormat)
	local nxt = findClosest(pagename, pageDay, '+', dateFormat)
	local res = ''
	if prv then
		res = res .. '[[' .. pagename .. '/' .. prv .. '|<<]]'
	end
	if prv and nxt then
		res = res .. ' | '
	end
	if nxt then
		res = res .. '[[' .. pagename .. '/' .. nxt .. '|>>]]'
	end
	
	return res
end

-- Основна функція: генерація шаблону навігації
function p.navigation(frame) 
	local args = frame.args
	if not args.days then
		args.days = 7
	end
	if not args.dateFormat then
		args.dateFormat = 'j xg Y'
	end
	if not args.color then
		args.color = '#6cbed0'
	end
	
	local res = ''
	
	if args.closed and #args.closed > 0 then
		res = res .. frame:expandTemplate{ title = 'closed' } .. '</b>'
		if args.closedcat and (not args.nocat or #args.nocat == 0) then
			res = res .. '[[Категорія:' .. args.closedcat .. ']]'
		end
	elseif args.opencat and (not args.nocat or #args.nocat == 0) then
		res = res .. '[[Категорія:' .. args.opencat .. ']]'
	end
	
	local nav = mw.html.create('div')
	if args.id then
		nav:attr('id', args.id)
	end
	if args.class then
		nav:addClass(args.class)
	end
	nav
		:css('background', '#fff')
		:css('border', '1px solid' .. args.color)
		:css('margin-bottom', '1em')
		:css('padding', '.5em .25em .25em')
		:css('text-align', 'center')
	
	local tbl = mw.html.create('table')
	tbl
		:css('width', '100%')
		:tag('tr')
			:tag('td')
				:css('width', '75px')
				:wikitext('&nbsp;')
			:done()
			:tag('td')
				:css('text-align', 'center')
				:node(p.daysTable(args.pagename, args.linkText, tonumber(args.days), args.dateFormat))
			:done()
			:tag('td')
				:css('width', '75px')
				:css('text-align', 'right')
				:css('font-size', '120%')
				:css('font-weight', 'bold')
				:wikitext(PrevNext(args.pagename, args.dateFormat))
			:done()
		:done()
	:done()
	
	if args.seeAlso and #args.seeAlso > 0 then
	tbl
		:tag('tr')
			:css('font-size', 'small')
			:tag('td')
				:attr('colspan', '3')
				:addClass('hlist')
				:css('text-align', 'center')
				:wikitext('\n' .. args.seeAlso)
			:done()
		:done()
	end
	
	nav:node(tbl)
		
	if args.reminder then
		nav
			:tag('hr')
				:css('background', args.color)
			:done()
			:wikitext(args.reminder)
	end
	
	res = res .. tostring(nav)
		
	return res
end

return p