Saltar para o conteúdo

Módulo:Navbox

Wikisource, a biblioteca livre
Documentação do módulo[ver] [editar] [histórico] [purgar]

Este módulo implementa a predefinição {{navbox}}. Consulte a documentação da predefinição para instruções de uso.

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

localp={}

localnavbar=require('Módulo:Navbar')._navbar
localgetArgs-- lazily initialized

localargs
localborder
locallistnums
localODD_EVEN_MARKER='\127_ODDEVEN_\127'
localRESTART_MARKER='\127_ODDEVEN0_\127'
localREGEX_MARKER='\127_ODDEVEN(%d?)_\127'

localfunctionstriped(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.
localorphanCat='[[Categoria:!Navecaixas órfãs]]'
localargsOrphan=args.orphanorargs['órfã']
ifborder=='subgroup'andargsOrphan~='yes'andargsOrphan~='sim'orborder=='subgrupo'andargsOrphan~='yes'andargsOrphan~='sim'then
-- No change; striping occurs in outermost navbox.
returnwikitext..orphanCat
end
localfirst,second='odd','even'
ifargs.evenoddorargs['pares-ímpares']then
ifargs.evenodd=='swap'orargs.evenodd=='trocar'orargs['pares-ímpares']=='swap'orargs['pares-ímpares']=='trocar'then
first,second=second,first
else
first=args.evenoddorargs['pares-ímpares']
second=first
end
end
localchanger
iffirst==secondthen
changer=first
else
localindex=0
changer=function(code)
ifcode=='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
returnfirst
end
index=index+1
returnindex%2==1andfirstorsecond
end
end
localregex=orphanCat:gsub('([%[%]])','%%%1')
return(wikitext:gsub(regex,''):gsub(REGEX_MARKER,changer))-- () omits gsub count
end

localfunctionprocessItem(item,nowrapitems)
ifitem: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
ifnowrapitems=='yes'ornowrapitems=='sim'then
locallines={}
forlinein(item..'\n'):gmatch('([^\n]*)\n')do
localprefix,content=line:match('^([*:;#]+)%s*(.*)')
ifprefixandnotcontent:match('^<span class= "nowrap" >')then
line=prefix..'<span class= "nowrap" >'..content..'</span>'
end
table.insert(lines,line)
end
item=table.concat(lines,'\n')
end
ifitem:match('^[*:;#]')then
return'\n'..item..'\n'
end
returnitem
end

localfunctionrenderNavBar(titleCell)

localargsName=args.nameorargs.nome
ifargs.navbar~='off'andargs.navbar~='desligada'andargs.navbar~='desligado'andargs.navbar~='desligar'andargs.navbar~='plain'andargs.navbar~='simples'andnot(notargsNameandmw.getCurrentFrame():getParent():getTitle():gsub('/Testes$','')=='Predefinição:Navbox')then
titleCell:wikitext(navbar{
argsName,
mini=1,
fontstyle=(args.basestyleorargs['estilo-base']or'')..';'..(args.titlestyleorargs['estilo-título']or'')..';background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;'
})
end

end

--
-- Title row
--
localfunctionrenderTitleRow(tbl)
ifnotargs.titleandnotargs['título']thenreturnend

localtitleRow=tbl:tag('tr')

ifargs.titlegrouporargs['grupo-título']then
titleRow
:tag('th')
:attr('scope','row')
:addClass('navbox-group')
:addClass(args.titlegroupclassorargs['classe-grupo-título'])
:cssText(args.basestyleorargs['estilo-base'])
:cssText(args.groupstyleorargs['estilo-grupo'])
:cssText(args.titlegroupstyleorargs['estilo-grupo-título'])
:wikitext(args.titlegrouporargs['grupo-título'])
end

localtitleCell=titleRow:tag('th'):attr('scope','col')

ifargs.titlegrouporargs['grupo-título']then
titleCell
:css('border-left','2px solid #fdfdfd')
:css('width','100%')
end

localtitleColspan=2
ifargs.imageleftorargs['imagem-esquerda']thentitleColspan=titleColspan+1end
ifargs.imageorargs.imagemthentitleColspan=titleColspan+1end
ifargs.titlegrouporargs['grupo-título']thentitleColspan=titleColspan-1end

titleCell
:cssText(args.basestyleorargs['estilo-base'])
:cssText(args.titlestyleorargs['estilo-título'])
:addClass('navbox-title')
:attr('colspan',titleColspan)

renderNavBar(titleCell)

titleCell
:tag('div')
-- id for aria-labelledby attribute
:attr('id',mw.uri.anchorEncode(args.titleorargs['título']))
:addClass(args.titleclassorargs['classe-título'])
:css('font-size','114%')
:css('margin','0 4em')
:wikitext(processItem(args.titleorargs['título']))
end

--
-- Above/Below rows
--

localfunctiongetAboveBelowColspan()
localret=2
ifargs.imageleftorargs['imagem-esquerda']thenret=ret+1end
ifargs.imageorargs.imagemthenret=ret+1end
returnret
end

localfunctionrenderAboveRow(tbl)
ifnotargs.aboveandnotargs.acimathenreturnend

tbl:tag('tr')
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.aboveclassorargs['classe-acima'])
:cssText(args.basestyleorargs['estilo-base'])
:cssText(args.abovestyleorargs['estilo-acima'])
:attr('colspan',getAboveBelowColspan())
:tag('div')
-- id for aria-labelledby attribute, if no title
:attr('id',args.titleandnilorargs['título']andnilormw.uri.anchorEncode(args.aboveorargs.acima))
:wikitext(processItem(args.aboveorargs.acima,args.nowrapitemsorargs['nowrap-itens']))
end

localfunctionrenderBelowRow(tbl)
ifnotargs.belowandnotargs.abaixothenreturnend

tbl:tag('tr')
:tag('td')
:addClass('navbox-abovebelow')
:addClass(args.belowclassorargs['classe-abaixo'])
:cssText(args.basestyleorargs['estilo-base'])
:cssText(args.belowstyleorargs['estilo-abaixo'])
:attr('colspan',getAboveBelowColspan())
:tag('div')
:wikitext(processItem(args.beloworargs.abaixo,args.nowrapitemsorargs['nowrap-itens']))
end

--
-- List rows
--
localfunctionrenderListRow(tbl,index,listnum)
localrow=tbl:tag('tr')

ifindex==1andargs.imageleftorindex==1andargs['imagem-esquerda']then
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclassorargs['classe-imagem'])
:css('width','1px')-- Minimize width
:css('padding','0px 2px 0px 0px')
:cssText(args.imageleftstyleorargs['estilo-imagem-esquerda'])
:attr('rowspan',#listnums)
:tag('div')
:wikitext(processItem(args.imageleftorargs['imagem-esquerda']))
end

ifargs['group'..listnum]orargs['grupo'..listnum]then
localgroupCell=row:tag('th')

-- id for aria-labelledby attribute, if lone group with no title or above
iflistnum==1andnot(args.titleorargs['título']orargs.aboveorargs.acimaorargs.group2orargs.grupo2)then
groupCell
:attr('id',mw.uri.anchorEncode(args.group1orargs.grupo1))
end

groupCell
:attr('scope','row')
:addClass('navbox-group')
:addClass(args.groupclassorargs['classe-grupo'])
:cssText(args.basestyleorargs['estilo-base'])
:css('width',args.groupwidthorargs['largura-grupo']or'1%')-- If groupwidth not specified, minimize width

groupCell
:cssText(args.groupstyleorargs['estilo-grupo'])
:cssText(args['group'..listnum..'style']orargs['estilo-grupo'..listnum])
:wikitext(args['group'..listnum]orargs['grupo'..listnum])
end

locallistCell=row:tag('td')

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

ifnotargs.groupwidthandnotargs['largura-grupo']then
listCell:css('width','100%')
end

localrowstyle-- usually nil so cssText(rowstyle) usually adds nothing
ifindex%2==1then
rowstyle=args.oddstyleorargs['estilo-ímpares']
else
rowstyle=args.evenstyleorargs['estilo-pares']
end

locallistText=args['list'..listnum]orargs['lista'..listnum]
localoddEven=ODD_EVEN_MARKER
iflistText: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" ')andRESTART_MARKERor'odd'
end
listCell
:css('padding','0px')
:cssText(args.liststyleorargs['estilo-lista'])
:cssText(rowstyle)
:cssText(args['list'..listnum..'style']orargs['estilo-lista'..listnum])
:addClass('navbox-list')
:addClass('navbox-'..oddEven)
:addClass(args.listclassorargs['classe-lista'])
:addClass(args['list'..listnum..'class']orargs['classe-lista'..listnum])
:tag('div')
:css('padding',(index==1andargs.list1padding)or(index==1andargs['padding-lista1'])orargs.listpaddingorargs['padding-lista']or'0em 0.25em')
:wikitext(processItem(listText,args.nowrapitemsorargs['nowrap-itens']))

ifindex==1andargs.imageorindex==1andargs.imagemthen
row
:tag('td')
:addClass('navbox-image')
:addClass(args.imageclassorargs['classe-imagem'])
:css('width','1px')-- Minimize width
:css('padding','0px 0px 0px 2px')
:cssText(args.imagestyleorargs['estilo-imagem'])
:attr('rowspan',#listnums)
:tag('div')
:wikitext(processItem(args.imageorargs.imagem))
end
end


--
-- Tracking categories
--

localfunctionneedsHorizontalLists()
ifborder=='subgroup'orborder=='subgrupo'orargs.tracking=='no'orargs.tracking=='não'orargs['monitoramento']=='no'orargs['monitoramento']=='não'then
returnfalse
end
locallistClasses={
['plainlist']=true,['hlist']=true,['hlist hnum']=true,
['hlist hwrap']=true,['hlist vcard']=true,['vcard hlist']=true,
['hlist vevent']=true,
}
returnnot(listClasses[args.listclass]orlistClasses[args['classe-lista']]orlistClasses[args.bodyclass]orlistClasses[args['classe-corpo']]orlistClasses[args.class]orlistClasses[args.classe])
end

localfunctionhasBackgroundColors()
for_,keyinipairs({'titlestyle','estilo-título','groupstyle','estilo-grupo','basestyle','estilo-base','abovestyle','estilo-acima','belowstyle','estilo-abaixo'})do
iftostring(args[key]):find('background',1,true)then
returntrue
end
end
end

localfunctionhasBorders()
for_,keyinipairs({'groupstyle','estilo-grupo','basestyle','estilo-base','abovestyle','estilo-acima','belowstyle','estilo-abaixo'})do
iftostring(args[key]):find('border',1,true)then
returntrue
end
end
end

localfunctionisIllegible()
localstyleratio=require('Módulo:Color contrast')._styleratio

forkey,styleinpairs(args)do
iftostring(key):match("style$")ortostring(key):match("^estilo")then
ifstyleratio{mw.text.unstripNoWiki(style)}<4.5then
returntrue
end
end
end
returnfalse
end

localfunctiongetTrackingCategories()
localcats={}
ifneedsHorizontalLists()thentable.insert(cats,'!Navecaixas sem listas horizontais')end
ifhasBackgroundColors()thentable.insert(cats,'!Navecaixas usando cores de fundo')end
ifisIllegible()thentable.insert(cats,'!Navecaixas potencialmente ilegíveis')end
ifhasBorders()thentable.insert(cats,'!Navecaixas usando bordas')end
returncats
end

localfunctionrenderTrackingCategories(builder)
localtitle=mw.title.getCurrentTitle()
iftitle.namespace~=10thenreturnend-- not in template space
localsubpage=title.subpageText
ifsubpage=='doc'orsubpage=='Testes'orsubpage=='Exemplos para testes'thenreturnend

for_,catinipairs(getTrackingCategories())do
builder:wikitext('[[Categoria:'..cat..']]')
end
end

--
-- Main navbox tables
--
localfunctionrenderMainTable()
localargsTitle=args.titleorargs['título']
localargsState=args.stateorargs.estado
localtbl=mw.html.create('table')
:addClass('nowraplinks')
:addClass(args.bodyclassorargs['classe-corpo']orargs['class']orargs['classe'])

ifargsTitleand(argsState~='plain'andargsState~='simples'andargsState~='off'andargsState~='desligada'andargsState~='desligado'andargsState~='desligar')then
tbl
:addClass('collapsible')
:addClass(argsStateor'autocollapse')
end

tbl:css('border-spacing',0)
ifborder=='subgroup'orborder=='subgrupo'orborder=='none'orborder=='nenhuma'then
tbl
:addClass('navbox-subgroup')
:cssText(args.bodystyleorargs['estilo-corpo'])
:cssText(args.styleorargs.estilo)
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.innerstyleorargs['estilo-interno'])

renderTitleRow(tbl)
renderAboveRow(tbl)
fori,listnuminipairs(listnums)do
renderListRow(tbl,i,listnum)
end
renderBelowRow(tbl)

returntbl
end

functionp._navbox(navboxArgs)
args=navboxArgs
listnums={}

fork,_inpairs(args)do
iftype(k)=='string'then
locallistnum=k:match('^list(%d+)$')ork:match('^lista(%d+)$')
iflistnumthentable.insert(listnums,tonumber(listnum))end
end
end
table.sort(listnums)

localargsGroup1=args.group1orargs.grupo1
localargsGroup2=args.group2orargs.grupo2

border=mw.text.trim(args.borderorargs.bordaorargs[1]or'')
ifborder=='child'orborder=='filho'orborder=='filha'then
border='subgroup'
end

-- render the main body of the navbox
localtbl=renderMainTable()

-- render the appropriate wrapper around the navbox, depending on the border param
localres=mw.html.create()
ifborder=='none'orborder=='nenhuma'then
localnav=res:tag('div')
:attr('role','navigation')
:node(tbl)
-- aria-labelledby title, otherwise above, otherwise lone group
ifargs.titleorargs['título']orargs.aboveorargs.acimaor(argsGroup1andnotargsGroup2)then
nav:attr('aria-labelledby',mw.uri.anchorEncode(args.titleorargs['título']orargs.aboveorargs.acimaorargs.group1orargs.grupo1))
else
nav:attr('aria-label','Navbox')
end
elseifborder=='subgroup'orborder=='subgrupo'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
localnav=res:tag('div')
:attr('role','navigation')
:addClass('navbox')
:addClass('ws-noexport noprint')
:addClass(args.navboxclassorargs['classe-navbox'])
:cssText(args.bodystyleorargs['estilo-corpo'])
:cssText(args.styleorargs.estilo)
:css('padding','3px')
:node(tbl)
-- aria-labelledby title, otherwise above, otherwise lone group
ifargs.titleorargs['título']orargs.aboveorargs.acimaor(argsGroup1andnotargsGroup2)then
nav:attr('aria-labelledby',mw.uri.anchorEncode(args.titleorargs['título']orargs.aboveorargs.acimaorargs.group1orargs.grupo1))
else
nav:attr('aria-label','Navbox')
end
end

ifargs.nocatthen
ifargs.nocat:lower()=='false'orargs.nocat:lower()=='falso'orargs.nocat:lower()=='falsa'then
renderTrackingCategories(res)
end
elseifargs.semcatthen
ifargs.semcat:lower()=='false'orargs.semcat:lower()=='falso'orargs.semcat:lower()=='falsa'then
renderTrackingCategories(res)
end
end
returnstriped(tostring(res))
end

functionp.navbox(frame)
ifnotgetArgsthen
getArgs=require('Módulo:Arguments').getArgs
end
args=getArgs(frame,{wrappers={'Predefinição:Navbox','Predefinição:Navbox/lua','Predefinição:Navbox subgroup'}})
ifframe.args.borderthen
-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.
args.border=frame.args.borderorframe.args.borda
end

-- Read the arguments in the order they'll be output in, to make references number in the right order.
local_
_=args.titleorargs['título']
_=args.aboveorargs.acima
fori=1,20do
_=args["group"..tostring(i)]orargs["grupo"..tostring(i)]
_=args["list"..tostring(i)]orargs["lista"..tostring(i)]
end
_=args.beloworargs.abaixo

returnp._navbox(args)
end

returnp