Mudanças entre as edições de "Módulo:Navbox"

Origem: IRChelp Brasil - Wiki
Ir para navegação Ir para pesquisar
(Criação do Módulo Navbox.)
 
 
Linha 5: Linha 5:
 
local p = {}
 
local p = {}
  
local navbar = require('Módulo:Navbar')._navbar
+
local navbar = require('Module:Navbar')._navbar
 
local getArgs -- lazily initialized
 
local getArgs -- lazily initialized
  
Linha 20: Linha 20:
 
-- by parent navboxes. The result is that the category shows all pages
 
-- by parent navboxes. The result is that the category shows all pages
 
-- where a child navbox is not contained in a parent navbox.
 
-- where a child navbox is not contained in a parent navbox.
local orphanCat = '[[Categoria:!Navecaixas órfãs]]'
+
local orphanCat = '[[Category:Navbox orphans]]'
local argsOrphan = args.orphan or args['órfã']
+
if border == 'subgroup' and args.orphan ~= 'yes' then
if border == 'subgroup' and argsOrphan ~= 'yes' and argsOrphan ~= 'sim' or border == 'subgrupo' and argsOrphan ~= 'yes' and argsOrphan ~= 'sim' 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 args.evenodd or args['pares-ímpares'] then
+
if args.evenodd then
if args.evenodd == 'swap' or args.evenodd == 'trocar' or args['pares-ímpares'] == 'swap' or args['pares-ímpares'] == 'trocar' then
+
if args.evenodd == 'swap' then
 
first, second = second, first
 
first, second = second, first
 
else
 
else
first = args.evenodd or args['pares-ímpares']
+
first = args.evenodd
 
second = first
 
second = first
 
end
 
end
Linha 63: Linha 62:
 
return '\n' .. item ..'\n'
 
return '\n' .. item ..'\n'
 
end
 
end
if nowrapitems == 'yes' or nowrapitems == 'sim' then
+
if nowrapitems == 'yes' then
 
local lines = {}
 
local lines = {}
 
for line in (item .. '\n'):gmatch('([^\n]*)\n') do
 
for line in (item .. '\n'):gmatch('([^\n]*)\n') do
Linha 82: Linha 81:
 
local function renderNavBar(titleCell)
 
local function renderNavBar(titleCell)
  
local argsName = args.name or args.nome
+
if args.navbar ~= 'off' and args.navbar ~= 'plain' and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then
if args.navbar ~= 'off' and args.navbar ~= 'desligada' and args.navbar ~= 'desligado' and args.navbar ~= 'desligar' and args.navbar ~= 'plain' and args.navbar ~= 'simples' and not (not argsName and mw.getCurrentFrame():getParent():getTitle():gsub('/Testes$', '') == 'Predefinição:Navbox') then
 
 
titleCell:wikitext(navbar{
 
titleCell:wikitext(navbar{
argsName,
+
args.name,
 
mini = 1,
 
mini = 1,
fontstyle = (args.basestyle or args['estilo-base'] or '') .. ';' .. (args.titlestyle or args['estilo-título'] or '') .. ';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;'
+
fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;'
 
})
 
})
 
end
 
end
Linha 97: Linha 95:
 
--
 
--
 
local function renderTitleRow(tbl)
 
local function renderTitleRow(tbl)
if not args.title and not args['título'] then return end
+
if not args.title then return end
  
 
local titleRow = tbl:tag('tr')
 
local titleRow = tbl:tag('tr')
  
if args.titlegroup or args['grupo-título'] then
+
if args.titlegroup then
 
titleRow
 
titleRow
 
:tag('th')
 
:tag('th')
 
:attr('scope', 'row')
 
:attr('scope', 'row')
 
:addClass('navbox-group')
 
:addClass('navbox-group')
:addClass(args.titlegroupclass or args['classe-grupo-título'])
+
:addClass(args.titlegroupclass)
:cssText(args.basestyle or args['estilo-base'])
+
:cssText(args.basestyle)
:cssText(args.groupstyle or args['estilo-grupo'])
+
:cssText(args.groupstyle)
:cssText(args.titlegroupstyle or args['estilo-grupo-título'])
+
:cssText(args.titlegroupstyle)
:wikitext(args.titlegroup or args['grupo-título'])
+
:wikitext(args.titlegroup)
 
end
 
end
  
 
local titleCell = titleRow:tag('th'):attr('scope', 'col')
 
local titleCell = titleRow:tag('th'):attr('scope', 'col')
  
if args.titlegroup or args['grupo-título'] then
+
if args.titlegroup then
 
titleCell
 
titleCell
 
:css('border-left', '2px solid #fdfdfd')
 
:css('border-left', '2px solid #fdfdfd')
Linha 122: Linha 120:
  
 
local titleColspan = 2
 
local titleColspan = 2
if args.imageleft or args['imagem-esquerda'] then titleColspan = titleColspan + 1 end
+
if args.imageleft then titleColspan = titleColspan + 1 end
if args.image or args.imagem then titleColspan = titleColspan + 1 end
+
if args.image then titleColspan = titleColspan + 1 end
if args.titlegroup or args['grupo-título'] then titleColspan = titleColspan - 1 end
+
if args.titlegroup then titleColspan = titleColspan - 1 end
  
 
titleCell
 
titleCell
:cssText(args.basestyle or args['estilo-base'])
+
:cssText(args.basestyle)
:cssText(args.titlestyle or args['estilo-título'])
+
:cssText(args.titlestyle)
 
:addClass('navbox-title')
 
:addClass('navbox-title')
 
:attr('colspan', titleColspan)
 
:attr('colspan', titleColspan)
Linha 137: Linha 135:
 
:tag('div')
 
:tag('div')
 
-- id for aria-labelledby attribute
 
-- id for aria-labelledby attribute
:attr('id', mw.uri.anchorEncode(args.title or args['título']))
+
:attr('id', mw.uri.anchorEncode(args.title))
:addClass(args.titleclass or args['classe-título'])
+
:addClass(args.titleclass)
 
:css('font-size', '114%')
 
:css('font-size', '114%')
 
:css('margin', '0 4em')
 
:css('margin', '0 4em')
:wikitext(processItem(args.title or args['título']))
+
:wikitext(processItem(args.title))
 
end
 
end
  
Linha 150: Linha 148:
 
local function getAboveBelowColspan()
 
local function getAboveBelowColspan()
 
local ret = 2
 
local ret = 2
if args.imageleft or args['imagem-esquerda'] then ret = ret + 1 end
+
if args.imageleft then ret = ret + 1 end
if args.image or args.imagem 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)
if not args.above and not args.acima 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(args.aboveclass or args['classe-acima'])
+
:addClass(args.aboveclass)
:cssText(args.basestyle or args['estilo-base'])
+
:cssText(args.basestyle)
:cssText(args.abovestyle or args['estilo-acima'])
+
:cssText(args.abovestyle)
 
:attr('colspan', getAboveBelowColspan())
 
:attr('colspan', getAboveBelowColspan())
 
:tag('div')
 
:tag('div')
 
-- id for aria-labelledby attribute, if no title
 
-- id for aria-labelledby attribute, if no title
:attr('id', args.title and nil or args['título'] and nil or mw.uri.anchorEncode(args.above or args.acima))
+
:attr('id', args.title and nil or mw.uri.anchorEncode(args.above))
:wikitext(processItem(args.above or args.acima, args.nowrapitems or args['nowrap-itens']))
+
:wikitext(processItem(args.above, args.nowrapitems))
 
end
 
end
  
 
local function renderBelowRow(tbl)
 
local function renderBelowRow(tbl)
if not args.below and not args.abaixo 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(args.belowclass or args['classe-abaixo'])
+
:addClass(args.belowclass)
:cssText(args.basestyle or args['estilo-base'])
+
:cssText(args.basestyle)
:cssText(args.belowstyle or args['estilo-abaixo'])
+
:cssText(args.belowstyle)
 
:attr('colspan', getAboveBelowColspan())
 
:attr('colspan', getAboveBelowColspan())
 
:tag('div')
 
:tag('div')
:wikitext(processItem(args.below or args.abaixo, args.nowrapitems or args['nowrap-itens']))
+
:wikitext(processItem(args.below, args.nowrapitems))
 
end
 
end
  
Linha 191: Linha 189:
 
local row = tbl:tag('tr')
 
local row = tbl:tag('tr')
  
if index == 1 and args.imageleft or index == 1 and args['imagem-esquerda'] then
+
if index == 1 and args.imageleft then
 
row
 
row
 
:tag('td')
 
:tag('td')
 
:addClass('navbox-image')
 
:addClass('navbox-image')
:addClass(args.imageclass or args['classe-imagem'])
+
:addClass(args.imageclass)
 
:css('width', '1px')              -- Minimize width
 
:css('width', '1px')              -- Minimize width
 
:css('padding', '0px 2px 0px 0px')
 
:css('padding', '0px 2px 0px 0px')
:cssText(args.imageleftstyle or args['estilo-imagem-esquerda'])
+
:cssText(args.imageleftstyle)
 
:attr('rowspan', #listnums)
 
:attr('rowspan', #listnums)
 
:tag('div')
 
:tag('div')
:wikitext(processItem(args.imageleft or args['imagem-esquerda']))
+
:wikitext(processItem(args.imageleft))
 
end
 
end
  
if args['group' .. listnum] or args['grupo' .. listnum] then
+
if args['group' .. listnum] then
 
local groupCell = row:tag('th')
 
local groupCell = row:tag('th')
  
 
-- id for aria-labelledby attribute, if lone group with no title or above
 
-- id for aria-labelledby attribute, if lone group with no title or above
if listnum == 1 and not (args.title or args['título'] or args.above or args.acima or args.group2 or args.grupo2) then
+
if listnum == 1 and not (args.title or args.above or args.group2) then
 
groupCell
 
groupCell
:attr('id', mw.uri.anchorEncode(args.group1 or args.grupo1))
+
:attr('id', mw.uri.anchorEncode(args.group1))
 
end
 
end
  
Linha 216: Linha 214:
 
:attr('scope', 'row')
 
:attr('scope', 'row')
 
:addClass('navbox-group')
 
:addClass('navbox-group')
:addClass(args.groupclass or args['classe-grupo'])
+
:addClass(args.groupclass)
:cssText(args.basestyle or args['estilo-base'])
+
:cssText(args.basestyle)
:css('width', args.groupwidth or args['largura-grupo'] or '1%') -- If groupwidth not specified, minimize width
+
:css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width
  
 
groupCell
 
groupCell
:cssText(args.groupstyle or args['estilo-grupo'])
+
:cssText(args.groupstyle)
:cssText(args['group' .. listnum .. 'style'] or args['estilo-grupo' .. listnum])
+
:cssText(args['group' .. listnum .. 'style'])
:wikitext(args['group' .. listnum] or args['grupo' .. listnum])
+
:wikitext(args['group' .. listnum])
 
end
 
end
  
 
local listCell = row:tag('td')
 
local listCell = row:tag('td')
  
if args['group' .. listnum] or args['grupo' .. listnum] then
+
if args['group' .. listnum] then
 
listCell
 
listCell
 
:css('text-align', 'left')
 
:css('text-align', 'left')
Linha 237: Linha 235:
 
end
 
end
  
if not args.groupwidth and not args['largura-grupo'] then
+
if not args.groupwidth then
 
listCell:css('width', '100%')
 
listCell:css('width', '100%')
 
end
 
end
Linha 243: Linha 241:
 
local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing
 
local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing
 
if index % 2 == 1 then
 
if index % 2 == 1 then
rowstyle = args.oddstyle or args['estilo-ímpares']
+
rowstyle = args.oddstyle
 
else
 
else
rowstyle = args.evenstyle or args['estilo-pares']
+
rowstyle = args.evenstyle
 
end
 
end
  
local listText = args['list' .. listnum] or args['lista' .. listnum]
+
local listText = args['list' .. listnum]
 
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
Linha 256: Linha 254:
 
listCell
 
listCell
 
:css('padding', '0px')
 
:css('padding', '0px')
:cssText(args.liststyle or args['estilo-lista'])
+
:cssText(args.liststyle)
 
:cssText(rowstyle)
 
:cssText(rowstyle)
:cssText(args['list' .. listnum .. 'style'] or args['estilo-lista' .. listnum])
+
:cssText(args['list' .. listnum .. 'style'])
 
:addClass('navbox-list')
 
:addClass('navbox-list')
 
:addClass('navbox-' .. oddEven)
 
:addClass('navbox-' .. oddEven)
:addClass(args.listclass or args['classe-lista'])
+
:addClass(args.listclass)
:addClass(args['list' .. listnum .. 'class'] or args['classe-lista' .. listnum])
+
:addClass(args['list' .. listnum .. 'class'])
 
:tag('div')
 
:tag('div')
:css('padding', (index == 1 and args.list1padding) or (index == 1 and args['padding-lista1']) or args.listpadding or args['padding-lista'] or '0em 0.25em')
+
:css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
:wikitext(processItem(listText, args.nowrapitems or args['nowrap-itens']))
+
:wikitext(processItem(listText, args.nowrapitems))
  
if index == 1 and args.image or index == 1 and args.imagem then
+
if index == 1 and args.image then
 
row
 
row
 
:tag('td')
 
:tag('td')
 
:addClass('navbox-image')
 
:addClass('navbox-image')
:addClass(args.imageclass or args['classe-imagem'])
+
:addClass(args.imageclass)
 
:css('width', '1px')              -- Minimize width
 
:css('width', '1px')              -- Minimize width
 
:css('padding', '0px 0px 0px 2px')
 
:css('padding', '0px 0px 0px 2px')
:cssText(args.imagestyle or args['estilo-imagem'])
+
:cssText(args.imagestyle)
 
:attr('rowspan', #listnums)
 
:attr('rowspan', #listnums)
 
:tag('div')
 
:tag('div')
:wikitext(processItem(args.image or args.imagem))
+
:wikitext(processItem(args.image))
 
end
 
end
 
end
 
end
Linha 287: Linha 285:
  
 
local function needsHorizontalLists()
 
local function needsHorizontalLists()
if border == 'subgroup' or border == 'subgrupo' or args.tracking == 'no' or args.tracking == 'não' or args['monitoramento'] == 'no' or args['monitoramento'] == 'não' then
+
if border == 'subgroup' or args.tracking == 'no' then
 
return false
 
return false
 
end
 
end
Linha 295: Linha 293:
 
['hlist vevent'] = true,
 
['hlist vevent'] = true,
 
}
 
}
return not (listClasses[args.listclass] or listClasses[args['classe-lista']] or listClasses[args.bodyclass] or listClasses[args['classe-corpo']] or listClasses[args.class] or listClasses[args.classe])
+
return not (listClasses[args.listclass] or listClasses[args.bodyclass])
 
end
 
end
  
 
local function hasBackgroundColors()
 
local function hasBackgroundColors()
for _, key in ipairs({'titlestyle', 'estilo-título', 'groupstyle', 'estilo-grupo', 'basestyle', 'estilo-base', 'abovestyle', 'estilo-acima', 'belowstyle', 'estilo-abaixo'}) do
+
for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
 
if tostring(args[key]):find('background', 1, true) then
 
if tostring(args[key]):find('background', 1, true) then
 
return true
 
return true
Linha 307: Linha 305:
  
 
local function hasBorders()
 
local function hasBorders()
for _, key in ipairs({'groupstyle', 'estilo-grupo', 'basestyle', 'estilo-base', 'abovestyle', 'estilo-acima', 'belowstyle', 'estilo-abaixo'}) do
+
for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
 
if tostring(args[key]):find('border', 1, true) then
 
if tostring(args[key]):find('border', 1, true) then
 
return true
 
return true
Linha 315: Linha 313:
  
 
local function isIllegible()
 
local function isIllegible()
local styleratio = require('Módulo:Color contrast')._styleratio
+
local styleratio = require('Module:Color contrast')._styleratio
  
 
for key, style in pairs(args) do
 
for key, style in pairs(args) do
if tostring(key):match("style$") or tostring(key):match("^estilo") then
+
if tostring(key):match("style$") then
 
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then
 
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then
 
return true
 
return true
Linha 329: Linha 327:
 
local function getTrackingCategories()
 
local function getTrackingCategories()
 
local cats = {}
 
local cats = {}
if needsHorizontalLists() then table.insert(cats, '!Navecaixas sem listas horizontais') end
+
if needsHorizontalLists() then table.insert(cats, 'Navigational boxes without horizontal lists') end
if hasBackgroundColors() then table.insert(cats, '!Navecaixas usando cores de fundo') end
+
if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end
if isIllegible() then table.insert(cats, '!Navecaixas potencialmente ilegíveis') end
+
if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end
if hasBorders() then table.insert(cats, '!Navecaixas usando bordas') end
+
if hasBorders() then table.insert(cats, 'Navboxes using borders') end
 
return cats
 
return cats
 
end
 
end
Linha 340: Linha 338:
 
if title.namespace ~= 10 then return end -- not in template space
 
if title.namespace ~= 10 then return end -- not in template space
 
local subpage = title.subpageText
 
local subpage = title.subpageText
if subpage == 'doc' or subpage == 'Testes' or subpage == 'Exemplos para testes' then return end
+
if subpage == 'doc' or subpage == 'sandbox' or subpage == 'testcases' then return end
  
 
for _, cat in ipairs(getTrackingCategories()) do
 
for _, cat in ipairs(getTrackingCategories()) do
builder:wikitext('[[Categoria:' .. cat .. ']]')
+
builder:wikitext('[[Category:' .. cat .. ']]')
 
end
 
end
 
end
 
end
Linha 351: Linha 349:
 
--
 
--
 
local function renderMainTable()
 
local function renderMainTable()
local argsTitle = args.title or args['título']
 
local argsState = args.state or args.estado
 
 
local tbl = mw.html.create('table')
 
local tbl = mw.html.create('table')
 
:addClass('nowraplinks')
 
:addClass('nowraplinks')
:addClass(args.bodyclass or args['classe-corpo'] or args['class'] or args['classe'])
+
:addClass(args.bodyclass)
  
if argsTitle and (argsState ~= 'plain' and argsState ~= 'simples' and argsState ~= 'off' and argsState ~= 'desligada' and argsState ~= 'desligado' and argsState ~= 'desligar') then
+
if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
 +
if args.state == 'collapsed' then args.state = 'mw-collapsed' end
 
tbl
 
tbl
:addClass('collapsible')
+
:addClass('mw-collapsible')
:addClass(argsState or 'autocollapse')
+
:addClass(args.state or 'autocollapse')
 
end
 
end
  
 
tbl:css('border-spacing', 0)
 
tbl:css('border-spacing', 0)
if border == 'subgroup' or border == 'subgrupo' or border == 'none' or border == 'nenhuma' then
+
if border == 'subgroup' or border == 'none' then
 
tbl
 
tbl
 
:addClass('navbox-subgroup')
 
:addClass('navbox-subgroup')
:cssText(args.bodystyle or args['estilo-corpo'])
+
:cssText(args.bodystyle)
:cssText(args.style or args.estilo)
+
:cssText(args.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
Linha 375: Linha 372:
 
:css('color', 'inherit')
 
:css('color', 'inherit')
 
end
 
end
tbl:cssText(args.innerstyle or args['estilo-interno'])
+
tbl:cssText(args.innerstyle)
  
 
renderTitleRow(tbl)
 
renderTitleRow(tbl)
Linha 393: Linha 390:
 
for k, _ in pairs(args) do
 
for k, _ in pairs(args) do
 
if type(k) == 'string' then
 
if type(k) == 'string' then
local listnum = k:match('^list(%d+)$') or k:match('^lista(%d+)$')
+
local listnum = k:match('^list(%d+)$')
 
if listnum then table.insert(listnums, tonumber(listnum)) end
 
if listnum then table.insert(listnums, tonumber(listnum)) end
 
end
 
end
Linha 399: Linha 396:
 
table.sort(listnums)
 
table.sort(listnums)
  
local argsGroup1 = args.group1 or args.grupo1
+
border = mw.text.trim(args.border or args[1] or '')
local argsGroup2 = args.group2 or args.grupo2
+
if border == 'child' then
 
 
border = mw.text.trim(args.border or args.borda or args[1] or '')
 
if border == 'child' or border == 'filho' or border == 'filha' then
 
 
border = 'subgroup'
 
border = 'subgroup'
 
end
 
end
Linha 412: Linha 406:
 
-- 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' or border == 'nenhuma' then
+
if border == 'none' then
 
local nav = res:tag('div')
 
local nav = res:tag('div')
 
:attr('role', 'navigation')
 
:attr('role', 'navigation')
 
:node(tbl)
 
:node(tbl)
 
-- aria-labelledby title, otherwise above, otherwise lone group
 
-- aria-labelledby title, otherwise above, otherwise lone group
if args.title or args['título'] or args.above or args.acima or (argsGroup1 and not argsGroup2) then
+
if args.title or args.above or (args.group1 and not args.group2) then
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args['título'] or args.above or args.acima or args.group1 or args.grupo1))
+
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))
 
else
 
else
 
nav:attr('aria-label', 'Navbox')
 
nav:attr('aria-label', 'Navbox')
 
end
 
end
elseif border == 'subgroup' or border == 'subgrupo' then
+
elseif 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
Linha 434: Linha 428:
 
:attr('role', 'navigation')
 
:attr('role', 'navigation')
 
:addClass('navbox')
 
:addClass('navbox')
:addClass(args.navboxclass or args['classe-navbox'])
+
:addClass(args.navboxclass)
:cssText(args.bodystyle or args['estilo-corpo'])
+
:cssText(args.bodystyle)
:cssText(args.style or args.estilo)
+
:cssText(args.style)
 
:css('padding', '3px')
 
:css('padding', '3px')
 
:node(tbl)
 
:node(tbl)
 
-- aria-labelledby title, otherwise above, otherwise lone group
 
-- aria-labelledby title, otherwise above, otherwise lone group
if args.title or args['título'] or args.above or args.acima or (argsGroup1 and not argsGroup2) then
+
if args.title or args.above or (args.group1 and not args.group2) then
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args['título'] or args.above or args.acima or args.group1 or args.grupo1))
+
nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))
 
else
 
else
 
nav:attr('aria-label', 'Navbox')
 
nav:attr('aria-label', 'Navbox')
Linha 447: Linha 441:
 
end
 
end
  
if args.nocat then
+
if (args.nocat or 'false'):lower() == 'false' then
if args.nocat:lower() == 'false' or args.nocat:lower() == 'falso' or args.nocat:lower() == 'falsa' then
+
renderTrackingCategories(res)
renderTrackingCategories(res)
 
end
 
elseif args.semcat then
 
if args.semcat:lower() == 'false' or args.semcat:lower() == 'falso' or args.semcat:lower() == 'falsa' then
 
renderTrackingCategories(res)
 
end
 
 
end
 
end
 
return striped(tostring(res))
 
return striped(tostring(res))
Linha 461: Linha 449:
 
function p.navbox(frame)
 
function p.navbox(frame)
 
if not getArgs then
 
if not getArgs then
getArgs = require('Módulo:Arguments').getArgs
+
getArgs = require('Module:Arguments').getArgs
 
end
 
end
args = getArgs(frame, {wrappers = {'Predefinição:Navbox', 'Predefinição:Navbox/lua', 'Predefinição:Navbox subgroup'}})
+
args = getArgs(frame, {wrappers = {'Template:Navbox', 'Template:Navbox subgroup'}})
 
if frame.args.border then
 
if frame.args.border then
 
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
 
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
args.border = frame.args.border or frame.args.borda
+
args.border = frame.args.border
 
end
 
end
  
 
-- Read the arguments in the order they'll be output in, to make references number in the right order.
 
-- Read the arguments in the order they'll be output in, to make references number in the right order.
 
local _
 
local _
_ = args.title or args['título']
+
_ = args.title
_ = args.above or args.acima
+
_ = args.above
 
for i = 1, 20 do
 
for i = 1, 20 do
_ = args["group" .. tostring(i)] or args["grupo" .. tostring(i)]
+
_ = args["group" .. tostring(i)]
_ = args["list" .. tostring(i)] or args["lista" .. tostring(i)]
+
_ = args["list" .. tostring(i)]
 
end
 
end
_ = args.below or args.abaixo
+
_ = args.below
  
 
return p._navbox(args)
 
return p._navbox(args)

Edição atual tal como às 21h55min de 23 de março de 2020

Predefinição:Lua sidebar

This module implements the {{Navbox}} template. Please see the template page for usage instructions.

Tracking/maintenance categories


--
-- This module implements {{Navbox}}
--

local p = {}

local navbar = require('Module:Navbar')._navbar
local getArgs -- lazily initialized

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

local function striped(wikitext)
	-- Return wikitext with markers replaced for odd/even striping.
	-- Child (subgroup) navboxes are flagged with a category that is removed
	-- by parent navboxes. The result is that the category shows all pages
	-- where a child navbox is not contained in a parent navbox.
	local orphanCat = '[[Category:Navbox orphans]]'
	if border == 'subgroup' and args.orphan ~= 'yes' then
		-- No change; striping occurs in outermost navbox.
		return wikitext .. orphanCat
	end
	local first, second = 'odd', 'even'
	if args.evenodd then
		if args.evenodd == 'swap' then
			first, second = second, first
		else
			first = args.evenodd
			second = first
		end
	end
	local changer
	if first == second then
		changer = first
	else
		local index = 0
		changer = function (code)
			if code == '0' then
				-- Current occurrence is for a group before a nested table.
				-- Set it to first as a valid although pointless class.
				-- The next occurrence will be the first row after a title
				-- in a subgroup and will also be first.
				index = 0
				return first
			end
			index = index + 1
			return index % 2 == 1 and first or second
		end
	end
	local regex = orphanCat:gsub('([%[%]])', '%%%1')
	return (wikitext:gsub(regex, ''):gsub(REGEX_MARKER, changer))  -- () omits gsub count
end

local function processItem(item, nowrapitems)
	if item:sub(1, 2) == '{|' then
		-- Applying nowrap to lines in a table does not make sense.
		-- Add newlines to compensate for trim of x in |parm=x in a template.
		return '\n' .. item ..'\n'
	end
	if nowrapitems == 'yes' then
		local lines = {}
		for line in (item .. '\n'):gmatch('([^\n]*)\n') do
			local prefix, content = line:match('^([*:;#]+)%s*(.*)')
			if prefix and not content:match('^<span class="nowrap">') then
				line = prefix .. '<span class="nowrap">' .. content .. '</span>'
			end
			table.insert(lines, line)
		end
		item = table.concat(lines, '\n')
	end
	if item:match('^[*:;#]') then
		return '\n' .. item ..'\n'
	end
	return item
end

local function renderNavBar(titleCell)

	if args.navbar ~= 'off' and args.navbar ~= 'plain' and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub('/sandbox$', '') == 'Template:Navbox') then
		titleCell:wikitext(navbar{
			args.name,
			mini = 1,
			fontstyle = (args.basestyle or '') .. ';' .. (args.titlestyle or '') .. ';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;'
		})
	end

end

--
--   Title row
--
local function renderTitleRow(tbl)
	if not args.title then return end

	local titleRow = tbl:tag('tr')

	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')
			-- id for aria-labelledby attribute
			:attr('id', mw.uri.anchorEncode(args.title))
			:addClass(args.titleclass)
			:css('font-size', '114%')
			:css('margin', '0 4em')
			:wikitext(processItem(args.title))
end

--
--   Above/Below rows
--

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

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

	tbl:tag('tr')
		:tag('td')
			:addClass('navbox-abovebelow')
			:addClass(args.aboveclass)
			:cssText(args.basestyle)
			:cssText(args.abovestyle)
			:attr('colspan', getAboveBelowColspan())
			:tag('div')
				-- id for aria-labelledby attribute, if no title
				:attr('id', args.title and nil or mw.uri.anchorEncode(args.above))
				:wikitext(processItem(args.above, args.nowrapitems))
end

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

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

--
--   List rows
--
local function renderListRow(tbl, index, listnum)
	local row = tbl:tag('tr')

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

	if args['group' .. listnum] then
		local groupCell = row:tag('th')

		-- id for aria-labelledby attribute, if lone group with no title or above
		if listnum == 1 and not (args.title or args.above or args.group2) then
			groupCell
				:attr('id', mw.uri.anchorEncode(args.group1))
		end

		groupCell
			:attr('scope', 'row')
			:addClass('navbox-group')
			:addClass(args.groupclass)
			:cssText(args.basestyle)
			:css('width', args.groupwidth or '1%') -- If groupwidth not specified, minimize width

		groupCell
			:cssText(args.groupstyle)
			:cssText(args['group' .. listnum .. 'style'])
			:wikitext(args['group' .. listnum])
	end

	local listCell = row:tag('td')

	if args['group' .. listnum] then
		listCell
			:css('text-align', 'left')
			:css('border-left-width', '2px')
			:css('border-left-style', 'solid')
	else
		listCell:attr('colspan', 2)
	end

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

	local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing
	if index % 2 == 1 then
		rowstyle = args.oddstyle
	else
		rowstyle = args.evenstyle
	end

	local listText = args['list' .. 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(args.liststyle)
		:cssText(rowstyle)
		:cssText(args['list' .. listnum .. 'style'])
		:addClass('navbox-list')
		:addClass('navbox-' .. oddEven)
		:addClass(args.listclass)
		:addClass(args['list' .. listnum .. 'class'])
		:tag('div')
			:css('padding', (index == 1 and args.list1padding) or args.listpadding or '0em 0.25em')
			:wikitext(processItem(listText, args.nowrapitems))

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


--
--   Tracking categories
--

local function needsHorizontalLists()
	if border == 'subgroup' or args.tracking == 'no' then
		return false
	end
	local listClasses = {
		['plainlist'] = true, ['hlist'] = true, ['hlist hnum'] = true,
		['hlist hwrap'] = true, ['hlist vcard'] = true, ['vcard hlist'] = true,
		['hlist vevent'] = true,
	}
	return not (listClasses[args.listclass] or listClasses[args.bodyclass])
end

local function hasBackgroundColors()
	for _, key in ipairs({'titlestyle', 'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
		if tostring(args[key]):find('background', 1, true) then
			return true
		end
	end
end

local function hasBorders()
	for _, key in ipairs({'groupstyle', 'basestyle', 'abovestyle', 'belowstyle'}) do
		if tostring(args[key]):find('border', 1, true) then
			return true
		end
	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, 'Navigational boxes without horizontal lists') end
	if hasBackgroundColors() then table.insert(cats, 'Navboxes using background colours') end
	if isIllegible() then table.insert(cats, 'Potentially illegible navboxes') end
	if hasBorders() then table.insert(cats, 'Navboxes using borders') 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 _, cat in ipairs(getTrackingCategories()) do
		builder:wikitext('[[Category:' .. cat .. ']]')
	end
end

--
--   Main navbox tables
--
local function renderMainTable()
	local tbl = mw.html.create('table')
		:addClass('nowraplinks')
		:addClass(args.bodyclass)

	if args.title and (args.state ~= 'plain' and args.state ~= 'off') then
		if args.state == 'collapsed' then args.state = 'mw-collapsed' end
		tbl
			:addClass('mw-collapsible')
			:addClass(args.state or 'autocollapse')
	end

	tbl:css('border-spacing', 0)
	if border == 'subgroup' or border == 'none' then
		tbl
			:addClass('navbox-subgroup')
			:cssText(args.bodystyle)
			:cssText(args.style)
	else  -- regular navbox - bodystyle and style will be applied to the wrapper table
		tbl
			:addClass('navbox-inner')
			:css('background', 'transparent')
			:css('color', 'inherit')
	end
	tbl:cssText(args.innerstyle)

	renderTitleRow(tbl)
	renderAboveRow(tbl)
	for i, listnum in ipairs(listnums) do
		renderListRow(tbl, i, listnum)
	end
	renderBelowRow(tbl)

	return tbl
end

function p._navbox(navboxArgs)
	args = navboxArgs
	listnums = {}

	for k, _ in pairs(args) do
		if type(k) == 'string' then
			local listnum = k:match('^list(%d+)$')
			if listnum then table.insert(listnums, tonumber(listnum)) end
		end
	end
	table.sort(listnums)

	border = mw.text.trim(args.border or args[1] or '')
	if border == 'child' then
		border = 'subgroup'
	end

	-- render the main body of the navbox
	local tbl = renderMainTable()

	-- render the appropriate wrapper around the navbox, depending on the border param
	local res = mw.html.create()
	if border == 'none' then
		local nav = res:tag('div')
			:attr('role', 'navigation')
			:node(tbl)
		-- aria-labelledby title, otherwise above, otherwise lone group
		if args.title or args.above or (args.group1 and not args.group2) then
			nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))
		else
			nav:attr('aria-label', 'Navbox')
		end
	elseif border == 'subgroup' then
		-- 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
		-- padding being applied, and at the end add a <div> to balance out the parent's </div>
		res
			:wikitext('</div>')
			:node(tbl)
			:wikitext('<div>')
	else
		local nav = res:tag('div')
			:attr('role', 'navigation')
			:addClass('navbox')
			:addClass(args.navboxclass)
			:cssText(args.bodystyle)
			:cssText(args.style)
			:css('padding', '3px')
			:node(tbl)
		-- aria-labelledby title, otherwise above, otherwise lone group
		if args.title or args.above or (args.group1 and not args.group2) then
			nav:attr('aria-labelledby', mw.uri.anchorEncode(args.title or args.above or args.group1))
		else
			nav:attr('aria-label', 'Navbox')
		end
	end

	if (args.nocat or 'false'):lower() == 'false' then
		renderTrackingCategories(res)
	end
	return striped(tostring(res))
end

function p.navbox(frame)
	if not getArgs then
		getArgs = require('Module:Arguments').getArgs
	end
	args = getArgs(frame, {wrappers = {'Template:Navbox', 'Template:Navbox subgroup'}})
	if frame.args.border then
		-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
		args.border = frame.args.border
	end

	-- Read the arguments in the order they'll be output in, to make references number in the right order.
	local _
	_ = args.title
	_ = args.above
	for i = 1, 20 do
		_ = args["group" .. tostring(i)]
		_ = args["list" .. tostring(i)]
	end
	_ = args.below

	return p._navbox(args)
end

return p