Ir para o conteúdo

Módulo:Infocaixa

De Wiki TokuDrive

local p = {} local args = {} local origArgs = {} local root local empty_row_categories = {} local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:[^]]*]]' local has_rows = false local lists = {

   plainlist_t = {
       patterns = {
           '^plainlist$',
           '%splainlist$',
           '^plainlist%s',
           '%splainlist%s'
       },
       found = false,
       styles = 'Plainlist/styles.css'
   },
   hlist_t = {
       patterns = {
           '^hlist$',
           '%shlist$',
           '^hlist%s',
           '%shlist%s'
       },
       found = false,
       styles = 'Hlist/styles.css'
   }

}

local function has_list_class(args_to_check)

   for _, list in pairs(lists) do
       if not list.found then
           for _, arg in pairs(args_to_check) do
               for _, pattern in ipairs(list.patterns) do
                   if mw.ustring.find(arg or , pattern) then
                       list.found = true
                       break
                   end
               end
               if list.found then break end
           end
       end
   end

end

local function isUntitledChildBox(sval)

   return sval and (
       sval:match('^%s*<%s*[Tt][Rr]') or
       sval:match('^%s*\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127%s*<%s*[Tt][Rr]')
   )

end

local function fixChildBoxes(sval, tt)

   local function notempty( s ) return s and s:match( '%S' ) end
   
   if notempty(sval) then
       local marker = ''
       local s = sval
       local slast = 
       while slast ~= s do
           slast = s
           s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Ii][Aa]%s*:[^]]*%]%])', '%2%1')
           s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
       end
       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 .. '>' 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 .. '<' .. tt .. ' colspan=2>\n' .. subcells[k] .. '</' .. tt .. '>' end end end end 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 cleanInfobox() root = tostring(root) if has_rows == false then root = mw.ustring.gsub(root, '<table[^<>]*>%s*', )

   end

end

local function union(t1, t2)

   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)

   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)

   if rowArgs.header and rowArgs.header ~= '_BLANK_' then
       has_rows = true
       has_list_class({ rowArgs.rowclass, rowArgs.class, args['tópico-classe'] })
      
       root
           :tag('tr')
               :addClass(rowArgs.rowclass)
               :addClass(isUntitledChildBox(rowArgs.header) and 'infobox-hiddenrow' or nil)
               :cssText(rowArgs.rowstyle)
               :tag('th')
                   :attr('colspan', '2')
                   :addClass('infobox-header')
                   :addClass(rowArgs.class)
                   :addClass(args['tópico-classe'])
                   :cssText(args['tópico-estilo'])
                   :cssText(rowArgs.rowcellstyle)
                   :wikitext(fixChildBoxes(rowArgs.header, 'th'))
       if rowArgs.data then
           root:wikitext(
               --
           )
       end
   elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ):match('^%S') then
       has_rows = true
       has_list_class({ rowArgs.rowclass, rowArgs.class })
      
       local row = root:tag('tr')
       row:addClass(rowArgs.rowclass)
       row:cssText(rowArgs.rowstyle)
       if rowArgs.label then
           row
               :tag('th')
                   :attr('scope', 'row')
                   :addClass('infobox-label')
                   :cssText(args['rótulo-estilo'])
                   :cssText(rowArgs.rowcellstyle)
                   :wikitext(rowArgs.label)
                   :done()
       else
           row:addClass(isUntitledChildBox(rowArgs.data) and 'infobox-hiddenrow' or nil)
       end
       local dataCell = row:tag('td')
       dataCell
           :attr('colspan', not rowArgs.label and '2' or nil)
           :addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
           :addClass(rowArgs.class)
           :cssText(rowArgs.datastyle)
           :cssText(rowArgs.rowcellstyle)
           :wikitext(fixChildBoxes(rowArgs.data, 'td'))
   else
       table.insert(empty_row_categories, rowArgs.data or )
   end

end

local function renderTitle()

   if not args['cabeçalho'] then return end
   has_rows = true
   has_list_class({args['cabeçalho-classe']})
   
   root
       :tag('caption')
           :addClass('infobox-title')
           :addClass(args['cabeçalho-classe'])
           :cssText(args['cabeçalho-estilo'])
           :wikitext(args['cabeçalho'])

end

local function renderAboveRow()

   if not args['título'] then return end
   has_rows = true
   has_list_class({ args['título-classe'] })
   local frame = mw.getCurrentFrame()
   local titleText = args['título'] or args['titulo'] or mw.title.getCurrentTitle().text
   local span = mw.html.create('span')
   if args['hCard'] then
       span:addClass(args['hCard'])
   end
   span:wikitext(titleText)
   local content = tostring(span)
   if args['pictograma'] then
       local pictogramArgs = {
           pictograma = args['pictograma'],
           ['tamanho-pictograma'] = args['tamanho-pictograma'] or '30px',
           ['pictograma-ligação'] = args['pictograma-ligação'],
           ['pictograma-legenda'] = args['pictograma-legenda'],
           opacidade = args['opacidade'],
           ['margem-superior'] = args['margem-superior']
       }
       content = content .. frame:expandTemplate{ title = 'Info/topo/imagem', args = pictogramArgs }
   end
   local row = root:tag('tr')
   row:addClass(isUntitledChildBox(args['título']) and 'infobox-hiddenrow' or nil)
   local th = row:tag('th')
   th
       :attr('colspan', '2')
       :addClass('infobox-above')
       :addClass(args['título-classe'] or 'infobox-above')
       :cssText(args['título-estilo'] or )
       :wikitext(content)

end

local function renderBelowRow()

   if not args['rodapé'] then return end
   has_rows = true
   has_list_class({ args['rodapé-classe'] })
   
   root
       :tag('tr')
           :addClass(isUntitledChildBox(args['rodapé']) and 'infobox-hiddenrow' or nil)
           :tag('td')
               :attr('colspan', '2')
               :addClass('infobox-below')
               :addClass(args['rodapé-classe'])
               :cssText(args['rodapé-estilo'])
               :wikitext(fixChildBoxes(args['rodapé'],'td'))

end

local function addSubheaderRow(subheaderArgs)

   if subheaderArgs.data and
       subheaderArgs.data:gsub(category_in_empty_row_pattern, ):match('^%S') then
       has_rows = true
       has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
      
       local row = root:tag('tr')
       row:addClass(subheaderArgs.rowclass)
       row:addClass(isUntitledChildBox(subheaderArgs.data) and 'infobox-hiddenrow' or nil)
       local dataCell = row:tag('td')
       dataCell
           :attr('colspan', '2')
           :addClass('infobox-subheader')
           :addClass(subheaderArgs.class)
           :cssText(subheaderArgs.datastyle)
           :cssText(subheaderArgs.rowcellstyle)
           :wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
   else
       table.insert(empty_row_categories, subheaderArgs.data or )
   end

end

local function renderSubheaders()

   if args['subtítulo'] then
       args['subtítulo1'] = args['subtítulo']
   end
   if args['subtítulo-classe-linha'] then
       args['subtítulo-classe-linha1'] = args['subtítulo-classe-linha']
   end
   local subheadernums = getArgNums('subtítulo')
   for k, num in ipairs(subheadernums) do
       addSubheaderRow({
           data = args['subtítulo' .. tostring(num)],
           datastyle = args['subtítulo-estilo'],
           rowcellstyle = args['subtítulo-estilo' .. tostring(num)],
           class = args['subtítulo-classe'],
           rowclass = args['subtítulo-classe-linha' .. tostring(num)]
       })
   end

end

local function addImageRow(imageArgs)

   if imageArgs.data and
       imageArgs.data:gsub(category_in_empty_row_pattern, ):match('^%S') then
       has_rows = true
       has_list_class({ imageArgs.rowclass, imageArgs.class })
      
       local row = root:tag('tr')
       row:addClass(imageArgs.rowclass)
       row:addClass(isUntitledChildBox(imageArgs.data) and 'infobox-hiddenrow' or nil)
       local dataCell = row:tag('td')
       dataCell
           :attr('colspan', '2')
           :addClass('infobox-image')
           :addClass(imageArgs.class)
           :cssText(imageArgs.datastyle)
           :wikitext(fixChildBoxes(imageArgs.data, 'td'))
   else
       table.insert(empty_row_categories, imageArgs.data or )
   end

end

local function renderImages()

   if args['imagem'] then
       args['imagem1'] = args['imagem']
   end
   if args['legenda'] then
       args['legenda1'] = args['legenda']
   end
   local imagenums = getArgNums('imagem')
   for k, num in ipairs(imagenums) do
       local caption = args['legenda' .. tostring(num)]
       local data = mw.html.create():wikitext(args['imagem' .. tostring(num)])
       if caption then
           data
               :tag('div')
                   :addClass('infobox-caption')
                   :cssText(args['legenda-estilo'])
                   :wikitext(caption)
       end
       addImageRow({
           data = tostring(data),
           datastyle = args['imagem-estilo'],
           class = args['imagem-classe'],
           rowclass = args['imagem-classe-linha' .. tostring(num)]
       })
   end

end

local function preprocessRows()

   if not args.autoheaders then return end
   
   local rownums = union(getArgNums('tópico'), getArgNums('dados'))
   table.sort(rownums)
   local lastheader
   for k, num in ipairs(rownums) do
       if args['tópico' .. tostring(num)] then
           if lastheader then
               args['tópico' .. tostring(lastheader)] = nil
           end
           lastheader = num
       elseif args['dados' .. tostring(num)] and
           args['dados' .. tostring(num)]:gsub(
               category_in_empty_row_pattern, 
           ):match('^%S') then
           local data = args['dados' .. tostring(num)]
           if data:gsub(category_in_empty_row_pattern, ):match('%S') then
               lastheader = nil
           end
       end
   end
   if lastheader then
       args['tópico' .. tostring(lastheader)] = nil
   end

end

local function renderRows()

   local rownums = union(getArgNums('tópico'), getArgNums('dados'))
   table.sort(rownums)
   for k, num in ipairs(rownums) do
       addRow({
           header = args['tópico' .. tostring(num)],
           label = args['rótulo' .. tostring(num)],
           data = args['dados' .. tostring(num)],
           datastyle = args['dados-estilo'],
           class = args['class' .. tostring(num)],
           rowclass = args['classe-linha' .. tostring(num)],
           rowstyle = args['rowstyle' .. tostring(num)] or args['linha-estilo' .. tostring(num)],
           rowcellstyle = args['rowcellstyle' .. tostring(num)]
       })
   end

end

local function renderNavBar()

   if not args['nome'] then return end
   has_rows = true
   root
       :tag('tr')
           :tag('td')
               :attr('colspan', '2')
               :addClass('infobox-navbar')
               :wikitext(require('Módulo:Navbar')._navbar{
                   args['nome'],
                   mini = 1,
               })

end

local function renderItalicTitle()

   local italicTitle = args['título em itálico'] and mw.ustring.lower(args['título em itálico'])
   if italicTitle ==  or italicTitle == 'forçar' or italicTitle == 'sim' then
       root:wikitext(require('Módulo:Título em itálico')._main({}))
   end

end

local function renderEmptyRowCategories()

   for _, s in ipairs(empty_row_categories) do
       root:wikitext(s)
   end

end

local function renderTrackingCategories()

   if args.decat == 'yes' or args.decat == 'sim' then return end
   if args.child == 'yes' or args.child == 'sim' then
       if args['cabeçalho'] then
           root:wikitext(
               --
           )
       end
   elseif #(getArgNums('dados')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
       --root:wikitext()
   end

end

local function loadTemplateStyles()

   local frame = mw.getCurrentFrame()
   
   local hlist_templatestyles = 
   if lists.hlist_t.found then
       hlist_templatestyles = frame:extensionTag{
           name = 'templatestyles', args = { src = lists.hlist_t.styles }
       }
   end
   
   local plainlist_templatestyles = 
   if lists.plainlist_t.found then
       plainlist_templatestyles = frame:extensionTag{
           name = 'templatestyles', args = { src = lists.plainlist_t.styles }
       }
   end
   
   local base_templatestyles = frame:extensionTag{
       name = 'templatestyles', args = { src = 'Módulo:Infocaixa/estilos.css' }
   }
   local templatestyles = 
   if args['templatestyles'] then
       templatestyles = frame:extensionTag{
           name = 'templatestyles', args = { src = args['templatestyles'] }
       }
   end
   
   local child_templatestyles = 
   if args['child templatestyles'] then
       child_templatestyles = frame:extensionTag{
           name = 'templatestyles', args = { src = args['child templatestyles'] }
       }
   end
   
   local grandchild_templatestyles = 
   if args['grandchild templatestyles'] then
       grandchild_templatestyles = frame:extensionTag{
           name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
       }
   end
   
   return table.concat({
       hlist_templatestyles,
       plainlist_templatestyles,
       base_templatestyles,
       templatestyles,
       child_templatestyles,
       grandchild_templatestyles
   })

end

local function structure_infobox_common()

   renderSubheaders()
   renderImages()
   preprocessRows()
   renderRows()
   renderBelowRow()
   renderNavBar()
   renderItalicTitle()
   renderEmptyRowCategories()
   renderTrackingCategories()
   cleanInfobox()

end

local function _infobox()

   local child = args.child and mw.ustring.lower(args.child) or 
   if child ~= 'yes' and child ~= 'sim' then
       root = mw.html.create('table')
       root
           :addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
           :addClass(args['classe'])
           :cssText(args['estilo'])
      
       has_list_class({ args['classe'] })
       renderTitle()
       renderAboveRow()
   else
       root = mw.html.create()
       root
           :wikitext(args['cabeçalho'])
   end
   structure_infobox_common()
   
   return loadTemplateStyles() .. root

end

local function preprocessSingleArg(argName)

   if origArgs[argName] and origArgs[argName] ~=  then
       args[argName] = origArgs[argName]
   end

end

local function preprocessArgs(prefixTable, step)

   if type(prefixTable) ~= 'table' then
       error("Non-table value detected for the prefix table", 2)
   end
   if type(step) ~= 'number' then
       error("Invalid step value detected", 2)
   end
   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('Invalid input detected to preprocessArgs prefix table', 2)
       end
       preprocessSingleArg(v.prefix)
       if args[v.prefix] and v.depend then
           for j, dependValue in ipairs(v.depend) do
               if type(dependValue) ~= 'string' then
                   error('Invalid "depend" parameter value detected in preprocessArgs')
               end
               preprocessSingleArg(dependValue)
           end
       end
   end
   local a = 1
   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
                   preprocessSingleArg(prefixArgName)
               end
               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

local function parseDataParameters()

   preprocessSingleArg('autoheaders')
   preprocessSingleArg('child')
   preprocessSingleArg('classe')
   preprocessSingleArg('subbox')
   preprocessSingleArg('estilo')
   preprocessSingleArg('cabeçalho')
   preprocessSingleArg('cabeçalho-classe')
   preprocessSingleArg('cabeçalho-estilo')
   preprocessSingleArg('título')
   preprocessSingleArg('titulo')
   preprocessSingleArg('título-classe')
   preprocessSingleArg('título-estilo')
   preprocessSingleArg('pictograma')
   preprocessSingleArg('tamanho-pictograma')
   preprocessSingleArg('pictograma-ligação')
   preprocessSingleArg('pictograma-legenda')
   preprocessSingleArg('opacidade')
   preprocessSingleArg('margem-superior')
   preprocessSingleArg('hCard')
   preprocessSingleArg('incorporar')
   preprocessArgs({
       {prefix = 'subtítulo', depend = {'subtítulo-estilo', 'subtítulo-classe-linha'}}
   }, 10)
   preprocessSingleArg('subtítulo-estilo')
   preprocessSingleArg('subtítulo-classe')
   preprocessArgs({
       {prefix = 'imagem', depend = {'legenda', 'imagem-classe-linha'}}
   }, 10)
   preprocessSingleArg('legenda-estilo')
   preprocessSingleArg('imagem-estilo')
   preprocessSingleArg('imagem-classe')
   preprocessArgs({
       {prefix = 'tópico'},
       {prefix = 'dados', depend = {'rótulo'}},
       {prefix = 'classe-linha'},
       {prefix = 'rowstyle'},

{prefix = 'linha-estilo'},

       {prefix = 'rowcellstyle'},
       {prefix = 'class'}
   }, 50)
   preprocessSingleArg('tópico-classe')
   preprocessSingleArg('tópico-estilo')
   preprocessSingleArg('rótulo-estilo')
   preprocessSingleArg('dados-estilo')
   preprocessSingleArg('rodapé')
   preprocessSingleArg('rodapé-classe')
   preprocessSingleArg('rodapé-estilo')
   preprocessSingleArg('nome')
   args['título em itálico'] = origArgs['título em itálico']
   preprocessSingleArg('decat')
   preprocessSingleArg('templatestyles')
   preprocessSingleArg('child templatestyles')
   preprocessSingleArg('grandchild templatestyles')

end

function p.infobox(frame)

   if frame == mw.getCurrentFrame() then
       origArgs = frame:getParent().args
   else
       origArgs = frame
   end
   
   parseDataParameters()
   
   return _infobox()

end

function p.infoboxTemplate(frame)

   origArgs = {}
   for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
   
   parseDataParameters()
   
   return _infobox()

end return p