319 lines
9.0 KiB
Lua
319 lines
9.0 KiB
Lua
local M = { }
|
|
|
|
function M.draw_section(section, separator)
|
|
local status = {}
|
|
for _, status_function in pairs(section) do
|
|
local localstatus = status_function()
|
|
if #localstatus > 0 then
|
|
table.insert(status, localstatus)
|
|
end
|
|
end
|
|
if #status == 0 then
|
|
return ''
|
|
end
|
|
local sep = ' '
|
|
if #separator > 0 then
|
|
sep = ' ' .. separator .. ' '
|
|
end
|
|
return ' ' .. table.concat(status, sep) .. ' '
|
|
end
|
|
|
|
-- color conversion
|
|
local color_table = {
|
|
-- lookup table for cterm colors
|
|
-- format {'color_code', {r,g,b}}
|
|
|
|
-- Primary 3-bit (8 colors). Unique representation!
|
|
{'00', { 0, 0, 0 }},
|
|
{'01', { 128, 0, 0 }},
|
|
{'02', { 0, 128, 0 }},
|
|
{'03', { 128, 128, 0 }},
|
|
{'04', { 0, 0, 128 }},
|
|
{'05', { 128, 0, 128 }},
|
|
{'06', { 0, 128, 128 }},
|
|
{'07', { 192, 192, 192 }},
|
|
|
|
-- equivalent "bright" versions of original 8 colors.
|
|
{'08', { 128, 128, 128 }},
|
|
{'09', { 255, 0, 0 }},
|
|
{'10', { 0, 255, 0 }},
|
|
{'11', { 255, 255, 0 }},
|
|
{'12', { 0, 0, 255 }},
|
|
{'13', { 255, 0, 255 }},
|
|
{'14', { 0, 255, 255 }},
|
|
{'15', { 255, 255, 255 }},
|
|
|
|
-- Strictly ascending.
|
|
{'16', { 0, 0, 0 }},
|
|
{'17', { 0, 0, 95 }},
|
|
{'18', { 0, 0, 135 }},
|
|
{'19', { 0, 0, 175 }},
|
|
{'20', { 0, 0, 215 }},
|
|
{'21', { 0, 0, 255 }},
|
|
{'22', { 0, 95, 0 }},
|
|
{'23', { 0, 95, 95 }},
|
|
{'24', { 0, 95, 135 }},
|
|
{'25', { 0, 95, 175 }},
|
|
{'26', { 0, 95, 215 }},
|
|
{'27', { 0, 95, 255 }},
|
|
{'28', { 0, 135, 0 }},
|
|
{'29', { 0, 135, 95 }},
|
|
{'30', { 0, 135, 135 }},
|
|
{'31', { 0, 135, 175 }},
|
|
{'32', { 0, 135, 215 }},
|
|
{'33', { 0, 135, 255 }},
|
|
{'34', { 0, 175, 0 }},
|
|
{'35', { 0, 175, 95 }},
|
|
{'36', { 0, 175, 135 }},
|
|
{'37', { 0, 175, 175 }},
|
|
{'38', { 0, 175, 215 }},
|
|
{'39', { 0, 175, 255 }},
|
|
{'40', { 0, 215, 0 }},
|
|
{'41', { 0, 215, 95 }},
|
|
{'42', { 0, 215, 135 }},
|
|
{'43', { 0, 215, 175 }},
|
|
{'44', { 0, 215, 215 }},
|
|
{'45', { 0, 215, 255 }},
|
|
{'46', { 0, 255, 0 }},
|
|
{'47', { 0, 255, 95 }},
|
|
{'48', { 0, 255, 135 }},
|
|
{'49', { 0, 255, 175 }},
|
|
{'50', { 0, 255, 215 }},
|
|
{'51', { 0, 255, 255 }},
|
|
{'52', { 95, 0, 0 }},
|
|
{'53', { 95, 0, 95 }},
|
|
{'54', { 95, 0, 135 }},
|
|
{'55', { 95, 0, 175 }},
|
|
{'56', { 95, 0, 215 }},
|
|
{'57', { 95, 0, 255 }},
|
|
{'58', { 95, 95, 0 }},
|
|
{'59', { 95, 95, 95 }},
|
|
{'60', { 95, 95, 135 }},
|
|
{'61', { 95, 95, 175 }},
|
|
{'62', { 95, 95, 215 }},
|
|
{'63', { 95, 95, 255 }},
|
|
{'64', { 95, 135, 0 }},
|
|
{'65', { 95, 135, 95 }},
|
|
{'66', { 95, 135, 135 }},
|
|
{'67', { 95, 135, 175 }},
|
|
{'68', { 95, 135, 215 }},
|
|
{'69', { 95, 135, 255 }},
|
|
{'70', { 95, 175, 0 }},
|
|
{'71', { 95, 175, 95 }},
|
|
{'72', { 95, 175, 135 }},
|
|
{'73', { 95, 175, 175 }},
|
|
{'74', { 95, 175, 215 }},
|
|
{'75', { 95, 175, 255 }},
|
|
{'76', { 95, 215, 0 }},
|
|
{'77', { 95, 215, 95 }},
|
|
{'78', { 95, 215, 135 }},
|
|
{'79', { 95, 215, 175 }},
|
|
{'80', { 95, 215, 215 }},
|
|
{'81', { 95, 215, 255 }},
|
|
{'82', { 95, 255, 0 }},
|
|
{'83', { 95, 255, 95 }},
|
|
{'84', { 95, 255, 135 }},
|
|
{'85', { 95, 255, 175 }},
|
|
{'86', { 95, 255, 215 }},
|
|
{'87', { 95, 255, 255 }},
|
|
{'88', { 135, 0, 0 }},
|
|
{'89', { 135, 0, 95 }},
|
|
{'90', { 135, 0, 135 }},
|
|
{'91', { 135, 0, 175 }},
|
|
{'92', { 135, 0, 215 }},
|
|
{'93', { 135, 0, 255 }},
|
|
{'94', { 135, 95, 0 }},
|
|
{'95', { 135, 95, 95 }},
|
|
{'96', { 135, 95, 135 }},
|
|
{'97', { 135, 95, 175 }},
|
|
{'98', { 135, 95, 215 }},
|
|
{'99', { 135, 95, 255 }},
|
|
{'100', { 135, 135, 0 }},
|
|
{'101', { 135, 135, 95 }},
|
|
{'102', { 135, 135, 135 }},
|
|
{'103', { 135, 135, 175 }},
|
|
{'104', { 135, 135, 215 }},
|
|
{'105', { 135, 135, 255 }},
|
|
{'106', { 135, 175, 0 }},
|
|
{'107', { 135, 175, 95 }},
|
|
{'108', { 135, 175, 135 }},
|
|
{'109', { 135, 175, 175 }},
|
|
{'110', { 135, 175, 215 }},
|
|
{'111', { 135, 175, 255 }},
|
|
{'112', { 135, 215, 0 }},
|
|
{'113', { 135, 215, 95 }},
|
|
{'114', { 135, 215, 135 }},
|
|
{'115', { 135, 215, 175 }},
|
|
{'116', { 135, 215, 215 }},
|
|
{'117', { 135, 215, 255 }},
|
|
{'118', { 135, 255, 0 }},
|
|
{'119', { 135, 255, 95 }},
|
|
{'120', { 135, 255, 135 }},
|
|
{'121', { 135, 255, 175 }},
|
|
{'122', { 135, 255, 215 }},
|
|
{'123', { 135, 255, 255 }},
|
|
{'124', { 175, 0, 0 }},
|
|
{'125', { 175, 0, 95 }},
|
|
{'126', { 175, 0, 135 }},
|
|
{'127', { 175, 0, 175 }},
|
|
{'128', { 175, 0, 215 }},
|
|
{'129', { 175, 0, 255 }},
|
|
{'130', { 175, 95, 0 }},
|
|
{'131', { 175, 95, 95 }},
|
|
{'132', { 175, 95, 135 }},
|
|
{'133', { 175, 95, 175 }},
|
|
{'134', { 175, 95, 215 }},
|
|
{'135', { 175, 95, 255 }},
|
|
{'136', { 175, 135, 0 }},
|
|
{'137', { 175, 135, 95 }},
|
|
{'138', { 175, 135, 135 }},
|
|
{'139', { 175, 135, 175 }},
|
|
{'140', { 175, 135, 215 }},
|
|
{'141', { 175, 135, 255 }},
|
|
{'142', { 175, 175, 0 }},
|
|
{'143', { 175, 175, 95 }},
|
|
{'144', { 175, 175, 135 }},
|
|
{'145', { 175, 175, 175 }},
|
|
{'146', { 175, 175, 215 }},
|
|
{'147', { 175, 175, 255 }},
|
|
{'148', { 175, 215, 0 }},
|
|
{'149', { 175, 215, 95 }},
|
|
{'150', { 175, 215, 135 }},
|
|
{'151', { 175, 215, 175 }},
|
|
{'152', { 175, 215, 215 }},
|
|
{'153', { 175, 215, 255 }},
|
|
{'154', { 175, 255, 0 }},
|
|
{'155', { 175, 255, 95 }},
|
|
{'156', { 175, 255, 135 }},
|
|
{'157', { 175, 255, 175 }},
|
|
{'158', { 175, 255, 215 }},
|
|
{'159', { 175, 255, 255 }},
|
|
{'160', { 215, 0, 0 }},
|
|
{'161', { 215, 0, 95 }},
|
|
{'162', { 215, 0, 135 }},
|
|
{'163', { 215, 0, 175 }},
|
|
{'164', { 215, 0, 215 }},
|
|
{'165', { 215, 0, 255 }},
|
|
{'166', { 215, 95, 0 }},
|
|
{'167', { 215, 95, 95 }},
|
|
{'168', { 215, 95, 135 }},
|
|
{'169', { 215, 95, 175 }},
|
|
{'170', { 215, 95, 215 }},
|
|
{'171', { 215, 95, 255 }},
|
|
{'172', { 215, 135, 0 }},
|
|
{'173', { 215, 135, 95 }},
|
|
{'174', { 215, 135, 135 }},
|
|
{'175', { 215, 135, 175 }},
|
|
{'176', { 215, 135, 215 }},
|
|
{'177', { 215, 135, 255 }},
|
|
{'178', { 215, 175, 0 }},
|
|
{'179', { 215, 175, 95 }},
|
|
{'180', { 215, 175, 135 }},
|
|
{'181', { 215, 175, 175 }},
|
|
{'182', { 215, 175, 215 }},
|
|
{'183', { 215, 175, 255 }},
|
|
{'184', { 215, 215, 0 }},
|
|
{'185', { 215, 215, 95 }},
|
|
{'186', { 215, 215, 135 }},
|
|
{'187', { 215, 215, 175 }},
|
|
{'188', { 215, 215, 215 }},
|
|
{'189', { 215, 215, 255 }},
|
|
{'190', { 215, 255, 0 }},
|
|
{'191', { 215, 255, 95 }},
|
|
{'192', { 215, 255, 135 }},
|
|
{'193', { 215, 255, 175 }},
|
|
{'194', { 215, 255, 215 }},
|
|
{'195', { 215, 255, 255 }},
|
|
{'196', { 255, 0, 0 }},
|
|
{'197', { 255, 0, 95 }},
|
|
{'198', { 255, 0, 135 }},
|
|
{'199', { 255, 0, 175 }},
|
|
{'200', { 255, 0, 215 }},
|
|
{'201', { 255, 0, 255 }},
|
|
{'202', { 255, 95, 0 }},
|
|
{'203', { 255, 95, 95 }},
|
|
{'204', { 255, 95, 135 }},
|
|
{'205', { 255, 95, 175 }},
|
|
{'206', { 255, 95, 215 }},
|
|
{'207', { 255, 95, 255 }},
|
|
{'208', { 255, 135, 0 }},
|
|
{'209', { 255, 135, 95 }},
|
|
{'210', { 255, 135, 135 }},
|
|
{'211', { 255, 135, 175 }},
|
|
{'212', { 255, 135, 215 }},
|
|
{'213', { 255, 135, 255 }},
|
|
{'214', { 255, 175, 0 }},
|
|
{'215', { 255, 175, 95 }},
|
|
{'216', { 255, 175, 135 }},
|
|
{'217', { 255, 175, 175 }},
|
|
{'218', { 255, 175, 215 }},
|
|
{'219', { 255, 175, 255 }},
|
|
{'220', { 255, 215, 0 }},
|
|
{'221', { 255, 215, 95 }},
|
|
{'222', { 255, 215, 135 }},
|
|
{'223', { 255, 215, 175 }},
|
|
{'224', { 255, 215, 215 }},
|
|
{'225', { 255, 215, 255 }},
|
|
{'226', { 255, 255, 0 }},
|
|
{'227', { 255, 255, 95 }},
|
|
{'228', { 255, 255, 135 }},
|
|
{'229', { 255, 255, 175 }},
|
|
{'230', { 255, 255, 215 }},
|
|
{'231', { 255, 255, 255 }},
|
|
|
|
-- Gray-scale range.
|
|
{'232', { 8, 8, 8 }},
|
|
{'233', { 18, 18, 18 }},
|
|
{'234', { 28, 28, 28 }},
|
|
{'235', { 38, 38, 38 }},
|
|
{'236', { 48, 48, 48 }},
|
|
{'237', { 58, 58, 58 }},
|
|
{'238', { 68, 68, 68 }},
|
|
{'239', { 78, 78, 78 }},
|
|
{'240', { 88, 88, 88 }},
|
|
{'241', { 98, 98, 98 }},
|
|
{'242', { 108, 108, 108 }},
|
|
{'243', { 118, 118, 118 }},
|
|
{'244', { 128, 128, 128 }},
|
|
{'245', { 138, 138, 138 }},
|
|
{'246', { 148, 148, 148 }},
|
|
{'247', { 158, 158, 158 }},
|
|
{'248', { 168, 168, 168 }},
|
|
{'249', { 178, 178, 178 }},
|
|
{'250', { 188, 188, 188 }},
|
|
{'251', { 198, 198, 198 }},
|
|
{'252', { 208, 208, 208 }},
|
|
{'253', { 218, 218, 218 }},
|
|
{'254', { 228, 228, 228 }},
|
|
{'255', { 238, 238, 238 }},
|
|
}
|
|
|
|
function M.get_cterm_color(hex_color)
|
|
local function get_color_distance(color1, color2)
|
|
-- returns how much color2 deviates from color1
|
|
local dr = math.abs(color1[1] - color2[1]) / (color1[1]+1) * 100
|
|
local dg = math.abs(color1[2] - color2[2]) / (color1[2]+1) * 100
|
|
local db = math.abs(color1[3] - color2[3]) / (color1[3]+1) * 100
|
|
return (dr + dg + db)
|
|
end
|
|
|
|
local r = tonumber(hex_color:sub(2,3), 16)
|
|
local g = tonumber(hex_color:sub(4,5), 16)
|
|
local b = tonumber(hex_color:sub(6,7), 16)
|
|
|
|
-- check which cterm color is closest to hex colors in terms of rgb values
|
|
local closest_cterm_color = 0
|
|
local min_distance = 10000
|
|
for _, color in ipairs(color_table) do
|
|
local current_distance = get_color_distance(color[2], {r,g,b})
|
|
if current_distance < min_distance then
|
|
min_distance = current_distance
|
|
closest_cterm_color = color[1]
|
|
end
|
|
end
|
|
return closest_cterm_color
|
|
end
|
|
|
|
|
|
return M
|