Изменения
Перейти к навигации
Перейти к поиску
Строка 1:
Строка 1:
− +
− +
− +
− +
+
− local frame
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
− +
− +
− +
+
+
+
+
+
+
+
+
− .tag('tr') +
− .css('height', '2px') +
− .tag('td') +
+
− +
−
− return tbl.tag('tr')
− end
− +
− --
− -- Title row
− --
− function renderTitleRow(tbl)
− if not args.title then return end
−
− local titleRow = addTableRow(tbl)
−
− if args.titlegroup then
− titleRow
− .tag('th')
− .attr('scope', 'row')
− .addClass('navbox-group')
− .addClass(args.titlegroupclass)
− .cssText(args.basestyle)
− .cssText(args.groupstyle)
− .cssText(args.titlegroupstyle)
− .wikitext(args.titlegroup)
− end
−
− local titleCell = titleRow.tag('th').attr('scope', 'col')
−
− if args.titlegroup then
− titleCell
− .css('border-left', '2px solid #fdfdfd')
− .css('width', '100%')
− end
−
− local titleColspan = 2
− if args.imageleft then titleColspan = titleColspan + 1 end
− if args.image then titleColspan = titleColspan + 1 end
− if args.titlegroup then titleColspan = titleColspan - 1 end
−
− titleCell
− .cssText(args.basestyle)
− .cssText(args.titlestyle)
− .addClass('navbox-title')
− .attr('colspan', titleColspan)
−
− renderNavBar(titleCell)
−
− titleCell
− .tag('div')
− .addClass(args.titleclass)
− .css('font-size', '110%')
− .newline()
− .wikitext(args.title)
− +
Строка 90:
Строка 65:
− +
Строка 97:
Строка 72:
− local Navbar = require('Module:Navbar')+
− +
− args.name, +
− +
− +
− +
− +
− .tag('span') +
− .css('float', spacerSide) +
− .css('width', '6em') +
− .wikitext(' ') +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
− +
− +
− +
+
+
+
+
+
+
+
+
− .tag('td') +
− .addClass('navbox-abovebelow') +
− .addClass(args.aboveclass) +
− .cssText(args.basestyle) +
− .cssText(args.abovestyle) +
− .attr('colspan', getAboveBelowColspan()) +
− .tag('div') +
− .newline() +
− .wikitext(args.above)
− +
− +
− +
− .tag('td') +
− .addClass('navbox-abovebelow') +
− .addClass(args.belowclass) +
− .cssText(args.basestyle) +
− .cssText(args.belowstyle) +
− .attr('colspan', getAboveBelowColspan()) +
− .tag('div') +
− .newline() +
− .wikitext(args.below)
− function getAboveBelowColspan()
− local ret = 2
− if args.imageleft then ret = ret + 1 end
− if args.image then ret = ret + 1 end
− return ret
− end
−
−
− +
− +
− .tag('td') +
− .addClass('navbox-image') +
− .addClass(args.imageclass) +
− .css('width', '0%') +
− .css('padding', '0px 2px 0px 0px') +
− .cssText(args.imageleftstyle) +
− .attr('rowspan', 2 * #listnums - 1) +
− .tag('div') +
− .newline() +
− .wikitext(args.imageleft)
− +
− +
− local groupCell = row.tag('th')+
− +
− .attr('scope', 'row')+
− .addClass('navbox-group')+
− .addClass(args.groupclass)+
− .cssText(args.basestyle)+
− +
− +
− +
− .cssText(args.groupstyle) +
− .cssText(args['group' .. listnum .. 'style']) +
− .wikitext(args['group' .. listnum]) +
−
− local listCell = row.tag('td')
− +
+
+
− .css('text-align', 'left') +
− .css('border-left-width', '2px') +
− .css('border-left-style', 'solid') +
− +
− +
− +
− +
− +
− +
− +
− +
Строка 221:
Строка 240:
− +
− .css('padding', '0px') +
− .cssText(args.liststyle) +
− .cssText(rowstyle) +
− .cssText(args['list' .. listnum .. 'style']) +
− .addClass('navbox-list') +
− .addClass('navbox-' .. evenOdd) +
− .addClass(args.listclass) +
− .tag('div') +
− .css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em') +
− .newline() +
− .wikitext(args['list' .. listnum])
− +
− .tag('td') +
− .addClass('navbox-image') +
− .addClass(args.imageclass) +
− .css('width', '0%') +
− .css('padding', '0px 0px 0px 2px') +
− .cssText(args.imagestyle) +
− .attr('rowspan', 2 * #listnums - 1) +
− .tag('div') +
− .newline() +
− .wikitext(args.image)
Строка 254:
Строка 271:
− function renderTrackingCategories(builder)
− local frame = mw.getCurrentFrame()
−
− if not frame then return end
−
− local s = frame:preprocess('{{#ifeq:{{NAMESPACE}}|{{ns:10}}|1|0}}{{SUBPAGENAME}}')
− if mw.ustring.sub(s, 1, 1) == '0' then return end -- not in template space
− local subpage = mw.ustring.lower(mw.ustring.sub(s, 2))
− if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
−
− for i, cat in ipairs(getTrackingCategories()) do
− builder.wikitext('[[Category:' .. cat .. ']]')
− end
− end
− +
− local cats = {} +
− if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end
− if hasBackgroundColors() then table.insert(cats, 'Шаблоны, использующие фоновые цвета') end
− return cats
−
− function needsHorizontalLists()
− if border == 'child' or border == 'subgroup' or args.tracking == 'no' then return false end
−
Строка 289:
Строка 285:
− +
− +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
− +
− +
− .attr('cellspacing', 0) +
− .addClass('nowraplinks')+
− .addClass(args.bodyclass) +
− +
−
− .addClass('collapsible') +
− .addClass(args.state or 'autocollapse') +
− +
− +
− .addClass('navbox-subgroup') +
− .cssText(args.bodystyle) +
− .cssText(args.style) +
− .addClass('navbox-inner') +
− .css('background', 'transparent') +
− .css('color', 'inherit') +
− +
− +
− +
− +
Строка 335:
Строка 361:
− +
− +
− +
− +
+
+
+
+
+
+
+
+
+
+
+
+
+
− +
− +
Строка 356:
Строка 395:
− .tag('/div', {unclosed = true}) +
− .done()+
− .node(tbl) +
− .tag('div', {unclosed = true})
− .tag('table') +
− .attr('cellspacing', 0) +
− .addClass(args.navboxclass or 'navbox')+
− .css('border-spacing', 0) +
− .cssText(args.bodystyle) +
− .cssText(args.style) +
− .tag('tr') +
− .tag('td') +
− .css('padding', '2px') +
− .node(tbl)
− +
− +
− +
− -- ParserFunctions considers the empty string to be false, so to preserve the previous +
− -- behavior of {{navbox}}, change any empty arguments to nil, so Lua will consider+
− -- them false too. +
− local args = {} +
− local parent_args = frame:getParent().args;
− +
− +
− temp = parent_args.title; +
− temp = parent_args.above; +
− temp = parent_args["group" .. tostring(i)]; +
− temp = parent_args["list" .. tostring(i)]; +
− end
− temp = parent_args.below;
−
− for k, v in pairs(parent_args) do
− if v ~= '' then
− args[k] = v
− end
+
+
− +
Модуль:Navbox/sandbox по запросу на ВП:ЗКТА
--
--
-- This module will implement {{Navbox}}
-- This module implements {{Navbox}}
--
--
local p = {}
local p = {}
local HtmlBuilder = require('Module:HtmlBuilder')
local navbar = require('Module:Navbar')._navbar
local getArgs -- lazily initialized
local args
local args
local tableRowAdded = false
local tableRowAdded = false
local border
local border
local maintitle
local name
local above
local image
local below
local titlestyle
local groupstyle
local bodystyle
local basestyle
local liststyle
local oddstyle
local evenstyle
local abovestyle
local belowstyle
local listnums = {}
local listnums = {}
function trim(s)
local function trim(s)
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))
end
end
function addTableRow(tbl)
local function addNewline(s)
if s:match('^[*:;#]') or s:match('^{|') then
return '\n' .. s ..'\n'
else
return s
end
end
local function addTableRow(tbl)
-- If any other rows have already been added, then we add a 2px gutter row.
-- If any other rows have already been added, then we add a 2px gutter row.
if tableRowAdded then
if tableRowAdded then
tbl
tbl
:tag('tr')
:css('height', '2px')
:tag('td')
:attr('colspan',2)
end
end
tableRowAdded = true
tableRowAdded = true
return tbl:tag('tr')
end
end
function renderNavBar(titleCell)
local function renderNavBar(titleCell)
-- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
-- Depending on the presence of the navbar and/or show/hide link, we may need to add a spacer div on the left
-- or right to keep the title centered.
-- or right to keep the title centered.
-- also no show/hide link, then we need a spacer on the right to achieve the left shift.
-- also no show/hide link, then we need a spacer on the right to achieve the left shift.
if args.state == 'plain' then spacerSide = 'right' end
if args.state == 'plain' then spacerSide = 'right' end
elseif args.navbar == 'plain' or args.navbar == 'off' or (not args.name and (border == 'subgroup' or border == 'child' or border == 'none')) then
elseif args.navbar == 'plain' or (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Шаблон:Навигационная таблица/Тестовый') then
-- No navbar. Need a spacer on the left to balance out the width of the show/hide link.
-- No navbar. Need a spacer on the left to balance out the width of the show/hide link.
if args.state ~= 'plain' then spacerSide = 'left' end
if args.state ~= 'plain' then spacerSide = 'left' end
-- to balance out the width of the navbar.
-- to balance out the width of the navbar.
if args.state == 'plain' then spacerSide = 'right' end
if args.state == 'plain' then spacerSide = 'right' end
titleCell.wikitext(Navbar.navbar({
titleCell:wikitext(navbar{
name,
mini = 1,
mini = 1,
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;'
fontstyle = (basestyle or '') .. ';' .. (titlestyle or '') .. ';background:none transparent;border:none;'
}))
})
end
end
-- Render the spacer div.
-- Render the spacer div.
if spacerSide then
if spacerSide then
titleCell
titleCell
:tag('span')
:css('float', spacerSide)
:css('width', '6em')
:wikitext(' ')
end
end
end
end
--
-- Title row
--
local function renderTitleRow(tbl)
if not maintitle then return end
local titleRow = addTableRow(tbl)
if args.titlegroup then
titleRow
:tag('th')
:attr('scope', 'row')
:addClass('navbox-group')
:addClass(args.titlegroupclass)
:cssText(basestyle)
:cssText(groupstyle)
:cssText(args.titlegroupstyle)
:wikitext(args.titlegroup)
end
local titleCell = titleRow:tag('th'):attr('scope', 'col')
if args.titlegroup then
titleCell
:css('border-left', '2px solid #fdfdfd')
:css('width', '100%')
end
local titleColspan = 2
if args.imageleft then titleColspan = titleColspan + 1 end
if image then titleColspan = titleColspan + 1 end
if args.titlegroup then titleColspan = titleColspan - 1 end
titleCell
:cssText(basestyle)
:cssText(titlestyle)
:addClass('navbox-title')
:attr('colspan', titleColspan)
renderNavBar(titleCell)
titleCell
:tag('div')
:addClass(args.titleclass)
:css('font-size', '114%')
:wikitext(addNewline(maintitle))
end
--
--
-- Above/Below rows
-- Above/Below rows
--
--
function renderAboveRow(tbl)
if not args.above then return end
local function getAboveBelowColspan()
local ret = 2
if args.imageleft then ret = ret + 1 end
if image then ret = ret + 1 end
return ret
end
local function renderAboveRow(tbl)
if not above then return end
addTableRow(tbl)
addTableRow(tbl)
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.aboveclass)
:cssText(basestyle)
:cssText(abovestyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(addNewline(above))
end
end
function renderBelowRow(tbl)
local function renderBelowRow(tbl)
if not args.below then return end
if not below then return end
addTableRow(tbl)
addTableRow(tbl)
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.belowclass)
:cssText(basestyle)
:cssText(belowstyle)
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(addNewline(below))
end
end
--
--
-- List rows
-- List rows
--
--
function renderListRow(tbl, listnum)
local function renderListRow(tbl, listnum)
local row = addTableRow(tbl)
local row = addTableRow(tbl)
if listnum == 1 and args.imageleft then
if listnum == 1 and args.imageleft then
row
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclass)
:css('width', '0%')
:css('padding', '0px 2px 0px 0px')
:cssText(args.imageleftstyle)
:attr('rowspan', 2 * #listnums - 1)
:tag('div')
:wikitext(addNewline(args.imageleft))
end
end
if args['group' .. listnum] then
if (args['group' .. listnum] or args['заголовок' .. listnum]) then
local groupCell = row:tag('th')
groupCell
groupCell
:attr('scope', 'row')
:addClass('navbox-group')
:addClass(args.groupclass)
:cssText(basestyle)
if args.groupwidth then
if args.groupwidth then
groupCell.css('width', args.groupwidth)
groupCell:css('width', args.groupwidth)
end
end
groupCell
groupCell
:cssText(groupstyle)
:cssText(args['group' .. listnum .. 'style'])
:wikitext(args['group' .. listnum] or args['заголовок' .. listnum])
end
end
if args['group' .. listnum] then
local listCell = row:tag('td')
if (args['group' .. listnum] or args['заголовок' .. listnum]) then
listCell
listCell
:css('text-align', 'left')
:css('border-left-width', '2px')
:css('border-left-style', 'solid')
else
else
listCell.attr('colspan', 2)
listCell:attr('colspan', 2)
end
end
if not args.groupwidth then
if not args.groupwidth then
listCell.css('width', '100%')
listCell:css('width', '100%')
end
end
local isOdd = (listnum % 2) == 1
local isOdd = (listnum % 2) == 1
local rowstyle = args.evenstyle
local rowstyle = evenstyle
if isOdd then rowstyle = args.oddstyle end
if isOdd then rowstyle = oddstyle end
local evenOdd
local evenOdd
if args.evenodd == 'swap' then
if args.evenodd == 'swap' then
if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end
if isOdd then evenOdd = args.evenodd or 'odd' else evenOdd = args.evenodd or 'even' end
end
end
listCell
listCell
:css('padding', '0px')
:cssText(liststyle)
:cssText(rowstyle)
:cssText(args['list' .. listnum .. 'style'])
:addClass('navbox-list')
:addClass('navbox-' .. evenOdd)
:addClass(args.listclass)
:tag('div')
:css('padding', (listnum == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
:wikitext(addNewline(args['list' .. listnum] or args['список' .. listnum]))
if listnum == 1 and args.image then
if listnum == 1 and image then
row
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclass)
:css('width', '0%')
:css('padding', '0px 0px 0px 2px')
:cssText(args.imagestyle)
:attr('rowspan', 2 * #listnums - 1)
:tag('div')
:wikitext(addNewline(image))
end
end
end
end
-- Tracking categories
-- Tracking categories
--
--
function getTrackingCategories()
local function needsHorizontalLists()
if border == 'child' or border == 'subgroup' or args.tracking == 'no' then return false end
end
local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
local listClasses = {'plainlist', 'hlist', 'hlist hnum', 'hlist hwrap', 'hlist vcard', 'vcard hlist', 'hlist vevent'}
for i, cls in ipairs(listClasses) do
for i, cls in ipairs(listClasses) do
end
end
function hasBackgroundColors()
local function hasBackgroundColors()
return args.titlestyle or args.groupstyle
return mw.ustring.match(titlestyle or '','background') or mw.ustring.match(groupstyle or '','background') or mw.ustring.match(basestyle or '','background')
end
end
local function isIllegible()
local styleratio = require('Module:Color contrast')._styleratio
for key, style in pairs(args) do
if tostring(key):match("style$") then
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then
return true
end
end
end
return false
end
local function getTrackingCategories()
local cats = {}
if needsHorizontalLists() then table.insert(cats, 'Навигационные таблицы без горизонтальных списков') end
if hasBackgroundColors() then table.insert(cats, 'Навигационные таблицы, использующие фоновые цвета') end
if isIllegible() then table.insert(cats, 'Потенциально нечитаемые навигационные блоки') end
return cats
end
local function renderTrackingCategories(builder)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 then return end -- not in template space
local subpage = title.subpageText
if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
for i, cat in ipairs(getTrackingCategories()) do
builder:wikitext('[[Категория:' .. cat .. ']]')
end
end
--
--
-- Main navbox tables
-- Main navbox tables
--
--
function renderMainTable()
local function renderMainTable()
local tbl = HtmlBuilder.create('table')
local tbl = mw.html.create('table')
:addClass('nowraplinks')
: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(args.state or 'autocollapse')
end
end
tbl.css('border-spacing', 0)
tbl:css('border-spacing', 0)
if border == 'subgroup' or border == 'child' or border == 'none' then
if border == 'subgroup' or border == 'child' or border == 'none' then
tbl
tbl
:addClass('navbox-subgroup')
:cssText(bodystyle)
:cssText(args.style)
else -- regular navobx - bodystyle and style will be applied to the wrapper table
else -- regular navobx - bodystyle and style will be applied to the wrapper table
tbl
tbl
:addClass('navbox-inner')
:css('background', 'transparent')
:css('color', 'inherit')
end
end
tbl.cssText(args.innerstyle)
tbl:cssText(args.innerstyle)
renderTitleRow(tbl)
renderTitleRow(tbl)
renderAboveRow(tbl)
renderAboveRow(tbl)
for i, listnum in ipairs(listnums) do
for i, listnum in ipairs(listnums) do
renderListRow(tbl, listnum)
renderListRow(tbl, listnum)
end
end
renderBelowRow(tbl)
renderBelowRow(tbl)
return tbl
return tbl
end
end
function p._navbox(navboxArgs)
function p._navbox(navboxArgs)
args = navboxArgs
args = navboxArgs
for k, v in pairs(args) do
for k, v in pairs(args) do
local listnum = ('' .. k):match('^list(%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
end
table.sort(listnums)
table.sort(listnums)
border = trim(args.border or args[1] or '')
border = trim(args.border or args[1] or '')
maintitle = args.title or args['заголовок']
name = args.name or args['имя']
above = args.above or args['вверху']
image = args.image or args['изображение']
below = args.below or args['внизу']
titlestyle = args.titlestyle or args['стиль_основного_заголовка']
groupstyle = args.groupstyle or args['стиль_заголовков']
bodystyle = args.bodystyle or args['стиль_тела']
basestyle = args.basestyle or args['стиль']
liststyle = args.liststyle or args['стиль_списков']
oddstyle = args.oddstyle or args['стиль_нечетных']
evenstyle = args.evenstyle or args['стиль_четных']
abovestyle = args.abovestyle or args['стиль_вверху']
belowstyle = args.belowstyle or args['стиль_внизу']
-- render the main body of the navbox
-- render the main body of the navbox
local tbl = renderMainTable()
local tbl = renderMainTable()
-- 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 = HtmlBuilder.create()
local res = mw.html.create()
if border == 'none' then
if border == 'none' then
res.node(tbl)
res:node(tbl)
elseif border == 'subgroup' or border == 'child' then
elseif border == 'subgroup' or border == 'child' 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
-- padding being applied, and at the end add a <div> to balance out the parent's </div>
-- padding being applied, and at the end add a <div> to balance out the parent's </div>
res
res
:wikitext('</div>') -- XXX: hack due to lack of unclosed support in mw.html.
:node(tbl)
:wikitext('<div>') -- XXX: hack due to lack of unclosed support in mw.html.
else
else
res
res
:tag('table')
:addClass('navbox')
:css('border-spacing', 0)
:cssText(bodystyle)
:cssText(args.style)
:tag('tr')
:tag('td')
:css('padding', '2px')
:node(tbl)
end
end
renderTrackingCategories(res)
renderTrackingCategories(res)
return tostring(res)
return tostring(res)
end
end
function p.navbox(frame)
function p.navbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame, {wrappers = 'Шаблон:Навигационная таблица/Тестовый'})
-- Out of order parsing bug.
-- Read the arguments in the order they'll be output in, to make references number in the right order.
local temp;
local _
_ = maintitle
_ = above
for i = 1, 20 do
for i = 1, 20 do
_ = args["group" .. tostring(i)] and args["заголовок" .. tostring(i)]
_ = args["list" .. tostring(i)] and args["список" .. tostring(i)]
end
end
_ = below
return p._navbox(args)
return p._navbox(args)
end
end
return p
return p