<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATabular_data</id>
	<title>Module:Tabular data - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.tiffa.net/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ATabular_data"/>
	<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Tabular_data&amp;action=history"/>
	<updated>2026-04-16T13:13:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.tiffa.net/w/index.php?title=Module:Tabular_data&amp;diff=3494&amp;oldid=prev</id>
		<title>imported&gt;Fire: ページの作成:「local p = {} local lang = mw.getContentLanguage() local navbar = require(&quot;Module:Navbar&quot;)  local messages = { 	[&quot;true&quot;] = &quot;Yes&quot;, 	[&quot;false&quot;] = &quot;No&quot;, 	null = &quot;N/A&quot;, }  loca…」</title>
		<link rel="alternate" type="text/html" href="https://wiki.tiffa.net/w/index.php?title=Module:Tabular_data&amp;diff=3494&amp;oldid=prev"/>
		<updated>2021-01-31T01:26:12Z</updated>

		<summary type="html">&lt;p&gt;ページの作成:「local p = {} local lang = mw.getContentLanguage() local navbar = require(&amp;quot;Module:Navbar&amp;quot;)  local messages = { 	[&amp;quot;true&amp;quot;] = &amp;quot;Yes&amp;quot;, 	[&amp;quot;false&amp;quot;] = &amp;quot;No&amp;quot;, 	null = &amp;quot;N/A&amp;quot;, }  loca…」&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 lang = mw.getContentLanguage()&lt;br /&gt;
local navbar = require(&amp;quot;Module:Navbar&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local messages = {&lt;br /&gt;
	[&amp;quot;true&amp;quot;] = &amp;quot;Yes&amp;quot;,&lt;br /&gt;
	[&amp;quot;false&amp;quot;] = &amp;quot;No&amp;quot;,&lt;br /&gt;
	null = &amp;quot;N/A&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local bgColors = {&lt;br /&gt;
	[&amp;quot;true&amp;quot;] = &amp;quot;#9f9&amp;quot;,&lt;br /&gt;
	[&amp;quot;false&amp;quot;] = &amp;quot;#f99&amp;quot;,&lt;br /&gt;
	null = &amp;quot;#ececec&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local colors = {&lt;br /&gt;
	null = &amp;quot;#2c2c2c&amp;quot;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p._cell(args)&lt;br /&gt;
	local data = args.data or mw.ext.data.get(args[1])&lt;br /&gt;
	local rowIdx = tonumber(args.output_row)&lt;br /&gt;
	local outputFormat = args.output_format&lt;br /&gt;
	&lt;br /&gt;
	local outputColumnNames = {&lt;br /&gt;
		args.output_column1 or args.output_column,&lt;br /&gt;
	}&lt;br /&gt;
	while args[&amp;quot;output_column&amp;quot; .. #outputColumnNames + 1] do&lt;br /&gt;
		table.insert(outputColumnNames, args[&amp;quot;output_column&amp;quot; .. #outputColumnNames + 1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local outputColumnIdxs = {}&lt;br /&gt;
	local numOutputColumnIdxs = 0&lt;br /&gt;
	for i, field in ipairs(data.schema.fields) do&lt;br /&gt;
		for j, outputColumnName in ipairs(outputColumnNames) do&lt;br /&gt;
			if field.name == outputColumnName then&lt;br /&gt;
				outputColumnIdxs[outputColumnName] = i&lt;br /&gt;
				numOutputColumnIdxs = numOutputColumnIdxs + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if numOutputColumnIdxs == #outputColumnNames then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if numOutputColumnIdxs &amp;lt; #outputColumnNames then&lt;br /&gt;
		for i, outputColumnName in ipairs(outputColumnNames) do&lt;br /&gt;
			assert(outputColumnIdxs[outputColumnName],&lt;br /&gt;
				mw.ustring.format(&amp;quot;Output column “%s” not found.&amp;quot;, outputColumnName))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if rowIdx &amp;gt; 0 then&lt;br /&gt;
		rowIdx = (rowIdx - 1) % #data.data + 1&lt;br /&gt;
	elseif rowIdx &amp;lt; 0 then&lt;br /&gt;
		rowIdx = rowIdx % #data.data + 1&lt;br /&gt;
	else&lt;br /&gt;
		error(&amp;quot;0 is not a valid row index.&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local record = data.data[rowIdx]&lt;br /&gt;
	if record ~= nil then&lt;br /&gt;
		if outputFormat or numOutputColumnIdxs &amp;gt; 1 then&lt;br /&gt;
			local values = {}&lt;br /&gt;
			for i, columnName in ipairs(outputColumnNames) do&lt;br /&gt;
				local columnIdx = outputColumnIdxs[columnName]&lt;br /&gt;
				table.insert(values, record[columnIdx])&lt;br /&gt;
			end&lt;br /&gt;
			if outputFormat then&lt;br /&gt;
				return mw.ustring.format(outputFormat, unpack(values))&lt;br /&gt;
			else&lt;br /&gt;
				return mw.text.listToText(values)&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			local columnIdx = outputColumnIdxs[outputColumnNames[1]]&lt;br /&gt;
			return record[columnIdx]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the value of the cell at the given row index and column name.&lt;br /&gt;
--- A row index of 1 refers to the first row in the table. A row index of -1&lt;br /&gt;
--- refers to the last row in the table. It is an error to specify a row index&lt;br /&gt;
--- of 0.&lt;br /&gt;
--- Usage: {{#invoke:Tabular data | cell | Table name | output_row = Index of row to output | output_column = Name of column to output }}&lt;br /&gt;
function p.cell(frame)&lt;br /&gt;
	return p._cell(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._lookup(args)&lt;br /&gt;
	local data = args.data or mw.ext.data.get(args[1])&lt;br /&gt;
	local searchValue = args.search_value&lt;br /&gt;
	local searchPattern = args.search_pattern&lt;br /&gt;
	local searchColumnName = args.search_column&lt;br /&gt;
	&lt;br /&gt;
	local searchColumnIdx&lt;br /&gt;
	for i, field in ipairs(data.schema.fields) do&lt;br /&gt;
		if field.name == searchColumnName then&lt;br /&gt;
			searchColumnIdx = i&lt;br /&gt;
		end&lt;br /&gt;
		if searchColumnIdx then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	assert(searchColumnIdx, mw.ustring.format(&amp;quot;Search column “%s” not found.&amp;quot;, searchColumnName))&lt;br /&gt;
	&lt;br /&gt;
	local occurrence = tonumber(args.occurrence) or 1&lt;br /&gt;
	&lt;br /&gt;
	local numMatchingRecords = 0&lt;br /&gt;
	for i = (occurrence &amp;lt; 0 and #data.data or 1),&lt;br /&gt;
		(occurrence &amp;lt; 0 and 1 or #data.data),&lt;br /&gt;
		(occurrence &amp;lt; 0 and -1 or 1) do&lt;br /&gt;
		local record = data.data[i]&lt;br /&gt;
		if (searchValue and record[searchColumnIdx] == searchValue) or&lt;br /&gt;
			(searchPattern and mw.ustring.match(tostring(record[searchColumnIdx]), searchPattern)) then&lt;br /&gt;
			numMatchingRecords = numMatchingRecords + 1&lt;br /&gt;
			if numMatchingRecords == math.abs(occurrence) then&lt;br /&gt;
				local args = mw.clone(args)&lt;br /&gt;
				args.data = data&lt;br /&gt;
				args.output_row = i&lt;br /&gt;
				return p._cell(args)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns the value of the cell(s) in the given output column(s) of the row&lt;br /&gt;
--- matching the search key and column.&lt;br /&gt;
--- Reminiscent of LOOKUP() macros in popular spreadsheet applications, except&lt;br /&gt;
--- that the search key must match exactly. (On the other hand, this means the&lt;br /&gt;
--- table does not need to be sorted.)&lt;br /&gt;
--- Usage: {{#invoke: Tabular data | lookup | Table name | search_value = Value to find in column | search_pattern = Pattern to find in column | search_column = Name of column to search in | occurrence = 1-based index of the matching row to output | output_column = Name of column to output | output_column2 = Name of another column to output | … | output_format = String format to output the values in }}&lt;br /&gt;
function p.lookup(frame)&lt;br /&gt;
	return p._lookup(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._wikitable(args)&lt;br /&gt;
	local pageName = args[1]&lt;br /&gt;
	local data = mw.ext.data.get(pageName)&lt;br /&gt;
	&lt;br /&gt;
	local datatypes = {}&lt;br /&gt;
	&lt;br /&gt;
	local htmlTable = mw.html.create(&amp;quot;table&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;wikitable sortable&amp;quot;)&lt;br /&gt;
	htmlTable&lt;br /&gt;
		:tag(&amp;quot;caption&amp;quot;)&lt;br /&gt;
		:wikitext(navbar.navbar({&lt;br /&gt;
			template = &amp;quot;:c:Data:&amp;quot; .. pageName,&lt;br /&gt;
			mini = &amp;quot;y&amp;quot;,&lt;br /&gt;
			style = &amp;quot;float: right;&amp;quot;,&lt;br /&gt;
			&amp;quot;view&amp;quot;, &amp;quot;edit&amp;quot;,&lt;br /&gt;
		}))&lt;br /&gt;
		:wikitext(data.description)&lt;br /&gt;
	&lt;br /&gt;
	local headerRow = htmlTable&lt;br /&gt;
		:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
	for i, field in ipairs(data.schema.fields) do&lt;br /&gt;
		headerRow&lt;br /&gt;
			:tag(&amp;quot;th&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;scope&amp;quot;, &amp;quot;col&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;data-sort-type&amp;quot;, datatypes[j] == &amp;quot;text&amp;quot; and &amp;quot;string&amp;quot; or datatypes[j])&lt;br /&gt;
			:wikitext(field.title)&lt;br /&gt;
		datatypes[i] = field.type&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, record in ipairs(data.data) do&lt;br /&gt;
		local row = htmlTable:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
		for j = 1, #data.schema.fields do&lt;br /&gt;
			local cell = row:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
			if record[j] then&lt;br /&gt;
				local formattedData = record[j]&lt;br /&gt;
				if datatypes[j] == &amp;quot;number&amp;quot; then&lt;br /&gt;
					formattedData = lang:formatNum(formattedData)&lt;br /&gt;
					cell:attr(&amp;quot;align&amp;quot;, &amp;quot;right&amp;quot;)&lt;br /&gt;
				elseif datatypes[j] == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
					cell&lt;br /&gt;
						:addClass(record[j] and &amp;quot;table-yes&amp;quot; or &amp;quot;table-no&amp;quot;)&lt;br /&gt;
						:css({&lt;br /&gt;
							background = record[j] and bgColors[&amp;quot;true&amp;quot;] or bgColors[&amp;quot;false&amp;quot;],&lt;br /&gt;
							color = record[j] and colors[&amp;quot;true&amp;quot;] or colors[&amp;quot;false&amp;quot;],&lt;br /&gt;
							[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;,&lt;br /&gt;
							[&amp;quot;text-align&amp;quot;] = &amp;quot;center&amp;quot;,&lt;br /&gt;
						})&lt;br /&gt;
						:wikitext(record[j] and messages[&amp;quot;true&amp;quot;] or messages[&amp;quot;false&amp;quot;])&lt;br /&gt;
				end&lt;br /&gt;
				cell:wikitext(formattedData)&lt;br /&gt;
			else&lt;br /&gt;
				cell&lt;br /&gt;
					:addClass(&amp;quot;mw-tabular-value-null&amp;quot;)&lt;br /&gt;
					:addClass(&amp;quot;table-na&amp;quot;)&lt;br /&gt;
					:css({&lt;br /&gt;
						background = bgColors.null,&lt;br /&gt;
						color = colors.null,&lt;br /&gt;
						[&amp;quot;vertical-align&amp;quot;] = &amp;quot;middle&amp;quot;,&lt;br /&gt;
						[&amp;quot;text-align&amp;quot;] = &amp;quot;center&amp;quot;,&lt;br /&gt;
					})&lt;br /&gt;
					:wikitext(messages.null)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local footer = htmlTable&lt;br /&gt;
		:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
		:tag(&amp;quot;td&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;sortbottom&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;colspan&amp;quot;, #data.schema.fields)&lt;br /&gt;
	footer:wikitext(data.sources)&lt;br /&gt;
	footer:tag(&amp;quot;br&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local licenseText = mw.message.new(&amp;quot;Jsonconfig-license&amp;quot;,&lt;br /&gt;
		mw.ustring.format(&amp;quot;[%s %s]&amp;quot;, data.license.url, data.license.text))&lt;br /&gt;
	footer&lt;br /&gt;
		:tag(&amp;quot;i&amp;quot;)&lt;br /&gt;
		:wikitext(tostring(licenseText))&lt;br /&gt;
	&lt;br /&gt;
	return htmlTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a tabular data page as a wikitext table.&lt;br /&gt;
--- Usage: {{#invoke:Tabular data | wikitable | Table name }}&lt;br /&gt;
function p.wikitable(frame)&lt;br /&gt;
	return p._wikitable(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Fire</name></author>
	</entry>
</feed>