<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAB-me%2FRacing_table2</id>
	<title>Module:Sandbox/AB-me/Racing table2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAB-me%2FRacing_table2"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/AB-me/Racing_table2&amp;action=history"/>
	<updated>2026-06-19T07:10:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/AB-me/Racing_table2&amp;diff=145016&amp;oldid=prev</id>
		<title>imported&gt;AB-me at 16:30, 7 April 2021</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/AB-me/Racing_table2&amp;diff=145016&amp;oldid=prev"/>
		<updated>2021-04-07T16:30:24Z</updated>

		<summary type="html">&lt;p&gt;&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;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
local DEFAULT_CODE = &amp;#039;default&amp;#039; .. os.time()&lt;br /&gt;
&lt;br /&gt;
local data = {&lt;br /&gt;
	events = {},&lt;br /&gt;
	eventColumns = 1,&lt;br /&gt;
	participants = {},&lt;br /&gt;
	pointSystems = {},&lt;br /&gt;
	results = {},&lt;br /&gt;
	notes = {},&lt;br /&gt;
	texts = { pos = &amp;#039;&amp;lt;abbr title=&amp;quot;Position&amp;quot;&amp;gt;Pos.&amp;lt;/abbr&amp;gt;&amp;#039;, participant = &amp;#039;Participant&amp;#039;, points = &amp;#039;Points&amp;#039; },&lt;br /&gt;
	styles = { pos = { &amp;#039;#FFFFBF&amp;#039;, &amp;#039;#DFDFDF&amp;#039;, &amp;#039;#FFDF9F&amp;#039; }, pts = &amp;#039;#DFFFDF&amp;#039;, noPts = &amp;#039;#CFCFFF&amp;#039;, notes = { Ret = &amp;#039;#EFCFFF&amp;#039;, DNQ = &amp;#039;#FFCFCF&amp;#039;, DNPQ = &amp;#039;#FFCFCF&amp;#039;, DSQ = &amp;#039;background-color:#000000;color:white&amp;#039;, DNS = &amp;#039;#FFFFFF&amp;#039;, C = &amp;#039;#FFFFFF&amp;#039; } }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--local debug = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	p.handleArg(&amp;#039;eventColumns&amp;#039;, args.eventColumns, &amp;#039;number&amp;#039;)&lt;br /&gt;
	p.handleCsvArg(&amp;#039;events&amp;#039;, args.events)&lt;br /&gt;
	p.handleItemArgs(&amp;#039;events&amp;#039;, &amp;#039;event&amp;#039;, &amp;#039;name&amp;#039;, &amp;#039;string&amp;#039;, args)&lt;br /&gt;
	p.handleItemArgs(&amp;#039;events&amp;#039;, &amp;#039;eventColumns&amp;#039;, &amp;#039;columns&amp;#039;, &amp;#039;number&amp;#039;, args)&lt;br /&gt;
&lt;br /&gt;
	p.handleCsvArg(&amp;#039;participants&amp;#039;, args.participants)&lt;br /&gt;
&lt;br /&gt;
	p.handleCsvArg(&amp;#039;notes&amp;#039;, args.notes)&lt;br /&gt;
	p.handleItemArgs(&amp;#039;notes&amp;#039;, &amp;#039;note&amp;#039;, &amp;#039;name&amp;#039;, &amp;#039;string&amp;#039;, args)&lt;br /&gt;
    &lt;br /&gt;
    -- Handling of default pointSystem&lt;br /&gt;
	if (args.pointSystem ~= nil) then&lt;br /&gt;
		if (args.pointSystems == nil) then&lt;br /&gt;
			args.pointSystems = DEFAULT_CODE&lt;br /&gt;
		else&lt;br /&gt;
			args.pointSystems = DEFAULT_CODE .. &amp;#039;,&amp;#039; .. args.pointSystems&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		args[&amp;#039;pointSystem_&amp;#039; .. DEFAULT_CODE] = args.pointSystem&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if (args.pointSystems ~= nil) then&lt;br /&gt;
		p.handleCsvArg(&amp;#039;pointSystems&amp;#039;, args.pointSystems)&lt;br /&gt;
		p.handleItemArgsCsv(&amp;#039;pointSystems&amp;#039;, args.pointSystems, &amp;#039;pos&amp;#039;, &amp;#039;number&amp;#039;, args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	p.handleItemArgsCsv(&amp;#039;events&amp;#039;, &amp;#039;eventPointSystems&amp;#039;, &amp;#039;pointSystems&amp;#039;, &amp;#039;string&amp;#039;, args)&lt;br /&gt;
&lt;br /&gt;
    p.handleItemArgs(&amp;#039;participants&amp;#039;, &amp;#039;participant&amp;#039;, &amp;#039;name&amp;#039;, &amp;#039;string&amp;#039;, args)&lt;br /&gt;
&lt;br /&gt;
	p.handleItemArgs(&amp;#039;texts&amp;#039;, &amp;#039;text&amp;#039;, nil, &amp;#039;string&amp;#039;, args)&lt;br /&gt;
&lt;br /&gt;
	local colCount = 0&lt;br /&gt;
&lt;br /&gt;
	for i,v in ipairs(data.events) do&lt;br /&gt;
		for j = 1, v.columns do&lt;br /&gt;
			colCount = colCount + 1&lt;br /&gt;
			if (j == 1) then&lt;br /&gt;
                p.handleResult(colCount, (args[&amp;#039;result_&amp;#039; .. v.code] or args[&amp;#039;result_&amp;#039; .. v.code .. &amp;#039;_1&amp;#039;]))&lt;br /&gt;
                &lt;br /&gt;
                for k,w in ipairs(data.notes) do&lt;br /&gt;
                    p.handleResultNotes(colCount, (args[&amp;#039;resultNotes_&amp;#039; .. v.code .. &amp;#039;_&amp;#039; .. w.code] or args[&amp;#039;resultNotes_&amp;#039; .. v.code .. &amp;#039;_1&amp;#039; .. &amp;#039;_&amp;#039; .. w.code]), w.code)&lt;br /&gt;
                end&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
				p.handleResult(colCount, args[&amp;#039;result_&amp;#039; .. v.code .. &amp;#039;_&amp;#039; .. j])&lt;br /&gt;
&lt;br /&gt;
                for k,w in ipairs(data.notes) do&lt;br /&gt;
                    p.handleResultNotes(colCount, args[&amp;#039;resultNotes_&amp;#039; .. v.code .. &amp;#039;_&amp;#039; .. j .. &amp;#039;_&amp;#039; .. w.code], w.code)&lt;br /&gt;
                end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--p.handleResult()&lt;br /&gt;
&lt;br /&gt;
	-- Draw table&lt;br /&gt;
    local stack = {}&lt;br /&gt;
&lt;br /&gt;
    --table.insert(stack, &amp;#039;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039; .. debug .. &amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;\n\n&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	table.insert(stack, &amp;#039;{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:85%; text-align:center;&amp;quot;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	p.writeTableHeader(stack)&lt;br /&gt;
	&lt;br /&gt;
	for i,v in ipairs(data[&amp;#039;participants&amp;#039;]) do&lt;br /&gt;
		p.writeTableRow(stack, v)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	p.writeTableHeader(stack)&lt;br /&gt;
&lt;br /&gt;
	table.insert(stack, &amp;#039;|}&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(stack)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleArg(key, value, type)&lt;br /&gt;
	if (value ~= nil) then&lt;br /&gt;
		data[key] = p.valueToType(value, type)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleCsvArg(key, value)&lt;br /&gt;
	if (value ~= nil) then&lt;br /&gt;
		local split = mw.text.split(value, &amp;#039;,&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
		if (data[key] == nil or #data[key] == 0) then&lt;br /&gt;
		&lt;br /&gt;
			for i,v in ipairs(split) do&lt;br /&gt;
				data[key][i] = p.handleCsvArgItem(key, v, i)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleCsvArgItem(key, v, i)&lt;br /&gt;
	if (key == &amp;#039;events&amp;#039;) then&lt;br /&gt;
		return { code = v, name = v, columns = data[&amp;#039;eventColumns&amp;#039;], pointSystems = { DEFAULT_CODE } }&lt;br /&gt;
	elseif (key == &amp;#039;participants&amp;#039;) then&lt;br /&gt;
		return { code = v, name = v, pos = i, results = {}, resultNotes = {}, points = {} }&lt;br /&gt;
	elseif (key == &amp;#039;pointSystems&amp;#039;) then&lt;br /&gt;
		return { code = v, pos = {}, notes = {} }&lt;br /&gt;
	else&lt;br /&gt;
		return { code = v, name = v }&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleItemArgs(key, argPrefix, property, type, args)&lt;br /&gt;
	local arg = {}&lt;br /&gt;
&lt;br /&gt;
	for k,v in pairs(data[key]) do&lt;br /&gt;
        &lt;br /&gt;
        arg = args[argPrefix .. &amp;#039;_&amp;#039; .. (v[&amp;#039;code&amp;#039;] or k)]&lt;br /&gt;
&lt;br /&gt;
		if (arg ~= nil) then&lt;br /&gt;
			if (property ~= nil) then&lt;br /&gt;
				v[property] = p.valueToType(arg, type)&lt;br /&gt;
			else&lt;br /&gt;
				data[key][k] = p.valueToType(arg, type)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleItemArgsCsv(key, argPrefix, property, type, args)&lt;br /&gt;
	local arg = {}&lt;br /&gt;
&lt;br /&gt;
	for k,v in pairs(data[key]) do&lt;br /&gt;
&lt;br /&gt;
		arg = args[argPrefix .. &amp;#039;_&amp;#039; .. (v[&amp;#039;code&amp;#039;] or k)]&lt;br /&gt;
&lt;br /&gt;
		if (arg ~= nil) then&lt;br /&gt;
			local split = mw.text.split(arg, &amp;#039;,&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			for j,w in ipairs(split) do&lt;br /&gt;
				v[property][j] = p.valueToType(w, type)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleResult(column, csv)&lt;br /&gt;
	if (csv ~= nil) then&lt;br /&gt;
		--debug = debug .. &amp;#039;Handling column &amp;#039; .. column .. &amp;#039; with content &amp;#039; .. csv .. &amp;#039;\n\n&amp;#039;&lt;br /&gt;
&lt;br /&gt;
		local split = mw.text.split(csv, &amp;#039;,&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		local res = {}&lt;br /&gt;
&lt;br /&gt;
		for i,v in ipairs(split) do&lt;br /&gt;
			res[v] = i&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		for i, v in ipairs(data.participants) do&lt;br /&gt;
			if v.results[column] ~= nil then&lt;br /&gt;
				v.results[column].pos = res[v.code]&lt;br /&gt;
			else&lt;br /&gt;
				v.results[column] = { pos = res[v.code], pts = tonumber(res[v.code]), notes = { } }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.handleResultNotes(column, csv, noteCode)&lt;br /&gt;
	if (csv ~= nil) then&lt;br /&gt;
		local split = mw.text.split(csv, &amp;#039;,&amp;#039;)&lt;br /&gt;
		&lt;br /&gt;
        local res = {}&lt;br /&gt;
&lt;br /&gt;
        for i,v in ipairs(split) do&lt;br /&gt;
            res[v] = 1&lt;br /&gt;
        end&lt;br /&gt;
		&lt;br /&gt;
        for i,v in ipairs(data.participants) do&lt;br /&gt;
            if res[v.code] ~= nil then&lt;br /&gt;
                if v.results[column] ~= nil then&lt;br /&gt;
                    table.insert(v.results[column].notes, noteCode)&lt;br /&gt;
                else&lt;br /&gt;
                    v.results[column] = { pos = nil, pts = 0, notes = { noteCode } }&lt;br /&gt;
                end&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;
function p.valueToType(value, type)&lt;br /&gt;
	if (type == &amp;#039;number&amp;#039;) then&lt;br /&gt;
		return tonumber(value)&lt;br /&gt;
	else&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Render functions&lt;br /&gt;
&lt;br /&gt;
function p.writeTableHeader(stack)&lt;br /&gt;
	table.insert(stack, &amp;#039;|-\n&amp;#039;)&lt;br /&gt;
	table.insert(stack, &amp;#039;! &amp;#039; .. data.texts.pos .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
	table.insert(stack, &amp;#039;!&amp;#039; .. data.texts.participant .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
	if (#data[&amp;#039;events&amp;#039;] &amp;gt; 0) then&lt;br /&gt;
		for i,v in ipairs(data[&amp;#039;events&amp;#039;]) do&lt;br /&gt;
			table.insert(stack, &amp;#039;!colspan=&amp;quot;&amp;#039; .. v.columns .. &amp;#039;&amp;quot;|&amp;#039; .. v.name .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(stack, &amp;#039;!&amp;#039; .. data.texts.points .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.writeTableRow(stack, participant)&lt;br /&gt;
	table.insert(stack, &amp;#039;|-\n&amp;#039;)&lt;br /&gt;
	table.insert(stack, &amp;#039;!&amp;#039; .. (participant[&amp;#039;pos&amp;#039;] or &amp;#039;&amp;amp;ndash;&amp;#039;) .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
	table.insert(stack, &amp;#039;|style=&amp;quot;text-align:left;&amp;quot;|&amp;#039; .. participant[&amp;#039;name&amp;#039;] .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local colCount = 0&lt;br /&gt;
&lt;br /&gt;
	for i,v in ipairs(data[&amp;#039;events&amp;#039;]) do&lt;br /&gt;
		&lt;br /&gt;
		for j=1,v[&amp;#039;columns&amp;#039;] do&lt;br /&gt;
			colCount = colCount + 1&lt;br /&gt;
&lt;br /&gt;
			--table.insert(stack, &amp;#039;|&amp;#039; .. (participant.results[colCount] or &amp;#039;&amp;#039;) .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
			if participant.results[colCount] ~= nil then&lt;br /&gt;
				p.writeTableCellResult(stack, participant.results[colCount].pos, participant.results[colCount].notes)&lt;br /&gt;
			else&lt;br /&gt;
				p.writeTableCellResult(stack, nil, nil)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	--table.insert(stack, &amp;#039;!&amp;#039; .. &amp;#039;0&amp;#039; .. &amp;#039;\n&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	p.writeTableCellSum(stack, participant)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.writeTableCellResult(stack, pos, notes)&lt;br /&gt;
	p.writeTableCellResultStyle(stack, pos)&lt;br /&gt;
	&lt;br /&gt;
	if (pos ~= nil and notes ~= nil and #notes &amp;gt; 0) then&lt;br /&gt;
		table.insert(stack, pos)&lt;br /&gt;
        for i,v in ipairs(notes) do&lt;br /&gt;
            table.insert(stack, &amp;#039;&amp;lt;span style=&amp;quot;margin:0 0 0 0.1em;&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;&amp;#039; .. v .. &amp;#039;&amp;lt;/sup&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
	elseif pos ~= nil then&lt;br /&gt;
		table.insert(stack, pos)&lt;br /&gt;
	elseif notes ~= nil and #notes &amp;gt; 0 then&lt;br /&gt;
        local firstNote = true&lt;br /&gt;
        for i,v in ipairs(notes) do&lt;br /&gt;
            if firstNote then&lt;br /&gt;
                table.insert(stack, v)&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(stack, &amp;#039;&amp;lt;span style=&amp;quot;margin:0 0 0 0.1em;&amp;quot;&amp;gt;&amp;lt;sup&amp;gt;&amp;#039; .. v .. &amp;#039;&amp;lt;/sup&amp;gt;&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            firstNote = false&lt;br /&gt;
        end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(stack, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.writeTableCellSum(stack, participant)&lt;br /&gt;
	table.insert(stack, &amp;#039;!&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	sum = 0&lt;br /&gt;
	&lt;br /&gt;
	for i,v in ipairs(participant.results) do&lt;br /&gt;
		sum = sum + (v.pts or 0)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(stack, sum)&lt;br /&gt;
	&lt;br /&gt;
	table.insert(stack, &amp;#039;\n&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.writeTableCellResultStyle(stack, pos)&lt;br /&gt;
	if data.styles.pos[pos] ~= nil then&lt;br /&gt;
		table.insert(stack, &amp;#039;|style=&amp;quot;&amp;#039; .. p.getStyle(data.styles.pos[pos]) .. &amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert(stack, &amp;#039;|&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getStyle(styleString)&lt;br /&gt;
	if not string.find(styleString, &amp;#039;:&amp;#039;, 1, true) then&lt;br /&gt;
		return &amp;#039;background-color:&amp;#039; .. styleString&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return styleString&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--debug&lt;br /&gt;
function p.dump(o)&lt;br /&gt;
    if type(o) == &amp;#039;table&amp;#039; then&lt;br /&gt;
       local s = &amp;#039;{ &amp;#039;&lt;br /&gt;
       for k,v in pairs(o) do&lt;br /&gt;
          if type(k) ~= &amp;#039;number&amp;#039; then k = &amp;#039;&amp;quot;&amp;#039;..k..&amp;#039;&amp;quot;&amp;#039; end&lt;br /&gt;
          s = s .. &amp;#039;[&amp;#039;..k..&amp;#039;] = &amp;#039; .. p.dump(v) .. &amp;#039;,&amp;#039;&lt;br /&gt;
       end&lt;br /&gt;
       return s .. &amp;#039;} &amp;#039;&lt;br /&gt;
    else&lt;br /&gt;
       return tostring(o)&lt;br /&gt;
    end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>imported&gt;AB-me</name></author>
	</entry>
</feed>