Modul:Archives

Archives může být použit k vygenerování seznamu archivů.

PoužitíEditovat

Modul zkusí podle zadaných parametrů najít existující podstránky s archivovanými diskusemi a vypíše je v seznamu.

{{#invoke:Archives|list}}:

* [[Diskuse:Homosexualita/Archiv 1|Archiv 1]]

{{#invoke:Archives|list|Diskuse s wikipedistou:Patriccck/Archiv/%|number|, }}:

[[Diskuse s wikipedistou:Patriccck/Archiv/2017|2017]], [[Diskuse s wikipedistou:Patriccck/Archiv/2018|2018]], [[Diskuse s wikipedistou:Patriccck/Archiv/2019|2019]]
pattern

{{#invoke:Archives|list|pattern = Diskuse s wikipedistou:Ján Kepler/Archiv/%}}:

* [[Diskuse s wikipedistou:Ján Kepler/Archiv/1|1]]
title

{{#invoke:Archives|list|title = subpage}} nebo {{#invoke:Archives|list}}:

* [[Diskuse s wikipedistou:Janbery/Archiv1|Archiv1]]

{{#invoke:Archives|list|title = number}}:

* [[Diskuse s wikipedistou:Janbery/Archiv1|1]]

{{#invoke:Archives|list|title = Archiv %}}:

* [[Diskuse s wikipedistou:Janbery/Archiv1|Archiv 1]]
delimiter

{{#invoke:Archives|list|delimiter = ,}}:

[[Diskuse s wikipedistou:Patriccck/Archiv/2017|2017]],[[Diskuse s wikipedistou:Patriccck/Archiv/2018|2018]],[[Diskuse s wikipedistou:Patriccck/Archiv/2019|2019]]
local p = {}

function p.list(frame)
	local a = require('Modul:Arguments')
	local params = a.getArgs(frame)

	local numbers = {}
	for i=1,9 do
		numbers['0' .. i] = 0
	end
	for i=2002,os.date('%Y') do
		numbers[i] = 0
	end
	for i=0,98 do
		numbers[i] = 0
		if #numbers == 99 then break end
	end

	local pattern = params['pattern'] or params[1] or mw.title.getCurrentTitle().prefixedText .. '/Archiv %'
	local _, count = string.gsub(pattern, '%%', '')
	local page_title = pattern
	local page_title2 = pattern
	local page_title3 = pattern
	local page = ''
	local pages = {}
	if count >= 1 then
		for i, _ in pairs(numbers) do
			page_title2 = string.gsub(page_title, '%%', i, 1)
			if count >= 2 then
				-- not working currently
				-- exceeds the limit of 99 page.exists checks
				-- requires implementing binary search algorithm to make it work
				for j, _ in pairs(numbers) do
					page_title3 = string.gsub(page_title2, '%%', j, 1)
					page = mw.title.new(page_title3)
					pages[page] = j
				end
			else
				page = mw.title.new(page_title2)
				pages[page] = i
			end
		end
	else
		page = mw.title.new(page_title)
		pages[page] = -1
	end

	local link_type = params['title'] or params[2] or 'subpage'
	local link_title = ''
	local link = ''
	local archives = {}
	local archivesort = {}
	for page, id in pairs(pages) do
		if page.exists then
			if link_type == 'subpage' then
				link_title = '|' .. page.subpageText
			elseif link_type == 'number' then
				link_title = '|' .. string.match(tostring(id), '0?(%d+)')
			else
				link_title = '|' .. string.gsub(link_type, '%%', string.match(tostring(id), '0?(%d+)'))
			end
			link = '[[' .. page.prefixedText .. link_title .. ']]'
			table.insert(archives, link)
			archivesort[link] = id
		end
	end

	function order (first, second)
		if tonumber(archivesort[first]) < tonumber(archivesort[second]) then
		    return true
		else
			return false
		end
	end
	table.sort(archives, order)

	local delimiter = params['delimiter'] or params[3] or '\n* '
	local result = table.concat(archives, delimiter)
	if string.sub(delimiter, 1, 1) == '\n' then
		result = mw.text.trim(delimiter .. result)
	end
	return result
end

return p