Módulo:Ficha
40x40px | This module is rated as pre-alpha. It is unfinished, and may or may not be in active development. It should not be used from article namespace pages. Modules remain pre-alpha until the original editor (or someone who takes one over if it is abandoned for some time) is satisfied with the basic structure. |
Arquivo:Merge-arrows 2.svg | Foi proposta a fusão desta página com Módulo:Infobox. Se a fusão não for óbvia, por favor crie um espaço de discussão e justifique o motivo aqui; não é necessário criar o espaço em ambas as páginas, crie-o somente uma vez. Em marcações antigas é provável que já haja uma discussão acontecendo na página de discussão de um dos artigos. Verifique ambas (1, 2) e leve toda a discussão quando levar o caso para a central. (desde agosto de 2017) |
Índice
Uso
Este módulo é para criar uma caixa de informação (infocaixa) genérica ou para ser utilizado por outro módulo ou predefinição para criar caixas de informação específicas. Os parâmetros deste modulo estam traduzidos ao português como na predefinição {{Ficha}}
e {{Infobox}}
.
Para invocarlo em predefinições {{#invoke:Ficha|infobox}}
.
Parâmetros
Notas:
- Os parâmetros que incluem
<número>
, indicam que se debe escrever no final do parâmetro um número de 1 a ∞. Por exemplo, o código «|estilotopico65 = font-style: italic;
» informava o estilo de foente do tópico 65 em itálico. - Se for informado um tópico, não deve usar-se o mesmo número do tópico nos campos do rótulo ou dados, se faz, não mostrará o conteudo de estos campos.
Título e subtítulos
Recomenda-se sempre estabelecer título à infocaixa. Tambem se pode estabelecer subtítulos à infocaixa.
título
: Título que aparecerá no topo.subtítulo<número>
: Subtítulos da infocaixa.
- Configuración
-
corfundo
: Cor do fundo do topo.cortexto
: Cor do texto do topo.título-classe
: Tipo de imagem que aparecerá de fundo no topo.
Imagens
Todas as imagens são centradas de forma predeterminada. Só deve especificarse o nome das imagens. Por exemplo: «example.png». Se o valor não coincide com uma imagem existente por exemplo se emprgega-se uma predefinição se mostrará só o valor literal.
imagemup<número>
: Imagem que aparece depois do subtítulo.
imagenesquerda
/imagemdireita
: Aparecerão uma junto à outra, centrado o conjunto de ambas se tem as dois, ou centrada uma única imagem se só é uma.imagem<número>
: Imagens da infocaixa. Tem número ilimitado e se comprueba se aa imagem existe e do contrario devuelve o valor literal (pensado para que se puedan usar predefinições).
imageminferior
: Imagem que aparecerá no rodapé da infocaixa.
- Todos têm os seguintes parámetros adicionais
-
imagen-tamanho<numero>
: Tamanho de imagem. (se coloca-se número só afectará a esa imagem)
imagemesquerda-tamanho
: Tamanho da imagem esquerda.
imagemdireita-tamanho
: Tamanho da imagem direita.
imageninferior-tamanho
: Tamanho da imagem do rodapé da tabela.
legeda<número>
: Lengeda de imagem (se coloca-se número só afectará a essa imagem).
legedadireita
: Lengeda da imagem direita.
legedaesquerda
: Lengeda da imagem esquerda. (se coloca-se número só afectará a essa imagem)
legedaimageninferior
: Lengeda da imagem do rodapé da tabela.
Estilos CSS
Estes parámetros são usados para agregar código CSS no atributo «style» dos elementos da predefinição; são os que permiten cambiar a apariencia de estos elementos. Pelo tanto, deberán ser usados com sutileza para manter un aspecto geral estético y atractivo.
classe
: Classe (class) de toda a infocaixa.
estilo
: Estilo de toda a infocaixa
classefila<número>
: Sem número classe de todas as linhas, con número classe de esa linha.
título-classe
: Classe do topo. Estabelece a imagem do topo. Para usar topo mediana acresentar Midia=sim
.
título-estilo
:
subtítulo-classe<número>
subtítulo-estilo<número>
imagem-classe
imagem-estilo
rótulo-estilo<número>
dados-estilo<número>
Campos
Uma linha com um rótulo pero sem um campo de dados não muestra-se. Isto facilita a crição de linhas opcionales. Para fazer uma linha opcional se tiene que incluir um parámetro que predetermine o conteudo de esta a uma cadena vacía:
dadosup<número>
: Linha que aparecerán entre Imagemesquerda/direita e imagem.
tópico<número>
rótulo<número>
dados<número>
Otros campos
rodapedetabela
: Rodapé da infocaixa. Generalmente este espacio se reserva para notas.
nome
: Nome da predefinição que enlazará na barra de navegação.
Ver também
{{Ficha}}
Outra documentação:
-- -- Este módulo implementa {{Ficha}} -- local p = {} local navbar = require('Módulo:Navbar')._navbar local args = {} local origArgs local root local function notempty( s ) return s and s:match( '%S' ) end local function fixChildBoxes(sval, tt) if notempty(sval) then local marker = '<span class=special_infobox_marker>' local s = sval s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1') s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker) if s:match(marker) then s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '') s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1') s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1') s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1') s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1') end if s:match(marker) then local subcells = mw.text.split(s, marker) s = '' for k = 1, #subcells do if k == 1 then s = s .. subcells[k] .. '</' .. tt .. '></tr>' elseif k == #subcells then local rowstyle = ' style="display:none"' if notempty(subcells[k]) then rowstyle = '' end s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' .. subcells[k] elseif notempty(subcells[k]) then if (k % 2) == 0 then s = s .. subcells[k] else s = s .. '<tr><' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '></tr>' end end end end -- as próximas duas linhas adicionam um nova linha no final de listas para o analisador sintático de PHP -- https://en.wikipedia.org/w/index.php?title=Template_talk:Infobox_musical_artist&oldid=849054481 -- remover quando [[:phab:T191516]] estiver consertado ou OBE s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n') s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1') s = mw.ustring.gsub(s, '^(%{%|)', '\n%1') return s else return sval end end local function union(t1, t2) -- Retorna a união dos valores de duas tabelas, em sequência. local vals = {} for k, v in pairs(t1) do vals[v] = true end for k, v in pairs(t2) do vals[v] = true end local ret = {} for k, v in pairs(vals) do table.insert(ret, k) end return ret end local function getArgNums(prefix) -- Retorna uma tabela que contém os números dos argumentos que existem -- para o prefixo identificado. Por exemplo, se o prefixo fosse 'data', e -- 'data1', 'data2' e 'data5' existirem, retornaria {1, 2, 5}. local nums = {} for k, v in pairs(args) do local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$') if num then table.insert(nums, tonumber(num)) end end table.sort(nums) return nums end local function addRow(rowArgs) -- Adiciona uma linha à infobox, ou com uma célula de cabeçalho -- ou com uma combinação rótulo/célula de dados. if rowArgs.header then root :tag('tr') :addClass(rowArgs.rowclass) :cssText(rowArgs.rowstyle) :attr('id', rowArgs.rowid) :tag('th') :attr('colspan', 2) :attr('id', rowArgs.headerid) :addClass(rowArgs.class) :addClass(args.headerclass or args['cabeçalho-classe']) :css('text-align', 'center') :cssText(args.headerstyle or args['cabeçalho-estilo']) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.header, 'th')) elseif rowArgs.data then local row = root:tag('tr') row:addClass(rowArgs.rowclass) row:cssText(rowArgs.rowstyle) row:attr('id', rowArgs.rowid) if rowArgs.label then row :tag('th') :attr('scope', 'row') :attr('id', rowArgs.labelid) :cssText(args.labelstyle or args['rótulo-estilo']) :cssText(rowArgs.rowcellstyle) :wikitext(rowArgs.label) :done() end local dataCell = row:tag('td') if not rowArgs.label then dataCell :attr('colspan', 2) :css('text-align', 'center') end dataCell :attr('id', rowArgs.dataid) :addClass(rowArgs.class) :cssText(rowArgs.datastyle) :cssText(rowArgs.rowcellstyle) :wikitext(fixChildBoxes(rowArgs.data, 'td')) end end local function renderTitle() local argsTitle = args.title or args['título'] if not argsTitle then return end root :tag('caption') :addClass(args.titleclass or args['título-classe']) :cssText(args.titlestyle or args['título-estilo']) :wikitext(args.title or args['título']) end local function renderAboveRow() local argsAbove = args.above or args.acima if not argsAbove then return end root :tag('tr') :tag('th') :attr('colspan', 2) :addClass(args.aboveclass or args['acima-classe']) :css('text-align', 'center') :css('font-size', '125%') :css('font-weight', 'bold') :cssText(args.abovestyle or args['acima-estilo']) :wikitext(fixChildBoxes(argsAbove,'th')) end local function renderBelowRow() local argsBelow = args.below or args.abaixo if not argsBelow then return end root :tag('tr') :tag('td') :attr('colspan', '2') :addClass(args.belowclass or args['abaixo-classe']) :css('text-align', 'center') :cssText(args.belowstyle or args['abaixo-estilo']) :wikitext(fixChildBoxes(argsBelow,'td')) end local function renderSubheaders() if args.subheader then args.subheader1 = args.subheader elseif args['subcabeçalho'] then args['subcabeçalho1'] = args['subcabeçalho'] end if args.subheaderrowclass then args.subheaderrowclass1 = args.subheaderrowclass elseif args['subcabeçalho-linha-classe'] then args['subcabeçalho-linha-classe1'] = args['subcabeçalho-linha-classe'] end local subheadernums = union(getArgNums('subheader'), getArgNums('subcabeçalho')) table.sort(subheadernums) for k, num in ipairs(subheadernums) do addRow({ data = args['subheader' .. tostring(num)] or args['subcabeçalho' .. tostring(num)], datastyle = args.subheaderstyle or args['subcabeçalho-estilo'], rowcellstyle = args['subheaderstyle' .. tostring(num)] or args['subcabeçalho-estilo' .. tostring(num)], class = args.subheaderclass or args['subcabeçalho-classe'], rowclass = args['subheaderrowclass' .. tostring(num)] or args['subcabeçalho-linha-classe' .. tostring(num)] }) end end local function renderImages() if args.image then args.image1 = args.image or args.imagem end if args.imagem then args.imagem1 = args.imagem or args.image end if args.caption then args.caption1 = args.caption or args.legenda end if args.legenda then args.legenda1 = args.legenda or args.caption end local imagenums = union(getArgNums('image'), getArgNums('imagem')) table.sort(imagenums) for k, num in ipairs(imagenums) do local caption = args['caption' .. tostring(num)] or args['legenda' .. tostring(num)] local data = mw.html.create():wikitext(args['image' .. tostring(num)] or args['imagem' .. tostring(num)]) if caption then data :tag('div') :cssText(args.captionstyle or args['legenda-estilo']) :wikitext(caption) end addRow({ data = tostring(data), datastyle = args.imagestyle or args['imagem-estilo'], class = args.imageclass or args['imagem-classe'], rowclass = args['imagerowclass' .. tostring(num)] or args['imagem-linha-classe' .. tostring(num)] }) end end local function renderRows() -- Recebe a união dos números dos argumentos de cabeçalho e de dados -- e renderiza-os todos em ordem ao usar addRow. local rownums = union(getArgNums('header'), getArgNums('data')) table.sort(rownums) rownums = union(rownums, getArgNums('cabeçalho')) table.sort(rownums) rownums = union(rownums, getArgNums('dados')) table.sort(rownums) for k, num in ipairs(rownums) do addRow({ header = args['header' .. tostring(num)] or args['cabeçalho' .. tostring(num)], label = args['label' .. tostring(num)] or args['rótulo' .. tostring(num)], data = args['data' .. tostring(num)] or args['dados' .. tostring(num)], datastyle = args.datastyle or args['dados-estilo'], class = args['class' .. tostring(num)] or args['classe' .. tostring(num)], rowclass = args['rowclass' .. tostring(num)] or args['linha-classe' .. tostring(num)], rowstyle = args['rowstyle' .. tostring(num)] or args['linha-estilo' .. tostring(num)], rowcellstyle = args['rowcellstyle' .. tostring(num)] or args['linha-célula-estilo' .. tostring(num)], dataid = args['dataid' .. tostring(num)] or args['dados-id' .. tostring(num)], labelid = args['labelid' .. tostring(num)] or args['rótulo-id' .. tostring(num)], headerid = args['headerid' .. tostring(num)] or args['cabeçalho-id' .. tostring(num)], rowid = args['rowid' .. tostring(num)] or args['linha-id' .. tostring(num)] }) end end local function renderNavBar() local argsName = args.name or args.nome if not argsName then return end root :tag('tr') :tag('td') :attr('colspan', '2') :css('text-align', 'right') :wikitext(navbar{ argsName, mini = 1, }) end local function renderItalicTitle() local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title']) if italicTitle == '' or italicTitle == 'force' or italicTitle == 'forçar' or italicTitle == 'yes' or italicTitle == 'sim' then root:wikitext(mw.getCurrentFrame():expandTemplate({title = 'Título em itálico'})) end end local function renderTrackingCategories() if args.decat ~= 'yes' and args.decat ~= 'sim' and args.descat ~= 'yes' and args.descat ~= 'sim' then if args.child == 'yes' or args.child == 'sim' or args.filha == 'yes' or args.filha == 'sim' then if args.title or args['título'] then root:wikitext('[[Categoria:!Páginas que usam predefinições de infocaixas incorporadas com o parâmetro título]]') end elseif #(getArgNums('data')) == 0 and #(getArgNums('dados')) == 0 and mw.title.getCurrentTitle().namespace == 0 then root:wikitext('[[Categoria:!Artigos que usam predefinições de infocaixas sem linhas de dados]]') end end end local function _infobox() -- Especifica o layout completo da infobox, com definições específicas -- caso a infobox seja utilizada com uma filha dentro de outra infobox. local argsSubbox = args.subbox or args.subcaixa if args.child ~= 'yes' and args.child ~= 'sim' and args.filho ~= 'yes' and args.filho ~= 'sim' and args.filha ~= 'yes' and args.filha ~= 'sim' then root = mw.html.create('table') root :addClass((argsSubbox ~= 'yes' and argsSubbox ~= 'sim') and 'infobox' or nil) :addClass(args.bodyclass or args['corpo-classe']) if argsSubbox == 'yes' or argsSubbox == 'sim' then root :css('padding', '0') :css('border', 'none') :css('margin', '-3px') :css('width', 'auto') :css('min-width', '100%') :css('font-size', '100%') :css('clear', 'none') :css('float', 'none') :css('background-color', 'transparent') else root :css('width', '22em') end root :cssText(args.bodystyle or args['corpo-estilo']) renderTitle() renderAboveRow() else root = mw.html.create() root :wikitext(args.title or args['título']) end renderSubheaders() renderImages() renderRows() renderBelowRow() renderNavBar() renderItalicTitle() renderTrackingCategories() return tostring(root) end local function preprocessSingleArg(argName) -- Se o argumento exitir e não estiver em brancp, adicioná-lo à tabela de argumentos. -- Argumentos em branco são tratados como nil para combinar com o comportamento de ParserFunctions. if origArgs[argName] and origArgs[argName] ~= '' then args[argName] = origArgs[argName] end end local function preprocessArgs(prefixTable, step) -- Atribuir os parâmetros aos prefixos dados para a tabela args, em ordem, em conjuntos -- do tamanho de step especificado. Isto é para prevenir referências etc. de aparecer na -- ordem errada. A prefixTable deve ser um array que contém tabelas, cada uma com -- dois campos possíveis, um string "prefix" e uma tabela "depend". A função sempre analisa sintaticamente -- parâmetros que contêm o string "prefix", mas somente analisa sintaticamente os parâmetros na tabela "depend" -- se o parâmetro prefix estiver presente não estiver em branco. if type(prefixTable) ~= 'table' then error("Valor que não é uma tabela detetado para o prefixo tabela", 2) end if type(step) ~= 'number' then error("Detetado valor de step inválido", 2) end -- Obter argumentos sem um sufixo de número, e checar por input ruim. for i,v in ipairs(prefixTable) do if type(v) ~= 'table' or type(v.prefix) ~= "string" or (v.depend and type(v.depend) ~= 'table') then error('Dado de entrada inválido detetado para tabela de prefixo preprocessArgs', 2) end preprocessSingleArg(v.prefix) -- Somente analisar sintaticamente o parâmetro depend caso o parâmetro prefixo estiver presente e não estiver em branco. if args[v.prefix] and v.depend then for j, dependValue in ipairs(v.depend) do if type(dependValue) ~= 'string' then error('Detetado valor do parâmetro "depend" inválido em preprocessArgs') end preprocessSingleArg(dependValue) end end end -- Obter argumentos com sufixos de números. local a = 1 -- Variável de contagem. local moreArgumentsExist = true while moreArgumentsExist == true do moreArgumentsExist = false for i = a, a + step - 1 do for j,v in ipairs(prefixTable) do local prefixArgName = v.prefix .. tostring(i) if origArgs[prefixArgName] then moreArgumentsExist = true -- Fazer um outro loop caso quaisquer argumenos forem encontrados, mesmo os em branco. preprocessSingleArg(prefixArgName) end -- Processar a tabela depend se o argumento prefix estiver presente não estiver em branco, ou -- estamos a processar "prefix1" e "prefix" está presente e não está em branco, e -- se a tabela depend estiver presente. if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then for j,dependValue in ipairs(v.depend) do local dependArgName = dependValue .. tostring(i) preprocessSingleArg(dependArgName) end end end end a = a + step end end function p.infobox(frame) -- Se chamado via #invoke, usar os argumentos na predefinição a invocar. -- Do contrário, para propósitos de testes, presumir que args estão a ser passados diretamente. if frame == mw.getCurrentFrame() then origArgs = frame:getParent().args else origArgs = frame end -- Analisar sintaticamente os prâmetros data na mesma ordem que a antiga {{infobox}} fazia, para que -- referências etc. sejam exibidas nos locais esperados. Parâmetros que dependem de -- um outro parâmetro somente são processados se presentes, para evitar -- referências fantasmas a aparecer nas lista de referências de artigos. preprocessSingleArg('child') preprocessSingleArg('filha') preprocessSingleArg('bodyclass') preprocessSingleArg('corpo-classe') preprocessSingleArg('subbox') preprocessSingleArg('subcaixa') preprocessSingleArg('bodystyle') preprocessSingleArg('corpo-estilo') preprocessSingleArg('title') preprocessSingleArg('título') preprocessSingleArg('titleclass') preprocessSingleArg('título-classe') preprocessSingleArg('titlestyle') preprocessSingleArg('título-estilo') preprocessSingleArg('above') preprocessSingleArg('acima') preprocessSingleArg('aboveclass') preprocessSingleArg('acima-classe') preprocessSingleArg('abovestyle') preprocessSingleArg('acima-estilo') preprocessArgs({ {prefix = 'subheader', depend = {'subheaderstyle', 'subcabeçalho-estilo', 'subheaderrowclass', 'subcabeçalho-linha-classe'}} }, 10) preprocessArgs({ {prefix = 'subcabeçalho', depend = {'subheaderstyle', 'subcabeçalho-estilo', 'subheaderrowclass', 'subcabeçalho-linha-classe'}} }, 10) preprocessSingleArg('subheaderstyle') preprocessSingleArg('subcabeçalho-estilo') preprocessSingleArg('subheaderclass') preprocessSingleArg('subcabeçalho-classe') preprocessArgs({ {prefix = 'image', depend = {'caption', 'legenda', 'imagerowclass', 'imagem-linha-classe'}} }, 10) preprocessArgs({ {prefix = 'imagem', depend = {'caption', 'legenda', 'imagerowclass', 'imagem-linha-classe'}} }, 10) preprocessSingleArg('captionstyle') preprocessSingleArg('legenda-estilo') preprocessSingleArg('imagestyle') preprocessSingleArg('imagem-estilo') preprocessSingleArg('imageclass') preprocessSingleArg('imagem-classe') preprocessArgs({ {prefix = 'header'}, {prefix = 'data', depend = {'label', 'rótulo'}}, {prefix = 'rowclass'}, {prefix = 'rowstyle'}, {prefix = 'rowcellstyle'}, {prefix = 'class'}, {prefix = 'dataid'}, {prefix = 'labelid'}, {prefix = 'headerid'}, {prefix = 'rowid'} }, 50) preprocessArgs({ {prefix = 'cabeçalho'}, {prefix = 'dados', depend = {'rótulo', 'label'}}, {prefix = 'linha-classe'}, {prefix = 'linha-estilo'}, {prefix = 'linha-célula-estilo'}, {prefix = 'classe'}, {prefix = 'dados-id'}, {prefix = 'rótulo-id'}, {prefix = 'cabeçalho-id'}, {prefix = 'linha-id'} }, 50) preprocessSingleArg('headerclass') preprocessSingleArg('cabeçalho-classe') preprocessSingleArg('headerstyle') preprocessSingleArg('cabeçalho-estilo') preprocessSingleArg('labelstyle') preprocessSingleArg('rótulo-estilo') preprocessSingleArg('datastyle') preprocessSingleArg('dados-estilo') preprocessSingleArg('below') preprocessSingleArg('abaixo') preprocessSingleArg('belowclass') preprocessSingleArg('abaixo-classe') preprocessSingleArg('belowstyle') preprocessSingleArg('abaixo-estilo') preprocessSingleArg('name') preprocessSingleArg('nome') args['italic title'] = origArgs['italic title'] or origArgs['título itálico'] -- comportamento diferente caso em branco ou em falta preprocessSingleArg('decat') preprocessSingleArg('descat') return _infobox() end return p