Module:Sandbox/AB-me/Racing table2 explained

local p = local getArgs = require('Module:Arguments').getArgs

local DEFAULT_CODE = 'default' .. os.time

local data =

--local debug =

function p.main(frame) local args = getArgs(frame) return p._main(args)end

function p._main(args) p.handleArg('eventColumns', args.eventColumns, 'number') p.handleCsvArg('events', args.events) p.handleItemArgs('events', 'event', 'name', 'string', args) p.handleItemArgs('events', 'eventColumns', 'columns', 'number', args)

p.handleCsvArg('participants', args.participants)

p.handleCsvArg('notes', args.notes) p.handleItemArgs('notes', 'note', 'name', 'string', args) -- Handling of default pointSystem if (args.pointSystem ~= nil) then if (args.pointSystems

nil) then args.pointSystems = DEFAULT_CODE else args.pointSystems = DEFAULT_CODE .. ',' .. args.pointSystems end args['pointSystem_' .. DEFAULT_CODE] = args.pointSystem end

if (args.pointSystems ~= nil) then p.handleCsvArg('pointSystems', args.pointSystems) p.handleItemArgsCsv('pointSystems', args.pointSystems, 'pos', 'number', args) end

p.handleItemArgsCsv('events', 'eventPointSystems', 'pointSystems', 'string', args)

p.handleItemArgs('participants', 'participant', 'name', 'string', args)

p.handleItemArgs('texts', 'text', nil, 'string', args)

local colCount = 0

for i,v in ipairs(data.events) do for j = 1, v.columns do colCount = colCount + 1 if (j

1) then p.handleResult(colCount, (args['result_' .. v.code] or args['result_' .. v.code .. '_1'])) for k,w in ipairs(data.notes) do p.handleResultNotes(colCount, (args['resultNotes_' .. v.code .. '_' .. w.code] or args['resultNotes_' .. v.code .. '_1' .. '_' .. w.code]), w.code) end

else p.handleResult(colCount, args['result_' .. v.code .. '_' .. j])

for k,w in ipairs(data.notes) do p.handleResultNotes(colCount, args['resultNotes_' .. v.code .. '_' .. j .. '_' .. w.code], w.code) end end end end

--p.handleResult

-- Draw table local stack =

--table.insert(stack, '<nowiki>' .. debug .. '</nowiki>\n\n') table.insert(stack, '

') return table.concat(stack)end

function p.handleArg(key, value, type) if (value ~= nil) then data[key] = p.valueToType(value, type) endend

function p.handleCsvArg(key, value) if (value ~= nil) then local split = mw.text.split(value, ',') if (data[key]

nil or #data[key]

0) then for i,v in ipairs(split) do data[key][i] = p.handleCsvArgItem(key, v, i) end

end endend

function p.handleCsvArgItem(key, v, i) if (key

'events') then return elseif (key

'participants') then return elseif (key

'pointSystems') then return else return endend

function p.handleItemArgs(key, argPrefix, property, type, args) local arg =

for k,v in pairs(data[key]) do arg = args[argPrefix .. '_' .. (v['code'] or k)]

if (arg ~= nil) then if (property ~= nil) then v[property] = p.valueToType(arg, type) else data[key][k] = p.valueToType(arg, type) end end

endend

function p.handleItemArgsCsv(key, argPrefix, property, type, args) local arg =

for k,v in pairs(data[key]) do

arg = args[argPrefix .. '_' .. (v['code'] or k)]

if (arg ~= nil) then local split = mw.text.split(arg, ',')

for j,w in ipairs(split) do v[property][j] = p.valueToType(w, type) end end

end

end

function p.handleResult(column, csv) if (csv ~= nil) then --debug = debug .. 'Handling column ' .. column .. ' with content ' .. csv .. '\n\n'

local split = mw.text.split(csv, ',')

local res =

for i,v in ipairs(split) do res[v] = i end

for i, v in ipairs(data.participants) do if v.results[column] ~= nil then v.results[column].pos = res[v.code] else v.results[column] = end end endend

function p.handleResultNotes(column, csv, noteCode) if (csv ~= nil) then local split = mw.text.split(csv, ',') local res =

for i,v in ipairs(split) do res[v] = 1 end for i,v in ipairs(data.participants) do if res[v.code] ~= nil then if v.results[column] ~= nil then table.insert(v.results[column].notes, noteCode) else v.results[column] = end end end endend

function p.valueToType(value, type) if (type

'number') then return tonumber(value) else return value endend

-- Render functions

function p.writeTableHeader(stack) table.insert(stack, '|-\n') table.insert(stack, '! ' .. data.texts.pos .. '\n') table.insert(stack, '!' .. data.texts.participant .. '\n') if (#data['events'] > 0) then for i,v in ipairs(data['events']) do table.insert(stack, '!colspan="' .. v.columns .. '"|' .. v.name .. '\n') end end table.insert(stack, '!' .. data.texts.points .. '\n')end

function p.writeTableRow(stack, participant) table.insert(stack, '|-\n') table.insert(stack, '!' .. (participant['pos'] or ' - ') .. '\n') table.insert(stack, '|style="text-align:left;"|' .. participant['name'] .. '\n') local colCount = 0

for i,v in ipairs(data['events']) do for j=1,v['columns'] do colCount = colCount + 1

--table.insert(stack, '|' .. (participant.results[colCount] or ) .. '\n') if participant.results[colCount] ~= nil then p.writeTableCellResult(stack, participant.results[colCount].pos, participant.results[colCount].notes) else p.writeTableCellResult(stack, nil, nil) end end end --table.insert(stack, '!' .. '0' .. '\n') p.writeTableCellSum(stack, participant) end

function p.writeTableCellResult(stack, pos, notes) p.writeTableCellResultStyle(stack, pos) if (pos ~= nil and notes ~= nil and #notes > 0) then table.insert(stack, pos) for i,v in ipairs(notes) do table.insert(stack, '

' .. v .. '') end elseif pos ~= nil then table.insert(stack, pos) elseif notes ~= nil and #notes > 0 then local firstNote = true for i,v in ipairs(notes) do if firstNote then table.insert(stack, v) else table.insert(stack, '' .. v .. '') end firstNote = false end end table.insert(stack, '\n')end

function p.writeTableCellSum(stack, participant) table.insert(stack, '!') sum = 0 for i,v in ipairs(participant.results) do sum = sum + (v.pts or 0) end table.insert(stack, sum) table.insert(stack, '\n')end

function p.writeTableCellResultStyle(stack, pos) if data.styles.pos[pos] ~= nil then table.insert(stack, '|style="' .. p.getStyle(data.styles.pos[pos]) .. '"') end table.insert(stack, '|')end

function p.getStyle(styleString) if not string.find(styleString, ':', 1, true) then return 'background-color:' .. styleString end return styleStringend

--debugfunction p.dump(o) if type(o)

'table' then local s = ' ' else return tostring(o) end end

return p;