Module:Color scale
Documentation for this module may be created at Module:Color scale/doc
local p = {}
function p.number_scale(frame)
return get_scale_color(tonumber(frame.args[1]), tonumber(frame.args[2]), tonumber(frame.args[3]), tonumber(frame.args[4]), frame.args[5], frame.args[6], frame.args[7]) .. "|" .. frame.args[8]
end
function get_scale_color(value, min_v, mid_v, max_v, min_c, mid_c, max_c)
if (mid_v == nil) then
mid_v = min_v + (max_v - min_v) * 0.5
end
if (mid_c == "") then
local color1 = decode_hex_color(min_c)
local color2 = decode_hex_color(max_c)
mid_c = string.format("%x%x%x",
map_range(mid_v, min_v, max_v, color1.r, color2.r),
map_range(mid_v, min_v, max_v, color1.g, color2.g),
map_range(mid_v, min_v, max_v, color1.b, color2.b))
end
local color = {r=0, g=0, b=0}
if value <= min_v then
color = decode_hex_color(min_c)
elseif value <= mid_v then
local color1 = decode_hex_color(min_c)
local color2 = decode_hex_color(mid_c)
color = {
r=map_range(value, min_v, mid_v, color1.r, color2.r),
g=map_range(value, min_v, mid_v, color1.g, color2.g),
b=map_range(value, min_v, mid_v, color1.b, color2.b)
}
elseif value < max_v then
local color1 = decode_hex_color(mid_c)
local color2 = decode_hex_color(max_c)
color = {
r=map_range(value, mid_v, max_v, color1.r, color2.r),
g=map_range(value, mid_v, max_v, color1.g, color2.g),
b=map_range(value, mid_v, max_v, color1.b, color2.b)
}
else
color = decode_hex_color(max_c)
end
return 'style="background:rgb(' .. math.floor(color.r) .. ',' .. math.floor(color.g) .. ',' .. math.floor(color.b) .. ')"'
end
function decode_hex_color(hex_color)
return {
r=tonumber(string.sub(hex_color, 1, 2), 16),
g=tonumber(string.sub(hex_color, 3, 4), 16),
b=tonumber(string.sub(hex_color, 5, 6), 16)
}
end
function map_range(value, min1, max1, min2, max2)
return min2 + ((value - min1) / (max1 - min1)) * (max2 - min2)
end
return p;