# Module:Political party/testtable

local p = {}  

local contrastRatio = require('Module:Color contrast')._ratio  

function __genOrderedIndex(t)  
local orderedIndex = {}  
for key in pairs(t) do  
table.insert(orderedIndex, key)  
end  
table.sort(orderedIndex)  
return orderedIndex  
end  

function orderedNext(t, state)  
-- Equivalent of the next function, but returns the keys in the alphabetic  
-- order. We use a temporary ordered key table that is stored in the  
-- table being iterated.  

local key = nil  
if state == nil then  
-- the first time, generate the index  
t.__orderedIndex = __genOrderedIndex(t)  
key = t.__orderedIndex[1]  
else  
-- fetch the next value  
for i = 1, #(t.__orderedIndex) do  
if t.__orderedIndex[i] == state then  
key = t.__orderedIndex[i + 1]  
end  
end  
end  

if key then  
return key, t[key]  
end  

-- no more value to return, cleanup  
t.__orderedIndex = nil  
return  
end  

function orderedPairs(t)  
-- Equivalent of the pairs function on tables. Allows to iterate in order.  
return orderedNext, t, nil  
end  

local function isContrastValid(text, background)  
if not background or background == "" then  
return ''  
end  

local ratio = tonumber(contrastRatio({text, background}))  
if not ratio then  
return ""  
end  
if ratio > 4.5 and ratio < 7.0 then  
return "AA"  
elseif ratio > 7.0 then  
return "AAA"  
else  
return "Failed"  
end  
end  

local function isColorValid(color)  
if not color or color == "" then  
return ''  
end  

-- Convert to lowercase.  
color = color:lower  

-- Check if color is using an HTML color name.  
local HTMLcolor = mw.loadData('Module:Color contrast/colors')  
if HTMLcolor[color] then  
return ''  
end  

-- Added as a valid color in https://www.w3.org/TR/css-color-3/#transparent  
if color == "transparent" then  
return ""  
end  

-- Remove leading # if there is one.  
color = string.gsub(color, "^#", "")  

local cs = mw.text.split(color, '')  
if #cs == 6 or #cs == 3 then  
return ''  
end  

return false  
end  

-- Example of having all the data - color and names - in one table. Requires one page to be edited instead of two when adding a new party.  
function p.tables  
-- Initialise and populate variables  
local args = .args  
local index = args.letter  

-- Load data from submodule  
local data = require('Module:Political party/' .. index)  

-- helper function  
local function table_row(party_name, party_info)  
local res = mw.html.create('')  
res:tag('th')  
:attr('scope', 'row')  
:wikitext(party_name)  
res:tag('td')  
:css('background-color', party_info.color)  
:wikitext(party_info.color)  
res:tag('td')  
:wikitext(party_info.abbrev)  
res:tag('td')  
:wikitext(party_info.shortname)  
res:tag('td')  
:wikitext(tostring(isColorValid(party_info.color)))  
res:tag('td')  
:wikitext(isContrastValid("black", party_info.color))  
res:tag('td')  
:wikitext(isContrastValid("#0645AD", party_info.color))  
res:tag('td')  
:wikitext(isContrastValid("#0B0080", party_info.color))  

return tostring(res)  
end  

-- build table  
local root = mw.html.create('table')  
root:addClass('wikitable')  
:addClass('sortable')  
:addClass('plainrowheaders')  
:css('background-color', 'transparent')  
:css('font-size', '90%')  
:css('line-height', '100%')  
:cssText(style)  
local row = root:tag('tr')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('Political party name')  
row:tag('th')  
:attr('scope', 'col')  
:addClass('unsortable')  
:wikitext('color')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('abbrev')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('shortname')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('Is color valid?')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('Contrast normal text')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('Contrast unvisited link')  
row:tag('th')  
:attr('scope', 'col')  
:wikitext('Contrast visited link')  

for party_name, party_vals in orderedPairs(data.full) do  
row = root:tag('tr')  
row:wikitext(table_row(party_name, party_vals))  
end  
return tostring(root)  

end  

return p