Модуль:Навигация: различия между версиями
Внешний вид
Admin (обсуждение | вклад) Нет описания правки |
Admin (обсуждение | вклад) Нет описания правки |
||
| Строка 3: | Строка 3: | ||
function p.navmenu(frame) | function p.navmenu(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
-- Собираем все категории | -- Собираем все категории | ||
| Строка 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 | ||
local 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 | for _, num in ipairs(sortedCategories) do | ||
local category = categories[num] | local category = categories[num] | ||
-- Разбираем категорию на составляющие | |||
local displayText = category.name | |||
local link = category.name | |||
local icon = '' | |||
-- | -- Если есть иконка в формате "Файл:icon.png&GravityExpansion" | ||
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 | 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 | ||
end | end | ||
table.insert(html, | 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