Module:Highest archive number

Documentation for this module may be created at Module:Highest archive number/doc

-- This module finds the highest existing archive number for a set of talk
-- archive pages.

local expSearch = require('Module:Exponential search')
local p = {}

local function raiseStartNumberError(start)
	error(string.format(
		'Invalid start number "%s" supplied to [[Module:Highest archive number]] (must be an integer)',
		tostring(start)
	), 3)
end

local function pageExists(page)
	local success, exists = pcall(function()
		return mw.title.new(page).exists
	end)
	return success and exists
end

function p._main(prefix, start)
	-- Check our inputs
	if type(prefix) ~= 'string' or not prefix:find('%S') then
		error('No prefix supplied to [[Module:Highest archive number]]', 2)
	end
	if start ~= nil and (type(start) ~= "number" or math.floor(start) ~= start) then
		raiseStartNumberError(start)
	end
	start = start or 1
	
	-- Do an exponential search for the highest archive number
	local result = expSearch(function (i)
		local archiveNumber = i + start - 1
		local page = prefix .. tostring(archiveNumber)
		return pageExists(page)
	end, 10)
	
	if result == nil then
		-- We didn't find any archives for our prefix + start number
		return nil
	else
		-- We found the highest archive, but the number is always 1-based, so
		-- adjust it for our start number
		return result + start - 1
	end
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {
		trim = false,
		removeBlanks = false,
		wrappers = 'Template:Highest archive number'
	})
	local prefix = args[1]
	
	-- Get the start archive number, if specified.
	local start = args.start
	if start == "" then
		start = nil
	elseif start then
		start = tonumber(start)
		if not start then
			raiseStartNumberError(args.start)
		end
	end

	return p._main(prefix, start)
end

return p