3664
правки
Mansur700 (обсуждение | вклад) Нет описания правки |
Mansur700 (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
-- | -- | ||
-- Реализует {{ | -- Реализует {{навигационная таблица}}, {{подгруппы навигационной таблицы}} и {{навигационная таблица с блоками}}. | ||
-- Основной объём кода заимствован из английского Module:Navbox. | -- Основной объём кода заимствован из английского Module:Navbox. | ||
-- | -- | ||
Строка 7: | Строка 7: | ||
local getArgs -- lazily initialized | local getArgs -- lazily initialized | ||
local yesno -- lazily initialized | |||
local styleratio | |||
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 | -- общие параметры для всех шаблонов | ||
local | local commonAliases = { | ||
local | name = {'name', 'имя'}, | ||
local | navigation = {'navigation', 'навигация'}, | ||
local image | navbar = {'navbar', 'ссылка_на_просмотр'}, | ||
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'} | |||
} | |||
-- параметры {{навигационная таблица с блоками}} | |||
-- с нижнего подчеркивания начинаются параметры, конфликтующие с 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 | local function checkAliases(args, aliases, index) | ||
local | 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 checkElAliases(args, name, index) | |||
return checkAliases(args, standardElementAliases[name], index) | |||
end | |||
local | local function concatStyles(t) | ||
local | 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) | 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 | ||
Строка 51: | Строка 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 | if args.evenodd then | ||
if | if args.evenodd == 'swap' then | ||
first, second = second, first | first, second = second, first | ||
else | else | ||
first = | first = args.evenodd | ||
second = first | second = first | ||
end | end | ||
Строка 94: | Строка 175: | ||
end | end | ||
local function renderNavBar(titleCell) | local function renderNavBar(titleCell, args) | ||
local currentFrame = mw.getCurrentFrame() | |||
if navbar ~= 'off' and navbar ~= 'plain' and | 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 | ||
if not styleratio then | |||
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 '') | ||
local gear = currentFrame:expandTemplate{ | |||
title = 'Tnavbar-view', | |||
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( | :wikitext(gear) | ||
end | end | ||
Строка 123: | Строка 211: | ||
-- Title row | -- Title row | ||
-- | -- | ||
local function renderTitleRow(tbl) | local function renderTitleRow(tbl, args) | ||
if not | if not args.title then return end | ||
local titleRow = tbl:tag('tr') | local titleRow = tbl:tag('tr') | ||
Строка 134: | Строка 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', ' | local titleCell = titleRow:tag('th'):attr('scope', 'colgroup') | ||
if args.titlegroup then | if args.titlegroup then | ||
Строка 149: | Строка 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( | :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( | :wikitext(addNewline(args.title)) | ||
end | end | ||
Строка 174: | Строка 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 | ||
Строка 213: | Строка 301: | ||
-- | -- | ||
local function haveSubgroups() | local function haveSubgroups(args) | ||
for i = 1, 23 do | for i = 1, 23 do | ||
if (args | if checkElAliases(args, 'group', i) and checkElAliases(args, 'list', i) then | ||
return true | return true | ||
end | end | ||
Строка 222: | Строка 310: | ||
end | end | ||
local function renderListRow(tbl, index, | 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', | :attr('rowspan', rowspan) | ||
:tag('div') | :tag('div') | ||
:wikitext(addNewline(imageleft)) | :wikitext(addNewline(args.imageleft)) | ||
end | end | ||
if | if rowArgs.group then | ||
local groupCell = row:tag('th') | local groupCell = row:tag('th') | ||
Строка 244: | Строка 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( | :cssText(rowArgs.groupstyle) | ||
:wikitext( | :wikitext(rowArgs.group) | ||
end | end | ||
local listCell = row:tag('td') | local listCell = row:tag('td') | ||
if | if rowArgs.group then | ||
listCell | listCell | ||
:css('text-align', 'left') | :css('text-align', 'left') | ||
Строка 262: | Строка 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) | ||
Строка 268: | Строка 356: | ||
end | end | ||
if not groupwidth then | if not args.groupwidth then | ||
listCell:css('width', '100%') | listCell:css('width', '100%') | ||
end | end | ||
local listText = | 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 | ||
Строка 280: | Строка 368: | ||
listCell | listCell | ||
:css('padding', '0px') | :css('padding', '0px') | ||
:cssText(liststyle) | :cssText(args.liststyle) | ||
:cssText( | :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 | :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', | :attr('rowspan', rowspan) | ||
:tag('div') | :tag('div') | ||
:wikitext(addNewline(image)) | :wikitext(addNewline(args.image)) | ||
end | end | ||
end | end | ||
Строка 306: | Строка 395: | ||
-- Tracking categories | -- Tracking categories | ||
-- | -- | ||
local function needsChangetoSubgroups() | local function needsChangetoSubgroups(args) | ||
for i = 1, 23 do | for i = 1, 23 do | ||
if (args | if (checkElAliases(args, 'group', i)) and not (checkElAliases(args, 'list', i)) then | ||
return true | return true | ||
end | end | ||
Строка 315: | Строка 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 | ||
Строка 324: | Строка 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 | ||
Строка 331: | Строка 420: | ||
-- end | -- end | ||
local function isIllegible() | local function isIllegible(args) | ||
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 | ||
Строка 344: | Строка 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 | ||
Строка 358: | Строка 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 | ||
Строка 366: | Строка 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 | if args.title and (args.state ~= 'plain' and args.state ~= 'off') then | ||
tbl | tbl | ||
:addClass('collapsible') | :addClass('collapsible') | ||
Строка 378: | Строка 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) | ||
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 | ||
Строка 391: | Строка 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, | 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 | -- Read the arguments in the order they'll be output in, to make references number in the right order. | ||
args = | 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+)$') | ||
Строка 411: | Строка 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 | ||
for argname, aliasesList in pairs(commonAliases) do | |||
args[argname] = checkAliases(args, aliasesList) | |||
end | |||
for argname, aliasesList in pairs(standardAliases) do | |||
args[argname] = checkAliases(args, aliasesList) | |||
end | |||
args.navigation = yesno(args.navigation, '') | |||
-- 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 | if args.title then | ||
nav:attr('aria-labelledby', mw.uri.anchorEncode( | 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 | |||
if args.navigation == true then | |||
nav:attr('data-navboxnavigation', '1') | |||
elseif args.navigation == false then | |||
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 | ||
Строка 475: | Строка 572: | ||
:attr('role', 'navigation') | :attr('role', 'navigation') | ||
:addClass('navbox') | :addClass('navbox') | ||
:cssText(bodystyle | :cssText(args.bodystyle) | ||
:node(tbl) | :node(tbl) | ||
if | if args.title then | ||
nav:attr('aria-labelledby', mw.uri.anchorEncode( | 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 | |||
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 | ||
Строка 498: | Строка 598: | ||
if not getArgs then | if not getArgs then | ||
getArgs = require('Module:Arguments').getArgs | getArgs = require('Module:Arguments').getArgs | ||
end | |||
if not yesno then | |||
yesno = require('Module:Yesno') | |||
end | end | ||
args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Подгруппы навигационной таблицы'}}) | args = getArgs(frame, {wrappers = {'Шаблон:Навигационная таблица', 'Шаблон:Подгруппы навигационной таблицы'}}) | ||
Строка 505: | Строка 608: | ||
end | end | ||
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 |