ФЭНДОМ


local navbox = {}
 
function navbox.create( settings )
    local self = navbox
    local obj = {}
    --
    if settings and settings.classes then
        self._classes = settings.classes
    end
    if settings and settings.styles then
        self._styles = settings.styles
    end
    if settings and settings.attrs then
        self._attrs = settings.attrs
    end
    --
    obj._elemsRoot = {}
    obj._elems = {}
    obj._navbox = nil
    --
    setmetatable( obj, self )
    self.__index = self
    return obj
end
--
function navbox:createSection( text, id, parentId, settings )
    if self._navbox then
        error( 'Навбокс закрыт для расширения' )
    end
    --
    local section = mw.html.create( 'div' )
    if settings and settings.classes then
        section:attr( 'class', settings.classes )
    end
    if settings and settings.styles then
        section:cssText( settings.styles )
    end
    if settings and settings.attrs then
        section:attr( settings.attrs )
    end
    section:addClass( 'navbox_section' )
    local header = mw.html.create( 'div' )
    header:addClass( 'navbox_sectionHeader' )
    header:wikitext( text )
    section:node( header )
    local body = mw.html.create( 'div' )
    body:addClass( 'navbox_sectionBody' )
    self:_collectBlock( { section, body }, 'section', id, parentId )
end
--
function navbox:createPartition( text, id, parentId, settings )
    if self._navbox then
        error( 'Навбокс закрыт для расширения' )
    end
    local partition = mw.html.create( 'div' )
    if settings and settings.classes then
        partition:attr( 'class', settings.classes )
    end
    if settings and settings.styles then
        partition:cssText( settings.styles )
    end
    if settings and settings.attrs then
        partition:attr( settings.attrs )
    end
    partition:addClass( 'navbox_partition' )
    local header = mw.html.create( 'div' )
    header:addClass( 'navbox_partitionHeader' )
    header:wikitext( text )
    partition:node( header )
    local body = mw.html.create( 'div' )
    body:addClass( 'navbox_partitionBody' )
    self:_collectBlock( { partition, body }, 'partition', id, parentId )
end
--
function navbox:createContent( text, id, parentId, settings )
    if self._navbox then
        error( 'Навбокс закрыт для расширения' )
    end
    local body = mw.html.create( 'div' )
    if settings and settings.classes then
        body:attr( 'class', settings.classes )
    end
    if settings and settings.styles then
        body:cssText( settings.styles )
    end
    if settings and settings.attrs then
        body:attr( settings.attrs )
    end
    body:addClass( 'navbox_content' )
    body:wikitext( text )
    self:_collectBlock( { body }, 'content', id, parentId )
end
--
function navbox:_collectBlock( block, blockType, id, parentId )
    if self._elems[ id ] then
        error( 'Блок "'..id..'", уже определён' )
    end
    if parentId then
        if ( not self._elems[ parentId ] ) then
            error( 'Блока "'..parentId..'", указанного как родительский блок для блока "'..id..'", не существует' )
        end
        if self._elems[ parentId ].blockType == 'content' then
            error( 'Блок "'..id..'" типа "содержимое" ("content") не может иметь дочерних блоков' )
        end
        if self._elems[ parentId ].blockType == 'partition' and blockType == 'section' then
            error( 'Блок "'..id..'" не может быть потомком блока "'..parentId..'" так как блок типа "раздел" ("partition") не может иметь дочерних блоков-секций ("section")' )
        end
    end
    local newBlock = {
        children = {},
        block = block,
        blockType = blockType,
        id = id
    }
    if not parentId then
        local root = self._elemsRoot
        newBlock.level = 1
        if blockType ~= 'content' then
            newBlock.nesting = 1
        end
        root[ #root + 1 ] = newBlock
    else
        local parent = self._elems[ parentId ]
        newBlock.parent =  parent
        newBlock.level = parent.level + 1
        if blockType ~= 'content' then
            if blockType == parent.blockType then
                newBlock.nesting = parent.nesting + 1
            else
                newBlock.nesting = 1
            end
        end
        local children = self._elems[ parentId ].children
        children[ #children + 1 ] = newBlock
    end
    self._elems[ id ] = newBlock
end
--
function navbox:assembly()
    if self._navbox then
        error( 'Навбокс закрыт для редактирования' )
    end
    local wrapper = mw.html.create( 'div' )
    if self._classes then
        wrapper:attr( 'class', self._classes )
    end
    if self._styles then
        wrapper:cssText( self._styles )
    end
    if self._attrs then
        wrapper:attr( self._attrs )
    end
    wrapper:addClass( 'navbox_wrapper' )
    for i, child in ipairs( self._elemsRoot ) do
        local block = self:_assembly( child )
        wrapper:node( block )
    end
    self._navbox = wrapper
    return wrapper
end
--
function navbox:_assembly( block )
    local himselfElement = block.block[ 1 ]
    local innerContainer = block.block[ 2 ]
    if block.nesting then
        himselfElement:addClass( 'navbox_'..block.blockType ..'_n'..block.nesting )
    end
    if not innerContainer then
        return himselfElement
    end
    for i, child in ipairs( block.children ) do
        local childBlock = self:_assembly( child )
        innerContainer:node( childBlock )
    end
    himselfElement:node( innerContainer )
    return himselfElement
end
--
function navbox:getBlockInfo( blockId )
    if not blockId or not self._elems[ blockId ] then
        return false
    end
    local block = self._elems[ blockId ]
    local info = {}
    info.nesting = block.nesting
    info.level = block.level
    info.blockType = block.blockType
    info.id = blockId
    if block.parent then
        info.parentId = block.parent.id
    end
    info.children = {}
    for i, child in ipairs( block.children ) do
        info.children[ #info.children + 1 ] = child.id
    end
    return info
end
--
function navbox:checkBlock( blockId )
    if blockId and self._elems[ blockId ] then
        return true
    end
    return false
end
--
function navbox:getNavbox()
    if not self._navbox then
        error( 'Навбокс не готов' )
    end
    return self._navbox
end
--
 
return navbox

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


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

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

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

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