Дружба – это Чудо Вики
Дружба – это Чудо Вики
Дружба – это Чудо Вики

Для документации этого модуля может быть создана страница Модуль:Появления/doc

local appearance = {}
 
function appearance.appearanceCreate(frame)
  --подготовка
    local library = require('Модуль:Библиотека')
    local seriesApi = require('Модуль:Серии')
    local args = frame.args
    local name
    if args['имя'] then
        name = args['имя']
    else
        name = mw.title.getCurrentTitle().text
    end
    --создание заголовка
    local header = mw.html.create("div"):addClass('appBlock_header'):wikitext('Присутствие в сериях')
    --создание оболочки
    local containerBlock = mw.html.create('div'):addClass('appBlock_apperanceBlock'):attr('data-name', name):node(header)
  --построение блока
    local sC = 1
    --проход по сезонам
    while args['сезон '..sC] do
        --проверка на появление
        if (args['сезон '..sC] ~= 'none') then
            local season = {}
            --разбор на статусные группы
            local statusGroups = library.string.split(args['сезон '..sC], ';%s?', true)
            --проход по статусным группам
            for i = 1, #statusGroups do
                --определение статуса
                local parsedStatusGroup = library.string.split(statusGroups[i], ':%s?', true)
                local appStatus = parsedStatusGroup[1]--статус текущей группы серий
                local appSeries = parsedStatusGroup[2]--серии текущей группы
                --проверка на заполненность
                if appSeries then
                    --разбор по сериям/диапазонам
                    local series = library.string.split(appSeries, ',%s?', true)
                    for j = 1, #series do
                        --если значение конвертируется в число => не диапазон
                        local seriesTN = tonumber(series[j])
                        --проверка значений на адекватность
                        if seriesTN and seriesTN <= seriesApi:getLength( 'g4', sC ) and seriesTN > 0 then
                            season[seriesTN] = appStatus
                        else
                            --разбор интервала
                            local interval = library.string.split(series[j], '-')
                            --проверка на полноту интервала
                            if interval[2] then
                                local interval1TN = tonumber(interval[1])
                                local interval2TN = tonumber(interval[2])
                                --проверка значений на адекватность
                                if (interval1TN and interval2TN and interval1TN <= interval2TN
                                    and interval2TN <= seriesApi:getLength( 'g4', sC ) and interval1TN > 0) then
                                    --проход по диапазону
                                    for k = interval1TN, interval2TN do
                                        season[k] = appStatus
                                   end
                                end
                            end
                        end
                    end
                end
            end
            --создание группы серий
            local rightColumn = mw.html.create('div'):addClass('appBlock_episodesGroup')
            seriesApi:forEach(function( series, i )
              --определение статуса
                local dAppearance
                if season[i] == 'главный' then
                    dAppearance = 'main'
                elseif season[i] == 'второстепенный' then
                    dAppearance = 'supporting'
                elseif season[i] == 'фоновый' then
                    dAppearance = 'background'
                elseif season[i] == 'упоминаемый' then
                    dAppearance = 'mentioned'
                else
                    dAppearance = 'missing'
                end
              --создание графы эпизода
                local episode = mw.html.create('div')
                episode:addClass('appBlock_episode')
                episode:wikitext(i)
                episode:attr('data-appearance', dAppearance)
                episode:attr( 'data-series-name', series.name )
                if series.pageName ~= series.name then
                    episode:attr( 'data-article-link', series.pageName )
                end
                episode:attr('data-season-number', sC)
                rightColumn:node(episode)
            end, 'g4', sC)
            --создание и добавление новой строки
            local leftColumn = mw.html.create('div'):addClass('appBlock_season'):wikitext('Сезон '..sC)
            local line = mw.html.create('div'):addClass('appBlock_line'):node(leftColumn):node(rightColumn)
            containerBlock:node(line)
        end
        sC = sC + 1
    end
    return containerBlock
end
 
return appearance