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;