ФЭНДОМ


local p = {}
local rates = require('Модуль:Util/Ratings')
 
-- Служебные функции
local function length ( t )
    local count = 0
    for _ in pairs(t) do count = count + 1 end
    return count    
end
 
local function note ( n )
    return tostring(
        mw.html.create("span")
            :css({
                ['font-weight'] = 'bold',
                ['color']       = '#aaaaaa'
            })
            :wikitext(n)
    )
end
 
-- Диалог
function p.dialog ( frame )
    frame = (frame:getParent() or frame)
 
    if not frame.args[1] then
        return perror("Неправильное заполнение или нет значений для безымянных параметров")
    end
 
    local header = frame.args["header"]
    local blockquote = mw.html.create("div")
        :css({
            ["border-left"]    = "5px solid #c28b1f",
            ["display"]        = "flex",
            ["flex-direction"] = "column",
            ["padding-left"]   = "6px"
        })
 
    if header then
        blockquote
        :tag("em")
        :wikitext( mw.text.trim(header) )
        :done()
    end
 
    for i = 1, length(frame.args) do
        if frame.args[i] then
            blockquote
            :tag("span")
            :wikitext( mw.text.trim(frame.args[i]) )
            :done()
        end
    end
 
    return tostring(blockquote)
end
 
-- Вывод рейтинга
function p.rating( frame )
    local code
    if frame.args["code"] then
        code = mw.text.trim(frame.args["code"])
    elseif frame.args["season"] and frame.args["episode"] then 
        local season = frame.args["season"]
        local episode = mw.text.trim(frame.args["episode"])
        episode = #episode < 2 and "0"..episode or episode
 
        code = season..episode
    else
        return error('Должны быть заполнены или «code» или «season» с «episode».', 2)
    end
 
    if rates[code] == "" then
        return note("Нет данных")
    elseif rates[code] == nil then
        return note("Серии нет")
    end
 
    return tostring(
        mw.html.create('span')
        :attr('title', 'Количество зрителей в США в день премьеры')
        :css({
            ["border-bottom"] = "1px dotted black",
            ["cursor"]        = "help"
        })
        :wikitext(rates[code])
    )
end
 
-- Навибокс (специфичный для серий)
function p.ep_navbox ( frame )
    if not frame.args["season"] then
        return error("Должно быть название сезона", 2)
    end
 
    if not frame.args[1] then
        return error("Должен быть заполнен список", 2)
    end
 
    if not rates[ frame.args["season"]..'01' ] then
        return note("Этот сезон ещё не выпустили")
    end
 
    local secondarystyles = {
        ["background"]  = "#c28b1f",
        ["text-align"]  = "center",
        ["font-weight"] = "bold",
        ["padding"]     = "5px"
    }
 
    local template = frame:getParent() or frame
    local templatename = template:getTitle()
    local seasonNumber = mw.text.trim( frame.args["season"] )
 
    local main = mw.html.create('div'):css('width', '100%')
 
    local header = mw.html.create('div')
        :css(secondarystyles)
            :tag('div')
            :css({
                ["position"] = "absolute",
                ["left"] = "5px"
            })
            :wikitext(
                '['..'['..templatename..'|П]]  • ['
                 ..tostring( mw.uri.fullUrl(templatename, "action=edit") )..' Р]'
            )
            :done()
        :wikitext('['..'['..seasonNumber..' сезон]]')
 
    local body = mw.html.create('div'):css('background', '#f9f9f9')
    local list = mw.html.create('ol')
            :css({
                ["display"]         = "flex",
                ["flex-wrap"]       = "wrap",
                ["margin-top"]      = "0",
                ["margin-bottom"]   = "0",
                ["justify-content"] = "space-between"
            })
 
    for i = 1, length(frame.args) do
        if frame.args[i] then
            list
            :tag('li')
            :css({
                ['width']       = '29%',
                ['margin-left'] = '4%'
            })
            :wikitext('['..'['..mw.text.trim(frame.args[i])..']]')
            :done()
        end
    end
 
    body:node(list)
 
    local footer = mw.html.create('div')
        :css(secondarystyles)
        :css({
            ["display"]         = "flex",
            ["justify-content"] = "space-between"
        })
 
    local prevS = tonumber( seasonNumber ) - 1
 
    if prevS == 0 then
        prevS = "N/A"
    else
        prevS = '['..'[:Категория:Серии ('..prevS..' сезон)|← '..prevS..' сезон]]'
    end
 
    local nextS = tonumber( seasonNumber ) + 1
 
    if rates[nextS..'01'] == nil then
        nextS = 'N/A'
    else
        nextS = '['..'[:Категория:Серии ('..nextS..' сезон)|'..nextS..' сезон →]]'
    end
 
    footer
        :tag("div")
        :css({
            ["width"]      = "33%",
            ["text-align"] = "left"
        })
        :wikitext(prevS)
        :done()
        :tag("div")
        :css("width", "33%")
        :wikitext("[".."[:Категория:Сезоны|Другие сезоны]]")
        :done()
        :tag("div")
        :css({
            ["width"] = "33%",
            ["text-align"] = "right"
        })
        :wikitext(nextS)
        :done()
 
    return tostring(
        main
        :node(header)
        :node(body)
        :node(footer)
    )
end
 
return p