Документация
Редактировать страницу документации модуля 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