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

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

Материал из GravityWiki
Новая страница: «local p = {} function p.navmenu(frame) local args = frame:getParent().args local currentTitle = mw.title.getCurrentTitle() 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 fo...»
 
Нет описания правки
 
(не показано 16 промежуточных версий этого же участника)
Строка 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()
      
      
    local html = {
        '<div class="mw-heading mw-heading2">' .. (args.section or 'Навигация') .. '</h2></div>',
        '<ul class="nav-main-list">'
    }
 
   
    -- Собираем и сортируем категории по номерам
     local categories = {}
     local categories = {}
   
     for key, value in pairs(args) do
     for key, value in pairs(args) do
         if string.match(key, '^category%d+$') then
         if string.match(key, '^category%d+$') then
             local num = string.match(key, 'category(%d+)')
             local num = tonumber(string.match(key, 'category(%d+)'))
             categories[tonumber(num)] = {
             categories[num] = {
                 name = value,
                 name = value,
                 subitems = {}
                 subitems_key = 'subitems' .. num
             }
             }
         end
         end
     end
     end
      
      
     for key, value in pairs(args) do
     local sortedNums = {}
        if string.match(key, '^subitems%d+$') then
     for num in pairs(categories) do table.insert(sortedNums, num) end
            local num = string.match(key, 'subitems(%d+)')
     table.sort(sortedNums)
            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)
      
      
    local html = {}
     for _, num in ipairs(sortedNums) do
    table.insert(html, '<nav class="wiki-nav-menu">')
    table.insert(html, '<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</div>')
    table.insert(html, '<ul class="nav-main-list">')
   
     for _, num in ipairs(sortedCategories) do
         local category = categories[num]
         local category = categories[num]
        local subitems = args[category.subitems_key]
          
          
         table.insert(html, '<li class="nav-category">')
         -- Категория
          
         local categoryContent = ''
         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
                 table.insert(html, parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. parts[3] .. '</span>]]')
                 categoryContent = frame:preprocess(parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. (parts[3] or parts[2]) .. '</span>]]')
            else
                table.insert(html, '[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]')
             end
             end
         else
         else
             table.insert(html, '[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]')
             categoryContent = frame:preprocess('[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]')
         end
         end
          
          
         if #category.subitems > 0 then
         table.insert(html, '<li class="nav-category">' .. categoryContent)
            table.insert(html, '<ul class="nav-sub-list">')
       
        -- Подпункты с алфавитной сортировкой
        if subitems then
            local subitemList = mw.text.split(subitems, ';')
              
              
             for _, subitem in ipairs(category.subitems) do
            -- Создаем таблицу для сортировки
                 table.insert(html, '<li class="nav-sub-item">' .. subitem .. '</li>')
            local sortableItems = {}
             for _, item in ipairs(subitemList) do
                 local trimmed = mw.text.trim(item)
                -- Извлекаем текст для сортировки (убираем вики-разметку, но сохраняем для обработки)
                local sortText = trimmed
                    :gsub("%[%[.*%|(.*)%]%]", "%1")  -- [[ссылка|текст]] → текст
                    :gsub("%[%[(.*)%]%]", "%1")      -- [[текст]] → текст
                    :gsub("<small>(.*)</small>", "%1") -- <small>текст</small> → текст
               
                table.insert(sortableItems, {
                    original = trimmed,  -- Оригинальная строка для обработки
                    sort_text = mw.text.trim(sortText)
                })
             end
             end
              
              
            -- Сортируем по алфавиту
            table.sort(sortableItems, function(a, b)
                return a.sort_text:lower() < b.sort_text:lower()
            end)
           
            table.insert(html, '<ul class="nav-sub-list">')
            for _, item in ipairs(sortableItems) do
                -- Убираем тег <small> из оригинальной строки перед обработкой
                local cleanItem = item.original
                local processedSubitem = frame:preprocess(cleanItem)
                table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>')
            end
             table.insert(html, '</ul>')
             table.insert(html, '</ul>')
         end
         end
Строка 72: Строка 82:
      
      
     table.insert(html, '</ul>')
     table.insert(html, '</ul>')
    table.insert(html, '</nav>')
      
      
     return table.concat(html, '\n')
     return table.concat(html, '\n')

Текущая версия от 08:00, 20 октября 2025

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

local p = {}

function p.navmenu(frame)
    local args = frame:getParent().args
    
    local html = {
        '<div class="mw-heading mw-heading2">' .. (args.section or 'Навигация') .. '</h2></div>',
        '<ul class="nav-main-list">'
    }
  
    
    -- Собираем и сортируем категории по номерам
    local categories = {}
    for key, value in pairs(args) do
        if string.match(key, '^category%d+$') then
            local num = tonumber(string.match(key, 'category(%d+)'))
            categories[num] = {
                name = value,
                subitems_key = 'subitems' .. num
            }
        end
    end
    
    local sortedNums = {}
    for num in pairs(categories) do table.insert(sortedNums, num) end
    table.sort(sortedNums)
    
    for _, num in ipairs(sortedNums) do
        local category = categories[num]
        local subitems = args[category.subitems_key]
        
        -- Категория
        local categoryContent = ''
        if string.find(category.name, '&') then
            local parts = mw.text.split(category.name, '&')
            if #parts >= 2 then
                categoryContent = frame:preprocess(parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. (parts[3] or parts[2]) .. '</span>]]')
            end
        else
            categoryContent = frame:preprocess('[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]')
        end
        
        table.insert(html, '<li class="nav-category">' .. categoryContent)
        
        -- Подпункты с алфавитной сортировкой
        if subitems then
            local subitemList = mw.text.split(subitems, ';')
            
            -- Создаем таблицу для сортировки
            local sortableItems = {}
            for _, item in ipairs(subitemList) do
                local trimmed = mw.text.trim(item)
                -- Извлекаем текст для сортировки (убираем вики-разметку, но сохраняем для обработки)
                local sortText = trimmed
                    :gsub("%[%[.*%|(.*)%]%]", "%1")  -- [[ссылка|текст]] → текст
                    :gsub("%[%[(.*)%]%]", "%1")      -- [[текст]] → текст
                    :gsub("<small>(.*)</small>", "%1") -- <small>текст</small> → текст
                
                table.insert(sortableItems, {
                    original = trimmed,  -- Оригинальная строка для обработки
                    sort_text = mw.text.trim(sortText)
                })
            end
            
            -- Сортируем по алфавиту
            table.sort(sortableItems, function(a, b)
                return a.sort_text:lower() < b.sort_text:lower()
            end)
            
            table.insert(html, '<ul class="nav-sub-list">')
            for _, item in ipairs(sortableItems) do
                -- Убираем тег <small> из оригинальной строки перед обработкой
                local cleanItem = item.original
                local processedSubitem = frame:preprocess(cleanItem)
                table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>')
            end
            table.insert(html, '</ul>')
        end
        
        table.insert(html, '</li>')
    end
    
    table.insert(html, '</ul>')
    
    return table.concat(html, '\n')
end

return p