-- Module for temperature conversion
local refgroup = 'Temp'
local output_temp = {
f = function ( val )
return val .. '°F'
end,
c = function ( val )
return val .. '°C'
end,
gm = function ( val )
return 'Gas mark ' .. val
end,
k = function ( val )
return val .. 'K'
end
}
-- All ranges in celsius
local gmranges = {
{
start = 93,
finish = 120,
best = 107,
val = '1/4'
},
{
start = 120,
finish = 134,
best = 121,
val = '1/2'
},
{
start = 135,
finish = 140,
best = 135,
val = '1'
},
{
start = 141,
finish = 150,
best = 149,
val = '2'
},
{
start = 151,
finish = 170,
best = 163,
val = '3'
},
{
start = 171,
finish = 180,
best = 177,
val = '4'
},
{
start = 181,
finish = 191,
best = 190,
val = '5'
},
{
start = 192,
finish = 217,
best = 200,
val = '6'
},
{
start = 205,
finish = 220,
best = 218,
val = '7'
},
{
start = 221,
finish = 232,
best = 230,
val = '8'
},
{
start = 233,
finish = 250,
best = 246,
val = '9'
},
{
start = 251,
finish = 260,
best = 260,
val = '10'
}
}
local build_ref_from_table = function ( frame, basetemp, temps )
local reflist = {}
local baseval
for _, temp in ipairs( temps ) do
local val = output_temp[temp[1]]( temp[2] )
if temp[1] == basetemp then
baseval = val
table.insert( reflist, 1, val )
else
table.insert( reflist, val )
end
end
return frame:expandTemplate{ title = 'H:title', args = { table.concat( reflist, ' = ' ), baseval } }
end
local conversions, convert
conversions = {
f = {
c = function ( val )
return ( val - 32.0 ) * ( 5.0 / 9.0 )
end,
k = function ( val )
return convert( 'c', 'k', convert( 'f', 'c', val ) )
end,
gm = function ( val )
return convert( 'c', 'gm', convert( 'f', 'c', val ) )
end
},
c = {
f = function ( val )
return ( val * ( 9.0 / 5.0 ) ) + 32.0
end,
k = function ( val )
return val + 273.15;
end,
gm = function ( val )
val = tonumber( val )
if val == nil then
return nil
end
for _, range in ipairs( gmranges ) do
if val > range.start and val <= range.finish then
return range.val
end
end
return nil
end
},
gm = {
f = function ( val )
return convert( 'c', 'f', convert( 'gm', 'c', val ) )
end,
c = function ( val )
for _, range in ipairs( gmranges ) do
if val == range.val then
return range.best
end
end
return nil
end,
k = function ( val )
return convert( 'c', 'k', convert( 'gm', 'c', val ) )
end
},
k = {
f = function ( val )
return convert( 'c', 'f', ( val - 273.15 ) )
end,
c = function ( val )
return val - 273.15
end,
gm = function ( val )
return convert( 'c', 'gm', convert( 'k', 'c', val ) )
end
}
}
convert = function ( from, to, val )
return conversions[from][to]( val )
end
local templist = {
'f',
'c',
'gm',
'k'
}
local build_table = function ( basetemp, baseval )
local tbl = {}
local thisVal = nil
for _, temp in ipairs( templist ) do
if temp == basetemp then
table.insert( tbl, { temp, baseval } )
else
thisVal = convert( basetemp, temp, baseval )
if thisVal ~= nil then
table.insert( tbl, { temp, math.floor( thisVal ) } )
end
end
end
return tbl
end
local build_ref = function ( basetemp, frame )
return build_ref_from_table( frame, basetemp, build_table( basetemp, frame.args[1] ) )
end
return {
f = function ( frame )
return build_ref( 'f', frame )
end,
c = function ( frame )
return build_ref( 'c', frame )
end,
k = function ( frame )
return build_ref( 'k', frame )
end,
gm = function ( frame )
return build_ref( 'gm', frame )
end
}