<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.pantonianrepublic.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_parameter_value</id>
	<title>Module:Template parameter value - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pantonianrepublic.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_parameter_value"/>
	<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Template_parameter_value&amp;action=history"/>
	<updated>2026-04-23T22:32:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://wiki.pantonianrepublic.com/index.php?title=Module:Template_parameter_value&amp;diff=2510&amp;oldid=prev</id>
		<title>Sebbog: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Template_parameter_value&amp;diff=2510&amp;oldid=prev"/>
		<updated>2023-05-22T17:21:25Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:21, 22 May 2023&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en-GB&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Sebbog</name></author>
	</entry>
	<entry>
		<id>https://wiki.pantonianrepublic.com/index.php?title=Module:Template_parameter_value&amp;diff=2509&amp;oldid=prev</id>
		<title>wikipedia&gt;Aidan9382: New features ignore_blank and only_subtemplates; some minor cleanup</title>
		<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Template_parameter_value&amp;diff=2509&amp;oldid=prev"/>
		<updated>2023-05-03T12:09:32Z</updated>

		<summary type="html">&lt;p&gt;New features ignore_blank and only_subtemplates; some minor cleanup&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local _getParameters = require(&amp;quot;Module:Transcluder&amp;quot;).getParameters&lt;br /&gt;
local yesno = require(&amp;quot;Module:Yesno&amp;quot;)&lt;br /&gt;
local PrepareText = require(&amp;quot;Module:Wikitext Parsing&amp;quot;).PrepareText&lt;br /&gt;
&lt;br /&gt;
local function getTitle(title)&lt;br /&gt;
	local success, titleObj = pcall(mw.title.new, title)&lt;br /&gt;
	if success then return titleObj&lt;br /&gt;
	else return nil end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--string.gmatch will check the largest block it can without re-scanning whats inside, but we need whats inside&lt;br /&gt;
local function matchAllTemplates(str)&lt;br /&gt;
	local matches = {}&lt;br /&gt;
	for template in string.gmatch(str, &amp;quot;{%b{}}&amp;quot;) do&lt;br /&gt;
		table.insert(matches, template)&lt;br /&gt;
		local innerContent = string.sub(template, 3, -3)&lt;br /&gt;
		for _,subtemplate in next,matchAllTemplates(innerContent) do&lt;br /&gt;
			table.insert(matches, subtemplate)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return matches&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Transcluder&amp;#039;s getParameters, but force all keys to be a string (helps with template inputs)&lt;br /&gt;
local function getParameters(template)&lt;br /&gt;
	local parameters, text, paramOrder = _getParameters(template)&lt;br /&gt;
	local newParams = {}&lt;br /&gt;
	for key,value in next,parameters do&lt;br /&gt;
		newParams[tostring(key)] = value&lt;br /&gt;
	end&lt;br /&gt;
	local newParamOrder = {}&lt;br /&gt;
	for index,key in next,paramOrder do&lt;br /&gt;
		newParamOrder[index] = tostring(key)&lt;br /&gt;
	end&lt;br /&gt;
	return newParams, text, newParamOrder&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a table containing parameters and a table with the order in which each of their values were found.&lt;br /&gt;
-- Since this considers all subtemplates, a single parameter is expected to have multiple values.&lt;br /&gt;
-- E.g. {{ABC|X={{DEF|X=Value|Y=Other value}}{{ABC|X=Yes}}|Y=P}}&lt;br /&gt;
-- Would return {X={&amp;quot;{{DEF|X=Value|Y=Other value}}&amp;quot;, &amp;quot;Value&amp;quot;, &amp;quot;Yes&amp;quot;}, Y={&amp;quot;Other value&amp;quot;, &amp;quot;P&amp;quot;}}&lt;br /&gt;
local function getAllParameters(template, ignore_blank, only_subtemplates)&lt;br /&gt;
	local parameterTree = setmetatable({}, {&lt;br /&gt;
		__index = function(self,key)&lt;br /&gt;
			rawset(self,key,{})&lt;br /&gt;
			return rawget(self,key)&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	local params, _, paramOrder = getParameters(template)&lt;br /&gt;
	for _,key in ipairs(paramOrder) do&lt;br /&gt;
		local value = params[key]&lt;br /&gt;
		if not ignore_blank or value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			if not only_subtemplates then&lt;br /&gt;
				table.insert(parameterTree[key], value) --Insert the initial value into the tree&lt;br /&gt;
			end&lt;br /&gt;
			for subtemplate in string.gmatch(value, &amp;quot;{%b{}}&amp;quot;) do --And now check for subvalues&lt;br /&gt;
				local subparams = getAllParameters(subtemplate, ignore_blank)&lt;br /&gt;
				for subkey,subset in next,subparams do&lt;br /&gt;
					for _,subvalue in ipairs(subset) do&lt;br /&gt;
						table.insert(parameterTree[subkey], subvalue) --And add any we find to our tree&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return parameterTree&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Primary module entry point. Returns a success boolean and either the result or why it failed&lt;br /&gt;
function p.getValue(page, templates, parameter, options)&lt;br /&gt;
	if not (templates and parameter) then --Required parameters&lt;br /&gt;
		return false, &amp;quot;Missing required parameters &amp;#039;templates&amp;#039; and &amp;#039;parameter&amp;#039;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	parameter = tostring(parameter) --Force consistency&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	&lt;br /&gt;
	--mix of camelCase and under_score is kept for backwards compatability&lt;br /&gt;
	local template_index = tonumber(options.templateIndex or options.template_index) or 1&lt;br /&gt;
	local parameter_index = tonumber(options.parameterIndex or options.parameter_index) or 1&lt;br /&gt;
	local ignore_subtemplates = options.ignoreSubtemplates or options.ignore_subtemplates or false&lt;br /&gt;
	local only_subtemplates = options.onlySubtemplates or options.only_subtemplates or false&lt;br /&gt;
	local ignore_blank = options.ignoreBlank or options.ignore_blank or false&lt;br /&gt;
	if type(templates) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		templates = mw.text.split(templates, &amp;quot;, ?&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local title = getTitle(page)&lt;br /&gt;
	if title == nil then&lt;br /&gt;
		return false, &amp;quot;Requested title doesn&amp;#039;t exist&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local content = PrepareText(title:getContent() or &amp;quot;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local foundTemplates = 0&lt;br /&gt;
	local foundParameters = 0&lt;br /&gt;
	for _,template in next,matchAllTemplates(content) do&lt;br /&gt;
		for _,wantedTemplate in pairs(templates) do&lt;br /&gt;
			if string.match(template, &amp;quot;^{{%s*&amp;quot;..wantedTemplate..&amp;quot;%s*[|}]&amp;quot;) then&lt;br /&gt;
				foundTemplates = foundTemplates + 1&lt;br /&gt;
				if foundTemplates == template_index then --Found our wanted template&lt;br /&gt;
					local value&lt;br /&gt;
					if ignore_subtemplates then&lt;br /&gt;
						value = getParameters(template)[parameter] or &amp;quot;&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						local params = getAllParameters(template, ignore_blank, only_subtemplates)&lt;br /&gt;
						value = params[parameter][parameter_index] or &amp;quot;&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
&lt;br /&gt;
					value = string.gsub(value, &amp;quot;&amp;lt;/?%a*include%a*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
					value = mw.text.trim(value)&lt;br /&gt;
					return true, mw.text.decode(value) --due to PrepareText&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return false, &amp;quot;No valid template found&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Template entry point. Returns an empty string upon failure&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = &amp;#039;Template:Template parameter value&amp;#039;&lt;br /&gt;
	})&lt;br /&gt;
	local options = {&lt;br /&gt;
		template_index = args[3],&lt;br /&gt;
		parameter_index = args[5],&lt;br /&gt;
		ignore_subtemplates = yesno(args.ignore_subtemplates or args.ist) or false,&lt;br /&gt;
		only_subtemplates = yesno(args.only_subtemplates) or false,&lt;br /&gt;
		ignore_blank = yesno(args.ignore_blank) or false,&lt;br /&gt;
	}&lt;br /&gt;
	local success, result = p.getValue(args[1], args[2], args[4], options)&lt;br /&gt;
	if not success then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		return frame:preprocess(result)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--Potentially useful module entry points&lt;br /&gt;
p.matchAllTemplates = matchAllTemplates&lt;br /&gt;
p.getParameters = getParameters&lt;br /&gt;
p.getAllParameters = getAllParameters&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;Aidan9382</name></author>
	</entry>
</feed>