Difference between revisions of "Module:Sandbox/Erutuon/parameters"

From blackwiki
Jump to navigation Jump to search
blackwiki>Erutuon
(may as well add a way to log parameters found for debugging)
blackwiki>Erutuon
(show_parameters function)
Line 37: Line 37:
 
elseif type(pagename) == "table" and pagename.nsText then
 
elseif type(pagename) == "table" and pagename.nsText then
 
page = pagename
 
page = pagename
 +
pagename = page.fullText
 
else
 
else
 
errorf("Bad argument #1 to get_parameters (expected pagename or page title, got %s)",
 
errorf("Bad argument #1 to get_parameters (expected pagename or page title, got %s)",
Line 43: Line 44:
 
 
 
local content = page:getContent()
 
local content = page:getContent()
 +
 +
if not content then
 +
errorf("The page '%s' does not have any content.", pagename)
 +
end
 
 
 
local params = {}
 
local params = {}
 
for param_name in content:gmatch '{{{([%w _]+)%f[|]' do -- Not a completely accurate pattern.
 
for param_name in content:gmatch '{{{([%w _]+)%f[|]' do -- Not a completely accurate pattern.
-- This will incorrectly convert floats along with integers.
+
--This code is not quite accurate, because PHP only converts integer
 +
-- parameter names to Lua numbers; float parameter names stay strings.
 
if tonumber(param_name) then
 
if tonumber(param_name) then
 
param_name = tonumber(param_name)
 
param_name = tonumber(param_name)
Line 81: Line 87:
 
unrecognized_params_list[2] and "are" or "is")
 
unrecognized_params_list[2] and "are" or "is")
 
end
 
end
 +
end
 +
 +
function p.show_parameters(frame)
 +
local template_name = frame.args[1]
 +
 +
if not template_name then
 +
error("Template name (parameter 1) is required")
 +
end
 +
 +
template_name = "Template:" .. template_name
 
 
 +
return table.concat(p.make_param_list(p.get_parameters(template_name)), ", ")
 
end
 
end
  
 
return p
 
return p

Revision as of 01:21, 29 August 2018

Lua error at line 48: The page 'Template:speciesbox' does not have any content..



local p = {}

local function errorf(level, ...)
	if type(level) == number then
		return error(string.format(...), level + 1)
	else -- level is actually the format string.
		return error(string.format(level, ...), 2)
	end
end

-- From [[wikt:Module:table]].
local function defaultKeySort(key1, key2)
	-- "number" < "string", so numbers will be sorted before strings.
	local type1, type2 = type(key1), type(key2)
	if type1 ~= type2 then
		return type1 < type2
	else
		return key1 < key2
	end
end

function p.make_param_list(params_set)
	local params_sorted = {}
	for param_name in pairs(params_set) do
		table.insert(params_sorted, param_name)
	end
	
	table.sort(params_sorted, defaultKeySort)
	
	return params_sorted
end

function p.get_parameters(pagename)
	local page
	if type(pagename) == "string" then
		page = mw.title.new(pagename)
	elseif type(pagename) == "table" and pagename.nsText then
		page = pagename
		pagename = page.fullText
	else
		errorf("Bad argument #1 to get_parameters (expected pagename or page title, got %s)",
			type(pagename))
	end
	
	local content = page:getContent()
	
	if not content then
		errorf("The page '%s' does not have any content.", pagename)
	end
	
	local params = {}
	for param_name in content:gmatch '{{{([%w _]+)%f[|]' do -- Not a completely accurate pattern.
		--This code is not quite accurate, because PHP only converts integer
		-- parameter names to Lua numbers; float parameter names stay strings.
		if tonumber(param_name) then
			param_name = tonumber(param_name)
		end
		
		params[param_name] = true
	end
	
	return params
end

function p.check_params(frame)
	local template_title = mw.title.getCurrentTitle()
	
	local params_set = p.get_parameters(template_title)
	
	if frame.args.log then
		mw.log("get_parameters found the following parameters:",
			table.concat(p.make_param_list(params_set), ", "))
	end
	
	local unrecognized_params = {}
	for param_name in pairs(frame:getParent().args) do
		if not params_set[param_name] then
			unrecognized_params[param_name] = true
		end
	end
	
	if next(unrecognized_params) then
		local unrecognized_params_list = p.make_param_list(unrecognized_params)
		
		errorf("The parameters %s %s not recognized",
			table.concat(unrecognized_params_list, ", "),
			unrecognized_params_list[2] and "are" or "is")
	end
end

function p.show_parameters(frame)
	local template_name = frame.args[1]
	
	if not template_name then
		error("Template name (parameter 1) is required")
	end
	
	template_name = "Template:" .. template_name
	
	return table.concat(p.make_param_list(p.get_parameters(template_name)), ", ")
end

return p