<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACsv</id>
	<title>Module:Csv - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACsv"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Csv&amp;action=history"/>
	<updated>2026-04-07T16:26:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:Csv&amp;diff=5687&amp;oldid=prev</id>
		<title>Admin coral island: Created page with &quot;local p = {} local getArgs = require(&quot;Dev:Arguments&quot;).getArgs  local str_find = string.find local str_sub = string.sub local str_gsub = string.gsub local tbl_insert = table.insert  local function escapeMagicCharacters(s) 	-- Lua pattern magic chars are ^$()%.[]*+-? 	return str_gsub(s, &#039;[%^%$%(%)%%%.%[%]%*%+%-%?]&#039;, &#039;%%%1&#039;) end  function p.main(frame) 	local args = getArgs(frame) 	local sPageName = args.page 	local fmtparams = { 		delimiter = args.delimiter, 		quotechar =...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Csv&amp;diff=5687&amp;oldid=prev"/>
		<updated>2023-08-04T02:28:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local getArgs = require(&amp;quot;Dev:Arguments&amp;quot;).getArgs  local str_find = string.find local str_sub = string.sub local str_gsub = string.gsub local tbl_insert = table.insert  local function escapeMagicCharacters(s) 	-- Lua pattern magic chars are ^$()%.[]*+-? 	return str_gsub(s, &amp;#039;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;#039;, &amp;#039;%%%1&amp;#039;) end  function p.main(frame) 	local args = getArgs(frame) 	local sPageName = args.page 	local fmtparams = { 		delimiter = args.delimiter, 		quotechar =...&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;
local getArgs = require(&amp;quot;Dev:Arguments&amp;quot;).getArgs&lt;br /&gt;
&lt;br /&gt;
local str_find = string.find&lt;br /&gt;
local str_sub = string.sub&lt;br /&gt;
local str_gsub = string.gsub&lt;br /&gt;
local tbl_insert = table.insert&lt;br /&gt;
&lt;br /&gt;
local function escapeMagicCharacters(s)&lt;br /&gt;
	-- Lua pattern magic chars are ^$()%.[]*+-?&lt;br /&gt;
	return str_gsub(s, &amp;#039;[%^%$%(%)%%%.%[%]%*%+%-%?]&amp;#039;, &amp;#039;%%%1&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local sPageName = args.page&lt;br /&gt;
	local fmtparams = {&lt;br /&gt;
		delimiter = args.delimiter,&lt;br /&gt;
		quotechar = args.quotechar,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if sPageName then&lt;br /&gt;
		return p.csvToHtmlTable(sPageName, fmtparams)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.csvToHtmlTable(sPage, fmtparams)&lt;br /&gt;
	local tLuaTable = p.convertToLua(sPage, fmtparams)&lt;br /&gt;
&lt;br /&gt;
	if tLuaTable then&lt;br /&gt;
		return p.generateHtml(tLuaTable, fmtparams)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.convertToLua(sPage, fmtparams)&lt;br /&gt;
	if sPage then&lt;br /&gt;
		local oData = mw.title.new(sPage)&lt;br /&gt;
		local arrColumns = {}&lt;br /&gt;
		&lt;br /&gt;
		if oData then&lt;br /&gt;
			local contents = oData:getContent()&lt;br /&gt;
			if contents then&lt;br /&gt;
				arrColumns = p.parseCSV(contents, fmtparams)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return arrColumns &lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- //Converts a csv page to html table&lt;br /&gt;
function p.generateHtml(arrColumns, fmtparams)&lt;br /&gt;
	local hTable = mw.html.create(&amp;quot;table&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	hTable:addClass(&amp;quot;wikitable&amp;quot;)&lt;br /&gt;
	for i, v in ipairs(arrColumns) do &lt;br /&gt;
		local sTag = i == 1 and &amp;quot;th&amp;quot; or &amp;quot;td&amp;quot;&lt;br /&gt;
		local tr = hTable:tag(&amp;quot;tr&amp;quot;)&lt;br /&gt;
		for _, sData in ipairs(v) do&lt;br /&gt;
			local text = sData:gsub(&amp;#039;\n&amp;#039;, &amp;#039;&amp;lt;br&amp;gt;&amp;#039;)&lt;br /&gt;
			tr:tag(sTag):wikitext(text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return hTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- http://lua-users.org/wiki/CsvUtils&lt;br /&gt;
-- https://docs.python.org/3/library/csv.html&lt;br /&gt;
function p.parseCSV(s, fmtparams)&lt;br /&gt;
	if s == &amp;#039;&amp;#039; then return {} end&lt;br /&gt;
	local t = {}&lt;br /&gt;
	local row = {}&lt;br /&gt;
	local pos = 1&lt;br /&gt;
	local delimiter = fmtparams and fmtparams.delimiter or &amp;#039;,&amp;#039;&lt;br /&gt;
	if #delimiter ~= 1 then&lt;br /&gt;
		error(&amp;#039;&amp;quot;delimiter&amp;quot; must be a 1-character string&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local quotechar = fmtparams and fmtparams.quotechar or &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
	if #quotechar ~= 1 then&lt;br /&gt;
		error(&amp;#039;&amp;quot;quotechar&amp;quot; must be a 1-character string&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local escapedDelimiter = escapeMagicCharacters(delimiter)&lt;br /&gt;
	local escapedQuotechar = escapeMagicCharacters(quotechar)&lt;br /&gt;
	repeat&lt;br /&gt;
		if str_find(s, &amp;#039;^&amp;#039;..escapedQuotechar, pos) then&lt;br /&gt;
			local a, c&lt;br /&gt;
			local i = pos&lt;br /&gt;
			repeat&lt;br /&gt;
				a, i, c = str_find(s, escapedQuotechar..&amp;#039;(&amp;#039;..escapedQuotechar..&amp;#039;?)&amp;#039;, i + 1)&lt;br /&gt;
			until c ~= quotechar&lt;br /&gt;
			if not i then error(&amp;#039;Unmatched &amp;#039;..quotechar) end&lt;br /&gt;
			local f = str_sub(s, pos + 1, i - 1)&lt;br /&gt;
			local txt = str_gsub(f, escapedQuotechar..escapedQuotechar, quotechar)&lt;br /&gt;
			tbl_insert(row, txt)&lt;br /&gt;
			local nexti = str_find(s, escapedDelimiter, i)&lt;br /&gt;
			pos = (nexti or i) + 1&lt;br /&gt;
		else -- unquoted; str_find next delimiter, newline, or EOL.&lt;br /&gt;
			local i = str_find(s, &amp;#039;[\n&amp;#039;..escapedDelimiter..&amp;#039;]&amp;#039;, pos)&lt;br /&gt;
			if i then&lt;br /&gt;
				local txt = str_sub(s, pos, i - 1)&lt;br /&gt;
				tbl_insert(row, txt)&lt;br /&gt;
				if str_sub(s, i, i) == &amp;#039;\n&amp;#039; then&lt;br /&gt;
					tbl_insert(t, row)&lt;br /&gt;
					row = {}&lt;br /&gt;
				end&lt;br /&gt;
				pos = i + 1&lt;br /&gt;
			else&lt;br /&gt;
				local txt = str_sub(s, pos)&lt;br /&gt;
				tbl_insert(row, txt)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	until pos &amp;gt; #s&lt;br /&gt;
	if row and #row &amp;gt; 0 then&lt;br /&gt;
		tbl_insert(t, row)&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin coral island</name></author>
	</entry>
</feed>