Module:Political party/testtable

From DoveArchives
Jump to navigation Jump to search

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(frame) -- Initialise and populate variables local args = frame.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 unvisted link') row:tag('th') :attr('scope', 'col') :wikitext('Contrast visted 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