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

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

local seriesApi = {}

seriesApi._serialsTable = {}
seriesApi._serialsTable.length = 2
--G4
seriesApi._serialsTable[1] = mw.loadData( 'Модуль:Серии/G4' )
--Friendship is Forever
seriesApi._serialsTable[2] = mw.loadData( 'Модуль:Серии/FriendshipForever' )
--Pony Life
seriesApi._serialsTable[3] = mw.loadData( 'Модуль:Серии/PonyLife' )
--Make Your Mark
seriesApi._serialsTable[4] = mw.loadData( 'Модуль:Серии/MYM' )
--Tell Your Tale
seriesApi._serialsTable[5] = mw.loadData( 'Модуль:Серии/TYT' )

seriesApi._episodesTable = seriesApi._serialsTable[1]
seriesApi._library = require( 'Модуль:Библиотека' )

--name - имя страницы; searchParametres - строка либо таблица. Возможные значения строки или ключи таблицы - ruName(bool), enName(bool), pageName(bool), code(string);
--Возвращает таблицу 
function seriesApi:_getEpisodeByName( name, searchParametres )
    if type( searchParametres ) == 'string' then
        local parameter = searchParametres
        searchParametres = {}
        searchParametres[ parameter ] = true
    end
    local episodesCounter
    for i, serial in ipairs( self._serialsTable ) do
    	episodesCounter = 1
    	for j, season in ipairs( serial ) do
    		if ( searchParametres and searchParametres.code and searchParametres.code ~= serial.code ) then
    			break
    		end
        	for k, episode in ipairs( season ) do
            	if ( not searchParametres or searchParametres.ruName ) and name == episode.ruName then
                	return { episode, serial.name, serial.code, j, k, episodesCounter }
            	end
            	if ( not searchParametres or searchParametres.enName ) and name == episode.enName then
                	return { episode, serial.name, serial.code, j, k, episodesCounter }
            	end
            	if ( not searchParametres or searchParametres.pageName ) and episode.pageName and name == episode.pageName then
                	return { episode, serial.name, serial.code, j, k, episodesCounter }
                end
                episodesCounter = episodesCounter + 1
            end
        end
    end
end

function seriesApi:_getEpisodeByNumbers( serialCode, seasonNumber, episodeNumber )
	local serialTable
	for i, serial in ipairs( self._serialsTable ) do
	 	if serialCode == serial.code then
	 		serialTable = serial
	 	end
	end
	if not serialTable or not serialTable[ seasonNumber ] or not serialTable[ seasonNumber ][ episodeNumber ] then
	 	return
	end
    local totalEpisodeNumber = 0
    for i, season in ipairs( serialTable ) do
        for j, episode in ipairs( season ) do
        	totalEpisodeNumber = totalEpisodeNumber + 1
        	if j == episodeNumber then
        		break
        	end
        end
        if i == seasonNumber then
        	break
        end
    end
    return { serialTable[ seasonNumber ][ episodeNumber ], serialTable.name, serialCode, seasonNumber, episodeNumber, totalEpisodeNumber }
end

function seriesApi:_getEpisodeByTotalNumber( serialCode, totalEpisodeNumber )
    if totalEpisodeNumber <= 0 then
        return
    end
    local serialTable
	for i, serial in ipairs( self._serialsTable ) do
	 	if serialCode == serial.code then
	 		serialTable = serial
	 	end
	end
	local episodeNumber = 0
    for i, season in ipairs( serialTable ) do
        for j, episode in ipairs( season ) do
        	episodeNumber = episodeNumber + 1
        	if episodeNumber == totalEpisodeNumber then
        		return { serialTable[ i ][ j ], serialTable.name, serialCode, i, j, totalEpisodeNumber }
        	end
        end
    end
end

function seriesApi:getEpisode( parameter1, parameter2, parameter3 )
    local selectedEpisode
    local episodeTable = {}
    if not parameter1 then
        return
    end
    if not parameter2 or type( parameter2 ) == 'table' then
        selectedEpisode = self:_getEpisodeByName( parameter1, parameter2 )
    elseif type( parameter2 ) == 'number' then
        if parameter3 then
            selectedEpisode = self:_getEpisodeByNumbers( parameter1, parameter2, parameter3 )
        else
            selectedEpisode = self:_getEpisodeByTotalNumber( parameter1, parameter2 )
        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.serialName = selectedEpisode[ 2 ]
    episodeTable.serialCode = selectedEpisode[ 3 ]
    episodeTable.seasonNumber = selectedEpisode[ 4 ]
    episodeTable.episodeNumber = selectedEpisode[ 5 ]
    episodeTable.totalEpisodeNumber = selectedEpisode[ 6 ]
    return episodeTable
end

function seriesApi:forEach( func, serialCode, seasonNumber )
	local serialTable
	for i, serial in ipairs( self._serialsTable ) do
	 	if serialCode == serial.code then
	 		serialTable = serial
	 	end
	end
	if not serialTable or not serialTable[seasonNumber] then
		return
	end
    local iterationsCounter = 1
    for i, episode in ipairs( serialTable[seasonNumber] ) do
            local episode = self:getEpisode( serialCode, seasonNumber, i )
            func( episode, iterationsCounter )
            iterationsCounter = iterationsCounter + 1
    end
end

function seriesApi:getLength( serialCode, seasonNumber )
	local serialTable
	for i, serial in ipairs( self._serialsTable ) do
	 	if serialCode == serial.code then
	 		serialTable = serial
	 	end
	end
	if not serialTable or not serialTable[seasonNumber] then
	 	return
	end
    local length = 0
    for i, episode in ipairs( serialTable[seasonNumber] ) do
        length = length + 1
    end
    return length
end

return seriesApi
Advertisement