Module:EGAColor
Jump to navigation
Jump to search
Documentation for this module may be created at Module:EGAColor/doc
-- Module for working with EGA colors -- -- Lookup tables -- local hex_codes = { "#000", "#00a", "#0a0", "#0aa", "#a00", "#a0a", "#a50", "#aaa", "#555", "#55f", "#5f5", "#5ff", "#f55", "#f5f", "#ff5", "#fff" } local color_names = { "black", "dark blue", "dark green", "dark cyan", "dark red", "dark purple", "dark brown", "light gray", "dark gray", "blue", "green", "cyan", "red", "purple", "yellow", "white" } -- Compute a lookup table of names to indexes, and include a few synonyms as well local inv_color_names = {} for i, name in ipairs(color_names) do inv_color_names[name] = i end local color_synonyms = { brown = "dark brown", ["dark yellow"] = "dark brown", ["light brown"] = "yellow", gray = "light gray" } for synonym, name in pairs(color_synonyms) do local i = inv_color_names[name] inv_color_names[synonym] = i end -- -- Package functions -- local p = {} function p.to_name(val) i = p.to_index(val) return color_names[i + 1] end function p.to_hex_color(val) i = p.to_index(val) return hex_codes[i + 1] end function p.to_index(val) -- Handle decimal numbers, hex numbers starting with "0x" local number = tonumber(val) if number ~= nil then if number ~= math.floor(number) or number < 0 or number > 15 then error("color index " .. number .. " not an integer 0-15") end return number end -- Handle color names local name = string.lower(val) name = string.gsub(name, "grey", "gray") if inv_color_names[name] == nil then name = string.gsub(name, "^light ", "") end if inv_color_names[name] == nil then error("color name not recognized: " .. val) end return inv_color_names[name] - 1 end return p