<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://hna.wiki/Module:Data_to_Table?action=history&amp;feed=atom</id>
	<title>Module:Data to Table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://hna.wiki/Module:Data_to_Table?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Data_to_Table?action=history"/>
	<updated>2026-10-13T07:11:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://hna.wiki/Module:Data_to_Table?diff=10622&amp;oldid=prev</id>
		<title>ReisuDesign: Created page with &quot;local p = {}  local CleanTT = require(&#039;Module:tt&#039;).CleanTT local lib = require(&#039;Module:Feature&#039;) local ne = lib.isNotEmpty  local block = false  -- Check if the entry is the first on the level local first = {true, true, true}  -- Check if the entry is right after the end of a deeper level local previous = {false, false, false}   -- Escape characters for Lua strings local function clean(txt) 	return txt 		:gsub(&#039;\\&#039;, &#039;\\\\&#039;) 		:gsub(&#039;\&#039;&#039;, &#039;\\\&#039;&#039;) end   -- Parse DPL data l...&quot;</title>
		<link rel="alternate" type="text/html" href="https://hna.wiki/Module:Data_to_Table?diff=10622&amp;oldid=prev"/>
		<updated>2026-10-10T17:25:15Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local CleanTT = require(&amp;#039;Module:tt&amp;#039;).CleanTT local lib = require(&amp;#039;Module:Feature&amp;#039;) local ne = lib.isNotEmpty  local block = false  -- Check if the entry is the first on the level local first = {true, true, true}  -- Check if the entry is right after the end of a deeper level local previous = {false, false, false}   -- Escape characters for Lua strings local function clean(txt) 	return txt 		:gsub(&amp;#039;\\&amp;#039;, &amp;#039;\\\\&amp;#039;) 		:gsub(&amp;#039;\&amp;#039;&amp;#039;, &amp;#039;\\\&amp;#039;&amp;#039;) end   -- Parse DPL data l...&amp;quot;&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;
&lt;br /&gt;
local CleanTT = require(&amp;#039;Module:tt&amp;#039;).CleanTT&lt;br /&gt;
local lib = require(&amp;#039;Module:Feature&amp;#039;)&lt;br /&gt;
local ne = lib.isNotEmpty&lt;br /&gt;
&lt;br /&gt;
local block = false&lt;br /&gt;
&lt;br /&gt;
-- Check if the entry is the first on the level&lt;br /&gt;
local first = {true, true, true}&lt;br /&gt;
&lt;br /&gt;
-- Check if the entry is right after the end of a deeper level&lt;br /&gt;
local previous = {false, false, false}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Escape characters for Lua strings&lt;br /&gt;
local function clean(txt)&lt;br /&gt;
	return txt&lt;br /&gt;
		:gsub(&amp;#039;\\&amp;#039;, &amp;#039;\\\\&amp;#039;)&lt;br /&gt;
		:gsub(&amp;#039;\&amp;#039;&amp;#039;, &amp;#039;\\\&amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Parse DPL data&lt;br /&gt;
local function parseInfo(info, frame)&lt;br /&gt;
	if not info then&lt;br /&gt;
		return {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ne(frame.args.cleanTT) then&lt;br /&gt;
		info = CleanTT(info)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return lib.parseTemplateFormat(&lt;br /&gt;
		info,&lt;br /&gt;
		&amp;#039;;;&amp;#039;,&lt;br /&gt;
		&amp;#039;$$$&amp;#039;,&lt;br /&gt;
		&amp;#039;==&amp;#039;&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Get grouped JSON data&lt;br /&gt;
local function getJsonGroups(frame)&lt;br /&gt;
	local groups = {}&lt;br /&gt;
&lt;br /&gt;
	local i = 1&lt;br /&gt;
&lt;br /&gt;
	while true do&lt;br /&gt;
		local groupName = frame.args[&amp;#039;group&amp;#039; .. i]&lt;br /&gt;
		local groupInfo = frame.args[&amp;#039;group&amp;#039; .. i .. &amp;#039;_info&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Stop when neither argument exists.&lt;br /&gt;
		if groupName == nil and groupInfo == nil then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if ne(groupName) and groupInfo ~= nil then&lt;br /&gt;
&lt;br /&gt;
			local info = parseInfo(groupInfo, frame)&lt;br /&gt;
			local entries = {}&lt;br /&gt;
&lt;br /&gt;
			-- Collect entries&lt;br /&gt;
			for _, entry in lib.spairs(&lt;br /&gt;
				info,&lt;br /&gt;
				function(tVal, a, b)&lt;br /&gt;
					local aPage = tostring(tVal[a].page or a)&lt;br /&gt;
					local bPage = tostring(tVal[b].page or b)&lt;br /&gt;
&lt;br /&gt;
					return aPage &amp;lt; bPage&lt;br /&gt;
				end&lt;br /&gt;
			) do&lt;br /&gt;
&lt;br /&gt;
				if ne(entry.page) then&lt;br /&gt;
					entries[#entries + 1] = entry.page&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- Only add the group if it actually contains entries.&lt;br /&gt;
			if #entries &amp;gt; 0 then&lt;br /&gt;
				groups[groupName] = entries&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return groups&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Format grouped data as readable JSON&lt;br /&gt;
function p.FormatJSONGroups(groups)&lt;br /&gt;
	local result = {}&lt;br /&gt;
&lt;br /&gt;
	table.insert(result, &amp;#039;{&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- Get group names&lt;br /&gt;
	local groupNames = {}&lt;br /&gt;
&lt;br /&gt;
	for name in pairs(groups) do&lt;br /&gt;
		groupNames[#groupNames + 1] = name&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort(groupNames)&lt;br /&gt;
&lt;br /&gt;
	-- Build each group&lt;br /&gt;
	for i, name in ipairs(groupNames) do&lt;br /&gt;
&lt;br /&gt;
		local entries = groups[name]&lt;br /&gt;
		local groupComma = (i &amp;lt; #groupNames) and &amp;#039;,&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		table.insert(&lt;br /&gt;
			result,&lt;br /&gt;
			&amp;#039;\t&amp;#039; ..&lt;br /&gt;
			mw.text.jsonEncode(name) ..&lt;br /&gt;
			&amp;#039;: [&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		for j, entry in ipairs(entries) do&lt;br /&gt;
&lt;br /&gt;
			local entryComma = (j &amp;lt; #entries) and &amp;#039;,&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
			table.insert(&lt;br /&gt;
				result,&lt;br /&gt;
				&amp;#039;\t\t&amp;#039; ..&lt;br /&gt;
				mw.text.jsonEncode(entry) ..&lt;br /&gt;
				entryComma&lt;br /&gt;
			)&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		table.insert(&lt;br /&gt;
			result,&lt;br /&gt;
			&amp;#039;\t]&amp;#039; .. groupComma&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.insert(result, &amp;#039;}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	return table.concat(result, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local info = {}&lt;br /&gt;
	local dataKeys = {}&lt;br /&gt;
	local rawKeys = {}&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- JSON MODE&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	if tostring(frame.args.json) == &amp;#039;1&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
		-- Grouped JSON mode&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		local groups = getJsonGroups(frame)&lt;br /&gt;
&lt;br /&gt;
		-- If groups were supplied, output the complete JSON object.&lt;br /&gt;
		if next(groups) ~= nil then&lt;br /&gt;
&lt;br /&gt;
			local jsonText = p.FormatJSONGroups(groups)&lt;br /&gt;
&lt;br /&gt;
			return frame:extensionTag(&lt;br /&gt;
				&amp;#039;syntaxhighlight&amp;#039;,&lt;br /&gt;
				jsonText,&lt;br /&gt;
				{&lt;br /&gt;
					lang = &amp;#039;json&amp;#039;,&lt;br /&gt;
					copy = &amp;#039;&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
		-- Simple JSON array mode&lt;br /&gt;
		-- --------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
		if frame.args.info then&lt;br /&gt;
&lt;br /&gt;
			info = parseInfo(frame.args.info, frame)&lt;br /&gt;
&lt;br /&gt;
			local jsonEntries = {}&lt;br /&gt;
&lt;br /&gt;
			for _, entry in lib.spairs(&lt;br /&gt;
				info,&lt;br /&gt;
				function(tVal, a, b)&lt;br /&gt;
					local aPage = tostring(tVal[a].page or a)&lt;br /&gt;
					local bPage = tostring(tVal[b].page or b)&lt;br /&gt;
&lt;br /&gt;
					return aPage &amp;lt; bPage&lt;br /&gt;
				end&lt;br /&gt;
			) do&lt;br /&gt;
&lt;br /&gt;
				if ne(entry.page) then&lt;br /&gt;
					jsonEntries[#jsonEntries + 1] = entry.page&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local jsonText = mw.text.jsonEncode(jsonEntries)&lt;br /&gt;
&lt;br /&gt;
			return frame:extensionTag(&lt;br /&gt;
				&amp;#039;syntaxhighlight&amp;#039;,&lt;br /&gt;
				jsonText,&lt;br /&gt;
				{&lt;br /&gt;
					lang = &amp;#039;json&amp;#039;,&lt;br /&gt;
					copy = &amp;#039;&amp;#039;&lt;br /&gt;
				}&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- NORMAL LUA MODE&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	-- Parse DPL data&lt;br /&gt;
	if frame.args.info then&lt;br /&gt;
&lt;br /&gt;
		info = parseInfo(frame.args.info, frame)&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Parse keys&lt;br /&gt;
	if frame.args.keys then&lt;br /&gt;
		dataKeys = p.ParseKeys(frame.args.keys)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Parse unquoted/raw keys&lt;br /&gt;
	if frame.args.unquoted then&lt;br /&gt;
		rawKeys = p.ParseKeys(frame.args.unquoted)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Block formatting&lt;br /&gt;
	if ne(frame.args.block) then&lt;br /&gt;
		block = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local sortkey = frame.args.sortkey or &amp;#039;page&amp;#039;&lt;br /&gt;
	local subtable = frame.args.subtable&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Constant value mode&lt;br /&gt;
	-- If |value=day is supplied, every page gets that value.&lt;br /&gt;
	local constantValue = frame.args.value&lt;br /&gt;
	local valueUnquoted = false&lt;br /&gt;
&lt;br /&gt;
	if constantValue ~= nil then&lt;br /&gt;
&lt;br /&gt;
		for _, rawKey in ipairs(rawKeys) do&lt;br /&gt;
&lt;br /&gt;
			if rawKey == &amp;#039;value&amp;#039; then&lt;br /&gt;
				valueUnquoted = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Check whether a key should be output as raw Lua&lt;br /&gt;
	local function isUnquotedKey(key)&lt;br /&gt;
&lt;br /&gt;
		for _, rawKey in ipairs(rawKeys) do&lt;br /&gt;
&lt;br /&gt;
			if rawKey == key then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Build result&lt;br /&gt;
	local result = mw.html.create()&lt;br /&gt;
		:wikitext(&amp;#039;return {\n&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	for _, entry in lib.spairs(&lt;br /&gt;
		info,&lt;br /&gt;
		function(tVal, a, b)&lt;br /&gt;
&lt;br /&gt;
			if sortkey == &amp;#039;INPUT&amp;#039; then&lt;br /&gt;
				return a &amp;lt; b&lt;br /&gt;
			else&lt;br /&gt;
				return (tVal[a][sortkey] or &amp;#039;&amp;#039;) &amp;lt;&lt;br /&gt;
					(tVal[b][sortkey] or &amp;#039;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	) do&lt;br /&gt;
&lt;br /&gt;
		if ne(entry.page) then&lt;br /&gt;
&lt;br /&gt;
			entry.page = clean(entry.page)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- Constant value mode&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			if constantValue ~= nil and #dataKeys == 0 then&lt;br /&gt;
&lt;br /&gt;
				local value&lt;br /&gt;
&lt;br /&gt;
				if valueUnquoted then&lt;br /&gt;
					value = clean(constantValue)&lt;br /&gt;
				else&lt;br /&gt;
					value = &amp;#039;\&amp;#039;&amp;#039; ..&lt;br /&gt;
						clean(constantValue) ..&lt;br /&gt;
						&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				result:wikitext(&lt;br /&gt;
					&amp;#039;\t[\&amp;#039;&amp;#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&amp;#039;\&amp;#039;] = &amp;#039;,&lt;br /&gt;
					value,&lt;br /&gt;
					&amp;#039;,\n&amp;#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- No data keys&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			elseif #dataKeys == 0 then&lt;br /&gt;
&lt;br /&gt;
				result:wikitext(&lt;br /&gt;
					&amp;#039;\t\&amp;#039;&amp;#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&amp;#039;\&amp;#039;,\n&amp;#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
			-- Normal nested table mode&lt;br /&gt;
			-- ----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
&lt;br /&gt;
				-- Reset formatting state for every entry&lt;br /&gt;
				first = {true, true, true}&lt;br /&gt;
				previous = {false, false, false}&lt;br /&gt;
&lt;br /&gt;
				local valid = false&lt;br /&gt;
				local values = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Entry name&lt;br /&gt;
				values:wikitext(&lt;br /&gt;
					&amp;#039;\t[\&amp;#039;&amp;#039;,&lt;br /&gt;
					entry.page,&lt;br /&gt;
					&amp;#039;\&amp;#039;] = {&amp;#039;&lt;br /&gt;
				)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Build entry&lt;br /&gt;
				local function parseLevels(K, level)&lt;br /&gt;
&lt;br /&gt;
					level = level or 1&lt;br /&gt;
&lt;br /&gt;
					if type(K) == &amp;#039;string&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
						valid = true&lt;br /&gt;
&lt;br /&gt;
						-- Use the value if present.&lt;br /&gt;
						-- BuildEntry handles missing values.&lt;br /&gt;
						values:node(&lt;br /&gt;
							p.BuildEntry(&lt;br /&gt;
								entry[K],&lt;br /&gt;
								K,&lt;br /&gt;
								level,&lt;br /&gt;
								subtable,&lt;br /&gt;
								isUnquotedKey(K)&lt;br /&gt;
							)&lt;br /&gt;
						)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
					elseif type(K) == &amp;#039;table&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
						level = level + 1&lt;br /&gt;
&lt;br /&gt;
						for _, K2 in ipairs(K) do&lt;br /&gt;
							parseLevels(K2, level)&lt;br /&gt;
						end&lt;br /&gt;
&lt;br /&gt;
						values:wikitext(&lt;br /&gt;
							&amp;#039;\n&amp;#039;,&lt;br /&gt;
							string.rep(&amp;#039;\t&amp;#039;, level - 1),&lt;br /&gt;
							&amp;#039;},&amp;#039;&lt;br /&gt;
						)&lt;br /&gt;
&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				parseLevels(dataKeys, 1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
				-- Return table if there is valid data&lt;br /&gt;
				if valid then&lt;br /&gt;
&lt;br /&gt;
					values:wikitext(&amp;#039;\n&amp;#039;)&lt;br /&gt;
					result:node(values)&lt;br /&gt;
&lt;br /&gt;
				else&lt;br /&gt;
&lt;br /&gt;
					result:wikitext(&lt;br /&gt;
						&amp;#039;\t\&amp;#039;&amp;#039;,&lt;br /&gt;
						entry.page,&lt;br /&gt;
						&amp;#039;\&amp;#039;,\n&amp;#039;&lt;br /&gt;
					)&lt;br /&gt;
&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	result:wikitext(&amp;#039;}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- LUA SYNTAX HIGHLIGHT&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	local luaText = tostring(result)&lt;br /&gt;
&lt;br /&gt;
	-- Decode HTML entities introduced by mw.html&lt;br /&gt;
	luaText = mw.text.decode(luaText)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	local output = frame:extensionTag(&lt;br /&gt;
		&amp;#039;syntaxhighlight&amp;#039;,&lt;br /&gt;
		luaText,&lt;br /&gt;
		{&lt;br /&gt;
			lang = &amp;#039;lua&amp;#039;,&lt;br /&gt;
			copy = &amp;#039;&amp;#039;&lt;br /&gt;
		}&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
	-- COPY BUTTON&lt;br /&gt;
	-- ============================================================&lt;br /&gt;
&lt;br /&gt;
	-- Keep Module:CopyText for normal Lua output.&lt;br /&gt;
	if frame.args.copy then&lt;br /&gt;
&lt;br /&gt;
		output = require(&amp;#039;Module:CopyText&amp;#039;)._main({&lt;br /&gt;
			output,&lt;br /&gt;
			frame.args.copy,&lt;br /&gt;
			&amp;#039;Copy Table&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ================================================================&lt;br /&gt;
-- FORMAT DATA&lt;br /&gt;
-- ================================================================&lt;br /&gt;
&lt;br /&gt;
function p.BuildEntry(value, key, level, subtable, unquoted)&lt;br /&gt;
&lt;br /&gt;
	level = level or 1&lt;br /&gt;
&lt;br /&gt;
	local container = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Default missing values&lt;br /&gt;
	if value == nil or value == &amp;#039;&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
		if key == &amp;#039;number&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
			value = &amp;#039;0&amp;#039;&lt;br /&gt;
			unquoted = true&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
&lt;br /&gt;
			value = &amp;#039;&amp;#039;&lt;br /&gt;
			unquoted = false&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Format value&lt;br /&gt;
	if subtable and value ~= &amp;#039;&amp;#039; and value:find(subtable) then&lt;br /&gt;
&lt;br /&gt;
		value = lib.split(&lt;br /&gt;
			clean(value),&lt;br /&gt;
			subtable&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		value = &amp;#039;{ \&amp;#039;&amp;#039; ..&lt;br /&gt;
			table.concat(value, &amp;#039;\&amp;#039;, \&amp;#039;&amp;#039;) ..&lt;br /&gt;
			&amp;#039; }&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	elseif unquoted and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
&lt;br /&gt;
		-- Raw Lua value&lt;br /&gt;
		value = clean(value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
&lt;br /&gt;
		-- String value&lt;br /&gt;
		value = &amp;#039;\&amp;#039;&amp;#039; ..&lt;br /&gt;
			clean(value) ..&lt;br /&gt;
			&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Format key as [&amp;#039;key&amp;#039;]&lt;br /&gt;
	local formattedKey =&lt;br /&gt;
		&amp;#039;[\&amp;#039;&amp;#039; .. clean(key) .. &amp;#039;\&amp;#039;]&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- First item on this level&lt;br /&gt;
	if first[level] then&lt;br /&gt;
&lt;br /&gt;
		container:wikitext(&lt;br /&gt;
			&amp;#039;\n&amp;#039;,&lt;br /&gt;
			string.rep(&amp;#039;\t&amp;#039;, level),&lt;br /&gt;
			formattedKey,&lt;br /&gt;
			&amp;#039; = &amp;#039;,&lt;br /&gt;
			value,&lt;br /&gt;
			&amp;#039;,&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		first[level] = false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if level &amp;gt; 2 then&lt;br /&gt;
			first[2] = false&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		if level &amp;gt; 1 then&lt;br /&gt;
			first[1] = false&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	-- Subsequent item on this level&lt;br /&gt;
	else&lt;br /&gt;
&lt;br /&gt;
		container:wikitext(&lt;br /&gt;
			&amp;#039;\n&amp;#039;,&lt;br /&gt;
			string.rep(&amp;#039;\t&amp;#039;, level),&lt;br /&gt;
			formattedKey,&lt;br /&gt;
			&amp;#039; = &amp;#039;,&lt;br /&gt;
			value,&lt;br /&gt;
			&amp;#039;,&amp;#039;&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		previous[level] = false&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	return container&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ================================================================&lt;br /&gt;
-- PARSE DATA KEYS INTO SPECIFIED LEVELS&lt;br /&gt;
-- ================================================================&lt;br /&gt;
&lt;br /&gt;
function p.ParseKeys(keys)&lt;br /&gt;
&lt;br /&gt;
	keys = lib.split(keys, &amp;#039;;;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	for i, key in pairs(keys) do&lt;br /&gt;
&lt;br /&gt;
		if key:find(&amp;#039;//&amp;#039;) then&lt;br /&gt;
&lt;br /&gt;
			local keys2 = lib.split(key, &amp;#039;//&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			for i2, key2 in pairs(keys2) do&lt;br /&gt;
&lt;br /&gt;
				if key2:find(&amp;#039;@@&amp;#039;) then&lt;br /&gt;
					keys2[i2] = lib.split(key, &amp;#039;@@&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			keys[i] = keys2&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return keys&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>ReisuDesign</name></author>
	</entry>
</feed>