Перейти к содержанию

Модуль:Навигация

Материал из GravityWiki

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

local p = {}

function p.navmenu(frame)
    local args = frame:getParent().args
    
    -- Просто генерируем вики-разметку и обрабатываем её
    local wikiMarkup = {}
    
    table.insert(wikiMarkup, '<nav class="wiki-nav-menu">')
    table.insert(wikiMarkup, '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>')
    table.insert(wikiMarkup, '<ul class="nav-main-list">')
    
    for i = 1, 20 do  -- Предполагаем максимум 20 категорий
        local category = args['category' .. i]
        local subitems = args['subitems' .. i]
        
        if category then
            -- Категория
            table.insert(wikiMarkup, '<li class="nav-category">')
            
            if string.find(category, '&') then
                local parts = mw.text.split(category, '&')
                if #parts >= 2 then
                    table.insert(wikiMarkup, parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. (parts[3] or parts[2]) .. '</span>]]')
                end
            else
                table.insert(wikiMarkup, '[[' .. category .. '|<span class="nav-category-text">' .. category .. '</span>]]')
            end
            
            -- Подпункты
            if subitems then
                table.insert(wikiMarkup, '<ul class="nav-sub-list">')
                local subitemList = mw.text.split(subitems, ';')
                for _, subitem in ipairs(subitemList) do
                    table.insert(wikiMarkup, '<li class="nav-sub-item">' .. mw.text.trim(subitem) .. '</li>')
                end
                table.insert(wikiMarkup, '</ul>')
            end
            
            table.insert(wikiMarkup, '</li>')
        end
    end
    
    table.insert(wikiMarkup, '</ul>')
    table.insert(wikiMarkup, '</nav>')
    
    -- Обрабатываем всю разметку через препроцессор
    return frame:preprocess(table.concat(wikiMarkup, '\n'))
end

return p