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

м
1 версия импортирована: Шаблоны:Для шаблонов
/>Iniquity
(navbox-spacing-temp более не требуется)
м (1 версия импортирована: Шаблоны:Для шаблонов)
 
(не показано 27 промежуточных версий 9 участников)
Строка 1: Строка 1:
--
--
-- Этот модуль реализует {{Навигационная таблица}}.
-- Реализует {{навигационная таблица}}, {{подгруппы навигационной таблицы}} и {{навигационная таблица с блоками}}.
-- Основной объём кода заимствован из английского Module:Navbox.
-- Основной объём кода заимствован из английского Module:Navbox.
--
--
Строка 7: Строка 7:


local getArgs -- lazily initialized
local getArgs -- lazily initialized
local yesno -- lazily initialized
local styleratio


local args
local border
local listnums = {}
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'
local ODD_EVEN_MARKER = '\127_ODDEVEN_\127'
local RESTART_MARKER = '\127_ODDEVEN0_\127'
local RESTART_MARKER = '\127_ODDEVEN0_\127'
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'
local REGEX_MARKER = '\127_ODDEVEN(%d?)_\127'


local maintitle
-- общие параметры для всех шаблонов
local name
local commonAliases = {
local navbar
name = {'name', 'имя'},
local above
navigation = {'navigation', 'навигация'},
local image
navbar = {'navbar', 'ссылка_на_просмотр'},
local below
state = {'state'},
orphan = {'orphan'},
tracking = {'tracking'},
border = {'border', 1},
title = {'title', 'заголовок'},
titlegroup = {'titlegroup'},
above = {'above', 'вверху'},
image = {'image', 'изображение'},
imageleft = {'imageleft', 'изображение2', 'изображение_слева'},
below = {'below', 'внизу'},
bodyclass = {'bodyclass', 'класс_тела'},
titleclass = {'titleclass', 'класс_заголовка'},
titlegroupclass = {'titlegroupclass'},
aboveclass = {'aboveclass', 'класс_вверху'},
belowclass = {'belowclass', 'класс_внизу'},
groupclass = {'groupclass', 'класс_групп'},
listclass = {'listclass', 'класс_списков'},
imageclass = {'imageclass', 'класс_изображения'},
basestyle = {'basestyle', 'стиль', 'стиль_базовый'},
bodystyle = {'style', 'bodystyle', 'стиль_тела'},
titlestyle = {'titlestyle', 'стиль_основного_заголовка', 'стиль_заголовка'},
titlegroupstyle = {'titlegroupstyle'},
innerstyle = {'innerstyle'},
abovestyle = {'abovestyle', 'стиль_вверху'},
belowstyle = {'belowstyle', 'стиль_внизу'},
imagestyle = {'imagestyle', 'стиль_изображения'},
imageleftstyle = {'imageleftstyle', 'imagestyle2', 'стиль_изображения_слева'},
}
 
-- параметры {{навигационная таблица}} и {{подгруппы навигационной таблицы}}
local standardAliases = {
groupstyle = {'groupstyle', 'стиль_заголовков', 'стиль_групп'},
liststyle = {'liststyle', 'стиль_списков'},
evenodd = {'evenodd', 'чётные_нечётные', 'четные_нечетные'},
groupwidth = {'groupwidth', 'ширина_групп'},
listpadding = {'listpadding', 'отступ_списков'},
}
 
-- параметры {{навигационная таблица}} и {{подгруппы навигационной таблицы}} с нумерацией
local standardElementAliases = {
group = {'group%s', 'заголовок%s', 'группа%s'},
list = {'list%s', 'список%s'},
groupstyle = {'group%sstyle', 'стиль_заголовка%s', 'стиль_группы%s'},
listclass = {'list%sclass', 'класс%sсписка', 'класс_списка%s'},
liststyle = {'list%sstyle', 'стиль_списка%s'},
listpadding = {'list%spadding'}
}


local titlestyle
-- параметры {{навигационная таблица с блоками}}
local groupstyle
-- с нижнего подчеркивания начинаются параметры, конфликтующие с standardAliases
local bodystyle
local groupsParentAliases = {
local basestyle
selected = {'selected', 'открытый_блок', 'развернуть'},
local liststyle
secttitlestyle = {'secttitlestyle', 'стиль_заголовков'},
local oddstyle
_groupstyle = {'groupstyle', 'стиль_блоков'},
local evenstyle
_liststyle = {'liststyle', 'стиль_списков', 'contentstyle'},
local evenoddARG
_listpadding = {'listpadding', 'отступ_списка', 'отступ_списков'}
local abovestyle
}
local belowstyle
local imageleft
local imageleftstyle
local style


local groupwidth
-- параметры {{навигационная таблица с блоками}} с нумерацией
local listpadding
local groupsChildAliases = {
groupname = {'abbr%s', 'имя_блока%s', 'аббр%s'},
state = {'state%s'},
title = {'group%s', 'блок%s', 'заголовок%s', 'группа%s', 'sect%s', 'section%s', 'секция%s'},
list1 = {'list%s', 'список%s', 'content%s'},
image = {'image%s', 'изображение%s'},
imageleft = {'imageleft%s', 'изображение_слева%s'},


local bodyclass
secttitlestyle = {'sect%stitlestyle', 'стиль%sзаголовка', 'стиль_секции%s'},
local titleclass
groupstyle = {'group%sstyle', 'стиль%sблока', 'стиль_группы%s', 'стиль_блока%s'},
local aboveclass
listclass = {'list%sclass', 'класс%sсписка', 'класс_списка%s'},
local belowclass
liststyle = {'list%sstyle', 'стиль%sсписка', 'стиль_списка%s', 'content%sstyle'},
local groupclass
color = {'цвет%s'}
local listclass
}
local imageclass
 
local function checkAliases(args, aliases, index)
for _, alias in ipairs(aliases) do
local arg
if index then
arg = args[string.format(alias, index)]
else
arg = args[alias]
end
if arg then
return arg
end
end
return nil
end


local function striped(wikitext)
local function checkElAliases(args, name, index)
return checkAliases(args, standardElementAliases[name], index)
end
 
local function concatStyles(t)
local res
for k, v in pairs(t) do
if v then
res = res and res .. ';' .. v or v
end
end
return res
end
 
local function striped(wikitext, args)
-- Return wikitext with markers replaced for odd/even striping.
-- Return wikitext with markers replaced for odd/even striping.
-- Child (subgroup) navboxes are flagged with a category that is removed
-- Child (subgroup) navboxes are flagged with a category that is removed
Строка 53: Строка 132:
-- where a child navbox is not contained in a parent navbox.
-- where a child navbox is not contained in a parent navbox.
local orphanCat = '[[Категория:Навигационные шаблоны без родителя]]'
local orphanCat = '[[Категория:Навигационные шаблоны без родителя]]'
if border == 'subgroup' and args.orphan ~= 'yes' then
if args.border == 'subgroup' and args.orphan ~= 'yes' then
-- No change; striping occurs in outermost navbox.
-- No change; striping occurs in outermost navbox.
return wikitext .. orphanCat
return wikitext .. orphanCat
Строка 96: Строка 175:
end
end


local function renderNavBar(titleCell)
local function renderNavBar(titleCell, args)
 
local currentFrame = mw.getCurrentFrame()
if navbar ~= 'off' and navbar ~= 'plain' and not (not name and mw.getCurrentFrame():getParent():getTitle():gsub('/песочница$', '') == 'Шаблон:Навигационная таблица') then
if args.navbar ~= 'off' and args.navbar ~= 'plain'  
and (args.name or not currentFrame:getParent():getTitle():gsub('/песочница$', '') == 'Шаблон:Навигационная таблица') then
-- Check color contrast of the gear icon
-- Check color contrast of the gear icon
local styleratio = require('Module:Color contrast')._styleratio
if not styleratio then
local gearColor = ''
styleratio = require('Module:Color contrast')._styleratio
local contrastStyle = titlestyle or basestyle
end
local contrastStyle = args.titlestyle or args.basestyle
local gearStyleBlack = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#666;' or '')
local gearStyleBlack = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#666;' or '')
local gearStyleWhite = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#fff;' or '')
local gearStyleWhite = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. '; color:#fff;' or '')
if styleratio{gearStyleBlack} < styleratio{gearStyleWhite} then
local gear = currentFrame:expandTemplate{
gearColor = ' white'
title = 'Tnavbar-view',
end
args = {
args.name,
fontcolor = (styleratio{gearStyleBlack} < styleratio{gearStyleWhite}) and 'white',
}
}
--- Gear creation
--- Gear creation
titleCell
titleCell
:tag('span')
:tag('span')
:addClass('navbox-gear')
:css('float', 'left')
:css('float', 'left')
:css('text-align', 'left')
:css('text-align', 'left')
:css('width', '5em')
:css('width', '5em')
:css('margin-right', '0.5em')
:css('margin-right', '0.5em')
:wikitext('[[Файл:Wikipedia interwiki section gear icon' .. gearColor .. '.svg|14px|Просмотр этого шаблона|link=Шаблон:' .. name .. '|alt=⛭]]')
:wikitext(gear)
end
end


Строка 125: Строка 211:
--  Title row
--  Title row
--
--
local function renderTitleRow(tbl)
local function renderTitleRow(tbl, args)
if not maintitle then return end
if not args.title then return end


local titleRow = tbl:tag('tr')
local titleRow = tbl:tag('tr')
Строка 136: Строка 222:
:addClass('navbox-group')
:addClass('navbox-group')
:addClass(args.titlegroupclass)
:addClass(args.titlegroupclass)
:cssText(basestyle)
:cssText(args.basestyle)
:cssText(groupstyle)
:cssText(args.groupstyle)
:cssText(args.titlegroupstyle)
:cssText(args.titlegroupstyle)
:wikitext(args.titlegroup)
:wikitext(args.titlegroup)
end
end


local titleCell = titleRow:tag('th'):attr('scope', 'col')
local titleCell = titleRow:tag('th'):attr('scope', 'colgroup')


if args.titlegroup then
if args.titlegroup then
Строка 151: Строка 237:


local titleColspan = 2
local titleColspan = 2
if imageleft then titleColspan = titleColspan + 1 end
if args.imageleft then titleColspan = titleColspan + 1 end
if image then titleColspan = titleColspan + 1 end
if args.image then titleColspan = titleColspan + 1 end
if args.titlegroup then titleColspan = titleColspan - 1 end
if args.titlegroup then titleColspan = titleColspan - 1 end


titleCell
titleCell
:cssText(basestyle)
:cssText(args.basestyle)
:cssText(titlestyle)
:cssText(args.titlestyle)
:addClass('navbox-title')
:addClass('navbox-title')
:attr('colspan', titleColspan)
:attr('colspan', titleColspan)


renderNavBar(titleCell)
renderNavBar(titleCell, args)


titleCell
titleCell
:tag('div')
:tag('div')
:attr('id', mw.uri.anchorEncode(maintitle))
:attr('id', mw.uri.anchorEncode(args.title))
:addClass(titleclass)
:addClass(args.titleclass)
:css('font-size', '114%')
:css('font-size', '114%')
:css('margin', '0 5em')
:css('margin', '0 5em')
:wikitext(addNewline(maintitle))
:wikitext(addNewline(args.title))
end
end


Строка 176: Строка 262:
--
--


local function getAboveBelowColspan()
local function getAboveBelowColspan(args)
local ret = 2
local ret = 2
if imageleft then ret = ret + 1 end
if args.imageleft then ret = ret + 1 end
if image then ret = ret + 1 end
if args.image then ret = ret + 1 end
return ret
return ret
end
end


local function renderAboveRow(tbl)
local function renderAboveRow(tbl, args)
if not above then return end
if not args.above then return end


tbl:tag('tr')
tbl:tag('tr')
:tag('td')
:tag('td')
:addClass('navbox-abovebelow')
:addClass('navbox-abovebelow')
:addClass(aboveclass)
:addClass(args.aboveclass)
:cssText(basestyle)
:cssText(args.basestyle)
:cssText(abovestyle)
:cssText(args.abovestyle)
:attr('colspan', getAboveBelowColspan())
:attr('colspan', getAboveBelowColspan(args))
:tag('div')
:tag('div')
:wikitext(addNewline(above))
:wikitext(addNewline(args.above))
end
end


local function renderBelowRow(tbl)
local function renderBelowRow(tbl, args)
if not below then return end
if not args.below then return end


tbl:tag('tr')
tbl:tag('tr')
:tag('td')
:tag('td')
:addClass('navbox-abovebelow')
:addClass('navbox-abovebelow')
:addClass(belowclass)
:addClass(args.belowclass)
:cssText(basestyle)
:cssText(args.basestyle)
:cssText(belowstyle)
:cssText(args.belowstyle)
:attr('colspan', getAboveBelowColspan())
:attr('colspan', getAboveBelowColspan(args))
:tag('div')
:tag('div')
:wikitext(addNewline(below))
:wikitext(addNewline(args.below))
end
end


Строка 215: Строка 301:
--
--


local function haveSubgroups()
local function haveSubgroups(args)
for i = 1, 23 do
for i = 1, 23 do
if (args['group' .. i] or args['заголовок' .. i] or args['группа' .. i]) and (args['list' .. i] or args['список' .. i]) then
if checkElAliases(args, 'group', i) and checkElAliases(args, 'list', i) then
return true
return true
end
end
Строка 224: Строка 310:
end
end


local function renderListRow(tbl, index, listnum)
local function renderListRow(tbl, args, index, rowspan, rowArgs)
local row = tbl:tag('tr')
local row = tbl:tag('tr')


if index == 1 and imageleft then
if index == 1 and args.imageleft then
row
row
:tag('td')
:tag('td')
:addClass('navbox-image')
:addClass('navbox-image')
:addClass(imageclass)
:addClass(args.imageclass)
:css('width', '1px')
:css('width', '1px')
:css('padding', '0px 7px 0px 0px')
:css('padding', '0px 7px 0px 0px')
:cssText(imageleftstyle)
:cssText(args.imageleftstyle)
:attr('rowspan', #listnums)
:attr('rowspan', rowspan)
:tag('div')
:tag('div')
:wikitext(addNewline(imageleft))
:wikitext(addNewline(args.imageleft))
end
end


if (args['group' .. listnum] or args['заголовок' .. listnum] or args['группа' .. listnum]) then
if rowArgs.group then
local groupCell = row:tag('th')
local groupCell = row:tag('th')


Строка 246: Строка 332:
:attr('scope', 'row')
:attr('scope', 'row')
:addClass('navbox-group')
:addClass('navbox-group')
:addClass(groupclass)
:addClass(args.groupclass)
:cssText(basestyle)
:cssText(args.basestyle)
:css('width', args.groupwidth or '1px') -- If groupwidth not specified, minimize width
:css('width', args.groupwidth or '1px') -- If groupwidth not specified, minimize width
-- заголовки без списков - для обратной совместимости, только в нашем разделе
if not (args['list' .. listnum] or args['список' .. listnum]) then
groupCell
:css('text-align', 'center')
if haveSubgroups() then
groupCell:attr('colspan', 2)
end
end


groupCell
groupCell
:cssText(groupstyle)
:cssText(args.groupstyle)
:cssText(args['group' .. listnum .. 'style'] or args['стиль_группы' .. listnum] or args['стиль_заголовка' .. listnum])
:cssText(rowArgs.groupstyle)
:wikitext(args['group' .. listnum] or args['заголовок' .. listnum] or args['группа' .. listnum])
:wikitext(rowArgs.group)
end
end


if args['list' .. listnum] or args['список' .. listnum] then -- проверка на наличие списков, иначе временный наш  безсписочный функционал не поддерживается
local listCell = row:tag('td')
local listCell = row:tag('td')
 
if rowArgs.group then
if (args['group' .. listnum] or args['заголовок' .. listnum] or args['группа' .. listnum]) then
listCell
:css('text-align', 'left')
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
if haveSubgroups(args) then
listCell
listCell
:css('text-align', 'left')
:attr('colspan', 2)
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
if haveSubgroups() then
listCell
:attr('colspan', 2)
end
end
end
if not groupwidth then
listCell:css('width', '100%')
end
local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing
if index % 2 == 1 then
rowstyle = oddstyle
else
rowstyle = evenstyle
end
local listText = args['list' .. listnum] or args['список' .. listnum]
local oddEven = ODD_EVEN_MARKER
if listText:sub(1, 12) == '</div><table' then
-- Assume list text is for a subgroup navbox so no automatic striping for this row.
oddEven = listText:find('<th[^>]*"navbox%-title"') and RESTART_MARKER or 'odd'
end
listCell
:css('padding', '0px')
:cssText(liststyle)
:cssText(rowstyle)
:cssText(args['list' .. listnum .. 'style'] or args['стиль_списка' .. listnum])
:addClass('navbox-list')
:addClass('navbox-' .. oddEven)
:addClass(listclass)
:tag('div')
:css('padding', (index == 1 and args.list1padding) or listpadding or '0em 0.25em')
:wikitext(addNewline(listText))
end
end


if index == 1 and image then
if not args.groupwidth then
listCell:css('width', '100%')
end
 
local listText = rowArgs.list
local oddEven = ODD_EVEN_MARKER
if listText:sub(1, 12) == '</div><table' then
-- Assume list text is for a subgroup navbox so no automatic striping for this row.
oddEven = listText:find('<th[^>]*"navbox%-title"') and RESTART_MARKER or 'odd'
end
listCell
:css('padding', '0px')
:cssText(args.liststyle)
:cssText(rowArgs.liststyle)
:addClass('navbox-list')
:addClass('navbox-' .. oddEven)
:addClass(args.listclass)
:addClass(rowArgs.listclass)
:tag('div')
:css('padding', rowArgs.listpadding or args.listpadding or '0em 0.25em')
:wikitext(addNewline(listText))
 
if index == 1 and args.image then
row
row
:tag('td')
:tag('td')
:addClass('navbox-image')
:addClass('navbox-image')
:addClass(imageclass)
:addClass(args.imageclass)
:css('width', '1px')
:css('width', '1px')
:css('padding', '0px 0px 0px 7px')
:css('padding', '0px 0px 0px 7px')
:cssText(imagestyle)
:cssText(args.imagestyle)
:attr('rowspan', #listnums)
:attr('rowspan', rowspan)
:tag('div')
:tag('div')
:wikitext(addNewline(image))
:wikitext(addNewline(args.image))
end
end
end
end
Строка 327: Строка 395:
--  Tracking categories
--  Tracking categories
--
--
local function needsChangetoSubgroups()
local function needsChangetoSubgroups(args)
for i = 1, 23 do
for i = 1, 23 do
if (args['group' .. i] or args['заголовок' .. i] or args['группа' .. i]) and not (args['list' .. i] or args['список' .. i]) then
if (checkElAliases(args, 'group', i)) and not (checkElAliases(args, 'list', i)) then
return true
return true
end
end
Строка 336: Строка 404:
end
end


local function needsHorizontalLists()
local function needsHorizontalLists(args)
if border == 'subgroup' or args.tracking == 'no' then
if args.border == 'subgroup' or args.tracking == 'no' then
return false
return false
end
end
Строка 345: Строка 413:
['hlist vevent'] = true, ['hlist hlist-items-nowrap'] = true, ['hlist-items-nowrap'] = true,
['hlist vevent'] = true, ['hlist hlist-items-nowrap'] = true, ['hlist-items-nowrap'] = true,
}
}
return not (listClasses[listclass] or listClasses[bodyclass])
return not (listClasses[args.listclass] or listClasses[args.bodyclass])
end
end


Строка 352: Строка 420:
-- end
-- end


local function isIllegible()
local function isIllegible(args)
local styleratio = require('Module:Color contrast')._styleratio
if not styleratio then
styleratio = require('Module:Color contrast')._styleratio
end


for key, style in pairs(args) do
for key, style in pairs(args) do
Строка 365: Строка 435:
end
end


local function getTrackingCategories()
local function getTrackingCategories(args)
local cats = {}
local cats = {}
if needsChangetoSubgroups() then table.insert(cats, 'Навигационные шаблоны с ошибочным использованием заголовков') end
if needsChangetoSubgroups(args) then table.insert(cats, 'Навигационные шаблоны с ошибочным использованием заголовков') end
if needsHorizontalLists() then table.insert(cats, 'Навигационные шаблоны без горизонтальных списков') end
if needsHorizontalLists(args) then table.insert(cats, 'Навигационные шаблоны без горизонтальных списков') end
if isIllegible() then table.insert(cats, 'Потенциально нечитаемые навигационные шаблоны') end
if isIllegible(args) then table.insert(cats, 'Потенциально нечитаемые навигационные шаблоны') end
return cats
return cats
end
end


local function renderTrackingCategories(builder)
local function renderTrackingCategories(builder, args)
local title = mw.title.getCurrentTitle()
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 then return end -- not in template space
if title.namespace ~= 10 then return end -- not in template space
Строка 379: Строка 449:
if subpage == 'doc' or subpage == 'песочница' or subpage == 'тесты' then return end
if subpage == 'doc' or subpage == 'песочница' or subpage == 'тесты' then return end


for i, cat in ipairs(getTrackingCategories()) do
for i, cat in ipairs(getTrackingCategories(args)) do
builder:wikitext('[[Категория:' .. cat .. ']]')
builder:wikitext('[[Категория:' .. cat .. ']]')
end
end
Строка 387: Строка 457:
--  Main navbox tables
--  Main navbox tables
--
--
local function renderMainTable()
local function renderMainTable(args, listnums)
local tbl = mw.html.create('table')
local tbl = mw.html.create('table')
:addClass('nowraplinks')
:addClass('nowraplinks')
:addClass(bodyclass)
:addClass(args.bodyclass)


if maintitle and (args.state ~= 'plain' and args.state ~= 'off') then
if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
tbl
tbl
:addClass('collapsible')
:addClass('collapsible')
Строка 399: Строка 469:


tbl:css('border-spacing', 0)
tbl:css('border-spacing', 0)
if border == 'subgroup' or border == 'none' then
if args.border == 'subgroup' or args.border == 'none' then
tbl
tbl
:addClass('navbox-subgroup')
:addClass('navbox-subgroup')
:cssText(bodystyle)
:cssText(args.bodystyle)
:cssText(style)
else -- regular navbox - bodystyle and style will be applied to the wrapper table
else -- regular navbox - bodystyle and style will be applied to the wrapper table
tbl
tbl
Строка 412: Строка 481:
tbl:cssText(args.innerstyle)
tbl:cssText(args.innerstyle)


renderTitleRow(tbl)
renderTitleRow(tbl, args)
renderAboveRow(tbl)
renderAboveRow(tbl, args)
for i, listnum in ipairs(listnums) do
for i, listnum in ipairs(listnums) do
renderListRow(tbl, i, listnum)
local rowArgs = {
group = checkElAliases(args, 'group', listnum),
list = checkElAliases(args, 'list', listnum),
groupstyle = checkElAliases(args, 'groupstyle', listnum),
listclass = checkElAliases(args, 'listclass', listnum),
liststyle = checkElAliases(args, 'liststyle', listnum),
listpadding = checkElAliases(args, 'listpadding', listnum)
}
renderListRow(tbl, args, i, #listnums, rowArgs)
end
end
renderBelowRow(tbl)
renderBelowRow(tbl, args)


return tbl
return tbl
end
end


function p._navbox(navboxArgs)
-- Read the arguments in the order they'll be output in, to make references number in the right order.
args = navboxArgs
local function readInTheRightOrder(args, groupAliases, listAliases)
local _
_ = checkAliases(args, commonAliases.title)
_ = checkAliases(args, commonAliases.above)
for i = 1, 23 do
_ = checkAliases(args, groupAliases, i)
_ = checkAliases(args, listAliases, i)
end
_ = checkAliases(args, commonAliases.below)
end
 
function p._navbox(args)
if not yesno then
yesno = require('Module:Yesno')
end


local listnums = {}
for k, v in pairs(args) do
for k, v in pairs(args) do
local listnum = ('' .. k):match('^list(%d+)$') or ('' .. k):match('^список(%d+)$')
local listnum = ('' .. k):match('^list(%d+)$') or ('' .. k):match('^список(%d+)$')
if listnum then table.insert(listnums, tonumber(listnum)) end
if listnum then table.insert(listnums, tonumber(listnum)) end
end
-- заголовки без списков - для обратной совместимости, только в нашем разделе
for k, v in pairs(args) do
local double = false
local groupnum = ('' .. k):match('^заголовок(%d+)$') --group не нужен, так как в английском шаблоне эта фукнциональность не поддерживается
if groupnum then
for k2, v2 in pairs(listnums) do
if tonumber(groupnum) == v2 then
double = true
break
end
end
if not double then table.insert(listnums, tonumber(groupnum)) end --добавляем только номера заголовков, для которых нет списков
end
end
end
table.sort(listnums)
table.sort(listnums)


border = mw.text.trim(args.border or args[1] or '')
args.border = mw.text.trim(args.border or args[1] or '')
if border == 'child' then
if args.border == 'child' then
border = 'subgroup'
args.border = 'subgroup'
end
end
maintitle = args.title or args['заголовок']
for argname, aliasesList in pairs(commonAliases) do
navbar = args.navbar or args['ссылка_на_просмотр']
args[argname] = checkAliases(args, aliasesList)
name = args.name or args['имя']
end
above = args.above or args['вверху']
for argname, aliasesList in pairs(standardAliases) do
image = args.image or args['изображение']
args[argname] = checkAliases(args, aliasesList)
imagestyle = args.imagestyle or args['стиль_изображения']
end
imageleft = args.imageleft or args['изображение2'] or args['изображение_слева']
 
imageleftstyle = args.imageleftstyle or args.imagestyle2 or args['стиль_изображения_слева']
args.navigation = yesno(args.navigation, '')
below = args.below or args['внизу']
titlestyle = args.titlestyle or args['стиль_основного_заголовка'] or args['стиль_заголовка']
groupstyle = args.groupstyle or args['стиль_заголовков'] or args['стиль_групп']
bodystyle = args.bodystyle or args['стиль_тела']
basestyle = args.basestyle or args['стиль_базовый'] or args['стиль']
style = args.style
liststyle = args.liststyle or args['стиль_списков']
oddstyle = args.oddstyle or args['стиль_нечётных'] or args['стиль_нечетных']
evenstyle = args.evenstyle or args['стиль_чётных'] or args['стиль_четных']
abovestyle = args.abovestyle or args['стиль_вверху']
belowstyle = args.belowstyle or args['стиль_внизу']
evenoddARG = args.evenodd or args['чётные_нечётные'] or args['четные_нечетные']
groupwidth = args.groupwidth or args['ширина_групп']
listpadding = args.listpadding or args['отступ_списков']
bodyclass = args.bodyclass or args['класс_тела']
titleclass = args.titleclass or args['класс_заголовка']
aboveclass =args.aboveclass or args['класс_вверху']
belowclass = args.belowclass or args['класс_внизу']
groupclass = args.groupclass or args['класс_групп']
listclass = args.listclass or args['класс_списков']
imageclass = args.imageclass or args['класс_изображения']
-- render the main body of the navbox
-- render the main body of the navbox
local tbl = renderMainTable()
local tbl = renderMainTable(args, listnums)


-- render the appropriate wrapper around the navbox, depending on the border param
-- render the appropriate wrapper around the navbox, depending on the border param
local res = mw.html.create()
local res = mw.html.create()
if border == 'none' then
if args.border == 'none' then
local nav = res:tag('div')
local nav = res:tag('div')
:attr('role', 'navigation')
:attr('role', 'navigation')
:node(tbl)
:node(tbl)
if maintitle then
if args.title then
nav:attr('aria-labelledby', mw.uri.anchorEncode(maintitle))
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title))
else
else
nav:attr('aria-label', 'Навигационный шаблон')
nav:attr('aria-label', 'Навигационный шаблон')
end
end
elseif border == 'subgroup' then
if args.name and args.name ~= '-' then
nav:attr('data-name', args.name)
end
if args.navigation == true then
nav:attr('data-navboxnavigation', '1')
elseif args.navigation == false then
nav:attr('data-navboxnavigation', '0')
end
elseif args.border == 'subgroup' then
-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is
-- therefore inside a div with padding:0em 0.25em. We start with a </div> to avoid the
-- therefore inside a div with padding:0em 0.25em. We start with a </div> to avoid the
Строка 510: Строка 572:
:attr('role', 'navigation')
:attr('role', 'navigation')
:addClass('navbox')
:addClass('navbox')
:cssText(bodystyle)
:cssText(args.bodystyle)
:cssText(style)
:css('padding', '3px')
:node(tbl)
:node(tbl)
if maintitle then
if args.title then
nav:attr('aria-labelledby', mw.uri.anchorEncode(maintitle))
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title))
else
else
nav:attr('aria-label', 'Навигационный шаблон')
nav:attr('aria-label', 'Навигационный шаблон')
end
if args.name and args.name ~= '-' then
nav:attr('data-name', args.name)
end
if args.navigation == true then
nav:attr('data-navboxnavigation', '1')
elseif args.navigation == false then
nav:attr('data-navboxnavigation', '0')
end
end
end
end


renderTrackingCategories(res)
renderTrackingCategories(res, args)


return striped(tostring(res))
return striped(tostring(res), args)
end
end


Строка 531: Строка 599:
getArgs = require('Module:Arguments').getArgs
getArgs = require('Module:Arguments').getArgs
end
end
args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Навигационная таблица/песочница'}})
if not yesno then
 
yesno = require('Module:Yesno')
-- Read the arguments in the order they'll be output in, to make references number in the right order.
end
local _
args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Подгруппы навигационной таблицы'}})
_ = maintitle
if frame.args.border then
_ = above
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
for i = 1, 23 do
args.border = frame.args.border
_ = args["group" .. tostring(i)] and args["заголовок" .. tostring(i)] and args["группа" .. tostring(i)]
_ = args["list" .. tostring(i)] and args["список" .. tostring(i)]
end
end
_ = below
readInTheRightOrder(args, standardElementAliases.group, standardElementAliases.list)


return p._navbox(args)
return p._navbox(args)
end
function p.navboxWithCollapsibleGroups(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица с блоками'}})
readInTheRightOrder(args, groupsChildAliases.title, groupsChildAliases.list1)
local parent = {}
for argname, aliasesList in pairs(commonAliases) do
parent[argname] = checkAliases(args, aliasesList)
end
for argname, aliasesList in pairs(groupsParentAliases) do
parent[argname] = checkAliases(args, aliasesList)
end
for i = 1, 20 do
local child = {}
for argname, aliasesList in pairs(groupsChildAliases) do
child[argname] = checkAliases(args, aliasesList, i)
end
child.color = child.color and string.format('background:%s;', child.color) or ''
child.border = 'child'
child.navbar = 'plain'
if parent.selected and parent.selected == child.groupname then
child.state = 'uncollapsed'
end
child.state = child.state or 'collapsed'
child.basestyle = concatStyles{parent.basestyle, parent.secttitlestyle, child.secttitlestyle}
    child.titlestyle = concatStyles{parent._groupstyle, child.groupstyle, child.color}
    child.liststyle  = concatStyles{parent._liststyle, child.liststyle}
    child.lispadding = parent._listpadding
if child.title then
parent['list' .. i] = p._navbox(child)
else
parent['list' .. i] = child.list1
end
end
return p._navbox(parent)
end
end


return p
return p