Jump to content

Module:Sandbox/trappist the monk/template compare

From Wikipedia, the free encyclopedia
--{{#invoke:Sandbox/trappist the monk/template compare|compare|<template A>|<template B>}}

require('strict');

--[[--------------------------< T E M P L A T E _ P A R A M S _ G E T >----------------------------------------

gets parameters used by template from unparsed template wikitext and adds each to param_list.

returns true on success; false when template does not exist

]]

local function template_params_get (template, param_list)
	local content = mw.title.new (template):getContent();						-- get unparsed wikitext from the template
	if not content then
		return false;															-- announce failure
	end

	for param in content:gmatch ('{{{([^}|]+)') do								-- fetch each parameter in the template
		param_list[param] = true;												-- and add it to its list table
	end

	return true;																-- announce success
end


--[[--------------------------< D I F F _ L I S T _ M A K E >--------------------------------------------------

loop through source template's parameter list looking for parameters not also found in target's parameter list.
when parameter is unique to source, add it to diff list with source template's name

returns nothing

]]

local function 	diff_list_make (src, tgt, src_name, diff)
	for param, _ in pairs (src) do												-- look for source template parameters in target template's parameter list
		if not tgt[param] then
			diff[param] = src_name;												-- not found add to diff table with name of source template
		end
	end
end


--[[--------------------------< C O M P A R E >----------------------------------------------------------------

module entry point

create a list of parameter names not shared between two templates

returns the list of unique parameter names

]]

local function compare (frame)
	local A = {};																-- table to hold the parameters used in the first of two templates
	local B = {};																-- table to hold the parameters used in the second of two templates
	local diff = {};															-- table to hold the parameters that are not shared between the two templates

	local A_src = frame.args[1];												-- get template names
	local B_src = frame.args[2];
	
	if not A_src:match ('^Template:') then										-- if namespace missing
		A_src = 'Template:' .. A_src;											-- add it
	end

	if not B_src:match ('^Template:') then										-- if namespace missing
		B_src = 'Template:' .. B_src;											-- add it
	end

	local ret_val = template_params_get (A_src, A);								-- get parameters from first template
	if not ret_val then
		return '<span style="font-size:100%;" class="error">error: no ' .. A_src .. '</span>';
	end
		
	ret_val = template_params_get (B_src, B);									-- get parameters from second template
	if not ret_val then
		return '<span style="font-size:100%;" class="error">error: no ' .. B_src .. '</span>';
	end

	diff_list_make (A, B, A_src:gsub ('^Template:', ''), diff);					-- add parameters used in A that are not used in B; strip namespace for readability
	diff_list_make (B, A, B_src:gsub ('^Template:', ''), diff);					-- add parameters used in B that are not used in A

	return mw.dumpObject (diff);												-- for now; prettify later
end


--[[--------------------------< L I S T >----------------------------------------------------------------------

module entry point

create a list of parameter names

returns the list of parameter names

]]

local function list (frame)
	local A = {};																-- table to hold the parameters used in the first of two templates

	local A_src = frame.args[1];												-- get template names

	if not A_src:match ('^Template:') then										-- if namespace missing
		A_src = 'Template:' .. A_src;											-- add it
	end

	local ret_val = template_params_get (A_src, A);								-- get parameters from first template
	if not ret_val then
		return '<span style="font-size:100%;" class="error">error: no ' .. A_src .. '</span>';
	end
		
	return mw.dumpObject (A);													-- for now; prettify later
end


--[[--------------------------< E X P O R T E D   F U N C T I O N S >------------------------------------------
]]

return
	{
	compare = compare,
	list = list,
	}