Модул:Weather
Облик
Този модул дава прогнозата за времето в града city
на базата на данни, обновявяни от бота AKBot на страницата Module:Weather/data.
local p = {}
local data = mw.loadData('Module:Weather/data')
local translatedConditions = mw.loadData('Module:Weather/translatedConditions')
local conditionsIcon = mw.loadData('Module:Weather/conditionsIcon')
-- Формирует строку для таблицы прогноза погоды на несколько дней в шаблоне [[Шаблон:Прогноза на времето]]
p.lineForecast = function(f)
city = f.args[1] -- название города
return mw.ustring.format('%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s',
'|-\n| \'\'\'[[w:', city, '|', city, ']]\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'maxtemp0'), '" | \'\'\'', p.pm(data[city]['maxtemp0']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'mintemp0'), '" | \'\'\'', p.pm(data[city]['mintemp0']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'maxtemp1'), '" | \'\'\'', p.pm(data[city]['maxtemp1']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'mintemp1'), '" | \'\'\'', p.pm(data[city]['mintemp1']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'maxtemp2'), '" | \'\'\'', p.pm(data[city]['maxtemp2']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'mintemp2'), '" | \'\'\'', p.pm(data[city]['mintemp2']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'maxtemp3'), '" | \'\'\'', p.pm(data[city]['maxtemp3']), '\'\'\'\n| style="width:20px; text-align:right; ',
p.bgColorForecast(city, 'mintemp3'), '" | \'\'\'', p.pm(data[city]['mintemp3']), '\'\'\'\n|-')
end
-- Формирует табличку-метку для шаблона [[Шаблон:Погода в городе]], использующегося на погодных картах.
p.cityLabel = function(f)
city = f.args[1] -- название города
return mw.ustring.format('%s%s%s%s%s%s%s%s%s%s%s', '{| class="standard" style="width:50px;" title="', city, '"\n| style="width:30px; font-size:80%; ',
p.bgColorCurrent(city), '" | \'\'\'', p.pm(data[city]['temperature']), '\'\'\'\n| style="width:20px; background-color:#aaf" title="',
translatedConditions[mw.text.trim(data[city]['conditions'])], '" | [[Файл:', conditionsIcon[mw.text.trim(data[city]['conditions'])], '|20px|link=]]\n|}')
end
-- Возвращает значение температуры с правильным знаком: +6, 0 или −6.
p.pm = function(a)
if a > 0 then r = '+'..a
elseif a == 0 then r = tostring(a)
else r = '−'..math.abs(a)
end
return r
end
p.bgColor = function(t)
return mw.ustring.format('%s%s%s%s%s', 'background-color:#', p.colorTemperature(p.normalizeTemperature(t)), '; color:#', p.textColor(t), ';')
end
p.bgColorCurrent = function(city)
return p.bgColor(data[city].temperature)
end
p.bgColorForecast = function(city, a)
return p.bgColor(data[city][a])
end
p.temperature = function(f)
return data[f.args[1]].temperature
end
p.conditions = function(f)
return data[f.args[1]].conditions
end
p.maxtemp = function(f)
return data[f.args[2]][mw.ustring.format('%s%s','maxtemp',f.args[1])]
end
p.mintemp = function(f)
return data[f.args[2]][mw.ustring.format('%s%s','mintemp',f.args[1])]
end
-- Вспомогательная функция, проводящая нормировку температуры в интервал от 0 до 1 для использования в дальнейшем в функции colorTemperature.
-- Нормированный 0 соответствует температуре -35, нормированная 1 - +50
-- Нормировка производится по линейно формуле
p.normalizeTemperature = function(t)
return (t+35)/85
end
-- Данная функция ставит каждому значению температуры в соответствие некоторый цвет, отображаемый в дальнейшем как фон клетки, в которой указана температура
-- Аргумент функции преполагается нормированным в интервал от 0 до 1. Для этого, например, может быть использована вспомогательная функция normalizeTemperature
p.colorTemperature = function(a)
local r = 0; local g = 0; local b = 0.5;
if a > 0 then b = 4*a+0.5; end
if a > 0.125 then g = 4*a-0.5; b = 1; end
if a > 0.375 then r = 4*a-1.5; g = 1; b = -4*a+2.5; end
if a > 0.625 then r = 1; g = -4*a+3.5; b = 0; end
if a > 0.875 then r = -4*a+4.5; g = 0; end
if a > 1 then r = 0.5; end
return mw.ustring.format('%s%s%s', p.dec2hex(r), p.dec2hex(g), p.dec2hex(b))
end
-- Вспомогательная функция для colorTemperature, переводящая число от 0 до 1 в шестнадцатиричное число от 0 до F
p.dec2hex = function(a)
if a <= 0 then return '0'; end
if a >= 1 then return 'f'; end
local b = math.floor(16 * a);
return mw.ustring.format('%x', b)
end
-- Функция определяет цвет текста, которым отображается температура в клетке. Для тёмно-синего фона (низкие температуры) цвет белый, в остальных случаях - чёрный.
p.textColor = function(t)
if t > -10 then return '000'; else return 'fff'; end
end
return p