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

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

Материал из GravityWiki
Нет описания правки
Нет описания правки
Строка 3: Строка 3:
function p.navmenu(frame)
function p.navmenu(frame)
     local args = frame:getParent().args
     local args = frame:getParent().args
    local currentTitle = mw.title.getCurrentTitle()
      
      
     -- Собираем все категории
     -- Собираем все категории
Строка 18: Строка 17:
     end
     end
      
      
     -- Собираем подпункты для каждой категории
     -- Собираем подпункты
     for key, value in pairs(args) do
     for key, value in pairs(args) do
         if string.match(key, '^subitems%d+$') then
         if string.match(key, '^subitems%d+$') then
Строка 24: Строка 23:
             num = tonumber(num)
             num = tonumber(num)
             if categories[num] then
             if categories[num] then
                -- Разделяем подпункты по точке с запятой
                 local subitems = mw.text.split(value, ';')
                 local subitems = mw.text.split(value, ';')
                 for _, item in ipairs(subitems) do
                 for _, item in ipairs(subitems) do
Строка 33: Строка 31:
     end
     end
      
      
     -- Сортируем категории по номерам
     -- Сортируем по номерам
     local sortedCategories = {}
     local sortedCategories = {}
     for num in pairs(categories) do
     for num in pairs(categories) do
Строка 40: Строка 38:
     table.sort(sortedCategories)
     table.sort(sortedCategories)
      
      
     -- Начинаем формировать HTML
     -- Формируем HTML
     local html = {}
     local html = {
    table.insert(html, '<nav class="wiki-nav-menu">')
        '<nav class="wiki-nav-menu">',
    table.insert(html, '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>')
        '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>',
    table.insert(html, '<ul class="nav-main-list">')
        '<ul class="nav-main-list">'
    }
      
      
    -- Выводим категории
     for _, num in ipairs(sortedCategories) do
     for _, num in ipairs(sortedCategories) do
         local category = categories[num]
         local category = categories[num]
          
          
         table.insert(html, '<li class="nav-category">')
         -- Разбираем категорию на составляющие
        local displayText = category.name
        local link = category.name
        local icon = ''
          
          
         -- Обрабатываем иконки (формат: Файл:icon.png&Ссылка&Текст)
         -- Если есть иконка в формате "Файл:icon.png&GravityExpansion"
        local categoryHtml = ''
         if string.find(category.name, '&') then
         if string.find(category.name, '&') then
             local parts = mw.text.split(category.name, '&')
             local parts = mw.text.split(category.name, '&')
             if #parts >= 3 then
             if #parts == 2 then
                 -- Части: [1] = файл, [2] = ссылка, [3] = текст
                 -- Формат: Файл:icon.png&GravityExpansion
                 categoryHtml = parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. parts[3] .. '</span>]]'
                 icon = parts[1] .. ' '
             else
                displayText = parts[2]
                 -- Если частей меньше 3, выводим как обычную ссылку
                link = parts[2]
                 categoryHtml = '[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]'
             elseif #parts == 3 then
                 -- Формат: Файл:icon.png&GravityExpansion&GravityExpansion
                 icon = parts[1] .. ' '
                displayText = parts[3]
                link = parts[2]
             end
             end
        else
            -- Обычная категория без иконки
            categoryHtml = '[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]'
         end
         end
          
          
         table.insert(html, categoryHtml)
         table.insert(html, '<li class="nav-category">')
        table.insert(html, icon .. '[[' .. link .. '|<span class="nav-category-text">' .. displayText .. '</span>]]')
          
          
         -- Выводим подпункты
         -- Подпункты
         if #category.subitems > 0 then
         if #category.subitems > 0 then
             table.insert(html, '<ul class="nav-sub-list">')
             table.insert(html, '<ul class="nav-sub-list">')
           
             for _, subitem in ipairs(category.subitems) do
             for _, subitem in ipairs(category.subitems) do
                 table.insert(html, '<li class="nav-sub-item">' .. subitem .. '</li>')
                 table.insert(html, '<li class="nav-sub-item">' .. subitem .. '</li>')
             end
             end
           
             table.insert(html, '</ul>')
             table.insert(html, '</ul>')
         end
         end

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

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

local p = {}

function p.navmenu(frame)
    local args = frame:getParent().args
    
    -- Собираем все категории
    local categories = {}
    
    for key, value in pairs(args) do
        if string.match(key, '^category%d+$') then
            local num = string.match(key, 'category(%d+)')
            categories[tonumber(num)] = {
                name = value,
                subitems = {}
            }
        end
    end
    
    -- Собираем подпункты
    for key, value in pairs(args) do
        if string.match(key, '^subitems%d+$') then
            local num = string.match(key, 'subitems(%d+)')
            num = tonumber(num)
            if categories[num] then
                local subitems = mw.text.split(value, ';')
                for _, item in ipairs(subitems) do
                    table.insert(categories[num].subitems, mw.text.trim(item))
                end
            end
        end
    end
    
    -- Сортируем по номерам
    local sortedCategories = {}
    for num in pairs(categories) do
        table.insert(sortedCategories, num)
    end
    table.sort(sortedCategories)
    
    -- Формируем 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]
        
        -- Разбираем категорию на составляющие
        local displayText = category.name
        local link = category.name
        local icon = ''
        
        -- Если есть иконка в формате "Файл:icon.png&GravityExpansion"
        if string.find(category.name, '&') then
            local parts = mw.text.split(category.name, '&')
            if #parts == 2 then
                -- Формат: Файл:icon.png&GravityExpansion
                icon = parts[1] .. ' '
                displayText = parts[2]
                link = parts[2]
            elseif #parts == 3 then
                -- Формат: Файл:icon.png&GravityExpansion&GravityExpansion
                icon = parts[1] .. ' '
                displayText = parts[3]
                link = parts[2]
            end
        end
        
        table.insert(html, '<li class="nav-category">')
        table.insert(html, icon .. '[[' .. link .. '|<span class="nav-category-text">' .. displayText .. '</span>]]')
        
        -- Подпункты
        if #category.subitems > 0 then
            table.insert(html, '<ul class="nav-sub-list">')
            for _, subitem in ipairs(category.subitems) do
                table.insert(html, '<li class="nav-sub-item">' .. subitem .. '</li>')
            end
            table.insert(html, '</ul>')
        end
        
        table.insert(html, '</li>')
    end
    
    table.insert(html, '</ul>')
    table.insert(html, '</nav>')
    
    return table.concat(html, '\n')
end

return p