Модуль:Навигация: различия между версиями
Внешний вид
Admin (обсуждение | вклад) Нет описания правки |
Admin (обсуждение | вклад) Нет описания правки |
||
| Строка 3: | Строка 3: | ||
function p.navmenu(frame) | function p.navmenu(frame) | ||
local args = frame:getParent().args | local args = frame:getParent().args | ||
-- Собираем | local html = { | ||
'<nav class="wiki-nav-menu">', | |||
'<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</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[ | categories[num] = { | ||
name = value, | name = value, | ||
subitems | subitems_key = 'subitems' .. num | ||
} | } | ||
end | end | ||
end | end | ||
-- Сортируем категории по номерам | -- Сортируем категории по номерам | ||
local | local sortedNums = {} | ||
for num in pairs(categories) do | for num in pairs(categories) do table.insert(sortedNums, num) end | ||
table.sort(sortedNums) | |||
table.sort( | |||
for _, num in ipairs(sortedNums) do | |||
for _, num in ipairs( | |||
local category = categories[num] | local category = categories[num] | ||
local subitems = args[category.subitems_key] | |||
-- Обрабатываем категорию | |||
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 >= | if #parts >= 2 then | ||
categoryContent = frame:preprocess(parts[1] .. ' [[' .. parts[2] .. '|<span class="nav-category-text">' .. (parts[3] or parts[2]) .. '</span>]]') | |||
end | end | ||
else | else | ||
categoryContent = frame:preprocess('[[' .. category.name .. '|<span class="nav-category-text">' .. category.name .. '</span>]]') | |||
end | end | ||
-- | table.insert(html, '<li class="nav-category">' .. categoryContent) | ||
if | |||
-- Обрабатываем и сортируем подпункты по алфавиту | |||
if subitems then | |||
local subitemList = mw.text.split(subitems, ';') | |||
-- Сортируем подпункты по алфавиту | |||
table.sort(subitemList, function(a, b) | |||
-- Извлекаем текстовую часть для сортировки (убираем вики-разметку) | |||
local textA = mw.text.trim(a):gsub("%[%[.*%|?<small>(.*)</small>%]%]", "%1"):gsub("%[%[.*%|?(.*)%]%]", "%1") | |||
local textB = mw.text.trim(b):gsub("%[%[.*%|?<small>(.*)</small>%]%]", "%1"):gsub("%[%[.*%|?(.*)%]%]", "%1") | |||
return textA:lower() < textB:lower() | |||
end) | |||
table.insert(html, '<ul class="nav-sub-list">') | table.insert(html, '<ul class="nav-sub-list">') | ||
for _, subitem in ipairs(subitemList) do | |||
for _, subitem in ipairs( | local processedSubitem = frame:preprocess(mw.text.trim(subitem)) | ||
table.insert(html, '<li class="nav-sub-item">' .. | table.insert(html, '<li class="nav-sub-item">' .. processedSubitem .. '</li>') | ||
end | end | ||
table.insert(html, '</ul>') | table.insert(html, '</ul>') | ||
end | end | ||
Версия от 07:45, 20 октября 2025
Для документации этого модуля может быть создана страница Модуль:Навигация/doc
local p = {}
function p.navmenu(frame)
local args = frame:getParent().args
local html = {
'<nav class="wiki-nav-menu">',
'<div class="nav-section-title">' .. (args.section or 'Навигация') .. '</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, ';')
-- Сортируем подпункты по алфавиту
table.sort(subitemList, function(a, b)
-- Извлекаем текстовую часть для сортировки (убираем вики-разметку)
local textA = mw.text.trim(a):gsub("%[%[.*%|?<small>(.*)</small>%]%]", "%1"):gsub("%[%[.*%|?(.*)%]%]", "%1")
local textB = mw.text.trim(b):gsub("%[%[.*%|?<small>(.*)</small>%]%]", "%1"):gsub("%[%[.*%|?(.*)%]%]", "%1")
return textA:lower() < textB:lower()
end)
table.insert(html, '<ul class="nav-sub-list">')
for _, subitem in ipairs(subitemList) do
local processedSubitem = frame:preprocess(mw.text.trim(subitem))
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>')
table.insert(html, '</nav>')
return table.concat(html, '\n')
end
return p