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

Модуль:Навигация: различия между версиями

Материал из GravityWiki
Нет описания правки
Нет описания правки
Строка 4: Строка 4:
     local args = frame:getParent().args
     local args = frame:getParent().args
      
      
     -- Собираем все категории
     -- Просто генерируем вики-разметку и обрабатываем её
     local categories = {}
     local wikiMarkup = {}
      
      
     for key, value in pairs(args) do
     table.insert(wikiMarkup, '<nav class="wiki-nav-menu">')
        if string.match(key, '^category%d+$') then
    table.insert(wikiMarkup, '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>')
            local num = string.match(key, 'category(%d+)')
    table.insert(wikiMarkup, '<ul class="nav-main-list">')
            categories[tonumber(num)] = {
                name = value,
                subitems = {}
            }
        end
    end
      
      
     -- Собираем подпункты
     for i = 1, 20 do  -- Предполагаем максимум 20 категорий
    for key, value in pairs(args) do
        local category = args['category' .. i]
         if string.match(key, '^subitems%d+$') then
         local subitems = args['subitems' .. i]
             local num = string.match(key, 'subitems(%d+)')
       
             num = tonumber(num)
        if category then
             if categories[num] then
             -- Категория
                 local subitems = mw.text.split(value, ';')
            table.insert(wikiMarkup, '<li class="nav-category">')
                 for _, item in ipairs(subitems) do
              
                     table.insert(categories[num].subitems, mw.text.trim(item))
             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
                 end
            else
                table.insert(wikiMarkup, '[[' .. category .. '|<span class="nav-category-text">' .. category .. '</span>]]')
             end
             end
        end
           
    end
            -- Подпункты
   
            if subitems then
    -- Сортируем по номерам
                table.insert(wikiMarkup, '<ul class="nav-sub-list">')
    local sortedCategories = {}
                local subitemList = mw.text.split(subitems, ';')
    for num in pairs(categories) do
                for _, subitem in ipairs(subitemList) do
        table.insert(sortedCategories, num)
                    table.insert(wikiMarkup, '<li class="nav-sub-item">' .. mw.text.trim(subitem) .. '</li>')
    end
                end
    table.sort(sortedCategories)
                 table.insert(wikiMarkup, '</ul>')
   
    -- Формируем HTML
    local html = {
        '<nav class="wiki-nav-menu">',
        '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>',
        '<ul class="nav-main-list">'
    }
   
    for _, num in ipairs(sortedCategories) do
        local category = categories[num]
       
        table.insert(html, '<li class="nav-category">')
       
        -- Обрабатываем категорию с иконкой или без
        local categoryContent = ''
       
        if string.find(category.name, '&') then
            -- Категория с иконкой
            local parts = mw.text.split(category.name, '&')
            if #parts >= 2 then
                 local iconPart = parts[1]  -- Файл:icon.png
                local linkPart = parts[2]  -- GravityExpansion
                local textPart = parts[3] or parts[2]  -- Текст (если есть)
               
                -- Собираем вики-разметку для обработки
                categoryContent = frame:preprocess(iconPart .. ' [[' .. linkPart .. '|<span class="nav-category-text">' .. textPart .. '</span>]]')
             end
             end
        else
              
             -- Категория без иконки
             table.insert(wikiMarkup, '</li>')
             categoryContent = frame:preprocess('[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]')
         end
         end
       
        table.insert(html, categoryContent)
       
        -- Подпункты
        if #category.subitems > 0 then
            table.insert(html, '<ul class="nav-sub-list">')
            for _, subitem in ipairs(category.subitems) do
                -- Обрабатываем вики-разметку подпунктов
                local processedSubitem = frame:preprocess(subitem)
                table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>')
            end
            table.insert(html, '</ul>')
        end
       
        table.insert(html, '</li>')
     end
     end
      
      
     table.insert(html, '</ul>')
     table.insert(wikiMarkup, '</ul>')
     table.insert(html, '</nav>')
     table.insert(wikiMarkup, '</nav>')
      
      
     return table.concat(html, '\n')
    -- Обрабатываем всю разметку через препроцессор
     return frame:preprocess(table.concat(wikiMarkup, '\n'))
end
end


return p
return p

Версия от 07:35, 20 октября 2025

Для документации этого модуля может быть создана страница Модуль:Навигация/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