ФЭНДОМ


local core = require( 'Модуль:Навбокс/Ядро' )
local modules = require( 'Модуль:Навбокс/Модули' )
local library = require( 'Модуль:Библиотека' )
 
function createTableContent( cells, navbox, name, parentName )
    local content = ''
    for i, val in ipairs( cells ) do
        local wrapper = mw.html.create( 'div' )
        if val.moreCaption then
            wrapper:wikitext( '[[Файл:'..val.image..'|link='..val.caption..']][[Файл:'..val.moreImage..'|link='..val.moreCaption..']]<br />[['..val.caption..']] [['..val.moreCaption..']]' )
        else
            wrapper:wikitext( '[[Файл:'..val.image..'|link='..val.caption..']]<br />[['..val.caption..']]' )
        end
        content = content..tostring( wrapper )
    end
    navbox:createContent( content, name, parentName, { classes = 'navbox_table' } )
end
 
 
function universalCreate( args )
    --подготовка настроек
    local preparateUniversalSetting = function( prefix )
        if not prefix then
            prefix = ''
        end
        local settings = {}
        settings.classes = args[ prefix..'классы' ]
        settings.styles = args[ prefix..'стили' ]
        settings.attrs = {}
        return settings
    end
    local preparateCollapsibleSetting = function( allSettings, prefix )
        if not prefix then
            prefix = ''
        end
        local settings = {}
        local lAT = library.arguments.checkAndTranslate
        settings.collapsible = lAT( prefix..'сворачивается', {['да']='true', ['нет']='false'} )
        settings.collapsed = lAT( prefix..'свёрнут', {['да']='true', ['нет']='false'} )
        settings.openCurrent = lAT( prefix..'активные секции', {['открыты'] = 'open', ['закрыты'] = 'close'} )
        settings.controlElement = lAT( prefix..'управляющий элемент', {['заголовок']='header', ['кнопка']='button'} )
        settings.expandText = library.arguments.checkAndReturn( prefix..'текст развернуть' )
        settings.collapseText = library.arguments.checkAndReturn( prefix..'текст свернуть' )
        settings.expandTooltip = library.arguments.checkAndReturn( prefix..'подсказка развернуть' )
        settings.collapseTooltip = library.arguments.checkAndReturn( prefix..'подсказка свернуть' )
        allSettings.collapsible = settings
    end
    local preparateMenuSetting = function( allSettings, prefix )
        local settings = {}
        if not prefix then
            prefix = ''
            settings.status = library.arguments.checkAndTranslate( 'меню', {['для всех']='true', ['нет']='false', ['для всех корневых']='allRoot', ['для первого корневого']='firstRoot'} )
            if allSettings.collapsible then
                local collapsible = allSettings.collapsible
                if collapsible.collapsible ~= nil then
                    settings.collapsible = collapsible.collapsible
                else
                    settings.collapsible = modules.collapsible.standartSettings.collapsible
                end
                if collapsible.controlElement ~= nil then
                    settings.controlElement = collapsible.controlElement
                else
                    settings.controlElement = modules.collapsible.standartSettings.controlElement
                end
            end
        else
            settings.status = library.arguments.checkAndTranslate( prefix..'меню', {['да']='true', ['нет']='false'} )
            if allSettings.collapsible then
                settings.collapsible = allSettings.collapsible.collapsible
                settings.controlElement = allSettings.collapsible.controlElement
            end
        end
        settings.text = library.arguments.checkAndReturn( prefix..'текст меню' )
        settings.separator = library.arguments.checkAndReturn( prefix..'сепаратор меню' )
        if not prefix then
            allSettings.menu = library.table.mergeTables( standartMenuSettings, settings )
        else
            allSettings.menu = settings
        end
    end
    --парсеры
    local parsers = {}
    parsers.standart = library.parser.create( 'standart' )
    local defaultParser = 'standart'
    --
    function setParser( argName, default )
        local parser = args[ argName ]
        if parser and parser ~= 'нет' and not parsers[ parser ] then
            error( 'Неверный параметр "'..argName..'". Должен быть либо существующий парсер, либо "нет"' )
        end
        if not parser then
            return parsers[ default ]
        elseif parser == 'нет' then
            return false
        else
            return parsers[ parser ]
        end
    end
    --глобальные параметры
    local globalSettings = preparateUniversalSetting()
    preparateCollapsibleSetting( globalSettings )
    preparateMenuSetting( globalSettings )
    --активация сворачивания
    modules.collapsible.run( globalSettings, true )
    --создание базового навбокса
    local settings = {
        classes = globalSettings.classes,
        styles = globalSettings.styles,
        attrs = globalSettings.attrs
    }
    local navbox = core.create( settings )
    --
    local defaultParser = setParser( 'парсер', defaultParser )
    function createBlock( prefix )
        local index = 1
        local argName
        if prefix then
            argName = prefix..'.'..index
        else
            argName = 'блок '..index
        end
        local arg = args[ argName ]
        while arg do
            local argType = library.arguments.checkAndReturn( argName..' тип', {'секция', 'раздел', 'содержимое'}, true )
            if argType == 'секция' then
                --локальные параметры
                local localSettings = preparateUniversalSetting( argName..' ' )
                preparateCollapsibleSetting( localSettings, argName..' ' )
                preparateMenuSetting( localSettings, argName..' ' )
                --активация сворачивания
                modules.collapsible.run( localSettings )
                --активация меню
                local menuData = { headerText = arg, root = not prefix, number = index }
                arg = modules.menu.run( localSettings, globalSettings.menu, menuData )
                --создание секции
                local argSettings = {
                    classes = localSettings.classes,
                    styles = localSettings.styles,
                    attrs = localSettings.attrs
                }
                navbox:createSection( arg, argName, prefix, argSettings );
            elseif argType == 'раздел' then
                local argSettings = preparateUniversalSetting( argName..' ' )
                navbox:createPartition( arg, argName, prefix, argSettings )
            elseif argType == 'содержимое' then
                local argSettings = preparateUniversalSetting( argName..' ' )
                local text
                local parser = setParser( argName..' парсер' )
                if parser then
                    text = parser:parse( arg )
                elseif defaultParser and parser ~= false then
                    text = defaultParser:parse( arg )
                else
                    text = arg
                end
                navbox:createContent( text, argName, prefix, argSettings )
            end
            if args[ argName..'.'..1 ] then
                createBlock( argName )
            end
            index = index + 1
            if prefix then
                argName = prefix..'.'..index
            else
                argName = 'блок '..index
            end
            arg = args[ argName ]
        end
    end
    createBlock()
    return navbox:assembly()
end
 
function charactersCreate( args )
    local navbox = navboxLib:create( standartGlobalSettings )
    local parser = library.parser:create( 'standart' )
    local addMainCharacter = function( arr, name, moreName )
        local image = args[ name..' изображение' ]
        if not image then
            image = name..' навбокс.png'
        end
        local moreImage
        if moreName then
            moreImage = args[ moreName..' изображение' ]
            if not moreImage then
                moreImage = moreName..' навбокс.png'
            end
        end
        table.insert( arr, {caption=name, image=image, moreCaption=moreName, moreImage=moreImage} )
    end
    local checkPartition = function( argName )
        if not args[ argName ] then
            error( 'Отсутствует раздел "'..argName..'"' )
        end
    end
    navbox:createSection( 'Главные персонажи', 'ГП' )
    local mChars = {}
    addMainCharacter( mChars, 'Сумеречная Искорка', 'Спайк' )
    addMainCharacter( mChars, 'Эпплджек' )
    addMainCharacter( mChars, 'Флаттершай' )
    addMainCharacter( mChars, 'Пинки Пай' )
    addMainCharacter( mChars, 'Радуга Дэш' )
    addMainCharacter( mChars, 'Рарити' )
    createTableContent( mChars, navbox,  'ГПС', 'ГП' )
    navbox:createSection( 'Второстепенные персонажи', 'ВП' )
    local sCC = 1
    local group = args[ 'второстепенные персонажи раздел '..sCC ]
    while group do
        local name = args[ 'второстепенные персонажи раздел '..sCC..' название' ]
        if not name then
            error( 'У раздела второстепенных персонажей №"'..sCC..'" не указано название' )
        end
        navbox:createPartition( name, 'ВП'..sCC, 'ВП' )
        local text = parser:parse( group )
        navbox:createContent( text, 'ВП'..sCC..'С', 'ВП'..sCC )
        sCC = sCC + 1
        group = args[ 'второстепенные персонажи раздел '..sCC ]
    end
    navbox:createSection( 'Фоновые персонажи', 'ФП' )
    checkPartition( 'фоновые земные пони' )
    navbox:createPartition( '[[Земные пони]][[Файл:Earthpony_picto.png|20px|link=Земные пони]]', 'ФПЗ', 'ФП' )
    local eText = parser:parse( args[ 'фоновые земные пони' ] )
    navbox:createContent( eText, 'ФПЗС', 'ФПЗ' )
    checkPartition( 'фоновые пегасы' )
    navbox:createPartition( '[[Пегасы]][[Файл:Pegasus_picto.png|20px|link=Пегасы]]', 'ФПП', 'ФП' )
    local pText = parser:parse( args[ 'фоновые пегасы' ] )
    navbox:createContent( pText, 'ФППС', 'ФПП' )
    checkPartition( 'фоновые единороги' )
    navbox:createPartition( '[[Единороги]][[Файл:Unicorn_picto.png|20px|link=Единороги]]', 'ФПЕ', 'ФП' )
    local uText = parser:parse( args[ 'фоновые единороги' ] )
    navbox:createContent( uText, 'ФПЕС', 'ФПЕ' )
    return navbox:assembly()
end
 
function episodesCreate( name, handler, films, parser )
    if not films then
        error( 'Отсутствует раздел "фильмы"' )
    end
    local seriesApi = require( 'Модуль:Серии' )
    local seasonsAmount = seriesApi:getLength()
    local navbox = navboxLib:create( standartGlobalSettings )
    navbox:createSection( name, 'О' )
    for i = 1, seasonsAmount do
        local content = ''
        navbox:createSection( 'Сезон '..i, 'С'..i, 'О' )
        seriesApi:forEach(function( episode, i )
            content = content..handler( episode, i )
        end, i)
        navbox:createContent( content, 'С'..i..'э', 'С'..i )
    end
    navbox:createSection( 'Фильмы и короткометражки', 'Ф', 'О' )
    local filmsContent = parser:parse( films )
    navbox:createContent( filmsContent, 'Фэ', 'Ф' )
    return navbox:assembly()
end
 
function kindsCreate( args )
    local navbox = navboxLib:create( standartGlobalSettings )
    local addKind = function( arr, kind )
        local image = args[ kind ]
        if not image then
            image = kind..' навбокс.png'
        end
        table.insert( arr, {caption=kind, image=image} )
    end
    navbox:createSection( 'Виды пони', 'ВП', nil, {collapsed=false} )
    local kinds = {}
    addKind( kinds, 'Земные пони' )
    addKind( kinds, 'Пегасы' )
    addKind( kinds, 'Единороги' )
    addKind( kinds, 'Аликорны' )
    addKind( kinds, 'Кристальные пони' )
    createTableContent( kinds, navbox,  'ВПС', 'ВП' )
    return navbox:assembly()
end
 
function standartCreate( args )
    --подготовка настроек
    local preparateUniversalSetting = function( prefix )
        if not prefix then
            prefix = ''
        end
        local settings = {}
        settings.classes = args[ prefix..'классы' ]
        settings.styles = args[ prefix..'стили' ]
        settings.attrs = {}
        return settings
    end
    local preparateCollapsibleSetting = function( allSettings, prefix )
        if not prefix then
            prefix = ''
        end
        local settings = {}
        local lAT = library.arguments.checkAndTranslate
        settings.collapsible = lAT( prefix..'сворачивается', {['да']='true', ['нет']='false'} )
        settings.collapsed = lAT( prefix..'свёрнут', {['да']='true', ['нет']='false'} )
        settings.openCurrent = lAT( prefix..'активные секции', {['открыты'] = 'open', ['закрыты'] = 'close'} )
        settings.controlElement = 'header'
        allSettings.collapsible = settings
    end
    --парсеры
    local parsers = {}
    parsers.standart = library.parser.create( 'standart' )
    local defaultParser = 'standart'
    --
    function setParser( argName, default )
        local parser = args[ argName ]
        if parser and parser ~= 'нет' and not parsers[ parser ] then
            error( 'Неверный параметр "'..argName..'". Должен быть либо существующий парсер, либо "нет"' )
        end
        if not parser then
            return parsers[ default ]
        elseif parser == 'нет' then
            return false
        else
            return parsers[ parser ]
        end
    end
    --глобальные параметры
    local globalSettings = preparateUniversalSetting()
    preparateCollapsibleSetting( globalSettings )
    --активация сворачивания
    modules.collapsible.run( globalSettings, true )
    --создание базового навбокса
    local settings = {
        classes = globalSettings.classes,
        styles = globalSettings.styles,
        attrs = globalSettings.attrs
    }
    local navbox = core.create( settings )
    --
    local defaultParser = setParser( 'парсер', defaultParser )
    function createBlock( prefix )
        local index = 1
        local argName
        if prefix then
            argName = prefix..'.'..index
        else
            argName = 'блок '..index
        end
        local arg = args[ argName ]
        while arg do
            local argType = library.arguments.checkAndReturn( argName..' тип', {'секция', 'раздел', 'содержимое'}, true )
            if argType == 'секция' then
                --локальные параметры
                local localSettings = preparateUniversalSetting( argName..' ' )
                preparateCollapsibleSetting( localSettings, argName..' ' )
                --активация сворачивания
                modules.collapsible.run( localSettings )
                --создание секции
                local argSettings = {
                    classes = localSettings.classes,
                    styles = localSettings.styles,
                    attrs = localSettings.attrs
                }
                navbox:createSection( arg, argName, prefix, argSettings );
            elseif argType == 'раздел' then
                local argSettings = preparateUniversalSetting( argName..' ' )
                navbox:createPartition( arg, argName, prefix, argSettings )
            elseif argType == 'содержимое' then
                local argSettings = preparateUniversalSetting( argName..' ' )
                local text
                local parser = setParser( argName..' парсер' )
                if parser then
                    text = parser:parse( arg )
                elseif defaultParser and parser ~= false then
                    text = defaultParser:parse( arg )
                else
                    text = arg
                end
                navbox:createContent( text, argName, prefix, argSettings )
            end
            if args[ argName..'.'..1 ] then
                createBlock( argName )
            end
            index = index + 1
            if prefix then
                argName = prefix..'.'..index
            else
                argName = 'блок '..index
            end
            arg = args[ argName ]
        end
    end
    createBlock()
    return navbox:assembly()
end
 
local navbox = {}
 
function navbox.universal( frame )
    local withoutErrors, result = pcall( universalCreate, frame.args )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
function navbox.characters( frame )
    local withoutErrors, result = pcall( charactersCreate, frame.args )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
function navbox.galleries( frame )
    local galleriesSettings = {
        baseSettingName = 'standart',
        actions = { textHandler = 'replace' },
        textHandler = function( text )
            local featuredText = mw.ustring.gsub( text, '^%s*', '' )
            featuredText = mw.ustring.gsub( featuredText, '%s*$', '' )
            locallinkAndName = library:split( featuredText, '|' )
            if not locallinkAndName[ 2 ] then
                return '[['..featuredText..'/Галерея|'..featuredText..']]'
            else
                return '[['..locallinkAndName[1]..'/Галерея|'..locallinkAndName[2]..']]'
            end
        end
    }
    library.parser:addSetting( galleriesSettings, 'galleries' )
    local parser = library.parser:create( 'galleries' )
    local handler = function( episode, i, parser )
        if i == 1 then
            return '[['..episode.pageName..'/Галерея|'..episode.name..']]'
        else
            return ' • [['..episode.pageName..'/Галерея|'..episode.name..']]'
        end
    end
    local withoutErrors, result = pcall( episodesCreate, 'Галереи', handler, frame.args[ 'фильмы' ], parser )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
function navbox.transcripts( frame )
    local transcriptsSettings = {
        baseSettingName = 'standart',
        actions = { textHandler = 'replace' },
        textHandler = function( text )
            local featuredText = mw.ustring.gsub( text, '^%s*', '' )
            featuredText = mw.ustring.gsub( featuredText, '%s*$', '' )
            locallinkAndName = library:split( featuredText, '|' )
            if not locallinkAndName[ 2 ] then
                return '[[Стенограммы/'..featuredText..'|'..featuredText..']]'
            else
                return '[[Стенограммы/'..locallinkAndName[1]..'|'..locallinkAndName[2]..']]'
            end
        end
    }
    library.parser:addSetting( transcriptsSettings, 'transcripts' )
    local parser = library.parser:create( 'transcripts' )
    local handler = function( episode, i, parser )
        if i == 1 then
            return '[[Стенограммы/'..episode.pageName..'|'..episode.name..']]'
        else
            return ' • [[Стенограммы/'..episode.pageName..'|'..episode.name..']]'
        end
    end
    local withoutErrors, result = pcall( episodesCreate, 'Стенограммы', handler, frame.args[ 'фильмы' ], parser )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
function navbox.kinds( frame )
    local withoutErrors, result = pcall( kindsCreate, frame.args )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
function navbox.standart( frame )
    local withoutErrors, result = pcall( standartCreate, frame.args )
    if not withoutErrors then
        return library.errorPrint( result )
    else
        return result
    end
end
 
return navbox

Обнаружено использование расширения AdBlock.


Викия — это свободный ресурс, который существует и развивается за счёт рекламы. Для блокирующих рекламу пользователей мы предоставляем модифицированную версию сайта.

Викия не будет доступна для последующих модификаций. Если вы желаете продолжать работать со страницей, то, пожалуйста, отключите расширение для блокировки рекламы.

Также на ФЭНДОМЕ

Случайная вики