Module:Endnote

From Wikisource
Jump to navigation Jump to search

local getArgs = require('Module:Arguments').getArgs
local warn = require('Module:Warning')
local complain = require('Module:Error').error

local p = {}

function p._checkArguments(index, pages, section)
	local missing = {}
	if index == nil or index == "" then
		table.insert(missing, "page name (argument #1)")
	end
	if pages == nil or pages == "" then
		table.insert(missing, "page number or range (argument #2)")
	end
	if section == nil or section == "" then
		table.insert(missing, "section name (argument #3)")
	end
	if #missing ~= 0 then
		local messages = ""
		for k, v in ipairs(missing) do
			messages = messages .. v
			if k < #missing then
				messages = messages .. ", "
			end
		end
		warn("One or more calls to Endnote is missing required arguments: " .. messages, 0)
		return complain({message = "Endnote is missing required arguments: " .. messages})
	end
end

function p.main(frame)
	local args = getArgs(frame)
	local index = args[1] or ""
	local pages = args[2] or ""
	local section = args[3] or ""

	local complaint = p._checkArguments(index, pages, section)
	if complaint ~= nil and complaint ~= "" then
		return complaint
	end

	-- Get the pages from the arguments. Lua's anemic pseudo-regex patterns are
	-- too limited to do this in one step, so we need to check each case
	-- seperately in the conditional below.
	local startPage
	local endPage
	if mw.ustring.match(pages, "^(%d+)$") then
		-- single page
		local page = mw.ustring.match(pages, "^(%d+)$")
		startPage = tonumber(page)
		endPage = tonumber(page)
	elseif mw.ustring.match(pages, "^%d+%-%d+$") then
		-- page range
		startPage, endPage = mw.ustring.match(pages, "^(%d+)%-(%d+)$")
		startPage = tonumber(startPage)
		endPage = tonumber(endPage)
	else
		-- otherwise bail
		warn("One or more calls to Endnote on this page has an invalid page range argument", 0)
		return complain({message = "No valid page or page range given"})
	end

	-- Now iterate over the given page(s) and get their contents.
	-- startPage may be equal to endPage, in which case we execute only once
	local s = ""
	for i = startPage, endPage do
		local wikipage = "Page:" .. index .. "/" .. i
		s = s .. frame:callParserFunction{
			name = '#lst', args = {wikipage, section}
		}
	end
	return s
end

return p