Модуль:Навигация: различия между версиями
Внешний вид
Admin (обсуждение | вклад) Нет описания правки Метка: отменено |
Admin (обсуждение | вклад) Нет описания правки |
||
| (не показано 10 промежуточных версий этого же участника) | |||
| Строка 5: | Строка 5: | ||
local html = { | local html = { | ||
'<div class="mw-heading mw-heading2">' .. (args.section or 'Навигация') .. '</h2></div>', | |||
'<div class=" | |||
'<ul class="nav-main-list">' | '<ul class="nav-main-list">' | ||
} | } | ||
-- Собираем и сортируем категории | -- Собираем и сортируем категории по номерам | ||
local categories = {} | local categories = {} | ||
for key, value in pairs(args) do | for key, value in pairs(args) do | ||
| Строка 30: | Строка 30: | ||
local subitems = args[category.subitems_key] | local subitems = args[category.subitems_key] | ||
-- | -- Категория | ||
local categoryContent = '' | local categoryContent = '' | ||
if string.find(category.name, '&') then | if string.find(category.name, '&') then | ||
| Строка 43: | Строка 43: | ||
table.insert(html, '<li class="nav-category">' .. categoryContent) | table.insert(html, '<li class="nav-category">' .. categoryContent) | ||
-- | -- Подпункты с алфавитной сортировкой | ||
if subitems then | 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">') | table.insert(html, '<ul class="nav-sub-list">') | ||
for _, item in ipairs(sortableItems) do | |||
for _, | -- Убираем тег <small> из оригинальной строки перед обработкой | ||
local processedSubitem = frame:preprocess( | local cleanItem = item.original | ||
local processedSubitem = frame:preprocess(cleanItem) | |||
table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>') | table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>') | ||
end | end | ||
| Строка 58: | Строка 82: | ||
table.insert(html, '</ul>') | table.insert(html, '</ul>') | ||
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