<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://xenreference.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_input_utils</id>
	<title>Module:Template input utils - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://xenreference.com/wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ATemplate_input_utils"/>
	<link rel="alternate" type="text/html" href="https://xenreference.com/wiki/index.php?title=Module:Template_input_utils&amp;action=history"/>
	<updated>2026-06-19T13:02:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://xenreference.com/wiki/index.php?title=Module:Template_input_utils&amp;diff=840&amp;oldid=prev</id>
		<title>Vector: Created page with &quot;-- This module follows User:Ganaram inukshuk/Provisional style guide for Lua local p = {}  -- TODO: move tip functions here? See Module:Template input parse  -- TODO: -- Add param name normalization: params close enough to snake_case are normal- -- ized to snake_case  -- Library module for common operations with handling template input. -- - Numbered &lt;anything&gt; to table extract args and places them into a table.  -- Extracts numbered args (from frame.args) and st...&quot;</title>
		<link rel="alternate" type="text/html" href="https://xenreference.com/wiki/index.php?title=Module:Template_input_utils&amp;diff=840&amp;oldid=prev"/>
		<updated>2025-12-16T05:03:36Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- This module follows &lt;a href=&quot;/wiki/index.php?title=User:Ganaram_inukshuk/Provisional_style_guide_for_Lua&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Ganaram inukshuk/Provisional style guide for Lua (page does not exist)&quot;&gt;User:Ganaram inukshuk/Provisional style guide for Lua&lt;/a&gt; local p = {}  -- TODO: move tip functions here? See &lt;a href=&quot;/wiki/index.php?title=Module:Template_input_parse&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:Template input parse (page does not exist)&quot;&gt;Module:Template input parse&lt;/a&gt;  -- TODO: -- Add param name normalization: params close enough to snake_case are normal- -- ized to snake_case  -- Library module for common operations with handling template input. -- - Numbered &amp;lt;anything&amp;gt; to table extract args and places them into a table.  -- Extracts numbered args (from frame.args) and st...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- This module follows [[User:Ganaram inukshuk/Provisional style guide for Lua]]&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- TODO: move tip functions here? See [[Module:Template input parse]]&lt;br /&gt;
&lt;br /&gt;
-- TODO:&lt;br /&gt;
-- Add param name normalization: params close enough to snake_case are normal-&lt;br /&gt;
-- ized to snake_case&lt;br /&gt;
&lt;br /&gt;
-- Library module for common operations with handling template input.&lt;br /&gt;
-- - Numbered &amp;lt;anything&amp;gt; to table extract args and places them into a table.&lt;br /&gt;
&lt;br /&gt;
-- Extracts numbered args (from frame.args) and stores them into one table.&lt;br /&gt;
-- Removes original numbered args from args table. Sequence of numbered args&lt;br /&gt;
-- may have gaps.&lt;br /&gt;
-- Table of entries is returned without being inserted into the original args&lt;br /&gt;
-- table, as it may require further processing (EG, parsing to number, ratio, &lt;br /&gt;
-- kv-pairs, etc).&lt;br /&gt;
function p.numbered_args_to_table(args, max_num, key_fmt, keep_originals)&lt;br /&gt;
	local max_num = max_num or 100	&lt;br /&gt;
	local key_fmt = key_fmt or &amp;quot;Entry %d&amp;quot;&lt;br /&gt;
	local keep_originals = keep_originals or false		-- Denotes whether to keep originals in table or remove them; default false&lt;br /&gt;
	&lt;br /&gt;
	local entries = {}&lt;br /&gt;
	for i = 1, max_num do&lt;br /&gt;
		local key = string.format(key_fmt, i)		-- Make key&lt;br /&gt;
		local entry = args[key]						-- Extract&lt;br /&gt;
		table.insert(entries, entry)				-- Insert&lt;br /&gt;
		if not keep_originals then&lt;br /&gt;
			args[key] = nil								-- Remove original&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return entries&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Extracts numbered args that correspond to header-data pairs of a two-col&lt;br /&gt;
-- table, commonly seen in navboxes and infoboxes. Removes original numbered&lt;br /&gt;
-- args from args table. Sequence of numbered args may have gaps, and a pair may&lt;br /&gt;
-- have one element be missing/nil (headerless data and dataless header).&lt;br /&gt;
-- Table of entries is returned without being inserted into the original args&lt;br /&gt;
-- table, as it may require further processing (EG, parsing to number, ratio, &lt;br /&gt;
-- kv-pairs, etc).&lt;br /&gt;
function p.numbered_header_data_args_to_table(args, max_num, keep_originals, is_strict_pair, header_fmt, data_fmt)&lt;br /&gt;
	local max_num    = max_num or 100&lt;br /&gt;
	local header_fmt = header_fmt or &amp;quot;Header %d&amp;quot;	&lt;br /&gt;
	local data_fmt   = data_fmt or &amp;quot;Data %d&amp;quot;&lt;br /&gt;
	local is_strict_pair = is_strict_pair or false		-- Denotes whether a pair must have both header and data&lt;br /&gt;
	local keep_originals = keep_originals or false		-- Denotes whether to keep originals in table or remove them; default false&lt;br /&gt;
	&lt;br /&gt;
	local entries = {}&lt;br /&gt;
	for i = 1, max_num do&lt;br /&gt;
		-- Make keys&lt;br /&gt;
		local header_key = string.format(header_fmt, i)&lt;br /&gt;
		local data_key   = string.format(data_fmt, i)&lt;br /&gt;
		&lt;br /&gt;
		-- Extract header and data&lt;br /&gt;
		local header = args[header_key]&lt;br /&gt;
		local data = args[data_key]&lt;br /&gt;
		local entry = { [&amp;quot;Header&amp;quot;] = args[header_key], [&amp;quot;Data&amp;quot;] = args[data_key] }&lt;br /&gt;
		&lt;br /&gt;
		-- Insert&lt;br /&gt;
		if is_strict_pair then&lt;br /&gt;
			if (header and data) then table.insert(entries, entry) end&lt;br /&gt;
		else&lt;br /&gt;
			if (header or  data) then table.insert(entries, entry) end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Remove originals&lt;br /&gt;
		if not keep_originals then&lt;br /&gt;
			args[header_key] = nil&lt;br /&gt;
			args[data_key] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return entries&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Some older infoboxes use a jagged array instead of an assoc-array, so convert&lt;br /&gt;
-- two-element tables into a header-data pair, and one-element tables into&lt;br /&gt;
-- either a headerless data row, or a dataless header row.&lt;br /&gt;
-- Default is to interpret size-1 arrays as data rows, which corresponds to how&lt;br /&gt;
-- the infobox worked before it became template-ified. This old input method may&lt;br /&gt;
-- be easier to work with.&lt;br /&gt;
function p.jagged_array_to_header_data_pairs(rows, is_header_row)&lt;br /&gt;
	local is_header_row = is_header_row or false&lt;br /&gt;
	local new_rows = {}&lt;br /&gt;
	for i = 1, #rows do&lt;br /&gt;
		local row = rows[i]&lt;br /&gt;
		if #row == 2 then&lt;br /&gt;
			table.insert(new_rows, { [&amp;quot;Header&amp;quot;] = row[1], [&amp;quot;Data&amp;quot;] = row[2] })&lt;br /&gt;
		elseif #row == 1 and not is_header_row then&lt;br /&gt;
			table.insert(new_rows, { [&amp;quot;Data&amp;quot;  ] = row[1] })&lt;br /&gt;
		elseif #row == 1 and is_header_row then&lt;br /&gt;
			table.insert(new_rows, { [&amp;quot;Header&amp;quot;] = row[1] })&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return new_rows&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.tester()&lt;br /&gt;
	local test_args = {&lt;br /&gt;
		[&amp;quot;Entry 1&amp;quot;] = &amp;quot;aaa&amp;quot;,&lt;br /&gt;
		[&amp;quot;Entry 2&amp;quot;] = &amp;quot;bbb&amp;quot;,&lt;br /&gt;
		[&amp;quot;Entry 3&amp;quot;] = &amp;quot;ccc&amp;quot;,&lt;br /&gt;
		[&amp;quot;Header 2&amp;quot;] = &amp;quot;BBB&amp;quot;,&lt;br /&gt;
		[&amp;quot;Entry 5&amp;quot;] = &amp;quot;ddd&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	--test_args[&amp;quot;Entries&amp;quot;] = p.numbered_args_to_table(test_args, &amp;quot;Entry %d&amp;quot;, 10)&lt;br /&gt;
	test_args[&amp;quot;Entries&amp;quot;] = p.numbered_header_data_args_to_table(test_args, 10, &amp;quot;Header %d&amp;quot;, &amp;quot;Entry %d&amp;quot;)&lt;br /&gt;
	return test_args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Vector</name></author>
	</entry>
</feed>