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

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

local seriesApi = {}

seriesApi._episodesTable = mw.loadData( 'Модуль:Серии/Таблица' )
seriesApi._library = require( 'Модуль:Библиотека' )

function seriesApi:_getEpisodeByName( name, searchParametres )
    if type( searchParametres ) == 'string' then
        local parameter = searchParametres
        searchParametres = {}
        searchParametres[ parameter ] = true
    end
    local episodesCounter = 1
    for i, season in ipairs( self._episodesTable ) do
        for j, episode in ipairs( season ) do
            if ( not searchParametres or searchParametres.ruName ) and name == episode.ruName then
                return { episode,  i, j, episodesCounter }
            end
            if ( not searchParametres or searchParametres.enName ) and name == episode.enName then
                return { episode,  i, j, episodesCounter }
            end
            if ( not searchParametres or searchParametres.pageName ) and name == episode.pageName then
                return { episode,  i, j, episodesCounter }
            elseif searchParametres and searchParametres.pageName and not episode.pageName then
                if name == episode.ruName then
                    return { episode,  i, j, episodesCounter }
                elseif not episode.ruName and name == episode.enName then
                    return { episode,  i, j, episodesCounter }
                end
            end
            episodesCounter = episodesCounter + 1
        end
    end
end

function seriesApi:_getEpisodeByNumbers( seasonNumber, episodeNumber )
    if not self._episodesTable[ seasonNumber ] then
        return
    end
    if not self._episodesTable[ seasonNumber ][ episodeNumber ] then
        return
    end
    local totalEpisodeNumber = 0
    for i = 1, seasonNumber - 1 do
        totalEpisodeNumber = totalEpisodeNumber + self._episodesTable[ i ].length
    end
    totalEpisodeNumber = totalEpisodeNumber + episodeNumber
    return { self._episodesTable[ seasonNumber ][ episodeNumber ], seasonNumber, episodeNumber, totalEpisodeNumber }
end

function seriesApi:_getEpisodeByTotalNumber( totalEpisodeNumber )
    if totalEpisodeNumber <= 0 then
        return
    end
    local episodeNumber = totalEpisodeNumber
    for i, season in ipairs( self._episodesTable ) do
        if episodeNumber <= season.length then
            return { season[ episodeNumber ], i, episodeNumber, totalEpisodeNumber }
        else
            episodeNumber = episodeNumber - season.length
        end
    end
end

function seriesApi:getEpisode( parameter1, parameter2 )
    local selectedEpisode
    local episodeTable = {}
    if not parameter1 then
        return
    end
    if type( parameter1 ) == 'string' then
        selectedEpisode = self:_getEpisodeByName( parameter1, parameter2 )
    elseif type( parameter1 ) == 'number' then
        if parameter2 then
            selectedEpisode = self:_getEpisodeByNumbers( parameter1, parameter2 )
        else
            selectedEpisode = self:_getEpisodeByTotalNumber( parameter1 )
        end
    end
    if not selectedEpisode then
        return
    end
    if selectedEpisode[1].ruName then
        episodeTable.name = selectedEpisode[1].ruName
        episodeTable.ruName = selectedEpisode[1].ruName
    else
        episodeTable.name = selectedEpisode[1].enName
    end
    episodeTable.enName = selectedEpisode[1].enName
    if selectedEpisode[1].pageName then
        episodeTable.pageName = selectedEpisode[1].pageName
    else
        episodeTable.pageName = episodeTable.name
    end
    episodeTable.seasonNumber = selectedEpisode[ 2 ]
    episodeTable.episodeNumber = selectedEpisode[ 3 ]
    episodeTable.totalEpisodeNumber = selectedEpisode[ 4 ]
    return episodeTable
end

function seriesApi:forEach( func, seasons )
    if type( seasons ) == 'number' then
        seasons = { [1]=seasons }
    end
    local iterationsCounter = 1
    for i, season in ipairs( self._episodesTable ) do
        if not seasons or self._library.table.indexOf( seasons, i ) then
            for j, episode in ipairs( season ) do
                local episode = self:getEpisode( i, j )
                func( episode, iterationsCounter )
                iterationsCounter = iterationsCounter + 1
            end
        end
    end
end

function seriesApi:getLength( season )
    if not season then
        return self._episodesTable.length
    elseif self._episodesTable[ season ] then
        return self._episodesTable[ season ].length
    end
end

return seriesApi
Advertisement