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

м
1 версия импортирована: Шаблоны:Для шаблонов
/>Serhio Magpie
(Фикс для внешнего вызова в модуле External links)
м (1 версия импортирована: Шаблоны:Для шаблонов)
 
(не показано 7 промежуточных версий 6 участников)
Строка 1: Строка 1:
--
--
-- Реализует {{Навигационная таблица}} и {{Подгруппы навигационной таблицы}}.
-- Реализует {{навигационная таблица}}, {{подгруппы навигационной таблицы}} и {{навигационная таблица с блоками}}.
-- Основной объём кода заимствован из английского Module:Navbox.
-- Основной объём кода заимствован из английского Module:Navbox.
--
--
Строка 8: Строка 8:
local getArgs -- lazily initialized
local getArgs -- lazily initialized
local yesno -- 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 navigation
name = {'name', 'имя'},
local navbar
navigation = {'navigation', 'навигация'},
local above
navbar = {'navbar', 'ссылка_на_просмотр'},
local image
state = {'state'},
local below
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'}
}
 
-- параметры {{навигационная таблица с блоками}}
-- с нижнего подчеркивания начинаются параметры, конфликтующие с standardAliases
local groupsParentAliases = {
selected = {'selected', 'открытый_блок', 'развернуть'},
secttitlestyle = {'secttitlestyle', 'стиль_заголовков'},
_groupstyle = {'groupstyle', 'стиль_блоков'},
_liststyle = {'liststyle', 'стиль_списков', 'contentstyle'},
_listpadding = {'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'},
 
secttitlestyle = {'sect%stitlestyle', 'стиль%sзаголовка', 'стиль_секции%s'},
groupstyle = {'group%sstyle', 'стиль%sблока', 'стиль_группы%s', 'стиль_блока%s'},
listclass = {'list%sclass', 'класс%sсписка', 'класс_списка%s'},
liststyle = {'list%sstyle', 'стиль%sсписка', 'стиль_списка%s', 'content%sstyle'},
color = {'цвет%s'}
}


local titlestyle
local function checkAliases(args, aliases, index)
local groupstyle
for _, alias in ipairs(aliases) do
local bodystyle
local arg
local basestyle
if index then
local liststyle
arg = args[string.format(alias, index)]
local evenodd_VARIABLE
else
local abovestyle
arg = args[alias]
local belowstyle
end
local imageleft
local imageleftstyle
if arg then
local style
return arg
end
end
return nil
end


local groupwidth
local function checkElAliases(args, name, index)
local listpadding
return checkAliases(args, standardElementAliases[name], index)
end


local bodyclass
local function concatStyles(t)
local titleclass
local res
local aboveclass
for k, v in pairs(t) do
local belowclass
if v then
local groupclass
res = res and res .. ';' .. v or v
local listclass
end
local imageclass
end
return res
end


local function striped(wikitext)
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
end
end
local first, second = 'odd', 'even'
local first, second = 'odd', 'even'
if evenodd_VARIABLE then
if args.evenodd then
if evenodd_VARIABLE == 'swap' then
if args.evenodd == 'swap' then
first, second = second, first
first, second = second, first
else
else
first = evenodd_VARIABLE
first = args.evenodd
second = first
second = first
end
end
Строка 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', groupwidth or '1px') -- If groupwidth not specified, minimize width
:css('width', args.groupwidth or '1px') -- If groupwidth not specified, minimize width


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


local listCell = row:tag('td')
local listCell = row:tag('td')


if (args['group' .. listnum] or args['заголовок' .. listnum] or args['группа' .. listnum]) then
if rowArgs.group then
listCell
listCell
:css('text-align', 'left')
:css('text-align', 'left')
Строка 264: Строка 350:
:css('border-left-style', 'solid')
:css('border-left-style', 'solid')
else
else
if haveSubgroups() then
if haveSubgroups(args) then
listCell
listCell
:attr('colspan', 2)
:attr('colspan', 2)
Строка 270: Строка 356:
end
end


if not groupwidth then
if not args.groupwidth then
listCell:css('width', '100%')
listCell:css('width', '100%')
end
end


local listText = args['list' .. listnum] or args['список' .. listnum]
local listText = rowArgs.list
local oddEven = ODD_EVEN_MARKER
local oddEven = ODD_EVEN_MARKER
if listText:sub(1, 12) == '</div><table' then
if listText:sub(1, 12) == '</div><table' then
Строка 282: Строка 368:
listCell
listCell
:css('padding', '0px')
:css('padding', '0px')
:cssText(liststyle)
:cssText(args.liststyle)
:cssText(args['list' .. listnum .. 'style'] or args['стиль_списка' .. listnum])
:cssText(rowArgs.liststyle)
:addClass('navbox-list')
:addClass('navbox-list')
:addClass('navbox-' .. oddEven)
:addClass('navbox-' .. oddEven)
:addClass(listclass)
:addClass(args.listclass)
:addClass(rowArgs.listclass)
:tag('div')
:tag('div')
:css('padding', args['list' .. listnum .. 'padding'] or listpadding or '0em 0.25em')
:css('padding', rowArgs.listpadding or args.listpadding or '0em 0.25em')
:wikitext(addNewline(listText))
:wikitext(addNewline(listText))


if index == 1 and image then
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
Строка 308: Строка 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
Строка 317: Строка 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
Строка 326: Строка 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


Строка 333: Строка 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
Строка 346: Строка 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
Строка 360: Строка 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
Строка 368: Строка 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')
Строка 380: Строка 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
Строка 393: Строка 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
if not yesno then
yesno = require('Module:Yesno');
yesno = require('Module:Yesno')
end
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+)$')
Строка 416: Строка 524:
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
navigation = yesno(args.navigation or args['навигация'], '')
for argname, aliasesList in pairs(standardAliases) do
above = args.above or args['вверху']
args[argname] = checkAliases(args, aliasesList)
image = args.image or args['изображение']
end
imagestyle = args.imagestyle or args['стиль_изображения']
 
imageleft = args.imageleft or args['изображение2'] or args['изображение_слева']
args.navigation = yesno(args.navigation, '')
imageleftstyle = args.imageleftstyle or args.imagestyle2 or args['стиль_изображения_слева']
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['стиль_списков']
abovestyle = args.abovestyle or args['стиль_вверху']
belowstyle = args.belowstyle or args['стиль_внизу']
evenodd_VARIABLE = 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
if name and name ~= '-' then
if args.name and args.name ~= '-' then
nav:attr('data-name', name)
nav:attr('data-name', args.name)
end
end
if navigation == true then
if args.navigation == true then
nav:attr('data-navboxnavigation', '1')
nav:attr('data-navboxnavigation', '1')
elseif navigation == false then
elseif args.navigation == false then
nav:attr('data-navboxnavigation', '0')
nav:attr('data-navboxnavigation', '0')
end
end
elseif border == 'subgroup' then
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
Строка 486: Строка 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
end
if name and name ~= '-' then
if args.name and args.name ~= '-' then
nav:attr('data-name', name)
nav:attr('data-name', args.name)
end
end
if navigation == true then
if args.navigation == true then
nav:attr('data-navboxnavigation', '1')
nav:attr('data-navboxnavigation', '1')
elseif navigation == false then
elseif args.navigation == false then
nav:attr('data-navboxnavigation', '0')
nav:attr('data-navboxnavigation', '0')
end
end
Строка 506: Строка 590:
end
end


renderTrackingCategories(res)
renderTrackingCategories(res, args)


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


Строка 516: Строка 600:
end
end
if not yesno then
if not yesno then
yesno = require('Module:Yesno');
yesno = require('Module:Yesno')
end
end
args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Подгруппы навигационной таблицы'}})
args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Подгруппы навигационной таблицы'}})
Строка 524: Строка 608:
end
end
-- Read the arguments in the order they'll be output in, to make references number in the right order.
readInTheRightOrder(args, standardElementAliases.group, standardElementAliases.list)
local _
_ = maintitle
_ = above
for i = 1, 23 do
_ = args["group" .. tostring(i)] and args["заголовок" .. tostring(i)] and args["группа" .. tostring(i)]
_ = args["list" .. tostring(i)] and args["список" .. tostring(i)]
end
_ = below


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